from machine import Pin, PWM, ADC
from time import sleep
from dht import DHT22
from neopixel import NeoPixel
#شبیهسازی سنسور رطوبت خاک با استفاده از پتانسیومتر
pot_pin = ADC(26) #پین آنالوگ برای پتانسیومتر
min_measure = 0 #مقدار حداقل برای اندازهگیری
max_measure = 65535 #مقدار حداکثر برای اندازهگیری
threshold = 40 #آستانه برای رطوبت خاک، کمتر از این مقدار رله فعال میشه
#تنظیمات بازر
buzzer_pin = PWM(Pin(2, Pin.OUT))
buzzer_pin.freq(3000) #فرکانس بازر
buzzer_pin.duty_u16(0) #ابتدا بازر خاموشه
#تنظیمات نئوپیکسل
num_leds = 16 #تعداد ال ای دی های نئوپیکسل
neo_pin = NeoPixel(Pin(27), num_leds)
color_list = [ #لیست رنگها: قرمز، سبز، آبی
(255, 0, 0),
(0, 255, 0),
(0, 0, 255)
]
#تنظیمات سنسور DHT22 برای اندازهگیری دما و رطوبت
dht_pin = DHT22(Pin(28))
h = None #مقدار رطوبت هوا
t = None #مقدار دما
threshold_humidity = 60 #مقدار تنظیم شده بیشفرض برای انجام یک سناریو
min_normal_temp = 24 #مقدار مینیموم نرمال دما
max_normal_temp = 32 #مقدار ماکسیموم نرمال دما
#تنظیمات رله
relay_pin = Pin(22, Pin.OUT, Pin.PULL_DOWN)
#تابعی برای تنظیم رنگ نئوپیکسلها
def set_color(color):
global num_leds
for i in range(num_leds): #اعمال رنگ به تمامی ال ای دی ها
neo_pin[i] = color
neo_pin.write() #بهروزرسانی همه نئوپیکسلها
#تابعی برای اندازهگیری رطوبت خاک ، دما و رطوبت هوا
def measure():
global min_measure, max_measure, h, t
try:
#محاسبه درصد رطوبت خاک بر اساس مقدار خوانده شده از پتانسیومتر
soil_moisture_value = ((pot_pin.read_u16() - min_measure) / (max_measure - min_measure)) * 100
dht_pin.measure() #محاسبه مقادیر دما و رطوبت هوا
h = dht_pin.humidity() #خواندن مقدار رطوبت هوا
t = dht_pin.temperature() #خواندن مقدار دما
except Exception as e:
#مدیریت خطا در صورت مشکل در خواندن سنسورها
print("Error measuring!!! : ", e)
sleep(1)
return None, None, None
return soil_moisture_value, h, t #بازگشت مقادیر اندازهگیری شده
#تابعی برای اجرای اقدامات بر اساس مقادیر اندازهگیری شده
def action():
global threshold, threshold_humidity
s_m_v, h, t = measure() #دریافت مقادیر اندازهگیری شده
#بررسی رطوبت خاک و کنترل رله
if s_m_v <= threshold and not relay_pin.value():
relay_pin.on() #روشن کردن رله
print(f"Soil moisture is low : {s_m_v:.1f}%. turning on relay.")
elif s_m_v > threshold and relay_pin.value():
relay_pin.off() #خاموش کردن رله
print(f"Soil moisture normal : {s_m_v:.1f}%. relay off.")
#بررسی دما و تغییر رنگ نئوپیکسلها
if t >= max_normal_temp:
set_color(color_list[0]) #قرمز برای دمای بالا
print(f"Temperature is high : {t:.1f} C. Setting NeoPixel to red.")
elif min_normal_temp <= t <= max_normal_temp:
set_color(color_list[1]) #سبز برای دمای متوسط
print(f"Temperature is mid : {t:.1f} C. Setting NeoPixel to green.")
elif t <= min_normal_temp:
set_color(color_list[2]) #آبی برای دمای پایین
print(f"Temperature is low : {t:.1f} C. Setting NeoPixel to blue.")
#بررسی رطوبت هوا و کنترل بازر
if h >= threshold_humidity:
buzzer_pin.duty_u16(32768) #فعال کردن بازر
print(f"Humidity is high : {h:.1f}%. Activating buzzer.")
else:
buzzer_pin.duty_u16(0) #خاموش کردن بازر
print(f"Humidity is normal : {h:.1f}%. buzzer off. \n")
while True:
action() #اجرای سناریو ها
sleep(1) #تأخیر یک ثانیهای بین هر تکرار برای کاهش بار بردازشی