Monitorar Temperatura e Humidade de sua Casa com DHT11

Neste artigo iremos desenvolver um servidor utilizando o Arduino, Flask, e Firebase capaz de monitorizar a temperatura e humidade de sua casa.

Lista de material


Imagem Produto Comprar
 

 

 

Arduino Uno

 


 

 

 

DHT11

 


 

 

 

Cabos Jumper Macho-Femêa

 


Requisitos 

Para acompanhar este projeto necessita de:

Atenção

Sendo que neste artigo iremos utilizar algumas tecnologias avançadas que já foram introduzidas em detalhe em artigos anteriores portanto aconselhamos o leitor a que consulte os seguintes artigos antes de iniciar este projeto:

Preparar Ambiente 

Primeiramente necessita de criar 2 pastas, uma responsável por enviar os dados lidos pelo DHT11 para a nossa base de dados na FireBase e outra para armazenar os arquivos responsáveis pelo servidor e pela leitura dos dados da Firebase

Aconselhamos a que copie a seguinte estrutura de pastas e arquivos de forma a evitar incoerências na importação de ficheiros para o seu ambiente

Upload Firebase – Estrutura
Servidor – Estrutura

Código para Arduino

De seguida o código que deve ser carregado no seu Arduino para efetuar a leitura da Temperatura (ºC) e Humidade (%) – Deve também instalar a libraria DHT sensor library da Adafruit.

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
Serial.begin(9600);
dht.begin();
}

void loop() {
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);

if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Não foi possivel efetuar a leitura do sensor!"));
return;
}

Serial.print(t);
}

Esquema de Montagem

Esquema Montagem DHT11

Script Upload Firebase

De seguida iremos preparar a parte do projeto responsável por comunicar com o Firebase

Upload Firebase – Estrutura

run.py

Script principal responsável por gerenciar os restantes ficheiros do ambiente.

from models.ReadDht11 import SensorDHT11
from modules import UploadFirebase
from time import sleep

def lerValoresSensor():
sensor = SensorDHT11()
valoresDht = sensor.LerValoresArduino()
return valoresDht 

def main():
while True:
valoresDht = lerValoresSensor()
update_status = UploadFirebase.UploadTemperature(valoresDht)

if update_status:
print("Ocorreu um erro ao carregar firebase")

sleep(20)

if __name__ == '__main__':
main()

config/config.py

Ficheiro responsável por armazenar as configurações do nosso projeto – Ter em atenção este ficheiro deve ser substituídos pelos dados do seu ambiente:

FIREBASE_CONFIG = {
# Dados Firebase API
}

PORTA_COM = "PORTA_COM_ARDUINO"

models/ReadDht11.py

Ficheiro armazena a classe responsável por interpretar os valores que circulam no Serial da máquina e retomar o valor de Humidade e Temperatura.

from config import config
import serial

class SensorDHT11:
def __init__(self):
self.esp32 = serial.Serial(port= config.PORTA_COM, baudrate=9600, timeout=.1)
self.read_valores = ""


def LerValoresArduino(self):
while self.read_valores == "":
try:
self.read_valores = self.esp32.readline().decode("utf-8")
except:
continue
return self.read_valores

modules/UploadFirebase.py

Script responsável por formatar e carregar dados no Firebase

from datetime import datetime
from config import config
import pyrebase

def UploadTemperature(valores):
try:
# Establecer conexao com firebase
firebase = pyrebase.initialize_app(config.FIREBASE_CONFIG)
database = firebase.database()

# Timestamp no firebase
data = str(datetime.now().date())
hora = str(datetime.now().time()).split('.')[0]

temp = valores.split("|")[0]
hum = valores.split("|")[1]

upload_data = {
'Temperatura':temp,
'Humidade':hum,
'Data': data,
'Hora': hora
}

database.child().update({f'temperatura_data_{data}_{hora}':upload_data})
print(f"{upload_data.get('Data')} - {upload_data.get('Hora')}")
print(f"Temperatura registada: {upload_data.get('Temperatura')} C\nHumidade registada: {upload_data.get('Temperatura')}\n---")

