# modules
from machine import Pin,PWM,ADC
from time import sleep
from dht import DHT22
dht = DHT22(Pin(22))
ldr = ADC(28)
fire = ADC(27)
pir = Pin(0, Pin.IN)
relay=Pin(11,Pin.OUT)
warningled=Pin(17,Pin.OUT)
#SERVO
SERVO_MIN_PULSE_WIDTH = 500
SERVO_MAX_PULSE_WIDTH = 2500
servo = PWM(Pin(3))
servo.freq(50)
def angle_to_pulse_width(angle):
pulse_width = (SERVO_MAX_PULSE_WIDTH - SERVO_MIN_PULSE_WIDTH) * (angle / 180) + SERVO_MIN_PULSE_WIDTH
return int(pulse_width)
def moveServo(angle):
pulse_width = angle_to_pulse_width(angle)
servo.duty_u16(int(pulse_width / (1000000 / 50 / 65535)))
sleep(0.5)
def scaleIntensity(val, src, dist):
'''
Map the LDR analog value to a range of 0-100 (%)
Keys:
src = [lowestLDRValue, highestLDRValue]
dist = [minValue, maxValue]
'''
return int(((val - src[0]) / (src[1]-src[0])) * (dist[1]-dist[0]) + dist[0])
def Alarm():
buzzer = PWM(Pin(26))
buzzer.freq(3000)
buzzer.duty_u16(1000)
warningled.toggle()
sleep(0.2)
buzzer.duty_u16(0)
warningled.toggle()
while True:
# getting sensor readings
dht.measure()
temp = dht.temperature()
hum = dht.humidity()
percentLDR = scaleIntensity(ldr.read_u16(), [65007, 512], [0,100])
percentFire = scaleIntensity(fire.read_u16(), [65007, 512], [0,100])
pirv = pir.value()
print(f"Temp: {temp}°C Humid: {hum}% LDR: {percentLDR}% Fire: {percentFire}% PIR: {pirv}%")
if (percentFire == 100): #Detect Fire
Alarm() #Turns on Alarm
if (pirv == 1): #Detect Movement at Night or Armed (boleh guna blynk untuk arm alarm)
Alarm() #Turns on Alarm
if (percentLDR < 40):#If Dark
relay.value(1) #Switch on Lights
elif (temp > 30): #If hot
moveServo(0) #Dispense Water Vapour
else:
relay.value(0)