Conseguenza naturale degli ultimi due progetti (gli ultimi due post pubblicati!) e' quella di pubblicare su di un broker MQTT i dati rilevati da un sensore DHT11 di temperatura ed umidita' rilevata.
Il circuito e' come il precedente:
- Un ESP32 od un ESP8266 (il codice funziona su entrambi)
- un sensore DHT11
- alimentazione 3,3volt o 5 volt
- un broker MQTT disponibile
# TecnoGeppetto
# Sistema MQTT con esp8266 / esp32
# Legge la temperatura da DHT11 e invia a sever Mosquitto
#
# ESP#1
#
import time
from umqttsimple import MQTTClient
import ubinascii
import machine
import micropython
import network
import esp
esp.osdebug(None)
import gc
gc.collect()
import webrepl
import dht
from machine import Pin
ssid = "XXXXXXXXXXXXXXXXXXXXXX"
password = "XXXXXXXXXXXXXX"
mqtt_server = 'XXXXXXXXXXXXXXXXXXX'
#EXAMPLE IP ADDRESS
#mqtt_server = '192.168.1.144'
client_id = ubinascii.hexlify(machine.unique_id())
topic_sub = b'TecnoGeppetto/notifica'
topic_pub = b'TecnoGeppetto/temp'
sensor = dht.DHT11(Pin(14)) #il pin al quale e' collegato il sensore DHT11
last_message = 0
message_interval = 5 #intervallo tra i messaggi
last_start = time.time()
start_interval = 3600 # intervallo tra le conferme di ricezione da parte del sistema
counter = 0
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False:
pass
print('Connection successful')
print(station.ifconfig())
webrepl.start()
### ESP #1 def sub_cb(topic, msg): print((topic, msg)) if topic == b'TecnoGeppetto/notifica' and msg == b'OK': print('ESP Ha ricevuto la Temperatura!') last_start = time.time() #azzero contatore del reset def connect_and_subscribe(): global client_id, mqtt_server, topic_sub client = MQTTClient(client_id, mqtt_server) client.set_callback(sub_cb) client.connect() client.subscribe(topic_sub) print('Connected to %s MQTT broker, subscribed to %s topic' % (mqtt_server, topic_sub)) return client def restart_and_reconnect(): print('Failed to connect to MQTT broker. Reconnecting...') time.sleep(10) machine.reset() def get_temp(): #legge la temperatura dal sensore DHT11 sensor.measure() temp = sensor.temperature() hum = sensor.humidity() return [temp,hum] try: client = connect_and_subscribe() except OSError as e: restart_and_reconnect() while True: try: client.check_msg() if (time.time() - last_message) > message_interval: temp=get_temp() msg = b"N. "+str(counter)+" Temperatura. "+str(temp[0])+" Umidita. "+str(temp[1]) client.publish(topic_pub, msg) last_message = time.time() counter += 1 if (time.time() - last_start) > start_interval: #se e' passato piu di start_interval dall ultima conferma di ricezione restart_and_reconnect() #resetto la scheda e riconnetto except OSError as e: restart_and_reconnect()
Con il codice sopra il sensore comincia a pubblicare i valori letti dal sensore DHT11 sul topic TecnoGeppetto/temp, e si mette in ascolto sul topic TecnoGeppetto/notifica
Buon divertimento
TecnoGeppetto
Nessun commento:
Posta un commento