from machine import Pin, ADC, I2C, SPI
import utime
from nokia5110 import PCD8544 # Nokia 5110 LCD driver
# Thresholds
IMPACT_LIMIT = 2.5 # g-force
PM25_LIMIT = 35.0 # μg/m³
# --- Buzzer setup ---
buzzer = Pin(15, Pin.OUT)
# --- Potentiometer for PM2.5 simulation ---
pm25_sensor = ADC(Pin(26))
# --- MPU6050 setup ---
class MPU6050:
def __init__(self, i2c, addr=0x68):
self.i2c = i2c
self.addr = addr
self.i2c.writeto_mem(self.addr, 0x6B, b'\x00') # Wake up sensor
def read_raw_data(self, reg):
high = self.i2c.readfrom_mem(self.addr, reg, 1)[0]
low = self.i2c.readfrom_mem(self.addr, reg + 1, 1)[0]
value = (high << 8) | low
if value > 32768:
value -= 65536
return value
def get_accel_data(self):
ax = self.read_raw_data(0x3B) / 16384.0
ay = self.read_raw_data(0x3D) / 16384.0
az = self.read_raw_data(0x3F) / 16384.0
return ax, ay, az
# I2C for MPU6050 (GP4 = SDA, GP5 = SCL)
i2c = I2C(0, scl=Pin(5), sda=Pin(4))
mpu = MPU6050(i2c)
# --- SPI for Nokia 5110 ---
spi = SPI(0, baudrate=2000000, polarity=0, phase=0, sck=Pin(8), mosi=Pin(7))
dc = Pin(6)
rst = Pin(2)
cs = Pin(3)
lcd = PCD8544(spi, dc, cs, rst)
lcd.clear()
# --- Functions ---
def read_pm25():
"""Read PM2.5 level from potentiometer."""
raw = pm25_sensor.read_u16()
pm25 = (raw / 65535) * 100
return round(pm25, 2)
# --- Main loop ---
while True:
# PM2.5
pm25 = read_pm25()
# MPU6050 acceleration
ax, ay, az = mpu.get_accel_data()
total_g = round((ax**2 + ay**2 + az**2) ** 0.5, 2)
#
Loading
nokia-5110
nokia-5110