error = False
except:
error = True

return error

Servidor Flask

Servidor responsável por exibir uma tabela com as 10 medições mais recentes.

Servidor – Estrutura

app.py

from servidor import app

if __name__ == '__main__':
app.run(debug = True, host="0.0.0.0", port=80)

routes.py

from flask import render_template
from servidor import app
from servidor import firebase_data

@app.route("/")
def homepage():
firebase_objs = firebase_data.firebase_data()
return render_template("home.html", firebase_objs = firebase_objs)

firebase_data.py

import pandas as pd
import pyrebase

def firebase_data():
FIREBASE_CONFIG = {
"apiKey" : "AIzaSyDCVM_cDiDLTpdqF0Ug2mg3o3N8WGqZMjg",
"authDomain" : "shellyem-esp32.firebaseapp.com",
"databaseURL" : "https://shellyem-esp32-default-rtdb.europe-west1.firebasedatabase.app",
"projectId" : "shellyem-esp32",
"storageBucket" : "shellyem-esp32.appspot.com",
"messagingSenderId" : "130619280471",
"appId" : "1:130619280471:web:092c408d78d750b7616712"
}

firebase = pyrebase.initialize_app(FIREBASE_CONFIG)
db = firebase.database()
data_res = db.child().get()

firebase_obj = []

for line in data_res.each():
obj = {
'data':line.val().get("Data"),
"hora":line.val().get("Hora"),
"temp":line.val().get('Temperatura'),
"hum":line.val().get('Humidade')
}

firebase_obj.append(obj)

while len(firebase_obj) > 10:
firebase_obj.pop(0)

return firebase_obj

__init__.py

from flask import Flask

app = Flask(__name__)

from servidor import routes

templates/base.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" 
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Poiret+One&display=swap" rel="stylesheet">
<title>Monitorar DHT11</title>
</head>
<body>
{% include 'navbar.html' %}

{% block content %}
{% endblock %}
</body>
</html>

templates/navbar.html

<div class="navbar-custom">
<p class="text-center text-custom">
Monitorar Casa
<p>
</div>

<style>
.navbar-custom{
background: rgb(0,0,0);
background: linear-gradient(90deg, rgba(0,0,0,1) 0%, rgba(62,62,62,1) 50%, rgba(0,0,0,1) 100%);
border-bottom-width: 1px;
border-bottom-style:solid;
border-bottom-color:black;

}

.text-custom{
color:rgb(245, 245, 245);
font-size: 2rem;
font-family: 'Poiret One', cursive;
padding-top:10px;
}
</style>

templates/home.html

{% extends 'base.html' %}
{% block content %}
<div class="container">
<div class="row mt-3">
<div class="col">
<div class="display-6">Valores DHT-11</div>
<hr>
<table class="table table-secondary table-hover text-center">
<thead>
<tr>
<th scope="col">Data</th>
<th scope="col">Hora</th>
<th scope="col">Temperatura</th>
<th scope="col">Humidade</th>
</tr>
</thead>
<tbody class=>
{% for firebase_obj in firebase_objs %}
<tr>
<td>{{ firebase_obj.data }}</td>
<td>{{ firebase_obj.hora }}</td>
<td>{{ firebase_obj.temp }}ºC</td>
<td>{{ firebase_obj.hum }}%</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
<div class="row mt-2 text-center">
<div class="col-2">
<button class="btn btn-outline-dark form-control" id="btn-reload">Recarregar</button>
</div>
<div class="col-10"></div>
</div>
</div>
<script>
const btn_reload = document.getElementById('btn-reload');
btn_reload.addEventListener('click', function(e){
window.location.reload(true);
})
</script>
{% endblock %}

Para mais projetos, percorram o nosso blog, onde podem encontrar vários artigos interessantes relacionados com eletrónica, robótica e muito mais! Visitem também o nosso site, onde encontram tudo para eletrónica e robótica!