Taula de continguts:

PInt @ t10n: Sistema de control de plantes intel·ligents: 9 passos
PInt @ t10n: Sistema de control de plantes intel·ligents: 9 passos

Vídeo: PInt @ t10n: Sistema de control de plantes intel·ligents: 9 passos

Vídeo: PInt @ t10n: Sistema de control de plantes intel·ligents: 9 passos
Vídeo: Обзор планшета Rotor 10,1 дюйма 2024, De novembre
Anonim
PInt @ t10n: sistema de control de plantes intel·ligents
PInt @ t10n: sistema de control de plantes intel·ligents

PI @ nt @ t10n

Aquest projecte es va crear com a prova del núvol ibot iot. Utilitzem un esp-8266 per enviar i rebre dades des i des del núvol ibm. La comunicació entre l'esp i el núvol ibm passa per MQTT.

Per gestionar totes les dades i presentar a l’usuari una interfície d’usuari, fem servir node vermell. És molt amable per a principiants.

Per començar cal:

  • Esp-8266
  • dht 11/22 sensor de temperatura / humitat
  • díode fotosensible (mesurament de la llum)
  • zumbador
  • sensor d'humitat del terra
  • compte de núvol ibm

Pas 1: connecteu els vostres sensors

Connecteu els vostres sensors
Connecteu els vostres sensors
Connecteu els vostres sensors
Connecteu els vostres sensors
Connecteu els vostres sensors
Connecteu els vostres sensors

Com hem esmentat anteriorment, utilitzarem l’esp8266 per llegir i enviar dades del sensor. Per a aquest tutorial, assumirem que sabeu com connectar els vostres sensors al vostre microcontrolador. També cal saber com penjar codi a un esp8266.

El nostre model esp només té un port analògic, de manera que vam optar per rebre informació analògica del nostre sensor de llum perquè podem controlar la quantitat de llum que obté la planta.

La resta de sensors estan connectats digitalment. El nostre sensor DHT11 envia dades de manera digital i fem servir la biblioteca dht per interpretar les dades dels sensors.

A la part superior podeu trobar un esquema de circuits per als sensors que hem utilitzat. Però tingueu en compte que els sensors que hem utilitzat sovint inclouen un mòdul perquè pugueu connectar-lo fàcilment al vostre micro controlador sense totes les resistències addicionals que incloguem al diagrama.

Pas 2: Codi

Aquest és l'esbós d'arduino que hem utilitzat. Podeu obtenir informació sobre com funciona el codi si llegiu els comentaris.

