====== 3. IoT zařízení - periferie ======
===== Cíle cvičení =====
- Seznámení s externími periferiemi
- Implementace tlačítka s přerušením
- Seznámení se sběrnicemi (SPI, I2C, 1-Wire) a implementace (LED Maticový displej, Gyroskop + Akcelerometr, senzor teploty)
==== Implementace tlačítka s přerušením ====
Implementujte kód, který bude sledovat logickou úroveň na tlačítku. Do kódu zahrňte blokující fuknci (např. ''time.sleep(1)'') a sledujte, jak tlačítko na stisknutí reaguje. Poté vyzkoušejte stejnou implementaci tlačítka s využitím přerušení.
from machine import Pin
import time
led = Pin("LED", Pin.OUT)
button = Pin(16, Pin.IN, Pin.PULL_UP)
def button_pressed(pin):
led.toggle()
button.irq(trigger=Pin.IRQ_FALLING, handler=button_pressed)
while True:
time.sleep(1)
==== Maticový displej ====
Modul využívá čip MAX7219, který je převážně určen jako řadič 7segmentových displejů, ale lze jej využít i pro ovládání maticového displeje. Čip využívá sběrnici SPI pro komunikaci.
**Datasheet:** [[https://www.analog.com/media/en/technical-documentation/data-sheets/max7219-max7221.pdf| MAX7219 / MAX7221]]
Vytvořte si funkce pro inicializaci, smazání, a zobrazení obrázku na displeji.
**Inicializace SPI:**
from machine import Pin, SPI
matrix_SPI = SPI(0, baudrate=1000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(19))
matrix_cs = Pin(17, Pin.OUT)
matrix_cs.value(1)
**Funkce pro práci s displejem:**
def matrix_write(register, data):
matrix_cs.value(0)
matrix_SPI.write(bytearray([register,data]))
matrix_cs.value(1)
def init_display():
matrix_write(0x0C, 0x01) # Shutdown register: normal operation
matrix_write(0x0F, 0x00) # Display test: off
matrix_write(0x0B, 0x07) # Scan limit: display all 8 digits
matrix_write(0x09, 0x00) # Decode mode: none (matrix mode)
matrix_write(0x0A, 0x08) # Intensity: medium brightness
def clear_display():
for i in range(1,9):
matrix_write(i, 0x00) # Write digit i: toggle off all segments
def display_image(image):
for i in range(1,9):
matrix_write(i, image[i-1]) # Write digit i
[[courses:b0b37nsi:addons:extra:03_bonus|Bitmapy pro inspiraci]]
Kód můžete rozšířit o přijetí dat obrázku přes UART, popř. vytvořit scrollující text (např. zobrazovače v MHD).
==== Akcelerometr + Gyroskop ====
Využijte modul MPU-9250 pro vyčtení dat akcelerometru a gyroskopu. Modul komunikuje po sběrnici I2C (adresa ''0x68'').
**Datasheet:** [[https://invensense.tdk.com/wp-content/uploads/2015/02/RM-MPU-9250A-00-v1.6.pdf|MPU-9250]] [[https://invensense.tdk.com/wp-content/uploads/2015/02/RM-MPU-9250A-00-v1.6.pdf|Register Map]]
**Inicializace I2C:**
from machine import I2C, Pin
mpu9250 = I2C(1, scl=Pin(15), sda=Pin(14), freq=400000)
**Vyčtení "WHO_AM_I" registru:**
MPU_ADDR = 0x68
who = mpu9250.readfrom_mem(MPU_ADDR, 0x75, 1) # Read WHO_AM_I (reads 1 byte)
print(f"Read value 0x{who[0]:x}")
Čip obsahuje také magnetometr, který je obsažen v čipu jako externí I2C zařízení. S magnetometrem lze komunikovat pomocí I2C masteru obsaženém v čipu, nebo je potřeba zapnout I2C bypass (viz. datasheet).
==== Senzor teploty ====
Pro měření teploty a vlhkosti lze využít DHT11/22, který je připojen prostřednictvím 1-wire sériové sběrnice. Modul ''dht'' je v Micropythonu vestavěn. Senzor komunikuje po vlastní sběrnici, podobné sběrnici 1-Wire.
**Datasheet:** [[https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf| DHT22]]
**Inicializace senzoru:**
from machine import Pin
import dht
sensor = dht.DHT22(Pin(15))
**Výčet teploty a vlhkosti:**
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
print(f"Temperature: {temp:.1f}°C Humidity: {hum:.1f} %")
Při výčetu dat může dojit k timeoutu - může být vhodné zabalit výčet dat do ''try'' / ''except'' bloku.