Índice:

PInt @ t10n: Sistema de monitoramento inteligente da planta: 9 etapas
PInt @ t10n: Sistema de monitoramento inteligente da planta: 9 etapas

Vídeo: PInt @ t10n: Sistema de monitoramento inteligente da planta: 9 etapas

Vídeo: PInt @ t10n: Sistema de monitoramento inteligente da planta: 9 etapas
Vídeo: Aqara FP1 RTCZCGQ11LM - микроволновый zigbee датчик присутствия, первое знакомство 2024, Julho
Anonim
PInt @ t10n: Sistema de monitoramento inteligente de planta
PInt @ t10n: Sistema de monitoramento inteligente de planta

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

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

Nuvem ibm
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

Configuração Node-RED: Light
Configuração Node-RED: Light

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

Configuração Node-RED: Temperatura
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

Configuração Node-RED: Umidade
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

Configuração Node-RED: Umidade
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!