from machine import Pin, I2C
from time import sleep
from i2c_lcd import I2cLcd
from ds3231 import DS3231
from umqtt.simple import MQTTClient
import network
# Wi-Fi Configuration
ssid = 'Wokwi-GUEST'
password = ''
# MQTT Configuration
mqtt_broker = "broker.mqtt-dashboard.com"
client_id = 'clientId-yZ7ziYKHQq'
topic_sub = b'esp32/relay'
topic_pub = b'esp32/status'
# I2C setup for ESP32
i2c = I2C(1, scl=Pin(22), sda=Pin(21), freq=400000)
# LCD setup
lcd = I2cLcd(i2c, 0x27, 2, 16)
# RTC setup
rtc = DS3231(i2c)
# Push button pin setup
button_pin = Pin(25, Pin.IN, Pin.PULL_UP)
# Variable to keep track of manual override state
manual_override = False
last_button_state = 1 # Initial state, assuming button is not pressed
# Wi-Fi connection
def connect_to_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while not wlan.isconnected():
sleep(1)
print('Connected to WiFi:', wlan.ifconfig())
# MQTT callback function
def sub_cb(topic, msg):
global manual_override
print((topic, msg))
if topic == topic_sub:
if msg == b'ON':
manual_override = True
publish_status()
elif msg == b'OFF':
manual_override = True
publish_status()
elif msg == b'AUTO':
manual_override = False
publish_status()
# MQTT setup
def setup_mqtt():
client = MQTTClient(client_id, mqtt_broker)
client.set_callback(sub_cb)
client.connect()
client.subscribe(topic_sub)
print('Connected to %s MQTT broker, subscribed to %s topic' % (mqtt_broker, topic_sub))
return client
# Publish status to MQTT
def publish_status():
status = 'ON' if manual_override else 'OFF'
status = 'MANUAL ' + status if manual_override else 'AUTO ' + status
client.publish(topic_pub, status)
def setup():
# Display setup message
lcd.clear()
lcd.putstr("Lighting System")
sleep(2)
def loop():
global manual_override, last_button_state
while True:
# Read the button state
button_state = button_pin.value()
# Detect button press (assuming active low)
if button_state == 0 and last_button_state == 1:
manual_override = not manual_override
publish_status()
sleep(0.3) # Debounce delay
last_button_state = button_state
# Get current time
now = rtc.datetime()
# Display time on LCD
lcd.clear()
lcd.putstr("Time: {:02}:{:02}".format(now[4], now[5]))
# Display manual override status
lcd.move_to(0, 1)
status = 'MAN ON' if manual_override else 'MAN OFF'
lcd.putstr("Light: " + status)
client.check_msg() # Check for new messages
sleep(1)
# Connect to Wi-Fi
connect_to_wifi()
# Run the setup function once
setup()
# Setup MQTT
client = setup_mqtt()
# Enter the main loop
loop()