#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 #define moisturePin 4 #define DHTType DHT11 DHT dht (DHTPin, DHTType); ESP8266WiFiMulti WiFiMulti; temperatura flotant = 0; humitat flotant = 0; humitat booleana = falsa; int light = 0; const char * ssid = STASSID; const char * contrasenya = STAPSK; const char * mqtt_server = "cmfwqk.messaging.internetofthings.ibmcloud.com"; WiFiClient espClient; Client 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-auth" #define "MQTT_ iot-2 / evt / status / fmt / json "#define MQTT_TOPIC_DISPLAY" iot-2 / cmd / update / fmt / json "#include" pitches.h "// notes a la melodia: // durades de la nota: 4 = quart nota, 8 = nota de vuitena, etc.: int shortTone = 80; int longTone = 200; int standardDelay = 50; int delayBetweenBars = 50; void setup_wifi () {delay (10); // Comencem connectant-nos a una xarxa WiFi Serial.println (); Serial.print ("Connexió a"); Serial.println (ssid); WiFi.begin (ssid, contrasenya); while (WiFi.status ()! = WL_CONNECTED) {demora (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi connectat"); Serial.println ("adreça IP:"); Serial.println (WiFi.localIP ()); } void devolució de trucada (tema char *, byte * càrrega útil, longitud int sense signar) {Serial.print ("Ha arribat el missatge ["); Serial.print (tema); Serial.print ("]"); for (int i = 0; i <length; i ++) {Serial.print ((char) càrrega útil ); } Serial.println (); StaticJsonDocument jsonBuffer; deserializeJson (jsonBuffer, càrrega útil); Arrel JsonObject = jsonBuffer.as (); if (arrel ["cançó"] == "darude") {darude (); } if (root ["cançó"] == "starwars") {starwars (); } if (root ["song"] == "jacques") {Serial.println ("jakakakakakkakaka"); jacques (); }} void reconnect () {// Bucle fins que ens tornem a connectar mentre (! client.connected ()) {Serial.print ("Intent de connexió MQTT …"); // Intenteu connectar-vos si (client.connect (MQTT_DEVICEID, MQTT_USER, MQTT_TOKEN)) {Serial.println ("connectat"); client.subscribe (MQTT_TOPIC_DISPLAY); } else {Serial.print ("fallen, rc ="); Serial.print (client.state ()); Serial.println ("torneu-ho a provar en 5 segons"); // Espereu 5 segons abans de tornar a provar el retard (5000); }}} void setup () {Serial.begin (9600); pinMode (moistPin, INPUT); dht.begin (); pinMode (0, OUTPUT); setup_wifi (); client.setServer (mqtt_server, MQTT_PORT); client.setCallback (devolució de trucada); retard (20); } void loop () {if (! client.connected ()) {reconnect (); } client.loop (); humitat = digitalRead (moistPin); llum = Llegir analògic (A0); temp = dht.readTemperature (); humitat = dht.readHumidity (); Serial.println ("Temperatura =" + Cadena (temp, 1) + "\ nHumitat =" + Cadena (humitat, 1) + "\ n Humitat:" + Cadena (humitat) + "\ n Llum:" + Cadena (llum)); String payload = "{" ts / ": {" t / ":" + Cadena (temp, 1) + ", \" h / ":" + Cadena (humitat, 1) + "}, \" ms / ": {" m / ":" + String (moist) + "}, \" ls / ": {" l / ":" + String (light) + "}}"; Serial.println (càrrega útil); if (client.publish (MQTT_TOPIC, (char *) payload.c_str ())) {Serial.println ("publicar bé"); } else {Serial.println ("publicació fallida"); } demora (2000); } void darude () {tone (0, NOTE_B3, ShortTone); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, to llarg); retard (LongTone); noTone (0); delay (delayBetweenBars); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, to llarg); retard (LongTone); noTone (0); delay (retard estàndard); to (0, NOTE_E4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_E4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_E4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_E4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_E4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_E4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_E4, to llarg); retard (LongTone); noTone (0); delay (retard estàndard); to (0, NOTE_D4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_D4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_D4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_D4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_D4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_D4, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_D4, to llarg); endarreriment (LongTone); noTone (0); delay (retard estàndard); to (0, NOTE_A3, to llarg); retard (LongTone); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, to llarg); retard (LongTone); noTone (0); delay (delayBetweenBars); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, to llarg); endarreriment (LongTone); noTone (0); delay (retard estàndard); to (0, NOTE_E4, to llarg); retard (LongTone); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, to llarg); retard (LongTone); noTone (0); delay (delayBetweenBars); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, To curt); endarreriment (Ton curt); noTone (0); delay (retard estàndard); to (0, NOTE_B3, to llarg); retard (LongTone); noTone (0); delay (retard estàndard); to (0, NOTE_E4, to llarg); endarreriment (LongTone); noTone (0); delay (retard estàndard); } void starwars () {pitit (NOTA_A4, 500); bip (NOTA_A4, 500); bip (NOTA_A4, 500); bip (NOTA_F4, 350); bip (NOTA_C5, 150); bip (NOTA_A4, 500); bip (NOTA_F4, 350); bip (NOTA_C5, 150); bip (NOTA_A4, 650); retard (500); bip (NOTE_E5, 500); bip (NOTE_E5, 500); bip (NOTE_E5, 500); bip (NOTA_F5, 350); bip (NOTA_C5, 150); bip (NOTE_GS4, 500); bip (NOTA_F4, 350); bip (NOTA_C5, 150); bip (NOTA_A4, 650); } void beep (int note, int duration) {// To de reproducció en to de pinzador (0, nota, durada); retard (durada); noTone (0); delay (retard estàndard); } void heartOfCourage () {} void jacques () {beep (NOTE_C4, 500); bip (NOTA_D4, 500); pit (NOTA_E4, 500); bip (NOTE_C4, 500); bip (NOTE_C4, 500); bip (NOTA_D4, 500); pit (NOTA_E4, 500); bip (NOTE_C4, 500); pit (NOTA_E4, 500); bip (NOTA_F4, 500); bip (NOTA_G4, 500); bip (NOTA_E4, 500); bip (NOTA_F4, 500); bip (NOTA_G4, 500); bip (NOTA_G4, 500); bip (NOTA_A4, 500); bip (NOTA_G4, 500); bip (NOTA_F4, 500); pit (NOTA_E4, 500); bip (NOTE_C4, 500); bip (NOTA_G4, 500); bip (NOTA_A4, 500); bip (NOTA_G4, 500); bip (NOTA_F4, 500); pit (NOTA_E4, 500); bip (NOTE_C4, 500); bip (NOTE_C4, 500); bip (NOTA_G4, 500); bip (NOTE_C4, 500); bip (NOTE_C4, 500); bip (NOTA_G4, 500); bip (NOTE_C4, 500); }

