domingo, 12 de junio de 2016

Arduino uno, wifi ESP8266, sensor DS18B20 y ThingSpeak

Introducción

En esta entrada utilizaremos el sensor de temperatura (DS18B20), y lo conectaremos a la página ThingSpeak, para monitorizar en todo momento los valores de temperatura. Podríamos usar cualquier tipo de sensor, como presión, humedad, etc.... Vamos al lío.


Componentes

Protoboard
Arduino Uno
Fuente alimentación 9v 1A
Fuente alimentación protoboard 5v-3.3v
Sensor de temperatura DS18B20
Wifi ESP8266
Resistencia 4.7 k
Cables jumpers
ThingSpeak.com


Esquema




pin TX esp8266-pin 1 TX arduino
pin DX esp8266-pin 0 DX arduino
pin CH_PD esp8266-VCC protoboard fuente alimentación 3.3v
pin VCC esp8266-VCC protoboard fuente alimentación 3.3v
pin GND esp8266-GND protoboard fuente alimentación
pin GND ds18b20-GND protoboard
pin DATA ds18b20-pin 2 Arduino Uno
pin VCC ds18b20-protoboard fuente alimentación 5v
GND protoboard-GND Arduino Uno
5v protoboard-Vin Arduino Uno
Resistencia 4.7 entre pin DATA ds18b20-VCC ds18b20

Código


/*Sensor de Temperatura DS18B20 Instrucciones:
*/
  
#include <OneWire.h>
#include <DallasTemperature.h>
#define SSID "tured" //Nombre de la Red Wifi a la que nos conectamos
#define PASS "tucontraseña" //Contraseña de la Red Wifi
#define IP "184.106.153.149" // thingspeak.com
  
//Sustituir [WRITE_API_KEY] por la obtenida en thingspeak.com sin []
String GET_TEMP = "GET /update?key=0000000000000000&field1="; 
//Campo de temperatura, cambiamos los ceros por la key write

int DS18S20_Pin = 2; //pin donde conectamos sensor temperatura

OneWire ds(DS18S20_Pin);
DallasTemperature sensors(&ds);
float TemperaturaA;
long previousMillis = 0;
long interval = 300000; // 5 minutos entre lecturas

 
void setup()
{
 pinMode(13,OUTPUT);
  
 sensors.begin(); //Se inicializa sensor
 Serial.begin(74880); //Se inicializa el puerto Serial para comunicarse con el Modulo Wifi ESP8266
 Serial.setTimeout(3000); //Set el Timeout en 3 segundos para Serial.find()
 Serial.println("AT\r"); //PROBAR CON \n\r
  
 delay(2000);
  
 if(Serial.find("OK")){ //Verificar si Modulo Wifi responde
    if(!connectWiFi()){ //Conectarse a la red
       Serial.println("NO SE PUDO CONECTAR A RED WIFI");
    }
 } else {
    Serial.println("MODULO WIFI NO RESPONDE");
 }
}
  
void loop(){
 sensors.requestTemperatures();
 TemperaturaA=sensors.getTempCByIndex(0);
 char bufferTemp[8]; //Crear buffer temporal para convertir float a string
 String temperatura = dtostrf(TemperaturaA, 8, 1, bufferTemp); 
//Convertir de float a String 8 = longitud de String, 1 = numero de decimales. (e.g. 1234.5)
 
 unsigned long currentMillis = millis();
 if (currentMillis - previousMillis > interval){
  previousMillis = currentMillis;

  updateTemp(temperatura);
  digitalWrite(13,HIGH);
  delay(300);
  digitalWrite(13,LOW); 
 }  
}
  
void updateTemp(String temp){
  
 String cmd = "AT+CIPSTART=\"TCP\",\""; //Crear el comando para comenzar una conexion TCP
 cmd += IP; //IP del sitio a conectarse (thingspeak.com)
 cmd += "\",80"; //Puerto (80)
 Serial.println(cmd); //Crear conexion
 delay(2000); //Darle 2 segundos para responder
 
  
 if(Serial.find("ERROR")){
    return; //No se pudo conectar
 }
  
 temp.trim(); //Remover espacios e.g. "____30.00" >> "30.00"
  
 cmd = GET_TEMP; //Crear datos a enviar
 cmd += temp; //Agregar la temperatura leida
 cmd += "\r\n"; //Agregar caracteres de newline y Carriage return
  
 Serial.print("AT+CIPSEND="); //Indicar cuantos datos se enviaran por TCP
 Serial.println(cmd.length()); //Tamaño de los datos a enviar por TCP
 
 delay(2000);
  
 if(Serial.find(">")){
    Serial.print(cmd); //Enviar datos
 }else{
    Serial.println("AT+CIPCLOSE"); //No se pudo ejecutar, cerrar conexion TCP
 }
}
  

  
//Funcion para crear conexion Wifi. Regresa true si se conecta exitosamente, si no false.
boolean connectWiFi(){
  
 Serial.println("AT+CWMODE=3"); //Configurar Modulo Wifi ESP8266 en Modo 3 = Station + Access Point (Trasmitir y Recibir)
 delay(2000); //Darle tiempo para ejecutar comando
  
 String cmd="AT+CWJAP=\""; //
 cmd+=SSID;
 cmd+="\",\"";
 cmd+=PASS;
 cmd+="\"";
 
 //cmd = AT+CWJAP="SSID","PASS"
  
 Serial.println(cmd);
 delay(10000); //Darle 10 segundos para conectarse
  
 if(Serial.find("OK")){ 
    return true; //Conexión existosa
 }else{
    return false; //No se pudo conectar
 }
}


ThingSpeak

ThingSpeak es una web dedicada a la monitorización de sensores. Básicamente es para "el internet de las cosas".
El registro y uso es gratuito, y dispone de un montón de tutoriales, además de una extensa comunidad de usuarios. Una vez que te registres tienes acceso a un canal propio, donde conectar los sensores que desees.
Este tutorial es para empezar en ThingSpeak.

Notas

Ojo, la placa ESP8266 va a 3.3 voltios!!!!
ThingSpeak recibe un dato de temperatura cada 5 minutos, podemos cambiarlo, pero no menos de 20 segundos, que es lo que necesita la web para actualizar los datos.
Cambiar "mired", "micontraseña" y los ceros de la api key por los vuestros (ver código)

Enlaces












No hay comentarios:

Publicar un comentario