from machine import Pin, I2C
import ssd1306
import dht
import network
import urequests
import time
from umqtt.simple import MQTTClient
# Konfigurasi Wi-Fi
SSID = 'Wokwi-GUEST'
PASSWORD = '' # Tidak ada password
THINGSPEAK_WRITE_API_KEY = 'Z7KK4AO9PU7MY4HM'
THINGSPEAK_URL = 'http://api.thingspeak.com/update'
# Konfigurasi MQTT
MQTT_BROKER = 'broker.hivemq.com'
MQTT_PORT = 1883
MQTT_CLIENT_ID = 'esp32_client'
MQTT_TOPIC_TEMP = 'esp32/dht22/temp'
MQTT_TOPIC_HUM = 'esp32/dht22/hum'
MQTT_TOPIC_RELAY = 'esp32/relay'
# Inisialisasi Wi-Fi
def connect_wifi(ssid, password):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('Connecting to network...')
wlan.connect(ssid, password)
while not wlan.isconnected():
time.sleep(1)
print('Network connected:', wlan.ifconfig())
return wlan
# Koneksi ke Wi-Fi
connect_wifi(SSID, PASSWORD)
# Inisialisasi I2C untuk OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
# Inisialisasi OLED
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
# Inisialisasi sensor DHT22
sensor = dht.DHT22(Pin(23))
# Inisialisasi relay di pin 16
relay = Pin(16, Pin.OUT)
# Inisialisasi MQTT
def connect_mqtt():
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, port=MQTT_PORT)
client.connect()
print('MQTT connected')
return client
def mqtt_callback(topic, msg):
global relay_status
msg_str = msg.decode('utf-8')
#print('Received message on topic {}: {}'.format(topic, msg))
if topic == MQTT_TOPIC_RELAY:
if msg_str == 'ON':
relay.on()
relay_status = 'ON'
#print('Relay turned ON')
elif msg_str == 'OFF':
relay.off()
relay_status = 'OFF'
#print('Relay turned OFF')
mqtt_client = connect_mqtt()
mqtt_client.set_callback(mqtt_callback)
mqtt_client.subscribe(MQTT_TOPIC_RELAY)
# Fungsi untuk mengirim data ke ThingSpeak
def send_to_thingspeak(temperature, humidity):
url = '{}?api_key={}&field1={}&field2={}'.format(THINGSPEAK_URL, THINGSPEAK_WRITE_API_KEY, temperature, humidity)
try:
response = urequests.get(url)
if response.status_code == 200:
print('Data sent to ThingSpeak successfully')
else:
print('Failed to send data to ThingSpeak:', response.status_code)
response.close()
except Exception as e:
print('Error sending data to ThingSpeak:', e)
# Fungsi untuk mengirim data ke MQTT
def send_to_mqtt(client, temperature, humidity):
try:
client.publish(MQTT_TOPIC_TEMP, str(temperature))
client.publish(MQTT_TOPIC_HUM, str(humidity))
#print('Data sent to MQTT broker')
except Exception as e:
print('Error sending data to MQTT:', e)
# Status default
relay_status = 'OFF'
mqtt_sent = False
# Loop utama
last_mqtt_update_time = 0
last_thingspeak_update_time = 0
mqtt_update_interval = 5 # Waktu interval pengiriman data ke MQTT dalam detik
thingspeak_update_interval = 30 # Waktu interval pengiriman data ke ThingSpeak dalam detik
while True:
try:
sensor.measure() # Mengambil pembacaan dari sensor
temperature = sensor.temperature() # Membaca suhu dalam derajat Celsius
humidity = sensor.humidity() # Membaca kelembaban dalam persentase
# Hapus layar OLED
oled.fill(0)
# Tampilkan pesan pada OLED
oled.text('Temp: {:.1f} C'.format(temperature), 0, 0)
oled.text('Hum : {:.1f} %'.format(humidity), 0, 16)
# Perbarui tampilan OLED
oled.show()
# Kirim data ke MQTT jika interval waktu telah berlalu
current_time = time.time()
if current_time - last_mqtt_update_time > mqtt_update_interval:
send_to_mqtt(mqtt_client, temperature, humidity)
last_mqtt_update_time = current_time
mqtt_sent = True
else:
mqtt_sent = False
# Kirim data ke ThingSpeak jika interval waktu telah berlalu
if current_time - last_thingspeak_update_time > thingspeak_update_interval:
send_to_thingspeak(temperature, humidity)
last_thingspeak_update_time = current_time
# Periksa pesan MQTT dan proses callback
mqtt_client.check_msg()
# Cetak hasil pembacaan ke Serial Monitor dalam satu baris
print("Humidity = {:.1f} %; Temperature = {:.1f} C; Send MQTT = {}; Relay = {}".format(
humidity, temperature, mqtt_sent, relay_status))
except OSError as e:
oled.fill(0)
oled.text('Failed to read', 0, 0)
oled.text('sensor!', 0, 16)
oled.show()
print('Error:', e)
time.sleep(2) # Tunggu selama 2 detik sebelum mengambil pembacaan berikutnya