Spisu treści:

PInt@t10n: Inteligentny system monitorowania instalacji: 9 kroków
PInt@t10n: Inteligentny system monitorowania instalacji: 9 kroków

Wideo: PInt@t10n: Inteligentny system monitorowania instalacji: 9 kroków

Wideo: PInt@t10n: Inteligentny system monitorowania instalacji: 9 kroków
Wideo: Kant10t - Pain | Official Music Video 2024, Lipiec
Anonim
PInt@t10n: Inteligentny system monitorowania instalacji
PInt@t10n: Inteligentny system monitorowania instalacji

Ten projekt został utworzony jako test dla chmury ibm iot. Używamy esp-8266 do wysyłania i odbierania danych do iz chmury IBM. Komunikacja między esp a chmurą ibm odbywa się za pośrednictwem MQTT.

Do obsługi wszystkich danych i zaprezentowania użytkownikowi interfejsu użytkownika używamy node-red. Jest bardzo przyjazny dla początkujących.

Aby rozpocząć, potrzebujesz:

  • Esp-8266
  • czujnik temperatury/wilgotności dht 11/22
  • dioda światłoczuła (pomiar światła)
  • brzęczyk
  • czujnik wilgotności gruntu
  • konto w chmurze IBM

Krok 1: Podłącz czujniki

Podłącz swoje czujniki
Podłącz swoje czujniki
Podłącz swoje czujniki
Podłącz swoje czujniki
Podłącz swoje czujniki
Podłącz swoje czujniki

Jak wspomnieliśmy wcześniej, esp8266 będziemy używać do odczytu i wysyłania danych z czujników. W tym samouczku zakładamy, że wiesz, jak podłączyć czujniki do mikrokontrolera. Musisz już wiedzieć, jak wgrać kod do esp8266.

Nasz model esp ma tylko jeden port analogowy, więc zdecydowaliśmy się na otrzymywanie informacji analogowych z naszego czujnika światła, ponieważ wtedy możemy monitorować, ile światła otrzymuje roślina.

Wszystkie pozostałe czujniki są połączone cyfrowo. Nasz czujnik DHT11 przesyła dane cyfrowo, a my używamy biblioteki dht do interpretacji danych z czujników.

Powyżej znajduje się schemat połączeń użytych przez nas czujników. Należy jednak pamiętać, że czujniki, których używaliśmy, często są dostarczane z modułem, dzięki czemu można go łatwo podłączyć do mikrokontrolera bez wszystkich dodatkowych rezystorów, które uwzględniliśmy na schemacie.

Krok 2: Kod

To jest szkic arduino, którego użyliśmy. Możesz dowiedzieć się, jak działa kod, czytając komentarze.

