from machine import Pin, SoftI2C
from ssd1306 import SSD1306_I2C
from time import sleep
from hcsr04 import HCSR04
# ESP32 Pin assignment
i2c_lcd = SoftI2C(scl=Pin(22), sda=Pin(21), freq=100000)
i2c_oled = SoftI2C(scl=Pin(22), sda=Pin(21), freq=100000) # Same I2C pins as LCD
# LCD setup
from lcd_api import LcdApi
from i2c_lcd import LcdI2C
lcd = LcdI2C(i2c_lcd, 0x27, 4, 20) # Adjust I2C address if needed
# OLED setup
I2C_ADDR = 0x3c
oled_width = 128
oled_height = 64
oled = SSD1306_I2C(oled_width, oled_height, i2c_oled, I2C_ADDR)
# Ultrasonic sensor setup
trig_pin = Pin(5, Pin.OUT)
echo_pin = Pin(18, Pin.IN)
ultrasonic = HCSR04(trigger_pin=trig_pin, echo_pin=echo_pin)
# Display "ESP32" on LCD
lcd.clear()
lcd.putstr("ESP32")
lcd.move_to(0, 1)
lcd.putstr("on 20x4 LCD")
# Display "MicroPython" on OLED
oled.fill(0)
oled.text("MicroPython", 0, 0, 1)
oled.show()
def update_displays(timer):
# Read distance from ultrasonic sensor
distance = ultrasonic.distance_cm()
# Update LCD display
lcd.move_to(0, 2)
lcd.putstr(f"Distance: {distance:.2f} cm")
# Update OLED display
oled.fill(0)
oled.text(f"Distance: {distance:.2f} cm", 0, 0, 1)
oled.show()
# Timer to update displays every second
timer = Timer(-1)
timer.init(period=1000, mode=Timer.PERIODIC, callback=update_displays)
# Main loop
while True:
sleep(1) # Delay to avoid busy-waiting