from machine import Pin, PWM, ADC, Timer
from utime import sleep_ms, localtime, sleep
import network
import urequests
import ujson
import urequests as urlReq
import urequests as requests
import time
import gc
import ntptime
import machine
from onewire import OneWire
from ds18x20 import DS18X20
pin_ds18b20 = Pin(13) # Ganti angka 4 dengan pin GPIO yang sesuai pada ESP32
# Inisialisasi bus OneWire
ow = OneWire(pin_ds18b20)
ds = DS18X20(ow)
buzzer_pin = 32
# Inisialisasi pin sebagai output
buzzer = PWM(Pin(buzzer_pin))
# Konfigurasi WiFi
SSID = "FA"
PASSWORD = "123456789"
# Tentukan pin yang terhubung ke relay
relay_pin1 = 27 # CHANNEL SANYO 1
relay_pin2 = 26 # CHANNEL SANYO 2
relay_pin3 = 33 #CHANNEL LAMPU
# Inisialisasi pin sebagai output
relay1 = machine.Pin(relay_pin1, machine.Pin.OUT)
relay2 = machine.Pin(relay_pin2, machine.Pin.OUT)
relay3 = machine.Pin(relay_pin3, machine.Pin.OUT)
# Mengirim pesan notifikasi ke Telegram
TOKEN = "6716118364:AAGIgirxJOFpZ4VzbMJzsMJVzS3OsCs7qqo"
URL = f"https://api.telegram.org/bot{TOKEN}/"
CHAT_ID = '5949769208'
# Konfigurasi Firebase untuk Servo
KURAS_FIREBASE_URL = "https://my-project-9ec26-default-rtdb.firebaseio.com/kuras.json"
LAMPU_FIREBASE_URL = "https://my-project-9ec26-default-rtdb.firebaseio.com/relay.json"
FCM_SERVER_KEY = "AAAAFVQayUE:APA91bHVq1_t5lwAaZM7Lxz9BK-jRJVLyYrp2UmW8OdmIFDfZWLKo4jd8o-Q8HXOpoGUeO31a27BoDjD96SdIxGC-97M5SWZZsDjAGDCh2G9_SztDBcaFjJHcPzmQsz2kZjh6m5Wjste"
FCM_TOPIC = "pakan"
# Konfigurasi pin PWM untuk servo motor
urlWeb = "https://rnfrenp.000webhostapp.com/iot-kuras.php?"
urlSuhu = "https://rnfrenp.000webhostapp.com/iot-suhu.php?"
station = network.WLAN(network.STA_IF)
trying = 0
def baca_suhu():
roms = ds.scan()
if not roms:
print("Tidak ada sensor DS18B20 terdeteksi.")
return None
ds.convert_temp()
time.sleep_ms(750)
for rom in roms:
suhu = ds.read_temp(rom)
return suhu
def turn_on_relay1():
relay1.value(1)
print("Relay 1 ON")
# Fungsi untuk mematikan relay 1
def turn_off_relay1():
relay1.value(0)
print("Relay 1 OFF")
# Fungsi untuk menyalakan relay 2
def turn_on_relay2():
relay2.value(1)
print("Relay 2 ON")
# Fungsi untuk mematikan relay 2
def turn_off_relay2():
relay2.value(0)
print("Relay 2 OFF")
def kuras():
turn_on_relay1()
turn_on_relay2()
sleep_ms(15000)
beep(500, 200)
turn_off_relay1()
turn_off_relay2()
def turn_on_lampu():
relay3.value(1)
print("LAMPU MENYALA")
# Fungsi untuk mematikan relay 2
def turn_off_lampu():
relay3.value(0)
print("LAMPU MATI")
def beep(frequency, duration):
"""
Menghasilkan bunyi pada buzzer dengan frekuensi dan durasi tertentu.
"""
buzzer.freq(frequency)
buzzer.duty(50)
time.sleep_ms(duration)
buzzer.duty(0)
# Fungsi send_message
def send_message(text, chat_id):
url = f"{URL}sendMessage?text={text}&chat_id={chat_id}"
response = requests.get(url)
content = response.text
return content
def save_to_mysql(status, date_time):
try:
url = urlWeb + "status=" + status + "&waktu=" + date_time
print("URL MySQL:", url)
res = urlReq.get(url)
if res.status_code != 200:
print("Kesalahan koneksi MySQL. Status code:", res.status_code)
else:
print("Respon MySQL:", res.text)
# Manually close the response
res.close()
except OSError as e:
print("Kesalahan koneksi MySQL:", e)
while not station.isconnected():
station.active(True)
try:
station.connect(SSID, PASSWORD)
except OSError:
print("Connecting ...")
trying += 1
sleep(5)
if trying == 5:
print("Tidak dapat terhubung ke jaringan ...")
break
print("Status koneksi:", station.isconnected())
def send_to_firebase(url, kondisi):
try:
timestamp = localtime()
date_time = "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(
timestamp[0], timestamp[1], timestamp[2], timestamp[3], timestamp[4], timestamp[5]
)
data = {'status': kondisi, 'waktu': date_time}
urequests.put(url, data=ujson.dumps(data))
print("UBAH STATE KURAS")
except Exception as e:
print("Error:", e)
def t1(t):
global servo
res = urlReq.get(KURAS_FIREBASE_URL + ".json").json()
# Membaca status relay dari Firebase untuk Servo
kuras_response = urequests.get(KURAS_FIREBASE_URL)
kuras_status = kuras_response.json().get('status', 'OFF')
kuras_response.close()
# Mengontrol servo motor berdasarkan status dari Firebase
if kuras_status == 'ON':
for i in range(3):
print(f"Test {i+1}")
beep(1000, 200) # Bunyi dengan frekuensi 1000 Hz selama 200 ms
sleep_ms(200)
kuras()
send_to_firebase(KURAS_FIREBASE_URL, 'OFF')
timestamp = localtime()
date = "{:04d}-{:02d}-{:02d}".format(
timestamp[0], timestamp[1], timestamp[2]
)
time = "{:02d}:{:02d}:{:02d}".format(
timestamp[3], timestamp[4], timestamp[5]
)
sleep_ms(5000)
res_mysql = urlReq.get(url=urlWeb + "status=Dikuras" + "&tanggal=" + date + "&jam=" +time)
print("respon = ", res_mysql.text)
sleep_ms(5000)
def t2(t):
global lampu
res = urlReq.get(LAMPU_FIREBASE_URL + ".json").json()
# Membaca status relay dari Firebase untuk Servo
lampu_response = urequests.get(LAMPU_FIREBASE_URL)
lampu_status = lampu_response.json().get('status', 'OFF')
lampu_response.close()
if lampu_status == 'ON':
turn_on_lampu()
elif lampu_status == 'OFF':
turn_off_lampu()
def t3(t):
global suhu
suhu_air = baca_suhu()
if suhu_air is not None:
print("Suhu air: {:.2f} derajat Celsius".format(suhu_air))
# Menentukan kondisi suhu
if suhu_air < 29 or suhu_air > 33:
message = "Suhu Air Buruk, aktifkan Pompa air untuk menguras."
send_message(message, CHAT_ID)
print("Suhu air jelek.")
# Kirim notifikasi menggunakan FCM
url = "https://fcm.googleapis.com/fcm/send"
headers = {
"Authorization": "key=" + FCM_SERVER_KEY,
"Content-Type": "application/json"
}
payload = {
"to": "/topics/" + FCM_TOPIC,
"data": {
"title": "Suhu Air Tidak Normal !!!",
"body": "Segera kuras kolam anda"
}
}
response = urequests.post(url, headers=headers, json=payload)
print(response)
else:
print("Suhu air baik.")
# Tunggu sejenak sebelum melanjutkan
time.sleep(1)
def t4(t):
global suhu
suhu_air = baca_suhu()
suhu_str = str(suhu_air)
timestamp = localtime()
date = "{:04d}-{:02d}-{:02d}".format(
timestamp[0], timestamp[1], timestamp[2]
)
time = "{:02d}:{:02d}:{:02d}".format(
timestamp[3], timestamp[4], timestamp[5]
)
sleep_ms(5000)
res_mysql = urlReq.get(url=urlSuhu + "status=" + suhu_str + "&tanggal=" + date + "&jam=" +time)
print("respon kirim suhu = ", res_mysql.text)
print(date)
sleep_ms(5000)
# Fungsi untuk mengonfigurasi dan menghubungkan ke WiFi
def connect_to_wifi(ssid, password):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
beep(500, 500)
# Pastikan WiFi nonaktif
if not wlan.isconnected():
print("Connecting to WiFi...")
wlan.connect(ssid, password)
# Tunggu hingga terhubung ke WiFi
while not wlan.isconnected():
pass
print("Connected to WiFi")
beep(500, 1000)
print("IP Address:", wlan.ifconfig()[0])
# Panggil fungsi untuk mengonfigurasi dan menghubungkan ke WiFi
connect_to_wifi(SSID, PASSWORD)
if trying < 19:
ip, mask, gw, dns = station.ifconfig()
print("Terhubung ke jaringan")
print("IP = {}\nNetmask = {}\nGateway = {}\nDNS = {}".format(ip, mask, gw, dns))
#proces1 ( READ SERVO)
process1 = Timer(0, mode=Timer.PERIODIC, period=3697, callback=t1) #kuras air
process2 = Timer(1, mode=Timer.PERIODIC, period=2783, callback=t2) #menghidupkan dan mematikan lampu
process3 = Timer(2, mode=Timer.PERIODIC, period=13789, callback=t3) #membaca suhu dan mengirim notif
# Timer ke-2 akan dijalankan setiap 10 detik
process4 = Timer(3, mode=Timer.PERIODIC, period=9789, callback=t4) #membaca suhu