import machine
import ssd1306
import dht
import time
from machine import I2C, Pin
# === Konfigurasi PIN ===
DHT_PIN = 2 # DHT22 dihubungkan ke GPIO2 (D2)
LED_PIN = 15 # LED dihubungkan ke GPIO15 (D15)
SCL_PIN = 22 # SCL I2C (untuk OLED & MPU6050)
SDA_PIN = 21 # SDA I2C (untuk OLED & MPU6050)
# === Inisialisasi Sensor & Perangkat ===
# Sensor DHT22
dht_sensor = dht.DHT22(Pin(DHT_PIN))
# OLED Display SSD1306 (128x64)
i2c = I2C(0, scl=Pin(SCL_PIN), sda=Pin(SDA_PIN))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# LED
led = Pin(LED_PIN, Pin.OUT)
led.value(0) # Matikan LED saat startup
# MPU6050 Class
class MPU6050:
def __init__(self, i2c, addr=0x68):
self.i2c = i2c
self.addr = addr
self.i2c.writeto_mem(self.addr, 0x6B, b'\x00') # Wake up sensor
def read_raw_data(self, reg):
high = self.i2c.readfrom_mem(self.addr, reg, 1)[0]
low = self.i2c.readfrom_mem(self.addr, reg + 1, 1)[0]
value = (high << 8) | low
if value > 32768:
value -= 65536
return value
def get_accel_data(self):
ax = self.read_raw_data(0x3B) / 16384.0
ay = self.read_raw_data(0x3D) / 16384.0
az = self.read_raw_data(0x3F) / 16384.0
return {"x": ax, "y": ay, "z": az}
def get_gyro_data(self):
gx = self.read_raw_data(0x43) / 131.0
gy = self.read_raw_data(0x45) / 131.0
gz = self.read_raw_data(0x47) / 131.0
return {"x": gx, "y": gy, "z": gz}
# Inisialisasi MPU6050
mpu = MPU6050(i2c)
# === Loop Utama ===
while True:
try:
# === Baca Data DHT22 ===
dht_sensor.measure()
temperature = dht_sensor.temperature()
humidity = dht_sensor.humidity()
# === Baca Data MPU6050 ===
accel = mpu.get_accel_data()
gyro = mpu.get_gyro_data()
# === Tampilkan di Serial Monitor ===
print(f"Temp: {temperature}°C, Humidity: {humidity}%")
print(f"Accel: {accel}, Gyro: {gyro}")
print("=" * 30)
# === Kontrol LED (Suhu ≥ 30°C) ===
if temperature >= 30:
led.value(1) # Nyalakan LED
else:
led.value(0) # Matikan LED
# === Tampilkan di OLED ===
oled.fill(0) # Hapus layar
oled.text(f"Temp: {temperature:.1f}C", 0, 0)
oled.text(f"Humi: {humidity:.1f}%", 0, 10)
oled.text(f"Accel X: {accel['x']:.2f}", 0, 20)
oled.text(f"Accel Y: {accel['y']:.2f}", 0, 30)
oled.text(f"Accel Z: {accel['z']:.2f}", 0, 40)
oled.text(f"LED: {'ON' if temperature >= 30 else 'OFF'}", 0, 50)
oled.show()
except Exception as e:
print("Error:", e)
time.sleep(2) # Delay 2 detik sebelum membaca ulang