import network
import time
from machine import Pin, PWM
import dht
import blynklib
# ==========================
# Blynk Auth Token
# ==========================
BLYNK_AUTH_TOKEN = "zOomJZAMclTS1BmK1waXV3Unn5pWGCPQ"
# ==========================
class ParallelLCD:
def __init__(self, rs, e, d4, d5, d6, d7):
self.rs = Pin(rs, Pin.OUT)
self.e = Pin(e, Pin.OUT)
self.data = [Pin(p, Pin.OUT) for p in (d4, d5, d6, d7)]
time.sleep_ms(50)
self._nibble(0x03); time.sleep_ms(5)
self._nibble(0x03); time.sleep_us(150)
self._nibble(0x03)
self._nibble(0x02)
self._cmd(0x28); self._cmd(0x0C); self._cmd(0x06)
self.clear()
def _pulse(self):
self.e.value(0); time.sleep_us(1)
self.e.value(1); time.sleep_us(1)
self.e.value(0); time.sleep_us(100)
def _nibble(self, value):
for i in range(4):
self.data[i].value((value >> i) & 1)
self._pulse()
def _cmd(self, cmd):
self.rs.value(0)
self._nibble(cmd >> 4); self._nibble(cmd & 0x0F); time.sleep_us(50)
def _char(self, ch):
self.rs.value(1)
self._nibble(ch >> 4); self._nibble(ch & 0x0F); time.sleep_us(50)
def clear(self):
self._cmd(0x01); time.sleep_ms(2)
def move_to(self, col, row):
self._cmd(0x80 | (col + 0x40 * row))
def putstr(self, text):
for ch in text:
self._char(ord(ch))
# Hardware
# ==========================
sensor = dht.DHT22(Pin(27))
lcd = ParallelLCD(
2, # RS
15, # E
17, # D4
16, # D5
4, # D6
0 # D7
)
# RGB LED
red = PWM(Pin(19), freq=1000)
green = PWM(Pin(18), freq=1000)
blue = PWM(Pin(5), freq=1000)
def rgb_off():
red.duty(0)
green.duty(0)
blue.duty(0)
def rgb_red():
red.duty(1023)
green.duty(0)
blue.duty(0)
def rgb_green():
red.duty(0)
green.duty(1023)
blue.duty(0)
def rgb_blue():
red.duty(0)
green.duty(0)
blue.duty(1023)
rgb_off()
# ==========================
# Variables
# ==========================
system_on = True
comfort_temp = 25
# ==========================
# WiFi
# ==========================
print("Connecting WiFi...")
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect("Wokwi-GUEST", "")
while not wifi.isconnected():
time.sleep(0.2)
print("WiFi Connected")
# ==========================
# Blynk
# ==========================
blynk = blynklib.Blynk(
BLYNK_AUTH_TOKEN,
server="ny3.blynk.cloud"
)
# ==========================
# Slider (V2)
# ==========================
@blynk.on("V2")
def slider_handler(value):
global comfort_temp
comfort_temp = int(value[0])
# ==========================
# Switch (V3)
# ==========================
@blynk.on("V3")
def switch_handler(value):
global system_on
system_on = int(value[0])
# ==========================
# Main Loop
# ==========================
while True:
# Keep Blynk connected
blynk.run()
# ----------------------
# System OFF
# ----------------------
if not system_on:
rgb_off()
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("SYSTEM OFF")
lcd.move_to(0, 1)
lcd.putstr("Turn ON V3")
time.sleep(1)
continue
# ----------------------
# Read DHT22
# ----------------------
try:
sensor.measure()
temperature = sensor.temperature()
humidity = sensor.humidity()
except Exception:
continue
# ----------------------
# Send to Blynk
# ----------------------
blynk.virtual_write(0, temperature)
blynk.virtual_write(1, humidity)
# ----------------------
# LCD Display
# ----------------------
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("T:{:.1f}C".format(temperature))
lcd.move_to(9, 0)
lcd.putstr("H:{:.0f}%".format(humidity))
lcd.move_to(0, 1)
# ----------------------
# RGB Logic
# ----------------------
if temperature == comfort_temp :
rgb_green()
lcd.putstr("Status:Comfort")
elif temperature < 20 :
rgb_blue()
lcd.putstr("Status:COLD")
elif temperature > 30 :
rgb_red()
lcd.putstr("Status:HOT ")
else:
rgb_green()
lcd.putstr("Status:OK ")
time.sleep(1)