Índice:

Temperatura e umidade usando ESP32-DHT22-MQTT-MySQL-PHP: 7 etapas
Temperatura e umidade usando ESP32-DHT22-MQTT-MySQL-PHP: 7 etapas
Anonim
Temperatura e umidade usando ESP32-DHT22-MQTT-MySQL-PHP
Temperatura e umidade usando ESP32-DHT22-MQTT-MySQL-PHP

Minha namorada queria uma estufa, então fiz uma para ela. Mas eu queria um sensor de temperatura e umidade dentro da estufa. Então, eu pesquisei exemplos e comecei a experimentar.

Minha conclusão foi que todos os exemplos que encontrei não eram exatamente o que eu queria construir. Peguei várias pequenas partes do código e as combinei. Levei um bom tempo para terminar meu primeiro build de trabalho porque a documentação da maioria dos exemplos era muito difícil para eu entender ou eles presumiam uma parte que eu deveria saber ?? Mas eu não sabia de nada (ainda) ☹

É por isso que eu construo este instrutível. Um tutorial do “começo ao fim” para literalmente todo mundo entender. (Pelo menos eu espero?)

Como funciona …

O produto final é um ESP32-CAM com um sensor DHT22 conectado a ele que obtém energia de uma bateria 18650. A cada três minutos, ele lê a temperatura e a umidade e envia isso por WiFi para um servidor MQTT externo e, em seguida, entra em hibernação (por três minutos) para usar o mínimo de bateria necessário

Em um servidor Debian, (que também pode ser um raspberry pi, eu acho) eu tenho o python3, um servidor MQTT, um servidor MySQL e um servidor web

O script python3 é executado como um serviço e sempre que recebe uma mensagem MQTT, ele conta o número anterior de entradas (número do índice) e o incrementa em um. Em seguida, ele lê os valores de temperatura e umidade da mensagem MQTT. Ele verifica se há valores falsos e sempre que os valores estão corretos, ele os envia junto com o novo número de índice e a data e hora atuais para um servidor MySQL

O servidor web tem um script PHP que lê os valores do servidor MySQL e faz um gráfico bonito a partir dele usando o Google Charts. (exemplo)

Suprimentos

As peças que usei são as seguintes:

  • ESP32-CAM (A razão pela qual usei a versão cam é porque ela tem um conector de antena externa. Provavelmente também há outros ESP32 que você poderia usar)
  • Antena externa
  • Sensor AM2302 DHT22 (este tem um resistor embutido, então você só precisa de três fios)

    https://www.amazon.de/gp/product/B07CM2VLBK/ref=p…

  • Escudo bateria 18650 v3
  • Bateria 18650 (NCR18650B)
  • Cabo micro USB antigo (para conectar o ESP32 à proteção da bateria)
  • Alguns fios de jumpers curtos

Extra necessário:

  • Conector USB para TTL (imagem)

    https://www.amazon.de/FT232RL-Seriell-Unterst%C3%…

  • Ferro de solda
  • Impressora 3D (necessária apenas para caixa)

Etapa 1: faça upload do código do Arduino para o ESP32-CAM

Faça upload do código do Arduino para o ESP32-CAM
Faça upload do código do Arduino para o ESP32-CAM

Então vamos começar!

Para fazer o upload do código do Arduino para o ESP32-CAM, você deve conectar o conector USBtoTTL ao ESP32 usando o esquema acima.

O código do Arduino é:

/ * Apenas um pequeno programa para ler a temperatura e umidade de um sensor DHT22 e

