Raspberry Pi Pico ile LCD ekranda RTC Uygulaması

Merhaba Arkadaşlar, bu yazımda sizlere PICO ile lcd ekranda rtc saat uygulaması nasıl yapılır anlatacağım. LCD için daha önceden verdiğim SPI TFT LCD yi kullandım. RTC içinde piyasada bulunan DS3231 RTC entegresini kullandım. Aslında PICO nun kendi RTC özelliği var ama pil bağlantısı için kullanmadım.

LCD ve RTC pinleri için h dosyalarına bakabilirsiniz. Hangi pin nereye gidiyor.

DS3231 Bağlantı pinleri:

//I2C
#define RTC_PORT i2c1
#define RTC_SDA 6
#define RTC_SCL 7
#define RTC_INT 8

SPI TFT LCD Bağlantı pinleri:

#define SPI_PORT spi0
#define PIN_MISO 16
#define PIN_CS   17
#define PIN_SCK  18
#define PIN_MOSI 19

#define PIN_DC  20
#define PIN_RES  21

DS3231 de kesme çıkış özelliğini kullandım ve 1hz çıkışa ayarladım. Bunu picoda harici kesme ayarlayarak her kesme geldiğinde ise LCD ekranı güncelledim.

Programı ise ilk başta donanımı ayarlayıp küçük bir başlangıç ekranından sonra kesme pini ayarlanır.

    stdio_init_all();

    //led init
    gpio_init(BoardLED);
    gpio_set_dir(BoardLED, GPIO_OUT);
    gpio_put(BoardLED, true);

    // SPI initialisation. This example will use SPI at 1MHz.
    spi_init(SPI_PORT, 60000 * 1000);
    gpio_set_function(PIN_MISO, GPIO_FUNC_SPI);
    gpio_set_function(PIN_CS, GPIO_FUNC_SIO);
    gpio_set_function(PIN_SCK, GPIO_FUNC_SPI);
    gpio_set_function(PIN_MOSI, GPIO_FUNC_SPI);

    // DC pin
    gpio_init(PIN_DC);
    gpio_set_dir(PIN_DC, GPIO_OUT);
    gpio_put(PIN_DC, 0);
    // RS pin
    gpio_init(PIN_RES);
    gpio_set_dir(PIN_RES, GPIO_OUT);
    gpio_put(PIN_RES, 0);

    //RTC init
    i2c_init(RTC_PORT, 400 * 1000);
    gpio_set_function(RTC_SDA, GPIO_FUNC_I2C);
    gpio_set_function(RTC_SCL, GPIO_FUNC_I2C);
    gpio_pull_up(RTC_SDA);
    gpio_pull_up(RTC_SCL);

    //Adc init
    adc_init();
    adc_select_input(4);
    adc_set_temp_sensor_enabled(true);

    //LCD init
    ST7735_Init();

    //**************Alıçılış animasyon************************//
    ST7735_FillScreen(ST7735_BLACK);
    ST7735_WriteString(5, 5, "RaspberryPi Pico", Font_7x10, ST7735_WHITE, ST7735_BLACK);
    sleep_ms(250);
    ST7735_WriteString(5, 20, "ST7735 SPI LCD", Font_7x10, ST7735_WHITE, ST7735_BLACK);
    sleep_ms(250);
    ST7735_WriteString(5, 35, "RTC uygulamasi", Font_7x10, ST7735_WHITE, ST7735_BLACK);
    sleep_ms(250);
    ST7735_WriteString(5, 50, "aciliyor..", Font_7x10, ST7735_WHITE, ST7735_BLACK);
    sleep_ms(250);
    sprintf(strtxt, "Prg Ver:%s", Prgver);
    ST7735_WriteString(5, 65, strtxt, Font_7x10, ST7735_WHITE, ST7735_BLACK);
    printf("%s\n", strtxt);
    sleep_ms(3000);

    ST7735_FillScreen(ST7735_WHITE);
    ST7735_DrawImage(0, 0, 128, 128, win10_logo);

    uint8_t scr = 0;
    uint8_t yzd = 0;
    for (scr = 0; scr < 128; scr++)
    {
        yzd = ((scr * 100) / 128);
        ST7735_line_v(128, 148, scr, 1, ST7735_RED);
        sprintf(strtxt, "Loading:%03d", yzd + 1);
        ST7735_WriteString(30, 150, strtxt, Font_7x10, ST7735_BLUE, ST7735_WHITE);
        sleep_ms(10);
    }

    gpio_put(BoardLED, false);
    sleep_ms(2000);
    ST7735_FillScreen(ST7735_WHITE);
    ST7735_WriteString(0, 150, "www.digitalRuh.com", Font_7x10, ST7735_COLOR565(0, 0, 255), ST7735_WHITE);
    //**********************************************************//

    //init DS3231
    DS3231_Init();

    //RTC Ayar sacdece 1 kere ayar yaplıp sonra yoruma alınacak
    DS3231_SetFullTime(18,38,00);
    DS3231_SetFullDate(11,04,7,2021);
    //-------------------------------

    //GPIO 8 için düşen kenar kesme aktif hale getir.
    gpio_set_irq_enabled_with_callback(RTC_INT, GPIO_IRQ_EDGE_FALL, true, &gpio_callback);

While kısmında ise ADC okuyup led toggle yaptım.

    while (true)
    {
        //ADC Oku
        const float conversion_factor = 3.3F / (1 << 12);
        uint16_t result = adc_read();
        float r = result * conversion_factor;
        cpu_temp = 27 - (r - 0.706) / 0.001721;

        //led toggle
        ledst = !ledst;
        gpio_put(BoardLED, ledst);
        sleep_ms(500);
    }

daha sonra kesme geldiğinde LCD güncelleme yaptım.

void LCD_UPDATE(void)
{
    //RTC değerleri al
    rtc_sec = DS3231_GetSecond();
    rtc_min = DS3231_GetMinute();
    rtc_hour = DS3231_GetHour();
    rtc_week = DS3231_GetDayOfWeek();
    rtc_date = DS3231_GetDate();
    rtc_month = DS3231_GetMonth();
    rtc_year = DS3231_GetYear();
    rtc_temp1 = DS3231_GetTemperatureInteger();
    rtc_temp2 = DS3231_GetTemperatureFraction();

    //LCD guncelle
    ST7735_DrawImage(14, 0, 100, 100, clockface_100_100);
    Draw_clock(rtc_hour, rtc_min, rtc_sec, ST7735_BLACK, ST7735_BLUE, ST7735_RED);

    sprintf(strtxt, "%s", strWeekday[rtc_week - 1]);
    ST7735_WriteString(2, 85, strtxt, Font_7x10, ST7735_MAGENTA, ST7735_WHITE);
    sprintf(strtxt, "%s", strMonth[rtc_month - 1]);
    ST7735_WriteString(104, 85, strtxt, Font_7x10, ST7735_MAGENTA, ST7735_WHITE);

    sprintf(strtxt, "%02d:%02d:%02d", rtc_hour, rtc_min, rtc_sec);
    ST7735_WriteString(20, 100, strtxt, Font_11x18, ST7735_BLUE, ST7735_WHITE);
    sprintf(strtxt, "%02d/%02d/%04d", rtc_date, rtc_month, rtc_year);
    ST7735_WriteString(10, 120, strtxt, Font_11x18, ST7735_RED, ST7735_WHITE);

    sprintf((char *)strtxt, "CPU:%3.1f DS:%02d.%02d", cpu_temp, rtc_temp1, rtc_temp2);
    ST7735_WriteString(5, 140, strtxt, Font_7x10, ST7735_BLACK, ST7735_WHITE);
}

//GPIO kesme fonk
void gpio_callback(uint gpio, uint32_t events)
{
    LCD_UPDATE();
}

VSC proje dosyasını indirmek için tıklayın. SPI_LCD_RTC

Bir başka projede görüşmek üsere,
Kolay gelsin.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.