Tabla de contenido:
- Paso 1: conecte sus sensores
- Paso 2: Código
- Paso 3: Ibm Cloud
- Paso 4: Node-RED
- Paso 5: Configuración de Node-RED: Luz
- Paso 6: Configuración Node-RED: Temperatura
- Paso 7: Configuración de Node-RED: Humedad
- Paso 8: Configuración de Node-RED: Humedad
- Paso 9: ¡Listo
Video: PInt @ t10n: Sistema inteligente de monitoreo de plantas: 9 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:42
PI @ nt @ t10n
Este proyecto se creó como prueba para ibm iot cloud. Usamos un esp-8266 para enviar y recibir datos desde y hacia la nube de ibm. La comunicación entre esp e ibm cloud se realiza a través de MQTT.
Para manejar todos los datos y presentar al usuario una interfaz de usuario usamos node-red. Es muy amigable para principiantes.
Para empezar necesitas:
- Esp-8266
- Sensor de temperatura / humedad dht 11/22
- diodo fotosensible (medición de luz)
- zumbador
- sensor de humedad del suelo
- cuenta en la nube de ibm
Paso 1: conecte sus sensores
Como mencionamos anteriormente, usaremos el esp8266 para leer y enviar datos del sensor. Para este tutorial, asumiremos que sabe cómo conectar sus sensores a su microcontrolador. También necesita saber cómo cargar código en un esp8266.
Nuestro modelo esp solo tiene un puerto analógico, por lo que elegimos recibir información analógica de nuestro sensor de luz porque entonces podemos monitorear cuánta luz recibe la planta.
Todos los demás sensores están conectados digitalmente. Nuestro sensor DHT11 envía datos digitalmente y usamos la biblioteca dht para interpretar los datos de los sensores.
Arriba puede encontrar un diagrama de circuito para los sensores que usamos. Pero tenga en cuenta que los sensores que usamos a menudo vienen con un módulo para que pueda conectarlo fácilmente a su microcontrolador sin todas las resistencias adicionales que incluimos en el diagrama.
Paso 2: Código
Este es el boceto de arduino que usamos. Puede aprender cómo funciona el código si lee los comentarios.
#include ArduinoJson.h #include DHT_U.h #include DHT.h #include ESP8266WiFi.h #include ESP8266WiFiMulti.h #include PubSubClient.h
#define STASSID "ucll-projectweek-IoT" #define STAPSK "Foo4aiHa" #define DHTPin 5 #defineiditypin 4 #define DHTType DHT11 DHT dht (DHTPin, DHTType); ESP8266WiFiMulti WiFiMulti; temperatura de flotación = 0; humedad de flotación = 0; humedad booleana = falso; int light = 0; const char * ssid = STASSID; const char * contraseña = STAPSK; const char * mqtt_server = "cmfwqk.messaging.internetofthings.ibmcloud.com"; WiFiClient espClient; Cliente PubSubClient (espClient); long lastMsg = 0; char msg [50]; valor int = 0; #define MQTT_HOST "cmfwqk.messaging.internetofthings.ibmcloud.com" #define MQTT_PORT 1883 #define MQTT_DEVICEID "d: cmfwqk: ESP8266: ESP" #define MQTT_USER "use-token-token-autodisciplina" #deft_user "use-token-token-mqt" iot-2 / evt / status / fmt / json "#define MQTT_TOPIC_DISPLAY" iot-2 / cmd / update / fmt / json "#include" pitches.h "// notas en la melodía: // duraciones de las notas: 4 = cuarto nota, 8 = corchea, etc.: int shortTone = 80; int longTone = 200; int standardDelay = 50; int delayBetweenBars = 50; void setup_wifi () {retraso (10); // Empezamos por conectarnos a una red WiFi Serial.println (); Serial.print ("Conectando a"); Serial.println (ssid); WiFi.begin (ssid, contraseña); while (WiFi.status ()! = WL_CONNECTED) {retraso (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi conectado"); Serial.println ("dirección IP:"); Serial.println (WiFi.localIP ()); } devolución de llamada void (char * tema, byte * carga útil, longitud int sin firmar) {Serial.print ("Mensaje llegado ["); Serial.print (tema); Serial.print ("]"); for (int i = 0; i <longitud; i ++) {Serial.print ((char) payload ); } Serial.println (); StaticJsonDocument jsonBuffer; deserializeJson (jsonBuffer, carga útil); JsonObject root = jsonBuffer.as (); if (root ["canción"] == "darude") {darude (); } if (root ["canción"] == "starwars") {starwars (); } if (root ["canción"] == "jacques") {Serial.println ("jakakakakakkakaka"); jacques (); }} void reconnect () {// Bucle hasta que nos volvamos a conectar while (! client.connected ()) {Serial.print ("Intentando conexión MQTT…"); // Intente conectarse if (client.connect (MQTT_DEVICEID, MQTT_USER, MQTT_TOKEN)) {Serial.println ("conectado"); cliente.subscribe (MQTT_TOPIC_DISPLAY); } else {Serial.print ("fallido, rc ="); Serial.print (client.state ()); Serial.println ("inténtelo de nuevo en 5 segundos"); // Espere 5 segundos antes de volver a intentarlo (5000); }}} void setup () {Serial.begin (9600); pinMode (humedadPin, ENTRADA); dht.begin (); pinMode (0, SALIDA); setup_wifi (); client.setServer (mqtt_server, MQTT_PORT); client.setCallback (devolución de llamada); retraso (20); } bucle vacío () {if (! cliente.conectado ()) {reconectar (); } client.loop (); humedad = digitalRead (humedadPin); luz = analogRead (A0); temp = dht.readTemperature (); humedad = dht.readHumidity (); Serial.println ("Temperature =" + String (temp, 1) + "\ nHumedad =" + String (humedad, 1) + "\ nMoisture:" + String (humedad) + "\ nLight:" + String (luz)); String payload = "{" ts / ": {" t / ":" + String (temp, 1) + ", \" h / ":" + String (humedad, 1) + "}, \" ms / ": {" m / ":" + Cadena (humedad) + "}, \" ls / ": {" l / ":" + Cadena (luz) + "}}"; Serial.println (carga útil); if (cliente.publicar (MQTT_TOPIC, (char *) payload.c_str ())) {Serial.println ("publicar ok"); } else {Serial.println ("publicación fallida"); } retraso (2000); } void darude () {tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, longTone); retraso (tono largo); noTone (0); delay (delayBetweenBars); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, longTone); retraso (tono largo); noTone (0); retardo (retardo estándar); tono (0, NOTE_E4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_E4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_E4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_E4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_E4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_E4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_E4, tono largo); retraso (tono largo); noTone (0); retardo (retardo estándar); tono (0, NOTE_D4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_D4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_D4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_D4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_D4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_D4, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_D4, longTone); retraso (tono largo); noTone (0); retardo (retardo estándar); tono (0, NOTE_A3, longTone); retraso (tono largo); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, longTone); retraso (tono largo); noTone (0); delay (delayBetweenBars); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, longTone); retraso (tono largo); noTone (0); retardo (retardo estándar); tono (0, NOTE_E4, longTone); retraso (tono largo); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, longTone); retraso (tono largo); noTone (0); delay (delayBetweenBars); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, shortTone); retraso (tono corto); noTone (0); retardo (retardo estándar); tono (0, NOTE_B3, longTone); retraso (tono largo); noTone (0); retardo (retardo estándar); tono (0, NOTE_E4, longTone); retraso (tono largo); noTone (0); retardo (retardo estándar); } void starwars () {bip (NOTE_A4, 500); pitido (NOTE_A4, 500); pitido (NOTE_A4, 500); pitido (NOTE_F4, 350); pitido (NOTE_C5, 150); pitido (NOTE_A4, 500); bip (NOTE_F4, 350); pitido (NOTE_C5, 150); pitido (NOTE_A4, 650); retraso (500); pitido (NOTE_E5, 500); pitido (NOTE_E5, 500); pitido (NOTE_E5, 500); bip (NOTE_F5, 350); pitido (NOTE_C5, 150); pitido (NOTE_GS4, 500); pitido (NOTE_F4, 350); pitido (NOTE_C5, 150); pitido (NOTE_A4, 650); } void beep (int note, int duration) {// Reproducir tono en buzzerPin tone (0, nota, duración); retraso (duración); noTone (0); retardo (retardo estándar); } void heartOfCourage () {} void jacques () {bip (NOTE_C4, 500); pitido (NOTE_D4, 500); pitido (NOTE_E4, 500); pitido (NOTE_C4, 500); pitido (NOTE_C4, 500); pitido (NOTE_D4, 500); pitido (NOTE_E4, 500); pitido (NOTE_C4, 500); pitido (NOTE_E4, 500); pitido (NOTE_F4, 500); pitido (NOTE_G4, 500); pitido (NOTE_E4, 500); pitido (NOTE_F4, 500); pitido (NOTE_G4, 500); pitido (NOTE_G4, 500); pitido (NOTE_A4, 500); pitido (NOTE_G4, 500); pitido (NOTE_F4, 500); pitido (NOTE_E4, 500); pitido (NOTE_C4, 500); pitido (NOTE_G4, 500); pitido (NOTE_A4, 500); pitido (NOTE_G4, 500); pitido (NOTE_F4, 500); pitido (NOTE_E4, 500); pitido (NOTE_C4, 500); pitido (NOTE_C4, 500); pitido (NOTE_G4, 500); pitido (NOTE_C4, 500); pitido (NOTE_C4, 500); pitido (NOTE_G4, 500); pitido (NOTE_C4, 500); }
Paso 3: Ibm Cloud
Necesita configurar una instancia de IBM en la nube. Puede encontrar información sobre esto a través de este enlace: github.
Paso 4: Node-RED
Usamos node-red para manejar nuestra lógica comercial general y para visualizar estos datos en una interfaz de usuario intuitiva.
Paso 5: Configuración de Node-RED: Luz
Importe el siguiente código a su proyecto.
[{"id": "deb0d57.1c46528", "type": "tab", "label": "Light", "disabled": false, "info": ""}, {"id": "8a0fcaac. 4e54 "," type ":" ibmiot in "," z ":" deb0d57.1c46528 "," authentication ":" boundService "," apiKey ":" "," inputType ":" evt "," logicInterface ":" "," ruleId ":" "," deviceId ":" ESP "," applicationId ":" "," deviceType ":" ESP8266 "," eventType ":" + "," commandType ":" "," formato ": "json", "nombre": "Obtener datos de ESP", "servicio": "registrado", "allDevices": false, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 120, "y": 62, "cables":
Paso 6: Configuración Node-RED: Temperatura
Importe el siguiente código a su proyecto.
[{"id": "fbad3799.f0e0e", "type": "tab", "label": "Temperature", "disabled": false, "info": ""}, {"id": "b8618eb9. 1c9288 "," type ":" ibmiot in "," z ":" fbad3799.f0e0e "," authentication ":" boundService "," apiKey ":" "," inputType ":" evt "," logicInterface ":" "," ruleId ":" "," deviceId ":" ESP "," applicationId ":" "," deviceType ":" ESP8266 "," eventType ":" + "," commandType ":" "," formato ": "json", "nombre": "Obtener datos de ESP", "servicio": "registrado", "allDevices": false, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 145.5, "y": 49, "cables":
Paso 7: Configuración de Node-RED: Humedad
Importe el siguiente código a su proyecto.
[{"id": "144cd53b.c00473", "type": "tab", "label": "Humedad", "disabled": false, "info": ""}, {"id": "d958f58b. 2678e "," tipo ":" ibmiot in "," z ":" 144cd53b.c00473 "," autenticación ":" boundService "," apiKey ":" "," inputType ":" evt "," logicInterface ":" "," ruleId ":" "," deviceId ":" ESP "," applicationId ":" "," deviceType ":" ESP8266 "," eventType ":" + "," commandType ":" "," formato ": "json", "nombre": "Obtener datos de ESP", "servicio": "registrado", "allDevices": false, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 142, "y": 87, "cables":
Paso 8: Configuración de Node-RED: Humedad
Importe el siguiente código a su proyecto.
[{"id": "4ee73536.ec6fc4", "type": "tab", "label": "Humedad", "disabled": false, "info": ""}, {"id": "a6daac3e. 2d5268 "," type ":" ibmiot out "," z ":" 4ee73536.ec6fc4 "," authentication ":" boundService "," apiKey ":" "," outputType ":" cmd "," deviceId ":" ESP "," deviceType ":" ESP8266 "," eventCommandType ":" actualización "," formato ":" json "," datos ":" msg "," qos ": 0," nombre ":" Enviar comando a ESP "," servicio ":" registrado "," x ": 804.1944580078125," y ": 383.0000305175781," cables ": }, {" id ":" 4134fdb7.18e9b4 "," tipo ":" ibmiot en ", "z": "4ee73536.ec6fc4", "autenticación": "boundService", "apiKey": "", "inputType": "evt", "logicInterface": "", "ruleId": "", "deviceId": "ESP", "applicationId": "", "deviceType": "ESP8266", "eventType": "update", "commandType": "", "format": "json", "name": "Obtener datos de ESP "," servicio ":" registrado "," allDevices ": falso," allApplications ":" "," allDeviceTypes ": falso," allLogicalInterfaces ":" "," allEvents ": true," allCommands ":" ", "allFormats": false, "qos": 0, "x": 115, "y": 76, "cables":
Paso 9: ¡Listo
¡Felicidades! ahora tiene un sistema de observación de plantas en funcionamiento.
Si tienes alguna pregunta, ¡no dudes en contactarnos!