#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 wilgoćPin 4 #define DHTType DHT11 DHT dht(DHTPin, DHTType); ESP8266WiFiWiFiWiFiWiele; temp. pływaka = 0; wilgotność pływaka = 0; wilgotność logiczna = fałsz; wewn. światło = 0; const char* ssid = STASSID; const char* hasło = STAPSK; const char* mqtt_server = "cmfwqk.messaging.internetofthings.ibmcloud.com"; Klient Wi-Fi espKlient; Klient PubSubClient (espClient); dluga ostatnia wiadomosc = 0; wiadomość char[50]; wartość int = 0; #define MQTT_HOST "cmfwqk.messaging.internetofthings.ibmcloud.com" #define MQTT_PORT 1883 #define MQTT_DEVICEID "d:cmfwqk:ESP8266:ESP" #define MQTT_USER "użyj tokena" iot-2/evt/status/fmt/json" #define MQTT_TOPIC_DISPLAY "iot-2/cmd/update/fmt/json" #include "pitches.h" // nuty w melodii: // czas trwania nut: 4 = ćwierć nuta, 8 = ósemka itd.: int shortTone = 80; int longTone = 200; int standardoweOpóźnienie = 50; int opóźnienieMiędzyBarami = 50; void setup_wifi() { opóźnienie(10); // Zaczynamy od połączenia z siecią WiFi Serial.println(); Serial.print("Łączenie z"); Serial.println(ssid); WiFi.begin(SSid, hasło); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("Połączenie WiFi"); Serial.println("adres IP: "); Serial.println(WiFi.localIP()); } void callback(char* temat, bajt* ładunku, unsigned int length) { Serial.print("Wiadomość dotarła ["); Serial.print(temat); Serial.print("]"); for (int i = 0; i < długość; i++) { Serial.print((char)payload); } Serial.println(); StaticJsonDocument jsonBuffer; deserializeJson(jsonBuffer, ładunek); JsonObject root = jsonBuffer.as(); if(root["piosenka"]=="zwracam się"){ darude(); } if(root["piosenka"]=="starwars"){ starwars(); } if(root["piosenka"]=="jacques"){ Serial.println("jakakakakakkakaka"); jacek(); } } void reconnect() { // Pętla do ponownego połączenia while (!client.connected()) { Serial.print("Próba połączenia MQTT…"); // Próba połączenia if (client.connect(MQTT_DEVICEID, MQTT_USER, MQTT_TOKEN)) { Serial.println("podłączony"); klient.subskrybuj(MQTT_TOPIC_DISPLAY); } else { Serial.print("nie powiodło się, rc="); Serial.print(klient.stan()); Serial.println("spróbuj ponownie za 5 sekund"); // Poczekaj 5 sekund przed ponowną próbą delay(5000); } } } void setup() { Serial.begin(9600); pinMode (moisturePin, INPUT); dht.początek(); pinMode(0, WYJŚCIE); setup_wifi(); klient.setServer(mqtt_server, MQTT_PORT); klient.setCallback(oddzwanianie); opóźnienie(20); } void loop() { if (!client.connected()) { reconnect(); } klient.pętla(); wilgotność = digitalRead(moisturePin); światło = odczyt analogowy (A0); temp = dht.odczytTemperatura(); wilgotność= dht.odczytWilgotność(); Serial.println("Temperatura =" + String(temp, 1) + "\nWilgotność =" + String(wilgotność, 1) + "\nWilgotność: "+String(wilgotność)+"\nŚwiatło: "+String(light)); Ładunek ciągu = "{"ts\":{"t\": "+String(temp, 1)+", \"h\": "+String(wilgotność, 1)+"}, \"ms \":{"m\": "+String(wilgotność)+"}, \"ls\":{"l\":"+String(light)+"}}"; Serial.println(ładunek); if (client.publish(MQTT_TOPIC, (char*) payload.c_str())){ Serial.println("opublikuj ok"); }else { Serial.println("publikacja nie powiodła się"); } opóźnienie(2000); } void darude(){ ton(0, NOTE_B3, shortTone); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, NOTE_B3, longTone); opóźnienie (longTone); brak dźwięków(0); opóźnienie (opóźnienie między słupkami); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, NOTE_B3, longTone); opóźnienie (longTone); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, UWAGA_E4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, UWAGA_E4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, UWAGA_E4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, UWAGA_E4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, UWAGA_E4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, UWAGA_E4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, UWAGA_E4, długi ton); opóźnienie (longTone); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_D4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_D4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_D4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_D4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_D4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_D4, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, UWAGA_D4, długi ton); opóźnienie (longTone); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_A3, długi ton); opóźnienie (longTone); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, NOTE_B3, longTone); opóźnienie (longTone); brak dźwięków(0); opóźnienie (opóźnienie między słupkami); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, NOTE_B3, longTone); opóźnienie (longTone); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, UWAGA_E4, długi ton); opóźnienie (longTone); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, NOTE_B3, longTone); opóźnienie (longTone); brak dźwięków(0); opóźnienie (opóźnienie między słupkami); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton (0, UWAGA_B3, krótki ton); opóźnienie (krótki ton); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, NOTE_B3, longTone); opóźnienie (longTone); brak dźwięków(0); opóźnienie(standardowe opóźnienie); ton(0, NOTE_E4, longTone); opóźnienie (longTone); brak dźwięków(0); opóźnienie(standardowe opóźnienie); } void starwars() { sygnał dźwiękowy(UWAGA_A4, 500); sygnał dźwiękowy (UWAGA_A4, 500); sygnał dźwiękowy (UWAGA_A4, 500); dźwięk (UWAGA_F4, 350); dźwięk (UWAGA_C5, 150); sygnał dźwiękowy (UWAGA_A4, 500); dźwięk (UWAGA_F4, 350); dźwięk (UWAGA_C5, 150); sygnał dźwiękowy (UWAGA_A4, 650); opóźnienie (500); dźwięk (UWAGA_E5, 500); dźwięk (UWAGA_E5, 500); dźwięk (UWAGA_E5, 500); dźwięk (UWAGA_F5, 350); dźwięk (UWAGA_C5, 150); sygnał dźwiękowy (UWAGA_GS4, 500); dźwięk (UWAGA_F4, 350); dźwięk (UWAGA_C5, 150); sygnał dźwiękowy (UWAGA_A4, 650); } void beep(int note, int duration) { //Odtwórz ton brzęczyka ton (0, nuta, czas trwania); opóźnienie (czas trwania); brak dźwięków(0); opóźnienie(standardowe opóźnienie); } void heartOfCourage(){ } void jacques(){ beep(UWAGA_C4, 500); sygnał dźwiękowy (UWAGA_D4, 500); dźwięk (UWAGA_E4, 500); sygnał dźwiękowy (UWAGA_C4, 500); sygnał dźwiękowy (UWAGA_C4, 500); sygnał dźwiękowy (UWAGA_D4, 500); dźwięk (UWAGA_E4, 500); sygnał dźwiękowy (UWAGA_C4, 500); dźwięk (UWAGA_E4, 500); dźwięk (UWAGA_F4, 500); sygnał dźwiękowy (UWAGA_G4, 500); dźwięk (UWAGA_E4, 500); dźwięk (UWAGA_F4, 500); sygnał dźwiękowy (UWAGA_G4, 500); sygnał dźwiękowy (UWAGA_G4, 500); sygnał dźwiękowy (UWAGA_A4, 500); sygnał dźwiękowy (UWAGA_G4, 500); dźwięk (UWAGA_F4, 500); dźwięk (UWAGA_E4, 500); sygnał dźwiękowy (UWAGA_C4, 500); sygnał dźwiękowy (UWAGA_G4, 500); sygnał dźwiękowy (UWAGA_A4, 500); sygnał dźwiękowy (UWAGA_G4, 500); dźwięk (UWAGA_F4, 500); dźwięk (UWAGA_E4, 500); sygnał dźwiękowy (UWAGA_C4, 500); sygnał dźwiękowy (UWAGA_C4, 500); sygnał dźwiękowy (UWAGA_G4, 500); sygnał dźwiękowy (UWAGA_C4, 500); sygnał dźwiękowy (UWAGA_C4, 500); sygnał dźwiękowy (UWAGA_G4, 500); sygnał dźwiękowy (UWAGA_C4, 500); }

