from machine import Pin, ADC, PWM
import time
import dht
# Inisialisasi potensiometer pada GPIO 26
pot = ADC(26)
# Inisialisasi servo pada GPIO 15
servo = PWM(Pin(15))
servo.freq(50)
# Inisialisasi buzzer pada GPIO 14
buzzer = PWM(Pin(14))
buzzer.duty_u16(0)
# Inisialisasi sensor DHT22 pada GPIO 16
dht_sensor = dht.DHT22(Pin(16))
# Fungsi mapping nilai
def map_value(value, in_min, in_max, out_min, out_max):
return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
# Fungsi memainkan nada buzzer
def play_buzzer_note(freq, duration_ms):
buzzer.freq(freq)
buzzer.duty_u16(32768) # Volume sedang
time.sleep_ms(duration_ms)
buzzer.duty_u16(0)
time.sleep_ms(50)
# Melodi jika suhu > 35°C
def melody_low_temp():
play_buzzer_note(523, 200) # C5
play_buzzer_note(587, 200) # D5
play_buzzer_note(659, 200) # E5
# Melodi jika kelembapan < 50%
def melody_high_humidity():
play_buzzer_note(784, 200) # G5
play_buzzer_note(880, 200) # A5
play_buzzer_note(988, 200) # B5
# Melodi kombinasi (suhu > 35 dan kelembapan < 50)
def melody_combined():
play_buzzer_note(1047, 200) # C6
play_buzzer_note(1175, 200) # D6
play_buzzer_note(1319, 200) # E6
# Loop utama
while True:
# Baca nilai potensiometer dan gerakkan servo
pot_value = pot.read_u16()
servo_angle = map_value(pot_value, 0, 65535, 0, 180)
servo_duty = map_value(servo_angle, 0, 180, 1638, 8192)
servo.duty_u16(servo_duty)
# Baca suhu dan kelembapan dari DHT22
try:
dht_sensor.measure()
temperature = dht_sensor.temperature()
humidity = dht_sensor.humidity()
print(f"Suhu: {temperature}°C | Kelembapan: {humidity:.1f}% | sudut {servo_angle}")
# Cek kondisi dan mainkan melodi yang sesuai
if temperature > 35 and humidity < 50:
print("🌡️ Suhu tinggi & 💧 Kelembapan rendah — Combined melody")
melody_combined()
elif temperature > 35:
print("🌡️ Suhu tinggi — Low temp melody")
melody_low_temp()
elif humidity < 50:
print("💧 Kelembapan rendah — High humidity melody")
melody_high_humidity()
else:
buzzer.duty_u16(0) # Matikan buzzer
except OSError:
print("⚠️ Gagal membaca sensor DHT22.")
time.sleep(0.5)