Pas 3: Ibm Cloud

Núvol Ibm
Núvol Ibm

Cal configurar una instància del núvol IBM. Podeu trobar informació al respecte a través d’aquest enllaç: github.

Pas 4: Node-VERMELL

Utilitzem vermell de node per gestionar la nostra lògica empresarial general i per visualitzar aquestes dades en una interfície d’usuari intuïtiva.

Pas 5: Configuració del node-VERMELL: clar

Configuració Node-RED: Llum
Configuració Node-RED: Llum

Importeu el codi següent al vostre projecte.

[{"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 ":" "," format ": "json", "name": "Obteniu dades de l'ESP", "service": "registrat", "allDevices": fals, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 120, "y": 62, "wires":

Pas 6: Configuració del node-VERMELL: temperatura

Configuració Node-RED: temperatura
Configuració Node-RED: temperatura

Importeu el codi següent al vostre projecte.

[{"id": "fbad3799.f0e0e", "type": "tab", "label": "Temperatura", "disabled": fals, "info": ""}, {"id": "b8618eb9. 1c9288 "," type ":" ibmiot in "," z ":" fbad3799.f0e0e "," authentication ":" boundService "," apiKey ":" "," inputType ":" evt "," logicInterface ":" "," ruleId ":" "," deviceId ":" ESP "," applicationId ":" "," deviceType ":" ESP8266 "," eventType ":" + "," commandType ":" "," format ": "json", "name": "Obteniu dades de l'ESP", "service": "registrat", "allDevices": fals, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 145.5, "y": 49, "wires":

Pas 7: Configuració del node-VERMELL: humitat

Configuració Node-RED: Humitat
Configuració Node-RED: Humitat

Importeu el codi següent al vostre projecte.

[{"id": "144cd53b.c00473", "type": "tab", "label": "Humitat", "disabled": fals, "info": ""}, {"id": "d958f58b. 2678e "," type ":" ibmiot in "," z ":" 144cd53b.c00473 "," authentication ":" boundService "," apiKey ":" "," inputType ":" evt "," logicInterface ":" "," ruleId ":" "," deviceId ":" ESP "," applicationId ":" "," deviceType ":" ESP8266 "," eventType ":" + "," commandType ":" "," format ": "json", "name": "Obteniu dades de l'ESP", "service": "registrat", "allDevices": fals, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 142, "y": 87, "wires":

Pas 8: Configuració del node-VERMELL: humitat

Configuració Node-RED: Humitat
Configuració Node-RED: Humitat

Importeu el codi següent al vostre projecte.

[{"id": "4ee73536.ec6fc4", "type": "tab", "label": "Humitat", "disabled": fals, "info": ""}, {"id": "a6daac3e. 2d5268 "," type ":" ibmiot out "," z ":" 4ee73536.ec6fc4 "," authentication ":" boundService "," apiKey ":" "," outputType ":" cmd "," deviceId ":" ESP "," deviceType ":" ESP8266 "," eventCommandType ":" update "," format ":" json "," data ":" msg "," qos ": 0," name ":" Enviar ordre a ESP "," service ":" registrat "," x ": 804.1944580078125," y ": 383.0000305175781," wires ": }, {" id ":" 4134fdb7.18e9b4 "," type ":" ibmiot in ", "z": "4ee73536.ec6fc4", "authentication": "boundService", "apiKey": "", "inputType": "evt", "logicInterface": "", "ruleId": "", "deviceId": "ESP", "applicationId": "", "deviceType": "ESP8266", "eventType": "update", "commandType": "", "format": "json", "name": "Obtén dades des de l'ESP "," servei ":" registrat "," tots els dispositius ": fals," totes les aplicacions ":" "," tots els dispositius tipus ": fals," totes les interfícies lògiques ":" "," tots els esdeveniments ": cert," tots els comandaments ":" ", "allFormats": false, "qos": 0, "x": 115, "y": 76, "wires":

Pas 9: Ja esteu fet

Enhorabona! ara teniu un sistema d'observació de plantes en funcionament.

Si teniu alguna pregunta, no dubteu en posar-vos en contacte amb nosaltres.