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












domingo, 5 de junio de 2016

Arduino uno y wifi ESP8266

Introducción

Vamos añadir conexión inalambrica por wifi a nuestro Arduino con la placa ESP8266. La placa ESP8266 es un dispositivo wifi bastante accesible que se puede encontrar a buen precio.

Elementos

Arduino uno
Placa wifi ESP8266
Fuente alimentación
Protoboard
Cables jumpers

Esquema


pin TX esp8266-pin 2 arduino
pin DX esp8266-pin 3 arduino
pin CH_PD esp8266-VCC protoboard fuente alimentación (ojo!!!, 3.3 voltios)
pin VCC esp8266-VCC protoboard fuente alimentación (ojo!!! 3.3 voltios)
pin GND esp8266-GND protoboard fuente alimentación
GND protoboard-GND arduino (ojo!!! esto es importante)


Código

#include <SoftwareSerial.h>
SoftwareSerial BT1(3,2); // RX | TX

void setup()
  {  Serial.begin(74880);
     BT1.begin(74880);
  }

void loop()
  {  String B= "." ;
     if (BT1.available())
         { char c = BT1.read() ;
           Serial.print(c);
         }
     if (Serial.available())
         {  char c = Serial.read();
            BT1.print(c);
         }
   }



Comandos AT

Una vez que inicia el modulo wifi abrimos la consola serial y nos saldrá una serie de caracteres seguido de "ready". Eso quiere decir que está listo para recibir comandos AT. Los comandos AT son los siguientes:

AT+ [intro] , el modulo responde OK
AT+RST , el modulo resetea
AT+CWMODE? , el modulo te dice en que modo está, si en el modo 1, 2, o 3.
AT+CWMODE=3 , ponemos el módulo en modo 3, el mio estaba en el 2 y lo dejo en el 3. En modo 3 sirve para enviar como para recibir datos.
AT+CWLAP , el módulo hace un rastreo de las conexiones wifi disponibles
AT+CWJAP="mired","micontraseña" , el modulo se conecta a la red que elijas, después de un rato responde OK y te muestra la IP a la cual se conecta.
AT+CIOBAUD=? , te muestra el rango de transmisión de datos
AT+CIOBAUD? , te muestra la velocidad actual de transmisión de datos
AT+CIOBAUD=74880 , cambiamos la velocidad de transmisión de datos a 74880 baudios si tuviera otra y siempre dentro del rango.

Más en este enlace.

Problemas que he tenido

El consumo del módulo wifi cuando arranca es muy elevado, del orden de 250 miliamperios a 300. El pin de arduino como máximo puede dar 70 miliamperios. Por eso es importante lo de la fuente de alimentación que nos va ha dar energía suficiente para poder arrancar el módulo. También hay conectar las masas de la fuente de alimentación y la placa arduino, ya que al no estar las masas conectadas, no sólo no va a funcionar el módulo, sino que podemos chamuscar algo.

La velocidad de transmisión de datos debe ser la misma que la velocidad del puerto serie, en caso contrario se envían y reciben caracteres distintos de los que se desean, en consecuencia se producen errores de lecturas.
Como ejemplo tenía la velocidad de trasmisión a 115200 baudios y la del puerto serie a 74880,  no conectaba con mi red wifi. Arduino uno no va muy bien con la velocidad del puerto serie a 115200 baudios, por tanto para que la información me llegara lo mejor posible cambié la velocidad de transmisión de datos a 74880 baudios y la del puerto serie a la misma.

Si iniciamos el modulo wifi y abrimos la consola serial y no nos aparece nada, desde el interruptor de la fuente de alimentación, apagamos y encendemos de nuevo.

Notas

El módulo wifi funciona a 3.3 voltios, ¡¡¡NO OLVIDAR!!!, 
Hay que ir probando las velocidades de trasmisión hasta dar con la que mejor se ajusta.
Conectar la masa de la fuente con la del arduino

Enlaces