passe-o para MQTT. B. Duijnhouwer 8 de junho de 2020 * / #include #include #include #define wifi_ssid "*** WIFI_SSID ***" // wi-fi ssid #define wifi_password "*** WIFI_PASSWORD ***" // senha wi-fi #define mqtt_server "*** SERVER_NAME ***" // nome do servidor ou IP # definir mqtt_user "*** MQTT_USER ***" // nome de usuário # definir mqtt_password "*** MQTT_PASSWORD ***" // senha # definir tópico "estufa / dhtreadings "#define debug_topic" glasshouse / debug "// Tópico para depuração / * definições para sono profundo * / #define uS_TO_S_FACTOR 1000000 / * Fator de conversão de micro segundos para segundos * / #define TIME_TO_SLEEP 180 / * Tempo ESP32 irá dormir por 5 minutos (em segundos) * / bool debug = true; // Exibir mensagem de log se True #define DHT22_PIN 14 dht DHT; WiFiClient espClient; Cliente PubSubClient (espClient); dados char [80]; void setup () {Serial.begin (115200); setup_wifi (); // Conectar à rede Wifi client.setServer (mqtt_server, 1883); // Configure a conexão MQTT, altere a porta, se necessário. if (! client.connected ()) {reconect (); } // LER DADOS int chk = DHT.read22 (DHT22_PIN); float t = DHT.temperatura; flutuante h = DHT.umidade; String dhtReadings = "{" temperatura / ": \" "+ String (t) +" / ", \" umidade / ": \" "+ String (h) +" / "}"; dhtReadings.toCharArray (data, (dhtReadings.length () + 1)); if (debug) {Serial.print ("Temperatura:"); Serial.print (t); Serial.print ("| Umidade:"); Serial.println (h); } // Publicar valores para tópicos do MQTT client.publish (tópico, dados); // Publicar leituras no tópico (estufa / dhtreadings) if (depurar) {Serial.println ("Leituras enviadas para MQTT."); } esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); // vai dormir Serial.println ("Configure o ESP32 para dormir a cada" + String (TIME_TO_SLEEP) + "Segundos"); Serial.println ("Vou dormir normalmente agora."); esp_deep_sleep_start (); } // Configurar conexão para wi-fi void setup_wifi () {delay (20); Serial.println (); Serial.print ("Conectando a"); Serial.println (wifi_ssid); WiFi.begin (wifi_ssid, wifi_password); while (WiFi.status ()! = WL_CONNECTED) {delay (100); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi está OK"); Serial.print ("=> novo endereço IP ESP32 é:"); Serial.print (WiFi.localIP ()); Serial.println (""); } // Reconecte ao wi-fi se a conexão for perdida void reconnect () {while (! Client.connected ()) {Serial.print ("Conectando ao broker MQTT…"); if (client.connect ("ESP32Client", mqtt_user, mqtt_password)) {Serial.println ("OK"); } else {Serial.print ("[Erro] Não conectado:"); Serial.print (client.state ()); Serial.println ("Aguarde 5 segundos antes de tentar novamente."); atraso (5000); }}} void loop () {}

E, novamente, não se esqueça de substituir as credenciais por suas próprias credenciais

Etapa 2: Conecte

Wire Up!
Wire Up!

Para a alimentação, usei um cabo USB antigo, do qual cortei o conector USB-A. Existem quatro fios no cabo USB, só precisamos do preto e do vermelho.

Portanto, conecte tudo de acordo com o cronograma acima.

Etapa 3: Script Python3

O script Python3 vai para um lugar onde é acessível ao usuário root.

Usei /root/scripts/glasshouse/glasshouse.py para este script. O conteúdo do script Python é:

# Script Python3 para conectar ao MQTT, ler valores e gravá-los no MySQL

# # B. Duijnhouwer # 8 de junho de 2020 # # versão: 1.0 # # import paho.mqtt.client as mqtt import json import pymysql pymysql.install_as_MySQLdb () import MySQLdb from datetime import datetime db = MySQLdb.connect ("localhost", "glasshouse", "*** MYSQL_USERNAME ***", "*** MYSQL_PASSWORD ***") cursor = db.cursor () broker_address = "localhost" #Broker address port = 1883 #Broker port user = "** * MQTT_USERNAME *** "#Connection username password =" *** MQTT_PASSWORD *** "#Connection password def on_connect (client, userdata, flags, rc): # O retorno de chamada para quando o cliente se conecta ao broker print (" Conectado com o código de resultado {0} ". format (str (rc))) # Resultado de impressão da tentativa de conexão client.subscribe (" glasshouse / dhtreadings / # ") def on_message (client, userdata, msg): # O retorno de chamada para quando um PUBLICAR mensagem é recebida do servidor. cursor.execute ("select * from sensordata") numrows = int (cursor.rowcount) newrow = numrows + 1 now = datetime.now () formatted_date = now.strftime ('% Y-% m-% d% H:% M:% S ') carga útil = json.loads (msg.payload.decode (' utf-8 ')) print ("Nova linha:" + str (newrow)) temperatura = flutuação (carga útil ["temperatura"]) umidade = float (carga útil ["umidade"]) print ("Temperatura:" + str (temperatura)) print ("Umidade:" + str (umidade)) print ("DateTime:" + str (formatted_date)) if ((temperatura > -20) e (temperatura = 0) e (umidade <= 100)): cur = db.cursor () cur.execute ("INSERT INTO glasshouse.sensordata (idx, temperatura, umidade, timestamp) VALORES (" + str (newrow) + "," + str (temperatura) + "," + str (umidade) + ",% s)", (formatted_date)) db.commit () print ("dados recebidos e importados no MySQL") else: print ("os dados ultrapassaram os limites e NÃO são importados no MySQL") client = mqtt. Client ("duijnhouwer-com-glasshouse-script") client.username_pw_set (usuário, senha = senha) client.on_connect = on_connect # Definir função de retorno de chamada para conexão bem-sucedida client.on_message = on_message # Define a função de retorno de chamada para o recebimento de uma mensagem client.connect (broker_address, port = port) #connect to broker client.loop_forever () # Start networking daemon

