Select Page

Iniciándose en el IOT

Hace unos pocos días realizamos un post en facebook, mencionando nuestro sistema casero de mediciones de temperatura, humedad y presión barométrica, que envía y muestra la información utilizando el servicio de Thingspeak.com.

Aquí les vamos a mostrar el tutorial para poder realizar lo mismo ustedes en sus casas.

Materiales:

Arduino Uno

Ethernet Shield R2

Sensor BMP180 (temperatura y presión barométrica)

Sensor DHT11 (temperatura y humedad)

Cuenta en Thingspeak

Arduino Ide 1.5.x en adelante (es necesaria esta versión ya que tiene un mejor manejo de Strings que la versión 1.0.6)

Para quienes se pregunten por que tenemos dos sensores que miden los mismos valores, es porque el sensor BMP180 tiene una mejor resolución de medición de temperatura (mide con 2 decimales) cosa que el DHT11 no hace. Pero el DHT11 es un sensor muy económico y la medición de Humedad es una buena información para mostrar.

Bueno arrancamos:

Lo primero que tenemos que hacer es crearnos una cuenta en Thingspeak.com, una vez creada la cuenta, nos creamos un canal (Channel) y completamos la siguiente información:

  • Name, aquí completamos el nombre que queremos que tenga nuestro canal
  • Description, aquí va la descripción del canal.
  • Tags, aquí van las palabras claves que nos van a ayudar a buscar nuestro canal en la página web.
  • Latitude, la latitud de donde está el sensor ubicado.
  • Longitude, la longitud de donde está ubicado el sensor. (con estos dos valores, en el canal se va a agregar un mapa mostrando la ubicación del sensor)
  • Make Public?, si lo tildamos, nuestro canal va a estar visible para todos, sino va a ser necesario ingresar con usuario y contraseña para ver el canal.
  • URL y VideoID, es para darle más información al canal, el url es por si hay un blog sobre este canal y el video para que en el canal se muestre el video que uno desee (claramente relativo a este canal)
  • Field 1/8, aquí es donde se va a mostrar la información que le enviemos a la página, como en este caso tenemos 4 mediciones para mostrar, completamos hasta el field 4 en el siguiente orden:
  • 1) Temperatura DHT

2) Humedad

3) Presión Barométrica

4) Temperatura BMP

Buenísimo, ya tenemos seteado nuestro canal. Pueden variar la información, el nombre o lo que deseen del canal, pero después va a ser necesario hacer algunas modificaciones al programa que va dentro del arduino. Vamos a ver que hay un botón arriba en las solapas del canal que dice “Api Key”, le damos un click y nos va a mostrar en pantalla “Write API Key” y muchas letras y números, guarden ese número en algún lado porque lo necesitamos para configurar el arduino.

Con ese número, el servidor de ThingSpeak sabe que la información que le está enviando nuestro arduino pertenece a nuestro canal y que la tiene que mostrar en ese canal.

Pasemos al arduino:

Tenemos que tener instaladas 2 librerías extras. La del BMP180 y la del DHT. La librería del “Ethernet” y “wire” viene por default en arduino.

Si no tienen las librerías, aquí están los links de descarga:

BMP180

DHT

Van a ver que hay una parte del código que está en amarillo, allí es donde tenemos que copiar la “Write API Key”, No se olviden de esto. Además para que tener en cuenta, el BMP180 tiene comunicación I2C (usa los pines A4 y A5 del arduino uno) y el DHT11 está conectado al pin digital 2.

Codigo:

//Librerías necesarias para el funcionamiento de todos los componentes.

#include <SPI.h>

#include <Ethernet.h>

#include <SFE_BMP180.h>

#include <Wire.h>

#include “DHT.h”

#define DHTPIN 2

#define DHTTYPE DHT11

// Parámetros para la conexión Ethernet local

byte mac[] = { 0xD4, 0x28, 0xB2, 0xFF, 0xA0, 0xA1 }; // Mac address, tiene que ser única en la red local

IPAddress ip(192,168,1,177); // Dirección de ip, Al principio vamos a tratar de obtener una dirección por DHCP pero si no funciona usamos esta configuración.

IPAddress gateway(192,168,1, 1); // Gateway – Puerta de enlace

