from machine import Pin, ADC, PWM, time_pulse_us
import dht
import time
import urequests
import network
dht_sensor = dht.DHT22(Pin(15))
pir = Pin(13, Pin.IN)
ldr = ADC(Pin(34))
ldr.atten(ADC.ATTN_11DB)
led = Pin(5, Pin.OUT)
trig = Pin(12, Pin.OUT)
echo = Pin(14, Pin.IN)
servo_door = PWM(Pin(4), freq=50)
servo_object = PWM(Pin(16), freq=50)
api_key = "4Z6RFSDJ0DTHA0F3"
thingspeak_url = "https://api.thingspeak.com/update"
def read_distance():
trig.off()
time.sleep_us(2)
trig.on()
time.sleep_us(10)
trig.off()
duration = time_pulse_us(echo, 1, 30000)
return int((duration / 2) / 29.1)
def set_servo_angle(servo, angle):
angle = max(0, min(180, angle)) # Clamp
duty = int((angle / 180 * 2 + 0.5) / 20 * 1023)
servo.duty(duty)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("Wokwi-GUEST", "")
while not wlan.isconnected():
time.sleep(0.5)
print("Connected:", wlan.ifconfig())
# Loop ----
while True:
try:
dht_sensor.measure()
temp = dht_sensor.temperature()
motion = pir.value()
light = ldr.read()
distance = read_distance()
print("Temp:", temp, "°C | Light:", light, "| Motion:", motion, "| Distance:", distance, "cm")
led.value(1 if light < 2000 else 0)
set_servo_angle(servo_door, 100 if motion else 0)
set_servo_angle(servo_object, 100 if distance >= 50 else 30)
payload = "api_key={}&field1={}&field2={}&field3={}&field4={}".format(
api_key, temp, light, motion, distance)
response = urequests.get(thingspeak_url + "?" + payload)
response.close()
print("Data sent to ThingSpeak.")
print("Payload:", payload)
except Exception as e:
print("Error:", e)
time.sleep(0.5)