Índice:
- Etapa 1: conecte seus sensores
- Etapa 2: Código
- Etapa 3: Nuvem Ibm
- Etapa 4: Node-RED
- Etapa 5: Configuração do Nó-RED: Luz
- Etapa 6: Configuração Node-RED: Temperatura
- Etapa 7: Configuração Node-RED: Umidade
- Etapa 8: Configuração Node-RED: Umidade
- Etapa 9: Pronto
Vídeo: PInt @ t10n: Sistema de monitoramento inteligente da planta: 9 etapas
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:37
PI @ nt @ t10n
Este projeto foi criado como um teste para a nuvem ibm iot. Usamos um esp-8266 para enviar e receber dados de e para a nuvem ibm. A comunicação entre o esp e a nuvem ibm ocorre por meio do MQTT.
Para lidar com todos os dados e apresentar ao usuário uma interface de usuário, usamos o node-red. É muito amigável para iniciantes.
Para começar, você precisa de:
- Esp-8266
- sensor de temperatura / umidade dht 22/11
- diodo fotossensível (medição de luz)
- campainha
- sensor de umidade do solo
- conta nuvem ibm
Etapa 1: conecte seus sensores
Como mencionamos antes, vamos usar o esp8266 para ler e enviar dados do sensor. Para este tutorial, vamos presumir que você sabe como conectar seus sensores ao microcontrolador. Você também já precisa saber como fazer upload de código para um esp8266.
Nosso modelo esp tem apenas uma porta analógica, então optamos por receber informações analógicas de nosso sensor de luz porque assim podemos monitorar a quantidade de luz que a planta recebe.
Todos os outros sensores são conectados digitalmente. Nosso sensor DHT11 envia dados digitalmente e usamos a biblioteca dht para interpretar os dados dos sensores.
Acima você pode encontrar um diagrama de circuito para os sensores que usamos. Mas lembre-se de que os sensores que usamos geralmente vêm com um módulo para que você possa conectá-lo facilmente ao seu microcontrolador sem todos os resistores extras que incluímos no diagrama.
Etapa 2: Código
Este é o esboço do Arduino que usamos. Você pode aprender como o código funciona se ler os comentários.
#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 umidadePin 4 #define DHTType DHT11 DHT dht (DHTPin, DHTType); ESP8266WiFiMulti WiFiMulti; flutuador temp = 0; umidade flutuante = 0; umidade booleana = falso; luz interna = 0; const char * ssid = STASSID; const char * senha = 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 "uso-token-auth" #define MQTT_TOKEN "Ucll2018" #define MQTT_TOPIC " iot-2 / evt / status / fmt / json "#define MQTT_TOPIC_DISPLAY" iot-2 / cmd / update / fmt / json "#include" pitches.h "// notas na melodia: // durações da nota: 4 = quarto nota, 8 = colcheia, etc.: int shortTone = 80; tom longo int = 200; atraso padrão int = 50; atraso interno Entre Barras = 50; void setup_wifi () {delay (10); // Começamos nos conectando a uma rede WiFi Serial.println (); Serial.print ("Conectando a"); Serial.println (ssid); WiFi.begin (ssid, senha); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi conectado"); Serial.println ("endereço IP:"); Serial.println (WiFi.localIP ()); } retorno de chamada void (char * tópico, byte * carga útil, comprimento int não assinado) {Serial.print ("Mensagem chegada ["); Serial.print (tópico); Serial.print ("]"); para (int i = 0; i <comprimento; i ++) {Serial.print ((char) carga útil ); } Serial.println (); StaticJsonDocument jsonBuffer; deserializeJson (jsonBuffer, carga útil); JsonObject root = jsonBuffer.as (); if (root ["canção"] == "darude") {darude (); } if (root ["song"] == "starwars") {starwars (); } if (root ["canção"] == "jacques") {Serial.println ("jakakakakakkakaka"); jacques (); }} void reconnect () {// Loop até que estejamos reconectados while (! client.connected ()) {Serial.print ("Tentando conexão MQTT…"); // Tenta conectar if (client.connect (MQTT_DEVICEID, MQTT_USER, MQTT_TOKEN)) {Serial.println ("conectado"); client.subscribe (MQTT_TOPIC_DISPLAY); } else {Serial.print ("falhou, rc ="); Serial.print (client.state ()); Serial.println ("tente novamente em 5 segundos"); // Aguarde 5 segundos antes de tentar novamente delay (5000); }}} void setup () {Serial.begin (9600); pinMode (umidadePin, INPUT); dht.begin (); pinMode (0, SAÍDA); setup_wifi (); client.setServer (mqtt_server, MQTT_PORT); client.setCallback (callback); atraso (20); } void loop () {if (! client.connected ()) {reconect (); } client.loop (); umidade = digitalRead (umidadePin); luz = analogRead (A0); temp = dht.readTemperature (); umidade = dht.readHumidity (); Serial.println ("Temperatura =" + String (temp, 1) + "\ nHumidity =" + String (umidade, 1) + "\ nMoisture:" + String (umidade) + "\ nLight:" + String (light)); Carga útil da string = "{" ts / ": {" t / ":" + String (temp, 1) + ", \" h / ":" + String (umidade, 1) + "}, \" ms / ": {" m / ":" + Corda (umidade) + "}, \" ls / ": {" l / ":" + Corda (luz) + "}}"; Serial.println (carga útil); if (client.publish (MQTT_TOPIC, (char *) payload.c_str ())) {Serial.println ("publicar ok"); } else {Serial.println ("falha na publicação"); } atraso (2000); } void darude () {tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom longo); atraso (tom longo); noTone (0); atraso (atraso Entre Barras); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom longo); atraso (tom longo); noTone (0); atraso (atraso padrão); tom (0, NOTE_E4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_E4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_E4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_E4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_E4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_E4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_E4, tom longo); atraso (tom longo); noTone (0); atraso (atraso padrão); tom (0, NOTE_D4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_D4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_D4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_D4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_D4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_D4, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_D4, tom longo); atraso (tom longo); noTone (0); atraso (atraso padrão); tom (0, NOTE_A3, tom longo); atraso (tom longo); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom longo); atraso (tom longo); noTone (0); atraso (atraso Entre Barras); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom longo); atraso (tom longo); noTone (0); atraso (atraso padrão); tom (0, NOTE_E4, tom longo); atraso (tom longo); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom longo); atraso (tom longo); noTone (0); atraso (atraso Entre Barras); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom curto); atraso (tom curto); noTone (0); atraso (atraso padrão); tom (0, NOTE_B3, tom longo); atraso (tom longo); noTone (0); atraso (atraso padrão); tom (0, NOTE_E4, tom longo); atraso (tom longo); noTone (0); atraso (atraso padrão); } void starwars () {beep (NOTE_A4, 500); bip (NOTE_A4, 500); bip (NOTE_A4, 500); bip (NOTE_F4, 350); bip (NOTE_C5, 150); bip (NOTE_A4, 500); bip (NOTE_F4, 350); bip (NOTE_C5, 150); bip (NOTE_A4, 650); atraso (500); bip (NOTA_E5, 500); bip (NOTA_E5, 500); bip (NOTA_E5, 500); bip (NOTE_F5, 350); bip (NOTE_C5, 150); bip (NOTE_GS4, 500); bip (NOTE_F4, 350); bip (NOTE_C5, 150); bip (NOTE_A4, 650); } void beep (int note, int duration) {// Toca o tom no buzzerPin tone (0, nota, duração); atraso (duração); noTone (0); atraso (atraso padrão); } void heartOfCourage () {} void jacques () {beep (NOTE_C4, 500); bip (NOTE_D4, 500); bip (NOTE_E4, 500); bip (NOTE_C4, 500); bip (NOTE_C4, 500); bip (NOTE_D4, 500); bip (NOTE_E4, 500); bip (NOTE_C4, 500); bip (NOTE_E4, 500); bip (NOTE_F4, 500); bip (NOTA_G4, 500); bip (NOTE_E4, 500); bip (NOTE_F4, 500); bip (NOTA_G4, 500); bip (NOTA_G4, 500); bip (NOTE_A4, 500); bip (NOTA_G4, 500); bip (NOTE_F4, 500); bip (NOTE_E4, 500); bip (NOTE_C4, 500); bip (NOTA_G4, 500); bip (NOTE_A4, 500); bip (NOTA_G4, 500); bip (NOTE_F4, 500); bip (NOTE_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); }
Etapa 3: Nuvem Ibm
Você precisa configurar uma instância de nuvem IBM. Você pode encontrar informações sobre isso neste link: github.
Etapa 4: Node-RED
Usamos node-red para lidar com nossa lógica geral de negócios e para visualizar esses dados em uma interface de usuário intuitiva.
Etapa 5: Configuração do Nó-RED: Luz
Importe o seguinte código para o seu projeto.
[{"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": "Obter dados do ESP", "serviço": "registrado", "allDevices": false, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 120, "y": 62, "arames":
Etapa 6: Configuração Node-RED: Temperatura
Importe o seguinte código para o seu projeto.
[{"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": "Obter dados do ESP", "serviço": "registrado", "allDevices": false, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 145,5, "y": 49, "arames":
Etapa 7: Configuração Node-RED: Umidade
Importe o seguinte código para o seu projeto.
[{"id": "144cd53b.c00473", "type": "tab", "label": "Umidade", "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": "Obter dados do ESP", "serviço": "registrado", "allDevices": false, "allApplications": "", "allDeviceTypes": false, "allLogicalInterfaces": "", "allEvents": true, "allCommands": "", "allFormats": "", "qos": 0, "x": 142, "y": 87, "fios":
Etapa 8: Configuração Node-RED: Umidade
Importe o seguinte código para o seu projeto.
[{"id": "4ee73536.ec6fc4", "type": "tab", "label": "Umidade", "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 ":" Enviar comando para ESP "," serviço ":" registrado "," x ": 804.1944580078125," y ": 383.0000305175781," fios ": }, {" id ":" 4134fdb7.18e9b4 "," tipo ":" ibmiot em ", "z": "4ee73536.ec6fc4", "authentication": "boundService", "apiKey": "", "inputType": "evt", "logicalInterface": "", "ruleId": "", "deviceId": "ESP", "applicationId": "", "deviceType": "ESP8266", "eventType": "update", "commandType": "", "format": "json", "name": "Obter dados from ESP "," service ":" registrado "," allDevices ": false," allApplications ":" "," allDeviceTypes ": false," allLogicalInterfaces ":" "," allEvents ": true," allCommands ":" ", "allFormats": falso, "qos": 0, "x": 115, "y": 76, "fios":
Etapa 9: Pronto
Parabéns! agora você tem um sistema de observação da planta funcionando.
Se você tiver alguma dúvida, não hesite em nos contatar!