from machine import Pin, time_pulse_us, I2C
from ssd1306 import SSD1306_I2C
import time
class UltrassonicSensor:
def __init__(self, trig_pin: int, echo_pin: int):
self.__trig_pin = Pin(trig_pin, Pin.OUT)
self.__echo_pin = Pin(echo_pin, Pin.IN)
def read_distance_cm(self):
self.__trig_pin.value(0)
time.sleep_us(2)
self.__trig_pin.value(1)
time.sleep_us(10)
self.__trig_pin.value(0)
duration_us = time_pulse_us(self.__echo_pin, 1)
distance_cm = duration_us / 58.0
return distance_cm
ultrassonic = UltrassonicSensor(4, 5)
luminous_display = {
"critico": Pin(27, Pin.OUT),
"alerta": Pin(26, Pin.OUT),
"normal": Pin(25, Pin.OUT)
}
i2c = I2C(scl=Pin(22), sda=Pin(21))
OLED_W = 128
OLED_H = 64
oled_display = SSD1306_I2C(OLED_W, OLED_H, i2c)
CISTERN_HEIGHT_CM = 400
distance_to_water_cm = 0
full_height_cm_water = 0
situation = ''
oled_display.fill(0)
oled_display.text("Iniciando...", 0, 5)
time.sleep(1)
oled_display.show()
def get_situation(liters: float):
if liters < 20:
return 'critico'
if liters < 40:
return 'alerta'
return 'normal'
for k in luminous_display:
luminous_display[k].off()
while True:
distance_to_water_cm = ultrassonic.read_distance_cm()
if distance_to_water_cm > 400:
distance_to_water_cm = 400
full_height_cm_water = CISTERN_HEIGHT_CM - distance_to_water_cm
situation = get_situation(full_height_cm_water)
for k in luminous_display:
if k == situation:
luminous_display[k].on()
else:
luminous_display[k].off()
oled_display.fill(0)
oled_display.text(situation.upper(), 0, 5)
oled_display.text(f'{round(full_height_cm_water)} LITROS', 0, 20)
oled_display.show()
time.sleep(0.2)