Índice:
- Suprimentos
- Etapa 1: faça upload do código do Arduino para o ESP32-CAM
- Etapa 2: Conecte
- Etapa 3: Script Python3
- Etapa 4: servidor MySQL
- Etapa 5: servidor da web
- Etapa 6: Caixa impressa em 3D
- Etapa 7: O resultado final
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:35
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
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
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 também é mostrado nas fotos acima.
E sempre que a bateria estiver vazia, você pode carregá-la com um cabo mini USB.
Recomendado:
M5STACK Como exibir temperatura, umidade e pressão no M5StickC ESP32 usando Visuino - Fácil de fazer: 6 etapas
M5STACK Como exibir temperatura, umidade e pressão no M5StickC ESP32 usando Visuino - Fácil de fazer: neste tutorial, aprenderemos como programar ESP32 M5Stack StickC com Arduino IDE e Visuino para exibir a temperatura, umidade e pressão usando sensor ENV (DHT12, BMP280, BMM150)
Alerta de temperatura e umidade usando AWS e ESP32: 11 etapas
Alerta de temperatura e umidade usando AWS e ESP32: neste tutorial, mediremos diferentes dados de temperatura e umidade usando o sensor de temperatura e umidade. Você também aprenderá como enviar esses dados para AWS
Automatizando uma estufa com LoRa! (Parte 1) -- Sensores (temperatura, umidade, umidade do solo): 5 etapas
Automatizando uma estufa com LoRa! (Parte 1) || Sensores (Temperatura, Umidade, Umidade do Solo): Neste projeto irei mostrar como automatizei uma estufa. Isso significa que vou mostrar como construí a estufa e como conectei a eletrônica de energia e automação. Além disso, mostrarei como programar uma placa Arduino que usa L
Criando-Alerta-Usando-Ubidots-ESP32 + Sensor de Temperatura e Umidade: 9 etapas
Criando-Alerta-Usando-Ubidots-ESP32 + Sensor de Temperatura e Umidade: Neste tutorial, iremos medir diferentes dados de temperatura e umidade usando o sensor de temperatura e umidade. Você também aprenderá como enviar esses dados para Ubidots. Para que você possa analisá-lo de qualquer lugar para uma aplicação diferente. Também criando emai
Monitoramento de temperatura do Nodemcu ESP8266 usando DHT11 em um servidor da Web local - Obtenha a temperatura e umidade da sala no seu navegador: 6 etapas
Monitoramento de temperatura Nodemcu ESP8266 usando DHT11 em um servidor da Web local | Obtenha a temperatura e umidade da sala no seu navegador: Olá, pessoal, hoje vamos fazer um teste de umidade & sistema de monitoramento de temperatura usando ESP 8266 NODEMCU & Sensor de temperatura DHT11. A temperatura e a umidade serão obtidas no DHT11 Sensor & pode ser visto em um navegador cuja página da web será gerenciada