Não se esqueça de substituir o nome de usuário e senha MySQL e o nome de usuário e senha MQTT por suas próprias credenciais

Você pode fazer o script rodar como um serviço criando dois arquivos.

O primeiro é “/etc/init/glasshouse.conf” com o seguinte conteúdo:

começar no nível de execução [2345]

parar no nível de execução [! 2345] exec /root/scripts/glasshouse/glasshouse.py

O segundo é “/etc/systemd/system/multi-user.target.wants/glasshouse.service” com o seguinte conteúdo:

[Unidade]

Descrição = Glasshouse Monitoring Service After = multi-user.target [Service] Type = simple Restart = sempre RestartSec = 1 ExecStart = / usr / bin / python3 /root/scripts/glasshouse/glasshouse.py [Install] WantedBy = multiusuário.alvo

Você pode fazer isso funcionar como um serviço usando o seguinte comando:

systemctl enable glasshouse

e inicie usando:

systemctl start glasshouse

Etapa 4: servidor MySQL

Você deve criar um novo banco de dados MySQL com apenas uma tabela.

O código para criar a tabela é:

CRIAR TABELA `sensordata` (`idx` int (11) DEFAULT NULL,` temperatura` flutuante DEFAULT NULL, `umidade` flutuante DEFAULT NULL,` timestamp` datetime DEFAULT NULL) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Etapa 5: servidor da web

O servidor web tem dois arquivos, o arquivo index.php e um arquivo config.ini

O conteúdo do arquivo config.ini é:

[base de dados]

db_host = "localhost" db_name = "glasshouse" db_table = "sensordata" db_user = "*** DATABASE_USER ***" db_password = "*** DATABASE_PASSWORD ***"

É claro que você substitui *** DATABASE_USER *** e *** DATABASE_PASSWORD *** por suas próprias credenciais.

google.charts.load ('atual', {'pacotes': ['corechart']}); google.charts.setOnLoadCallback (drawChart); function drawChart () {var data = google.visualization.arrayToDataTable ([// ['Timestamp', 'Temperature', 'Humidity', 'Heat Index'], ['Timestamp', 'Temperature', 'Humidity'], query ($ sql); # Este while - loop formata e coloca todos os dados recuperados no caminho ['timestamp', 'temperatura', 'umidade']. while ($ row = $ result-> fetch_assoc ()) {$ timestamp_rest = substr ($ row ["timestamp"], 10, 6); echo "['". $ timestamp_rest. "',". $ row ['temperatura']. ",". $ row ['umidade']. "],"; // echo "['". $ timestamp_rest. "',". $ row ['temperatura']. ",". $ row ['umidade']. ",". $ row ['heatindex ']. "],";}?>]); // Linha curva var options = {title: 'Temperature and umidade', curveType: 'function', legend: {position: 'bottom'}, hAxis: {slantedText: true, slantedTextAngle: 45}}; // Gráfico curvo var chart = new google.visualization. LineChart (document.getElementById ('curve_chart')); chart.draw (dados, opções); } // Parêntese final de drawChart //

Etapa 6: Caixa impressa em 3D

Para o invólucro, usei dois invólucros separados, um para o ESP32-CAM e o DHT22 juntos e um para a blindagem da bateria 18650.

Etapa 7: O resultado final

O resultado final!
O resultado final!
O resultado final!
O resultado final!
O resultado final!
O resultado final!
O resultado final!
O resultado final!

O resultado final também é mostrado nas fotos acima.

E sempre que a bateria estiver vazia, você pode carregá-la com um cabo mini USB.

Recomendado: