Zapojení vývodů

IMG 20240328 235824

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\)

Zapojení vývodů

IMG 20240328 235842

Displej 320x240 bodů

IMG 20240329 000023

Tabulka 1. Tabulka zapojení pinů
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.

Tabulka 2. Zapojení displeje a Pico
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

ili9341.py

Testovací program

bouncing_box.py

Výsledky létající čtvece (Python)

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.

Instalace knihovny
$ 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

Hodiny s displejem
#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
    }
}
CMakeLists.txt
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)

Hodiny DS3231 s displejem ILI9341 (v Céčku)

Zabalený projekt hodiny2.tar.gz

Měření odběru proudu

odber hodin2

Zdroje a odkazy