Krok 3: Chmura IBM

Chmura IBM
Chmura IBM

Musisz skonfigurować instancję chmury IBM. Informacje na ten temat znajdziesz pod tym linkiem: github.

Krok 4: Węzeł-CZERWONY

Używamy node-red do obsługi naszej ogólnej logiki biznesowej i wizualizacji tych danych w intuicyjnym interfejsie użytkownika.

Krok 5: Konfiguracja węzła RED: Światło

Konfiguracja węzła RED: Jasna
Konfiguracja węzła RED: Jasna

Zaimportuj następujący kod do swojego projektu.

[{"id":"deb0d57.1c46528", "type":"tab", "label":"Światło", "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":"Pobierz dane z ESP", "service":"registered", "allDevices":false, "allApplications":"", "allDeviceTypes":false, "allLogicalInterfaces":"", "allEvents":true, "allCommands":"", "allFormats":"", "qos":0, "x":120, "y":62, "wires":

Krok 6: Konfiguracja węzła-RED: Temperatura

Konfiguracja węzła-CZERWONA: Temperatura
Konfiguracja węzła-CZERWONA: Temperatura

Zaimportuj następujący kod do swojego projektu.

[{"id":"fbad3799.f0e0e", "type":"tab", "label":"Temperatura", "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":"Pobierz dane z ESP", "service":"registered", "allDevices":false, "allApplications":"", "allDeviceTypes":false, "allLogicalInterfaces":"", "allEvents":true, "allCommands":"", "allFormats":"", "qos":0, "x":145.5, "y":49, "wires":

Krok 7: Konfiguracja węzła RED: Wilgotność

Konfiguracja węzła RED: Wilgotność
Konfiguracja węzła RED: Wilgotność

Zaimportuj następujący kod do swojego projektu.

[{"id":"144cd53b.c00473", "type":"tab", "label":" Wilgotność", "disabled":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":"Pobierz dane z ESP", "service":"registered", "allDevices":false, "allApplications":"", "allDeviceTypes":false, "allLogicalInterfaces":"", "allEvents":true, "allCommands":"", "allFormats":"", "qos":0, "x":142, "y":87, "wires":

Krok 8: Konfiguracja węzła RED: Wilgoć

Konfiguracja węzła RED: Wilgoć
Konfiguracja węzła RED: Wilgoć

Zaimportuj następujący kod do swojego projektu.

[{"id":"4ee73536.ec6fc4", "type":"tab", "label":" Wilgoć", "disabled":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":"Wyślij polecenie do ESP ", "service":"zarejestrowany", "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":"Pobierz dane z ESP", "service":"registered", "allDevices":false, "allApplications":"", "allDeviceTypes":false, "allLogicalInterfaces":"", "allEvents":true, "allCommands":"", "allFormats":false, "qos":0, "x"::115, "y":76, "wires":

Krok 9: Gotowe

Gratulacje! masz teraz działający system obserwacji roślin.

Jeśli masz jakiekolwiek pytania, nie wahaj się z nami skontaktować!