#import obsługi pinów i pamięci rtc
import machine
#import do połączenia z wi-fi
import network
#import do odmierzania czasu
import time
#import do utworzenia identyfikatora urządzenia
import binascii
#import klienta mqtt
from umqttsimple import MQTTClient
#adres brokera mqtt
BROKER = "broker.hivemq.com"
#temat na który wysyłam wynik pomiaru
VALUE_TOPIC = b"wokwi/justyna-esp32-01/energy/value"
#temat na który wysyłam stan alarmu
ALARM_TOPIC = b"wokwi/justyna-esp32-01/energy/alarm"
#identyfikator klienta na podstawie identyfikatora esp32
CLIENT_ID = b"energy-" + binascii.hexlify(machine.unique_id())
#próg alarmu dla odczytu adc
THRESHOLD = 2800 #ADC: zakres 0–4095
#czas uśpienia w milisekundach
SLEEP_TIME = 30000
#dostęp do pamięci rtc
rtc = machine.RTC()
#sprawdzam czy alarm był aktywny przed wybudzeniem
previous_alarm = rtc.memory() == b"ALARM"
#ustawiam potencjometr na wejściu analogowym gpio34
adc = machine.ADC(machine.Pin(34))
#zakres napięcia odczytywanego przez adc
adc.atten(machine.ADC.ATTN_11DB)
#bierzemy wartość z potencjometru
value = adc.read()
#czy wartość przekracza próg alarmu
alarm = value > THRESHOLD
#zapis aktualnego stanu alarmu w pamięci rtc
rtc.memory(b"ALARM" if alarm else b"OK")
#wynik pomiaru
print("Pomiar:", value)
#stan alarmu sprzed wybudzenia
print("Poprzedni alarm:", previous_alarm)
#aktualny stan alarmu
print("Aktualny alarm:", alarm)
#próba wysyłki danyvh przez mqtt
try:
#połączenie wi-fi
wifi = network.WLAN(network.STA_IF)
#moduł wi-fi
wifi.active(True)
#ukochana sieć wokwi
wifi.connect("Wokwi-GUEST", "")
#zapamiętuję czas rozpoczęcia łączenia
start = time.ticks_ms()
#czekam na połączenie z wi-fi
while not wifi.isconnected():
#sprawdzam czy minęło ponad 15 sekund
if time.ticks_diff(time.ticks_ms(), start) > 15000:
#jak tak to błąd po przekroczeniu czasu oczekiwania
raise OSError("Brak Wi-Fi")
#czekam chwilę przed kolejnym sprawdzeniem
time.sleep_ms(200)
#tworzę klienta mqtt
client = MQTTClient(CLIENT_ID, BROKER)
#łączę się z brokerem
client.connect()
#wysyłam wartość pomiaru
client.publish(VALUE_TOPIC, str(value).encode())
#wysyłam stan alarmu na osobny temat
client.publish(
ALARM_TOPIC,
b"ALARM" if alarm else b"OK",
retain=True
)
#rozłączam klienta przed uśpieniem
client.disconnect()
#potwierdzam wysłanie danych
print("Wysłano dane przez MQTT")
#obsługuję błąd połączenia lub wysyłania
except Exception as error:
#pokazuję błąd
print("Nie udało się wysłać danych:", error)
#informuję o rozpoczęciu uśpienia
print("Uśpienie na 30 sekund")
#usypiam esp32 na 30 sekund
machine.deepsleep(SLEEP_TIME)