import machine
import utime
from machine import I2C, Pin
# Classe para controle do LCD
class I2cLcd:
def __init__(self, i2c, i2c_addr, num_lines, num_columns):
self.i2c = i2c
self.i2c_addr = i2c_addr
self.num_lines = num_lines
self.num_columns = num_columns
self._init_lcd()
def _init_lcd(self):
self._write_cmd(0x33) # Initialization
self._write_cmd(0x32) # Set to 4-bit mode
self._write_cmd(0x28) # 2 lines, 5x7 matrix
self._write_cmd(0x0C) # Display on, cursor off
self._write_cmd(0x06) # Entry mode set
def _write_cmd(self, cmd):
self._send(cmd, 0)
def _write_data(self, data):
self._send(data, 1)
def _send(self, data, mode):
high = mode | (data & 0xF0) | 0x04 # High nibble with EN
low = mode | ((data << 4) & 0xF0) | 0x04 # Low nibble with EN
self.i2c.writeto(self.i2c_addr, bytearray([high, high & ~0x04])) # High nibble
self.i2c.writeto(self.i2c_addr, bytearray([low, low & ~0x04])) # Low nibble
def clear(self):
self._write_cmd(0x01)
def putstr(self, string):
for char in string:
self._write_data(ord(char))
# Configuração do LCD
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000) # Ajuste os pinos conforme necessário
lcd = I2cLcd(i2c, 0x27, 2, 16) # Endereço I2C do módulo LCD pode variar
# Configuração do sensor ultrassônico
trigger = machine.Pin(3, machine.Pin.OUT)
echo = machine.Pin(2, machine.Pin.IN)
def measure_distance():
trigger.low()
utime.sleep_us(2)
trigger.high()
utime.sleep_us(10)
trigger.low()
while echo.value() == 0:
signal_off = utime.ticks_us()
while echo.value() == 1:
signal_on = utime.ticks_us()
time_passed = utime.ticks_diff(signal_on, signal_off)
distance = (time_passed * 0.0343) / 2
return distance
while True:
distance = measure_distance()
height = round(distance, 2) # Altura arredondada
print("Altura:", height, "cm")
# Atualizar o LCD
lcd.clear()
lcd.putstr(f"Altura:\n{height} cm")
utime.sleep(1)