from machine import Pin, I2C
from time import localtime, sleep_ms, sleep, ticks_ms, time
from ntptime import settime
from network import WLAN, STA_IF
from requests import get
from json import loads
from umqtt.simple import MQTTClient
import ssd1306
import gc
import framebuf
btn_menu = Pin(5, Pin.IN, Pin.PULL_DOWN)
btn_up = Pin(16, Pin.IN, Pin.PULL_DOWN)
btn_down = Pin(17, Pin.IN, Pin.PULL_DOWN)
menu_prev = menu_now = btn_menu.value()
up_prev = up_now = btn_up.value()
down_prev = down_now = btn_down.value()
mqtt_topic = b'ifrs/rafael'
api_url = 'https://api.open-meteo.com/v1/forecast?latitude=-32.035&longitude=-52.0986¤t=temperature_2m,is_day,weather_code'
text_msg = 'Alô senhor compadecente'
icons = (
b'\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x81\x848\x08\xc0\x8c`\x08`\x88\xc0\x0c0\x01\x80\x06\x03\xe1\x00\x01\x8f\xf8\x00\x00\x1f\xfc\x1c\x03?\xfe \x0e?\xfe\x00\x00\x7f\xff\x00\x00\x7f\xff\x10<\x7f\xff?\x00\x7f\xff\x06\x00\x7f\xff\x00\x00?\xfe\x00\x0f?\xfe@\x00\x1f\xfcp\x00\x0f\xf8\x18\x00\x03\xe0\x0e\x00@\x00\x02\x00\xc0\x00\x80\x03\x88\x08`\x06\x08\x8c \x04\x18\x84\x18\x00\x10\x80\x0c\x00\x00\x80\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'\x00A\x06\x04\x00A\x84\x0c0@\x84\x18\x08 \x88 \x0c\x00\x08\xc0\x07\xcf\x81\x80\x00?\xe0\x00\x00\x7f\xf8\x00\x00\x7f\xf8<^\xff\xfe`0\xff\xfe\x00\x00\xff\xfe\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x07\x80\x03\x00\x1f\xe0\x7f\x00?\xff\xff\x80?\xff\xff\x80?\xff\xff\xc0?\xff\xff\xf0?\xff\xff\xf0?\xff\xff\xf0\x1f\xff\xff\xf0\x07\xff\xff\xe0\x01\xff\xff\xe0\x01\xff\x87\x00\x00\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|\x00\x00\x01\xfe\x00\x01\xf9\xfe\x80\x01\xf9\xff\x00\x03\xff\xff\x00\x03\xff\xff\x00\x03\xff\xff\x80\x03\xff\xff\xc0\x03\xff\xff\xf0\x07\xff\xff\xf0\x1f\xff\xff\xf0\x1f\xff\xff\xf4?\xff\xff\xf8?\xff\xff\xf8?\xff\xff\xf8?\xff\xff\xf0\x1f\xff\xff\xe0\x0f\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
)
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
wifi_tries = 0
wifi = WLAN(STA_IF)
wifi.active(True)
if not wifi.isconnected():
wifi.connect('Wokwi-GUEST', '')
while not wifi.isconnected() and wifi_tries <= 100:
sleep_ms(500)
wifi_tries += 1
try:
if wifi.isconnected():
settime()
except:
pass
broker = "broker.hivemq.com"
client_id = "esp32_Rafael"
client = MQTTClient(client_id, broker)
client.connect()
mqtt_enviado = False
response = get(api_url)
if response.status_code == 200:
weather = loads(response.text)
temperature = f'{weather["current"]["temperature_2m"]}{weather["current_units"]["temperature_2m"]}'
day_flag = f'{weather["current"]["is_day"]}'
cloud_code = f'{weather["current"]["weather_code"]}'
if cloud_code == '1' or cloud_code == '0':
cloud_code = 0
elif cloud_code == '2':
cloud_code = 1
else:
cloud_code = 2
if day_flag == '1':
day_flag = 'dia'
else:
day_flag = 'noite'
state = 0
time_update = ticks_ms()
alarm_time = [0, 0]
edit_mode = 0
timezone_time = time() - 3*3600
now = localtime()
alarm_active = False
icon_buf = bytearray(icons[cloud_code])
icon_fb = framebuf.FrameBuffer(icon_buf, 32, 27, framebuf.MONO_HLSB)
while True:
if state == 0:
edit_mode = 0
oled.fill(0)
oled.text(f"{localtime(timezone_time)[3]}:{now[4]}", 5, 10)
oled.text(f"data:{now[2]}/{now[1]}/{now[0]}", 5, 25)
oled.text(f'{weather["current"]["temperature_2m"]}C', 5, 40)
oled.text(f'{day_flag}', 5, 50)
oled.blit(icon_fb, 80, 35)
if alarm_active:
oled.text(f"({alarm_time[0]}:{alarm_time[1]})", 75, 10)
oled.show()
if ticks_ms() >= time_update:
timezone_time = time() - 3*3600
time_update = ticks_ms() + 5000
now = localtime(timezone_time)
menu_now = btn_menu.value()
if menu_now != menu_prev:
if menu_now == 1:
state = 1
sleep_ms(100)
menu_prev = menu_now
if localtime(timezone_time)[3] == alarm_time[0] and now[4] == alarm_time[1] and alarm_active:
state = 2
elif state == 1:
oled.fill(0)
oled.text("quando vai", 25, 10)
oled.text("despertar?", 25, 20)
if edit_mode == 0:
oled.text(f"[{alarm_time[0]}]:{alarm_time[1]}", 28, 30)
else:
oled.text(f"{alarm_time[0]}:[{alarm_time[1]}]", 28, 30)
oled.show()
up_now = btn_up.value()
if up_now != up_prev:
if up_now == 1:
alarm_time[edit_mode] += 1
up_prev = up_now
down_now = btn_down.value()
if down_now != down_prev:
if down_now == 1:
alarm_time[edit_mode] -= 1
down_prev = down_now
alarm_time[0] %= 24
alarm_time[1] %= 60
menu_now = btn_menu.value()
if menu_now != menu_prev:
if menu_now == 1:
edit_mode += 1
if edit_mode > 1:
state = 0
alarm_active = True
sleep_ms(200)
menu_prev = menu_now
elif state == 2:
if not mqtt_enviado:
client.publish(mqtt_topic, b"Acorda!")
mqtt_enviado = True
oled.fill(0)
oled.text("ACORDA!", 50, 15)
oled.show()