Obtener los datos del sensor NPK con Envío de Datos por SMS usando SIM800L
Realizar una llamada y obtener los datos del sensor NPK en un SMS
Presentación.
El propósito de este proyecto es desarrollar un sistema de monitoreo del sensor NPK y un módulo de comunicación SIM800L. Este sistema permite a los usuarios obtener los datos del suelo de manera remota mediante una llamada telefónica, después de la cual los datos se envían automáticamente por SMS.
Funcionamiento.
- El Arduino inicializa el módulo SIM800L y el sensor NPK.
- El sistema verifica la conexión GSM y la disponibilidad de la red móvil.
- El módulo SIM800L está configurado para detectar llamadas entrantes.
- Cuando se recibe una llamada, el sistema cuelga automáticamente.
- El Arduino lee los valores del sensor NPK.
- Los valores obtenidos se almacenan en variables.
- Después de detectar una llamada, el Arduino envía un SMS al número del llamante con los datos de los niveles de NPK.
- El SMS contiene un mensaje con los valores actuales del sensor, proporcionando una actualización rápida y precisa.
Realización.
Materiales
- Arduino UNO
- módulo SIM800L
- SIM TELCEL
- 1 Capacitor
- Sensor NPK
- Bus
- Protoboard
- Cables para las conexiones
Conexiones
SIM800L |
ARDUINO |
5V |
5V |
GND |
GND |
TX |
PIN7 |
RX |
PIN8 |
GND |
GND |
VDD |
|
RS485 |
ARDUINO |
GND |
GND |
RX |
PIN2 |
TX |
PIN3 |
VCC |
5V |
RS485 |
Sensor NPK |
B |
B |
A+ |
A+ |
SENSOR NPK - ARDUINO |
|
GND |
GND |
VCC |
5V |
Programación.
Inclusión de Bibliotecas
#include
#include
SoftwareSerial.h: Biblioteca que permite crear puertos seriales adicionales en pines digitales del Arduino.
Wire.h: Biblioteca para la comunicación I2C, aunque no parece ser utilizada en este código.
Declaración de Puertos Seriales
// RX, TX para SIM800L y sensor NPK
SoftwareSerial mySerial(7, 8);
SoftwareSerial mod(2, 3);
mySerial: Define un puerto serial en los pines digitales 7 (RX) y 8 (TX) para el módulo SIM800L.
mod: Define otro puerto serial en los pines 2 (RX) y 3 (TX) para el sensor NPK.
Comando y Variables para el Sensor NPK
const byte todo[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x07, 0x04, 0x08};
byte values[19];
float hum, temp, con, ph, n, p, k;
bool primeraVuelta = true;
bool yaLlamada = false;
todo: Array de bytes que representa el comando para leer el sensor NPK.
values: Array para almacenar los datos recibidos del sensor.
hum, temp, con, ph, n, p, k: Variables para almacenar los valores procesados de humedad, temperatura, conductividad, pH, nitrógeno, fósforo y potasio.
primeraVuelta: Booleano que indica si es la primera vez que se lee el sensor.
yaLlamada: Booleano que indica si ya se ha procesado una llamada.
Configuración Inicial
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
mod.begin(4800);
delay(1000);
// Inicializar el módulo SIM800L
sendCommand("AT");
sendCommand("AT+CLIP=1");
sendCommand("AT+CMGF=1");
sendCommand("AT+CNMI=1,2,0,0,0");
Serial.println(" ---Buscando señal--- ");
}
Serial.begin(9600): Inicializa la comunicación serial con la PC.
mySerial.begin(9600): Inicializa la comunicación serial con el módulo SIM800L.
mod.begin(4800): Inicializa la comunicación serial con el sensor NPK.
sendCommand("AT"), sendCommand("AT+CLIP=1"), sendCommand("AT+CMGF=1"), sendCommand("AT+CNMI=1,2,0,0,0"): Envía comandos AT al módulo SIM800L para inicializarlo.
Serial.println(" ---Buscando señal--- "): Imprime un mensaje en la consola serial indicando que está buscando señal.
Bucle Principal
void loop() {
if (primeraVuelta) {
leerSensorNPK();
primeraVuelta = false;
yaLlamada = true;
}
if (yaLlamada) {
mySerial.listen(); // Asegurarse de que mySerial esté escuchando
if (mySerial.available()) {
String quienLlama = mySerial.readString();
if (quienLlama.indexOf("RING") > -1) {
delay(1000);
String num;
int inicio = quienLlama.indexOf('"') + 1;
int fin = quienLlama.indexOf('"', inicio);
num = quienLlama.substring(inicio, fin);
Serial.println("Llamada de: " + num);
// Atender y colgar la llamada
sendCommand("ATA");
delay(2000);
sendCommand("ATH");
// Enviar SMS con los datos del sensor
envio_sms(num);
yaLlamada = false;
} } }
delay(1000);
}
if (primeraVuelta): Verifica si es la primera vez que se ejecuta el bucle y llama a leerSensorNPK() para obtener los datos del sensor.
mySerial.listen(): Asegura que el puerto serial mySerial esté activo.
if (mySerial.available()): Verifica si hay datos disponibles en mySerial.
String quienLlama = mySerial.readString(): Lee la cadena entrante del módulo SIM800L.
if (quienLlama.indexOf("RING") > -1): Comprueba si hay una llamada entrante.
String num = quienLlama.substring(inicio, fin): Extrae el número de teléfono del llamante.
sendCommand("ATA"), delay(2000), sendCommand("ATH"): Contesta y cuelga la llamada.
envio_sms(num): Llama a la función para enviar un SMS con los datos del sensor al número del llamante.
Enviar SMS
void envio_sms(String num) {
String mensaje = prepararMensaje();
Serial.println("Enviando SMS a " + num);
sendCommand("AT+CMGF=1"); // Modo texto
delay(1000);
mySerial.print("AT+CMGS="");
mySerial.print(num);
mySerial.println(""");
delay(1000);
mySerial.println(mensaje);
delay(100);
mySerial.write(26); // Ctrl+Z para finalizar el mensaje
delay(5000);
Serial.println("SMS Enviado...");
}
String mensaje = prepararMensaje(): Prepara el mensaje con los datos del sensor.
sendCommand("AT+CMGF=1"): Configura el módulo en modo de texto.
mySerial.print("AT+CMGS=""), mySerial.print(num), mySerial.println("""): Envía el comando AT para iniciar el envío de SMS al número especificado.
mySerial.println(mensaje): Envía el mensaje de texto.
mySerial.write(26): Envía el carácter Ctrl+Z para finalizar el mensaje.
delay(5000): Espera a que el envío del SMS se complete.
Enviar Comandos AT
void sendCommand(String command) {
mySerial.println(command);
delay(1000);
while (mySerial.available()) {
Serial.write(mySerial.read());
}
}
mySerial.println(command): Envía el comando AT al módulo SIM800L.
while (mySerial.available()): Serial.write(mySerial.read()): Lee y muestra la respuesta del módulo SIM800L en la consola serial.
Leer el Sensor NPK
void leerSensorNPK() {
Serial.println("Leyendo sensor NPK...");
mod.write(todo, 8);
delay(100);
for (byte i = 0; i < 19; i++) {
if (mod.available()) {
values[i] = mod.read();
} else {
values[i] = 0;
} }
hum = (values[3] * 256 + values[4]) / 10.0;
temp = (values[5] * 256 + values[6]) / 10.0;
con = (values[7] * 256 + values[8]) / 10.0;
ph = (values[9] * 256 + values[10]) / 10.0;
n = (values[11] * 256 + values[12]) / 10.0;
p = (values[13] * 256 + values[14]) / 10.0;
k = (values[15] * 256 + values[16]) / 10.0;
Serial.print("Humedad: "); Serial.print(hum); Serial.println(" %");
Serial.print("Temperatura: "); Serial.print(temp); Serial.println(" °C");
Serial.print("Conductividad: "); Serial.print(con); Serial.println(" us/cm");
Serial.print("PH: "); Serial.print(ph); Serial.println();
Serial.print("N: "); Serial.print(n); Serial.println(" mg/kg");
Serial.print("P: "); Serial.print(p); Serial.println(" mg/kg");
Serial.print("K: "); Serial.print(k); Serial.println(" mg/kg");
}
mod.write(todo, 8): Envía el comando para leer el sensor NPK.
for (byte i = 0; i < 19; i++): Lee los datos recibidos del sensor NPK.
hum, temp, con, ph, n, p, k: Calcula los valores de humedad, temperatura, conductividad, pH, nitrógeno, fósforo y potasio.
Serial.print: Imprime los valores en la consola serial.
Preparar Mensaje
String prepararMensaje() {
String mensaje = "Datos del sensor NPK: ";
mensaje += "Humedad: " + String(hum, 1) + " % ";
mensaje += "Temperatura: " + String(temp, 1) + " °C ";
mensaje += "Conductividad: " + String(con, 1) + " us/cm ";
mensaje += "PH: " + String(ph, 1) + " ";
mensaje += "N: " + String(n, 1) + " mg/kg ";
mensaje += "P: " + String(p, 1) + " mg/kg ";
mensaje += "K: " + String(k, 1) + " mg/kg ";
return mensaje;
}
String prepararMensaje(): Crea una cadena con los datos del sensor NPK formateados para enviar por SMS.
Utilización.
En nuestra aplicación de teléfono, realizamos una llamada al SIM TELCEL con el módulo SIM800L
Esperamos, la llamada se cortara automáticamente.
Se recibe un mensaje de texto del módulo con los datos del sensor
Conclusiones.
Miguel: El proyecto de monitoreo de niveles de NPK en el suelo con envío de datos por SMS utilizando el módulo SIM800L permitió aplicar y consolidar nuestros conocimientos en TIC. A lo largo del desarrollo, enfrentamos desafíos como la integración de sensores con módulos de comunicación y la gestión de energía del sistema. Superar estos obstáculos mejoró nuestras habilidades en la programación de microcontroladores y en la resolución de problemas de comunicación serial, proporcionando una experiencia práctica valiosa y relevante para nuestro campo de estudio.
Isaac: A través de este proyecto, obtuvimos una comprensión más profunda de la interacción entre hardware y software en sistemas de monitoreo remoto. Aunque nos encontramos con dificultades como la configuración correcta del módulo SIM800L y la calibración del sensor NPK, estas experiencias nos enseñaron la importancia de la paciencia y la atención al detalle. El éxito final en la obtención y envío de datos por SMS no solo reforzó nuestras competencias técnicas, sino que también abrió nuevas oportunidades de aprendizaje y desarrollo en nuestra carrera.