Lectura de temperatura DHT22 activada por SMS con Arduino Mega 2560
Componentes y materiales
| Componente | Cantidad |
|---|---|
| Arduino Mega 2560 | 1 |
| Sensor de temperatura DHT22 | 1 |
| Módulo SIM800L | 1 |
| Resistencia 10k ohm | 1 |
| Protoboard (genérico) | 1 |
| Cables de conexión (genéricos) | 1 |
Sobre el proyecto
Hola. Este proyecto es parte de uno mucho mayor. Tuve muchos problemas con esta parte y al encontrar solución, decidí compartirla para ayudar a la comunidad.
Descripción del proyecto
Enviar SMS al Arduino y recibir la temperatura en casa.
Software
Para el módulo SIM800L usé la librería "Seeeduino_GPRS-master". Tuve que cambiar en "sim800.h" las líneas:
#define SIM800_TX_PIN 8
#define SIM800_RX_PIN 7
... a TX_PIN 10 y RX_PIN 11. Cambiar la librería de "SoftwareSerial" a uno de los puertos serie hardware del Mega (Serial3) era muy difícil, así que tomé el camino fácil.
El problema
Mi código es copiar/pegar de ejemplos de "DHT.h" y "Seeeduino_GPRS-master". El problema: el ejemplo "gprs.h" solo mostraba cómo enviar un mensaje predeterminado entre comillas. No lograba enviar el valor float variable del sensor de temperatura. Lo mismo con otras librerías: "GPRS_SIM900-master" y "SIM800L-master".
Pasé semanas buscando ejemplos en la web sin encontrar ninguno. Vi posts en foros sobre el mismo tema, y para esas pobres almas sin respuesta, espero que encuentren esta publicación.
La solución
¡Convertir el valor float a String y luego el String a array de caracteres (char array) - simple!
Fragmento de código clave
MyString = String(temp, 0); // Convertir float a String
MyString = (MyString + " Grados C");
// Convertir string a char array
int str_len = MyString.length() + 1;
char char_array[str_len];
MyString.toCharArray(char_array, str_len);
// Fin conversión
gprs.sendSMS("04++++++++", char_array); // número de teléfono y texto
Conexiones
Usé una batería ULTRAFIRE 18650 para alimentar el módulo SIM. Luego añadiré regulador de voltaje. Ver este tutorial.
Material de referencia
Librerías
Código completo
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#include <gprs.h>
#include <softwareserial.h>
#define TIMEOUT 5000
GPRS gprs;
bool ITemp = false;
float temp;
String MyString;
#define LED_PIN 13
bool ledStatus;
char currentLine[500] = "";
int currentLineIndex = 0;
bool nextLineIsMessage = false;
void Reply() {
Serial.println("GPRS - Send SMS Test ...");
gprs.preInit();
delay(1000);
while(0 != gprs.init()) {
delay(1000);
Serial.print("init error\r\n");
}
Serial.println("Init success, start to send SMS message...");
if (ITemp == true) {
float t = dht.readTemperature();
temp = t;
ITemp = false;
}
MyString = String(temp, 0);
MyString = (MyString + " Grados C");
int str_len = MyString.length() + 1;
char char_array[str_len];
MyString.toCharArray(char_array, str_len);
gprs.sendSMS("04++++++++", char_array);
}
void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");
dht.begin();
gprs.preInit();
delay(1000);
while(0 != gprs.init()) {
delay(1000);
Serial.print("init error\r\n");
}
if(0 != gprs.sendCmdAndWaitForResp("AT+CMGF=1\r\n", "OK", TIMEOUT)) {
ERROR("ERROR:CNMI"); return;
}
if(0 != gprs.sendCmdAndWaitForResp("AT+CNMI=1,2,0,0,0\r\n", "OK", TIMEOUT)) {
ERROR("ERROR:CNMI"); return;
}
Serial.println("Init success");
}
void loop() {
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("Humedad: "); Serial.print(h); Serial.println(" %\t");
Serial.print("Temperatura: "); Serial.print(t); Serial.println(" *C ");
SIM();
}
void SIM() {
digitalWrite(LED_PIN, ledStatus);
Serial.println("Buscando SMS");
if(gprs.serialSIM800.available()) {
char lastCharRead = gprs.serialSIM800.read();
if(lastCharRead == '\r' || lastCharRead == '\n') {
String lastLine = String(currentLine);
if(lastLine.startsWith("+CMT:")) {
Serial.println(lastLine);
nextLineIsMessage = true;
} else if (lastLine.length() > 0) {
if(nextLineIsMessage) {
Serial.println(lastLine);
if(lastLine.indexOf("InTemp") >= 0) {
Serial.println("InTemp");
ITemp = true;
Reply();
}
nextLineIsMessage = false;
}
}
for(int i = 0; i < sizeof(currentLine); ++i) currentLine[i] = (char)0;
currentLineIndex = 0;
} else {
currentLine[currentLineIndex++] = lastCharRead;
}
}
}
Esquemáticos
Proceso de manufactura
- Ventilador controlado por temperatura: sistema DIY con relé para refrigeración de muebles multimedia
- Construya un registrador de temperatura con Raspberry Pi y sensor I2C de 5 $
- Cómo leer temperatura con un DS18B20 en Raspberry Pi 2
- Monitorización profesional de temperatura con Raspberry Pi y DS18B20
- Medición de temperatura en Raspberry Pi con sensores 1-Wire Maxim y puente I2C DS2482
- Monitorización precisa de temperatura en armario de servidores con Raspberry Pi
- Tutorial IoT para principiantes: Streaming de datos de temperatura desde Raspberry Pi
- Construya una Estación Meteorológica de Laboratorio Habilitada para Red con Raspberry Pi
- Monitor de temperatura casero con Raspberry Pi, MCP9808, InfluxDB y Grafana
- Construye un Rover con Windows IoT Core en Raspberry Pi 2 – Guía de Principiante a Avanzado
- AuGe12: Aleación Premium de Soldadura Blanda a Base de Oro