
Propojka J1 — volba napájecího napětí
-
nezapojeno — napájecí napětí \(V_{cc} = 5 V\)
-
zkratováno — napájecí napětí \(V_{cc} = 3.3 V\)


| jméno | popis |
|---|---|
T_IRQ |
Signál přerušení od dotyku. Je na nízké úrovni, pokud je detekován dotyk. |
T_DO |
Dotyková obrazovka: SPI výstup |
T_DIN |
Dotyková obrazovka: SPI vstup |
T_CS |
Dotyková obrazovka: signál chip select, nízká úroveň je zapnuto |
T_CLK |
Dotyková obrazovka: hodiny |
SDO |
(MISO) sběrnice SPI signál čtení, není-li potřeba, může být nezapojen |
LED |
Řízení podsvícení, na vysoké úrovni svítí. Pokud neřídíme jas podsvícení, připojte na 3.3V. |
SCK |
Sběrnice SPI hodiny. |
SDI (TX) |
(MOSI) sběrnice SPI signál zápisu dat. |
DC/RS |
LCD registr/data signál výběru, vysoká úroveň registr, nízká úroveň data. |
RESET |
LCD reset, pokud je na nízké úrovni. |
CS |
LCD chip select (výběr čipu), nízká úroveň zapnuto. |
GND |
Zem 0 V. |
VCC |
Napájecí napětí: 5 V pokud je propojka J1 nezapojena, 3.3 V pokud je propojka J1 zkratována. |
| ILI9341 TFT displej pin | Raspberry Pi Pico | drátek |
|---|---|---|
Vcc |
3.3V |
červený |
GND |
GND |
černý |
CS |
GP17 (pin 22) |
žlutý |
RESET |
GP7 (pin 10) |
zelený |
DC/RS |
GP6 (pin 9) |
modrý |
SDI(MOSI) |
GP15 (pin 20) |
oranžový |
SCK |
GP14 (pin 19) |
bílý |
LED |
3.3V |
červený |
Testování s MikroPythonem
Knihovna pico-displayDrivs v C pro práci s displejem
Zabiju dvě mouchy jednou ranou a zobrazím si čas z předchozího projektu hodin na TFT displeji.
$ git clone https://github.com/tvlad1234/pico-displayDrivs
Použití
Je potřeba přidat ili9341 a hardware_spi v CMakeLists.txt do target_link_libraries.
Mapování pinů a nastavení SPI
Implicitně je
-
RST je GPIO16,
-
CS je GPIO17,
-
DC je GPIO20,
-
SCK je GPIO18,
-
SDI (TX) je GPIO19, pokud použijeme defaultní SPI nastavení (SPI 0).
Nastavení pinů můžeme změnit pomocí funkce LCD_setPins() předtím než budeme inicializovat displej.
Je potřeba se ujistit, že zvolené SCK a TX piny jsou vhodné pro naši SPI periférii.
Použití reset pinu je implicitně povoleno. Nastavíme-li reset na -1, vypneme ho.
Výběr SPI displeje se dělá funkcí LCD_setSPIperiph().
Poznámka: V mém případě je to jinak, SPI používám č.1 a piny jsou: RST 7 CS 17 DC 6 SCK 14 MOSI 15
Funkce:
LCD_setPins(uint16_t dc, uint16_t cs, int16_t rst, uint16_t sck, uint16_t tx); volba pinů, které používá displej
LCD_setSPIperiph(spi_inst_t * s); výběr SPI zařízení na Picu
LCD_initDisplay(); inicializace GPIO pinů, SPI zařízení a displeje
LCD_setRotation(uint8_t m); nastavení otočení obrazovky (0, 1, 2, 3)
LCD_WritePixel(int x, int y, uint16_t col); zápis jednoho pixelu na obrazovku
LCD_WriteBitmap(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t *bitmap); zápis bitmapy na obrazovku
Použití DMA
DMA usage is disabled by default, but can be enabled by uncommenting #define USE_DMA 1 in ili9341.h
#include "pico/stdlib.h"
#include "ds3231.h"
#include "ili9341.h"
#include "gfx.h"
#include <stdio.h>
/* Funkce spustena pri preruseni budikem. */
void ds3231_interrupt_callback(uint gpio, uint32_t event_mask) {
printf("Zvoni budik.\n");
}
int main() {
// SPI piny
const uint cs_pin = 17;
const uint sck_pin = 14;
const uint mosi_pin = 15;
const uint dc_pin = 6;
const uint rst_pin = 7;
// SPI 1 (pro SPI 0 nemame piny)
spi_inst_t *spi = spi1;
/* Inicializace seriove komunikace */
stdio_init_all();
/* Piny pouzite pro hodiny DS3231. */
uint8_t sda_pin = 12;
uint8_t scl_pin = 13;
uint8_t int_pin = 18;
const char * days[7] = {"Pondeli", "Utery", "Streda", "Ctvrtek", "Patek", "Sobota", "Nedele"};
/* Nastaveni aktualniho casu. Nebudeme pouzivat, je jiz nastaveno. */
ds3231_data_t ds3231_data = {
.seconds = 0,
.minutes = 0,
.hours = 1,
.day = 4,
.date = 28,
.month = 3,
.year = 24,
.century = 1,
.am_pm = false
};
ds3231_t ds3231;
/* Nastaveni budiku */
ds3231_alarm_1_t alarm = {
.seconds = 7,
.minutes = 25,
.hours = 0,
.date = 0,
.day = 0,
.am_pm = false
};
/* Inicializace ds3231 struct. */
ds3231_init(&ds3231, i2c_default, DS3231_DEVICE_ADRESS, AT24C32_EEPROM_ADRESS_0);
sleep_ms(200);
/* Inicializace vestavene LED, bude blikat kazdou sekundu. Testovani, ze to funguje . */
#ifdef PICO_DEFAULT_LED_PIN
gpio_init(PICO_DEFAULT_LED_PIN);
gpio_set_dir(PICO_DEFAULT_LED_PIN, 1);
gpio_put(PICO_DEFAULT_LED_PIN, 1);
#endif
/* Inicializace I2C. */
gpio_init(sda_pin);
gpio_init(scl_pin);
gpio_set_function(sda_pin, GPIO_FUNC_I2C);
gpio_set_function(scl_pin, GPIO_FUNC_I2C);
gpio_pull_up(sda_pin);
gpio_pull_up(scl_pin);
i2c_init(ds3231.i2c, 400 * 1000);
/* Aktualizace registru DS3231, nastaveni casu, nastaveni budiku a nastaveni interuptu. */
// hodiny jsou již nastaveny z předchozího projektu
// ds3231_configure_time(&ds3231, &ds3231_data);
ds3231_set_alarm_1(&ds3231, &alarm, ON_MATCHING_SECOND_AND_MINUTE);
ds3231_set_interrupt_callback_function(int_pin, &ds3231_interrupt_callback);
// inicializace TFT displeje
LCD_setPins(dc_pin, cs_pin, rst_pin, sck_pin, mosi_pin);
LCD_setSPIperiph(spi);
LCD_initDisplay();
LCD_setRotation(2);
GFX_createFramebuf();
sleep_ms(1000);
printf("Zaciname smycku:\n");
while(true) {
/* Cteni registru hodin DS3231. */
if(ds3231_read_current_time(&ds3231, &ds3231_data)) {
printf("Nedostal jsem data.\n");
} else {
printf("%02u:%02u:%02u %10s %02u.%02u.20%02u\n",
ds3231_data.hours, ds3231_data.minutes, ds3231_data.seconds,
days[ds3231_data.day - 1], ds3231_data.date, ds3231_data.month, ds3231_data.year);
}
GFX_clearScreen();
GFX_setCursor(0,10);
GFX_printf("%02u:%02u:%02u %10s %02u.%02u.20%02u\n",
ds3231_data.hours, ds3231_data.minutes, ds3231_data.seconds,
days[ds3231_data.day - 1], ds3231_data.date, ds3231_data.month, ds3231_data.year);
GFX_flush();
#ifdef PICO_DEFAULT_LED_PIN
gpio_put(25, 0);
sleep_ms(500);
gpio_put(25, 1);
sleep_ms(500);
#endif
}
}
cmake_minimum_required(VERSION 3.12)
include(pico_sdk_import.cmake)
project(pico-rtc C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
add_executable(pico-rtc
ds3231_example.c)
add_subdirectory(libraries)
add_subdirectory(ili9341)
add_subdirectory(gfx)
target_link_libraries(pico-rtc pico_stdlib pico_ds3231 hardware_spi ili9341 gfx)
pico_enable_stdio_uart(pico-rtc 0)
pico_enable_stdio_usb(pico-rtc 1)
pico_add_extra_outputs(pico-rtc)
Zdroje a odkazy
Raspberry Pi Pico TFT LCD Touch Screen Tutorial - Micropython (tady prudí při zapnutém Adblocku)