IPAddress subnet(255, 255, 255, 0); //  Mascara de red

// Seteo de ThingSpeak

char thingSpeakAddress[] = “api.thingspeak.com”; // Esta es la dirección del servidor al cual vamos a postear los datos.

String writeAPIKey = “xxxxxxxxxxxxxx”; // Una vez creado un canal necesitamos saber la Key de ese canal y copiarla aquí.

const int updateThingSpeakInterval = 16 * 1000; // Intervalo de tiempo, cada cuanto posteamos en el servidor.

// Variables

long lastConnectionTime = 0;

boolean lastConnected = false;

int failedCounter = 0;

char Status;

double T1,P; //BMP180

double T2,H; //DHT11

// Configuraciones para los sensores

SFE_BMP180 BMP;

DHT dht(DHTPIN, DHTTYPE);

// Iniciamos el Ethernet Shield

EthernetClient client;

void setup()

{

// Iniciamos el serial para poder utilizarlo como puerto de debug.

Serial.begin(9600);

// Iniciamos los sensores.

BMP.begin();

dht.begin();

startEthernet();

}

void loop()

{

// Imprimimos por serial lo que nos haya devuelto el servidor.

if (client.available())

{

char c = client.read();

Serial.print(c);

}

// Nos desconectamos de Thingspeak

if (!client.connected() && lastConnected)

{

Serial.println(“…disconnected”);

Serial.println();

client.stop();

}

// Si estamos desconectados del servidor y paso suficiente tiempo, tenemos que volver a subir los nuevos datos.

if(!client.connected() && (millis() – lastConnectionTime > updateThingSpeakInterval))

{

Leersensores();

updateThingSpeak(“1=”+String(T2, DEC)+”&2=”+String(H, DEC)+”&3=”+String(P, DEC)+”&4=”+String(T1, DEC));

}

if (failedCounter > 3 ) {startEthernet();}

lastConnected = client.connected();

}

// Función para enviar los datos a el servidor.

void updateThingSpeak(String tsData)

{

if (client.connect(thingSpeakAddress, 80))

{

client.print(“POST /update HTTP/1.1\n”);

client.print(“Host: api.thingspeak.com\n”);

client.print(“Connection: close\n”);

client.print(“X-THINGSPEAKAPIKEY: “+writeAPIKey+”\n”);

client.print(“Content-Type: application/x-www-form-urlencoded\n”);

client.print(“Content-Length: “);

client.print(tsData.length());

client.print(“\n\n”);

client.print(tsData);

lastConnectionTime = millis();

if (client.connected())

{

Serial.println(“Connecting to ThingSpeak…”);

Serial.println();

failedCounter = 0;

}

else

{

failedCounter++;

Serial.println(“Connection to ThingSpeak failed (“+String(failedCounter, DEC)+”)”);

Serial.println();

}

}

else

{

failedCounter++;

Serial.println(“Connection to ThingSpeak Failed (“+String(failedCounter, DEC)+”)”);

Serial.println();

lastConnectionTime = millis();

}

}

// Función para iniciar la conexión con el servidor.

void startEthernet()

{

client.stop();

Serial.println(“Connecting Arduino to network…”);

Serial.println();

delay(1000);

// Intenta conectarse por DHCP y si no funciona usa la configuración por default.

if (Ethernet.begin(mac) == 0)

{

Serial.println(“DHCP Failed, Using default config”);

Serial.println();

Ethernet.begin(mac, ip, gateway, subnet);

}

else

{

Serial.println(“Arduino connected to network using DHCP”);

Serial.println();

}

delay(1000);

}

// Función para leer los sensores y almacenarlos en las variables globales.

void Leersensores() {

Status = BMP.startTemperature();

if (Status != 0)

delay(Status);

BMP.getTemperature(T1);

Status = BMP.startPressure(3);

if (Status != 0)

{

delay(Status);

BMP.getPressure(P,T1);

}

T2 = dht.readTemperature();

H = dht.readHumidity();

}

 Imagenes:10922711_793893364015437_6756010821299781046_n1374744_793893360682104_4834728567599167820_n

Bueno aquí está todo, si necesitan alguna información extra nos pueden llamar o enviar un mail.

Saludos desde Patagonia Tecnology.

Share This