Tabla de contenido:

PInt @ t10n: Sistema inteligente de monitoreo de plantas: 9 pasos
PInt @ t10n: Sistema inteligente de monitoreo de plantas: 9 pasos

Video: PInt @ t10n: Sistema inteligente de monitoreo de plantas: 9 pasos

Video: PInt @ t10n: Sistema inteligente de monitoreo de plantas: 9 pasos
Video: Cómo crear un DIAGRAMA de GANTT en Excel [ Cronograma usando los gráficos ] 2024, Noviembre
Anonim
PInt @ t10n: Sistema inteligente de monitoreo de plantas
PInt @ t10n: Sistema inteligente de monitoreo de plantas

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

Conecte sus sensores
Conecte sus sensores
Conecte sus sensores
Conecte sus sensores
Conecte sus sensores
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

Ibm Cloud
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

Configuración Node-RED: Luz
Configuración 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

Configuración Node-RED: Temperatura
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

Configuración Node-RED: Humedad
Configuración 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

Configuración Node-RED: Humedad
Configuración 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!