====== 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.