from machine import Pin, ADC
from umqtt.robust import MQTTClient
from json import loads, dumps
import network
from utime import ticks_ms
import dht
# Setups do sistema
DEVICE_ID = "922"
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_CLIENT = DEVICE_ID
MQTT_TELEMETRY_TOPIC = b"IFRS/ESP32_IoT/telemetry"
MQTT_CONTROL_TOPIC = b"IFRS/ESP32_IoT/control"
button = Pin(14, Pin.IN, Pin.PULL_DOWN)
switch = Pin(32, Pin.IN, Pin.PULL_DOWN)
blueLED = Pin(4, Pin.OUT)
greenLED = Pin(18, Pin.OUT)
purpleLED = Pin(22, Pin.OUT)
ogDHT = dht.DHT22(Pin(15))
luz = ADC(Pin(33))
buttonHistory = 0
switchHistory = 0
connectDelay = ticks_ms() + 200
lockDelay = ticks_ms()
##########################################################################################################################
# Funções
def receivedCallback(topic, message):
print(f'\nData Recieved! \ntopic = {topic.decode()}, message = {message.decode()}')
if topic == MQTT_CONTROL_TOPIC:
cmd = loads(message.decode())
if cmd['ID'] = DEVICE_ID:
if 'lock' in cmd and cmd['lock']=='open':
greenLED.on()
lockDelay = ticks_ms() + 5000
jsonLockStatus()
if 'lights' in cmd:
if cmd['lights'] == 'on':
purpleLED.on()
else:
purpleLED.off()
else:
print ('Não é para mim.')
def mqttConnect():
print("Connecting to MQTT broker... ", end="")
mqttClient = MQTTClient(MQTT_CLIENT, MQTT_BROKER, user="ESP32_IFRS", password="ifrsrgautomacao")
mqttClient.set_callback(receivedCallback)
mqttClient.connect()
print("Connected!")
mqttClient.subscribe(MQTT_CONTROL_TOPIC)
return mqttClient
def mqttPublish(topic, data):
print("\nUpdating MQTT Broker...")
mqttClient.publish(topic, data)
def createJsonData(lumens, temp, hum, light):
data = {
"ID": DEVICE_ID,
"Luminosidade": lumens,
"Temperatura": f'{temp:.2f}ºC',
"Umidade": f'{hum}%',
"Luzes": "acesas" if light == 1 else "apagadas"
}
return ujson.dumps(data)
def createJsonButton(x):
data = {"ID": "922",
"lock": "open" if x == 1 else "locked"}
return ujson.dumps(data)
def jsonLockStatus():
data = ujson.dumps(
{"Lock": "open" if greenLED.value() == 1 else "locked"})
print(data)
##########################################################################################################################
# Programa principal
wifiClient = network.WLAN(network.STA_IF)
wifiClient.active(True)
print("Connecting device to WiFi", end="")
wifiClient.connect(WIFI_SSID, WIFI_PASSWORD)
while not wifiClient.isconnected():
if ticks_ms() >= connectDelay:
print(".", end="")
connectDelay = ticks_ms() + 200
print("Wifi connected!\n")
print(wifiClient.ifconfig())
mqttClient = mqttConnect()
oldButtonTelemetryData = ""
oldSwitchTelemetryData = ""
antiBouncing1 = ticks_ms() + 100
antiBouncing2 = ticks_ms() + 100
publishTimer = ticks_ms() + 5000
printLoop = ticks_ms() + 200
while True:
mqttClient.check_msg()
ogDHT.measure()
if ticks_ms() >= printLoop:
print(". ", end="")
printLoop = ticks_ms() + 200
if ticks_ms() >= antiBouncing1:
buttonStatus = button.value()
if buttonStatus != buttonHistory:
if buttonStatus == 1:
blueLED.value(not blueLED())
buttonHistory = buttonStatus
antiBouncing1 = ticks_ms() + 100
if ticks_ms() >= antiBouncing2:
switchStatus = switch.value()
if switchStatus != buttonHistory:
if switchStatus == 1:
purpleLED.value(not purpleLED())
switchHistory = switchStatus
antiBouncing2 = ticks_ms() + 100
newButtonTelemetryData = createJsonButton(blueLED.value())
if newButtonTelemetryData != oldButtonTelemetryData:
mqttPublish(MQTT_CONTROL_TOPIC, newButtonTelemetryData.encode())
print(newButtonTelemetryData)
oldButtonTelemetryData = newButtonTelemetryData
newTelemetryData = createJsonData(luz.read(), ogDHT.temperature(), ogDHT.humidity(), purpleLED.value())
if ticks_ms() >= publishTimer:
mqttPublish(MQTT_CONTROL_TOPIC, newTelemetryData.encode())
print(newTelemetryData)
publishTimer = ticks_ms() + 5000
if ticks_ms() >= lockDelay and greenLED:
greenLED.off()
lockDelay = ticks_ms() + 5000