from machine import Pin, ADC, PWM, I2C
import dht
import time
from i2c_lcd import I2cLcd
# ===== ADC SETUP =====
wind_adc = ADC(Pin(34))
battery_adc = ADC(Pin(35))
ldr_adc = ADC(Pin(32))
# ===== BUTTON (TOGGLE) =====
button = Pin(27, Pin.IN, Pin.PULL_UP)
turbine = False
last_button_state = 1
# ===== OUTPUT =====
led_street = Pin(14, Pin.OUT)
led_charge = Pin(12, Pin.OUT)
# ===== BUZZER =====
buzzer = PWM(Pin(13))
buzzer.duty(0)
def buzzer_on():
buzzer.freq(1000)
buzzer.duty(512)
def buzzer_off():
buzzer.duty(0)
# ===== SERVO =====
servo = PWM(Pin(26), freq=50)
def set_servo_angle(angle):
duty = int((angle / 180) * 102 + 26)
servo.duty(duty)
# ===== DHT22 =====
dht_sensor = dht.DHT22(Pin(33))
# ===== LDR THRESHOLD =====
LDR_THRESHOLD = 2000
# ===== LCD SETUP =====
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
lcd = I2cLcd(i2c, 0x27, 4, 20)
# ===== LCD START =====
time.sleep(1)
lcd.clear()
lcd.putstr("SYSTEM START")
time.sleep(2)
lcd.clear()
print("SMART WIND ENERGY SYSTEM START")
while True:
# ===== BUTTON TOGGLE =====
current_button = button.value()
if last_button_state == 1 and current_button == 0:
turbine = not turbine
print("Turbine State:", "ON" if turbine else "OFF")
time.sleep(0.3)
last_button_state = current_button
# ===== SYSTEM OFF MODE =====
if not turbine:
led_charge.value(0)
led_street.value(0)
buzzer_off()
set_servo_angle(0)
lcd.clear()
lcd.move_to(0, 0)
lcd.putstr("SYSTEM OFF")
print("=== SYSTEM OFF ===")
time.sleep(1)
continue
# ===== READ SENSOR =====
wind = wind_adc.read()
battery = battery_adc.read()
ldr = ldr_adc.read()
try:
dht_sensor.measure()
temp = dht_sensor.temperature()
except:
temp = 25
# ===== CONVERT =====
wind_speed = int((wind / 4095) * 50)
battery_percent = int((battery / 4095) * 100)
# ===== LOGIC =====
generate = wind_speed > 10
# ===== LED STREET (LDR + BATTERY CONTROL) =====
if battery_percent >= 30:
if ldr < LDR_THRESHOLD:
led_street.value(1)
day_status = "NIGHT"
else:
led_street.value(0)
day_status = "DAY"
else:
led_street.value(0)
day_status = "LOW BATTERY"
# ===== LED CHARGING =====
led_charge.value(1 if generate else 0)
# ===== BUZZER ALERT =====
if temp > 38:
buzzer_on()
else:
buzzer_off()
# ===== SERVO =====
if wind_speed > 40:
set_servo_angle(90)
else:
set_servo_angle(0)
# ===== LCD DISPLAY =====
lcd.clear()
status = "CHG" if generate else "IDL"
line1 = "B:{}% {}".format(battery_percent, status)
line2 = "T:{}C".format(temp)
line3 = "W:{}km/h".format(wind_speed)
lcd.move_to(0, 0)
lcd.putstr(line1[:20])
lcd.move_to(0, 1)
lcd.putstr(line2[:20])
lcd.move_to(0, 2)
lcd.putstr(line3[:20])
lcd.move_to(0, 3)
lcd.putstr("Mode: {}".format(day_status)[:20])
# ===== SERIAL =====
print("----------------------")
print("System: ON")
print("Mode:", day_status)
print("Wind:", wind_speed, "km/h")
print("Battery:", battery_percent, "%")
print("Temp:", temp, "C")
print("LDR:", ldr)
if generate:
print("Status: CHARGING")
else:
print("Status: IDLE")
time.sleep(1)