Innehållsförteckning:
- Steg 1: Anslut dina sensorer
- Steg 2: Kod
- Steg 3: Ibm Cloud
- Steg 4: Nod-RÖD
- Steg 5: Node-RED Setup: Light
- Steg 6: Node-RED Setup: Temperatur
- Steg 7: Node-RED Setup: Luftfuktighet
- Steg 8: Node-RED Setup: Fukt
- Steg 9: Du är klar
Video: PInt@t10n: Smart Plant Monitoring System: 9 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:45
Detta projekt skapades som ett test för ibm iot -molnet. Vi använder en esp-8266 för att skicka och ta emot data till och från ibm-molnet. Kommunikationen mellan esp och ibm -molnet sker via MQTT.
För att hantera all data och för att presentera användaren med ett användargränssnitt använder vi nod-rött. Det är mycket nybörjarvänligt.
För att komma igång behöver du:
- Esp-8266
- dht 11/22 temp/fuktgivare
- ljuskänslig diod (ljusmätning)
- summer
- markfuktighetssensor
- ibm molnkonto
Steg 1: Anslut dina sensorer
Som vi nämnde tidigare kommer vi att använda esp8266 för att läsa och skicka sensordata. För denna handledning antar vi att du vet hur du ansluter dina sensorer till din mikrokontroller. Du behöver också redan veta hur du laddar upp kod till en esp8266.
Vår esp -modell har bara en analog port så vi valde att ta emot analog information från vår ljussensor för då kan vi övervaka hur mycket ljus anläggningen får.
Alla andra sensorer är digitalt anslutna. Vår DHT11 -sensor skickar data digitalt och vi använder dht -biblioteket för att tolka sensordata.
Ovan hittar du ett kretsschema för de sensorer vi använde. Men kom ihåg att de sensorer vi använde ofta kommer med en modul så att du enkelt kan ansluta den till din mikrokontroller utan alla extra motstånd som vi inkluderade i diagrammet.
Steg 2: Kod
Detta är arduino -skissen som vi använde. Du kan lära dig mer om hur koden fungerar om du läser kommentarerna.
#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 moistPin 4 #define DHTType DHT11 DHT dht (DHTPin, DHTType); ESP8266WiFiMulti WiFiMulti; float temp = 0; flottörfuktighet = 0; boolsk fukt = falsk; int ljus = 0; const char* ssid = STASSID; const char* lösenord = STAPSK; const char* mqtt_server = "cmfwqk.messaging.internetofthings.ibmcloud.com"; WiFiClient espClient; PubSubClient -klient (espClient); lång lastMsg = 0; char msg [50]; int värde = 0; #define MQTT_HOST "cmfwqk.messaging.internetofthings.ibmcloud.com" "#define MQTT_PORT 1883 #define MQTT_DEVICEID" d: cmfwqk: ESP8266: ESP "#define MQTT_UST" MOT_ENT "MOT_ENT" #Token_MT "#Token_MTT_UST" #"Token_MTT_UST" #"" iot-2/evt/status/fmt/json "#define MQTT_TOPIC_DISPLAY" iot-2/cmd/update/fmt/json "#include" pitches.h "// noter i melodin: // notlängd: 4 = kvartal not, 8 = åttonde not, etc.: int shortTone = 80; int longTone = 200; int standardDelay = 50; int delayBetweenBars = 50; void setup_wifi () {delay (10); // Vi börjar med att ansluta till ett WiFi -nätverk Serial.println (); Serial.print ("Ansluter till"); Serial.println (ssid); WiFi.begin (ssid, lösenord); medan (WiFi.status ()! = WL_CONNECTED) {fördröjning (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi ansluten"); Serial.println ("IP -adress:"); Serial.println (WiFi.localIP ()); } ogiltig återuppringning (karaktär* ämne, byte* nyttolast, osignerad int längd) {Serial.print ("Meddelande kom ["); Serial.print (ämne); Serial.print ("]"); for (int i = 0; i <length; i ++) {Serial.print ((char) nyttolast ); } Serial.println (); StaticJsonDocument jsonBuffer; deserializeJson (jsonBuffer, nyttolast); JsonObject root = jsonBuffer.as (); if (root ["sång"] == "darude") {darude (); } if (root ["song"] == "starwars") {starwars (); } if (root ["song"] == "jacques") {Serial.println ("jakakakakakkakaka"); jacques (); }} void reconnect () {// Loop tills vi återansluts medan (! client.connected ()) {Serial.print ("Försöker MQTT -anslutning …"); // Försök att ansluta om (client.connect (MQTT_DEVICEID, MQTT_USER, MQTT_TOKEN)) {Serial.println ("ansluten"); klient. prenumerera (MQTT_TOPIC_DISPLAY); } annat {Serial.print ("misslyckades, rc ="); Serial.print (client.state ()); Serial.println ("försök igen om 5 sekunder"); // Vänta 5 sekunder innan försöket försöker igen (5000); }}} void setup () {Serial.begin (9600); pinMode (fuktPin, INGÅNG); dht.begin (); pinMode (0, OUTPUT); setup_wifi (); client.setServer (mqtt_server, MQTT_PORT); client.setCallback (återuppringning); fördröjning (20); } void loop () {if (! client.connected ()) {reconnect (); } client.loop (); fukt = digitalRead (fuktPin); light = analogRead (A0); temp = dht.readTemperature (); fuktighet = dht.readHumidity (); Serial.println ("Temperatur =" + Sträng (temp, 1) + "\ nFuktighet =" + Sträng (fuktighet, 1) + "\ nFukt:" + Sträng (fukt) + "\ nLjus:" + Sträng (ljus)); String nyttolast = "{" ts / ": {" t / ":"+String (temp, 1)+", \" h / ":"+Sträng (fuktighet, 1)+"}, \" ms / ": {" m / ":"+Sträng (fukt)+"}, \" ls / ": {" l / ":"+Sträng (ljus)+"}}"; Serial.println (nyttolast); if (client.publish (MQTT_TOPIC, (char*) payload.c_str ())) {Serial.println ("publicera ok"); } else {Serial.println ("publicera misslyckades"); } fördröjning (2000); } void darude () {ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, longTone); delay (longTone); noTone (0); delay (delayBetweenBars); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, longTone); delay (longTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_E4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_E4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_E4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_E4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_E4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_E4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_E4, longTone); delay (longTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_D4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_D4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_D4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_D4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_D4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_D4, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_D4, longTone); delay (longTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_A3, longTone); delay (longTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, longTone); delay (longTone); noTone (0); delay (delayBetweenBars); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, longTone); delay (longTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_E4, longTone); delay (longTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, longTone); delay (longTone); noTone (0); delay (delayBetweenBars); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, shortTone); fördröjning (shortTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_B3, longTone); delay (longTone); noTone (0); fördröjning (standardDelay); ton (0, NOTE_E4, longTone); delay (longTone); noTone (0); fördröjning (standardDelay); } void starwars () {pip (NOTE_A4, 500); pip (NOTE_A4, 500); pip (NOTE_A4, 500); pip (NOTE_F4, 350); pip (NOTE_C5, 150); pip (NOTE_A4, 500); pip (NOTE_F4, 350); pip (NOTE_C5, 150); pip (NOTE_A4, 650); fördröjning (500); pip (NOTE_E5, 500); pip (NOTE_E5, 500); pip (NOTE_E5, 500); pip (NOTE_F5, 350); pip (NOTE_C5, 150); pip (NOTE_GS4, 500); pip (NOTE_F4, 350); pip (NOTE_C5, 150); pip (NOTE_A4, 650); } ogiltigt pip (int not, int varaktighet) {// Spela ton på buzzerPin ton (0, not, varaktighet); fördröjning (varaktighet); noTone (0); fördröjning (standardDelay); } void heartOfCourage () {} void jacques () {pip (NOTE_C4, 500); pip (NOTE_D4, 500); pip (NOTE_E4, 500); pip (NOTE_C4, 500); pip (NOTE_C4, 500); pip (NOTE_D4, 500); pip (NOTE_E4, 500); pip (NOTE_C4, 500); pip (NOTE_E4, 500); pip (NOTE_F4, 500); pip (NOTE_G4, 500); pip (NOTE_E4, 500); pip (NOTE_F4, 500); pip (NOTE_G4, 500); pip (NOTE_G4, 500); pip (NOTE_A4, 500); pip (NOTE_G4, 500); pip (NOTE_F4, 500); pip (NOTE_E4, 500); pip (NOTE_C4, 500); pip (NOTE_G4, 500); pip (NOTE_A4, 500); pip (NOTE_G4, 500); pip (NOTE_F4, 500); pip (NOTE_E4, 500); pip (NOTE_C4, 500); pip (NOTE_C4, 500); pip (NOTE_G4, 500); pip (NOTE_C4, 500); pip (NOTE_C4, 500); pip (NOTE_G4, 500); pip (NOTE_C4, 500); }
Steg 3: Ibm Cloud
Du måste konfigurera en IBM-molninstans. Du hittar information om detta via denna länk: github.
Steg 4: Nod-RÖD
Vi använder nod-rött för att hantera vår allmänna affärslogik och för att visualisera dessa data i ett intuitivt användargränssnitt.
Steg 5: Node-RED Setup: Light
Importera följande kod till ditt projekt.
[{"id": "deb0d57.1c46528", "type": "tab", "label": "Light", "disabled": false, "info": ""}, {"id": "8a0fcaac. 4e54 "," type ":" ibmiot in "," z ":" deb0d57.1c46528 "," authentication ":" boundService "," apiKey ":" "," inputType ":" evt "," logicalInterface ":" "," ruleId ":" "," deviceId ":" ESP "," applicationId ":" "," deviceType ":" ESP8266 "," eventType ":"+"," commandType ":" "," format ": "json", "name": "Hämta data från ESP", "service": "registrerad", "allDevices": false, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 120, "y": 62, "wires":
Steg 6: Node-RED Setup: Temperatur
Importera följande kod till ditt projekt.
[{"id": "fbad3799.f0e0e", "type": "tab", "label": "Temperature", "disabled": false, "info": ""}, {"id": "b8618eb9. 1c9288 "," type ":" ibmiot in "," z ":" fbad3799.f0e0e "," authentication ":" boundService "," apiKey ":" "," inputType ":" evt "," logicalInterface ":" "," ruleId ":" "," deviceId ":" ESP "," applicationId ":" "," deviceType ":" ESP8266 "," eventType ":"+"," commandType ":" "," format ": "json", "name": "Hämta data från ESP", "service": "registrerad", "allDevices": false, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 145.5, "y": 49, "wires":
Steg 7: Node-RED Setup: Luftfuktighet
Importera följande kod till ditt projekt.
[{"id": "144cd53b.c00473", "type": "tab", "label": "Fuktighet", "inaktiverad": false, "info": ""}, {"id": "d958f58b. 2678e "," type ":" ibmiot in "," z ":" 144cd53b.c00473 "," authentication ":" boundService "," apiKey ":" "," inputType ":" evt "," logicalInterface ":" "," ruleId ":" "," deviceId ":" ESP "," applicationId ":" "," deviceType ":" ESP8266 "," eventType ":"+"," commandType ":" "," format ": "json", "name": "Hämta data från ESP", "service": "registrerad", "allDevices": false, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 142, "y": 87, "wires":
Steg 8: Node-RED Setup: Fukt
Importera följande kod till ditt projekt.
[{"id": "4ee73536.ec6fc4", "type": "tab", "label": "Fukt", "inaktiverad": false, "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 ":" Send command to ESP "," service ":" registrerad "," x ": 804.1944580078125," y ": 383.0000305175781," wires ": }, {" id ":" 4134fdb7.18e9b4 "," type ":" ibmiot in ", "z": "4ee73536.ec6fc4", "authentication": "boundService", "apiKey": "", "inputType": "evt", "logicalInterface": "", "ruleId": "", "deviceId": "ESP", "applicationId": "", "deviceType": "ESP8266", "eventType": "update", "commandType": "", "format": "json", "name": "Hämta data från ESP "," service ":" registrerad "," allDevices ": false," allApplications ":" "," allDeviceTypes ": false," allLogicalInterfaces ":" "," allEvents ": true," allCommands ":" ", "allFormats": false, "qos": 0, "x": 115, "y": 76, "wires":
Steg 9: Du är klar
Grattis! du har nu ett fungerande anläggningsobservationssystem.
Om du har några frågor, tveka inte att kontakta oss!