STM32F4 ile ST7735 SPI TFT LCD kullanarak RTC Saat Uygulaması

Merhaba Arkadaşlar;

Bu yazımda sizlere önceki yazımda paylaştığım STM32 li saat devresinin SPI TFT LCD li olanını paylaşacağım. Yine çok sık kullanılan SPI TFT LCD ST7735 i kullanıyorum. Bunun yanında DS18B20 sıcaklık sensörünü ekleyerek ekranda ortam sıcaklığını ve işlemci sıcaklığını göstereceğim. Eğer DS18B20 istemiyorsanız programdan yoruma alabilirsiniz.

Önceki gibi ilk önce CubeMX programı ile proje oluşturacağım. İsterseniz komple paylaştığım proje içerisindeki dosyayı kullanabilirsiniz.

 

 

Daha sonra sırası ile kullanacağımız modülleri seçiyoruz.

Dahili sıcaklık gösterimi için ADC ayarı:

RTC için ayar:

SPI LCD ayar:

DS18B20 Pin ayar:

SPI iletişimi için CS, RES ve RS pinleri:

Daha sonra Osilatör ayarını değiştirmeyeceğiz, default ayar devam edilecek.

Şimdi gelelim seçtiğimiz modüllerin ayarlarını yapmaya;

SPI:

ADC:

RTC:

DS18B20 için pin ayar:

Ayarlarımızı yaptıktan sonra programın bize kaynak kodlarını oluşturmasını sağlayacağız. Project -> Settings den aşağıdaki gibi projenin adı ve kullanacağımız derleyici seçilir.

Ayarları yaptıktan sonra Project -> Generate Code a basarak kaynak kod şablonu üretilir.

Benim oluşturduğum proje dosyasını aşağıdaki linkten ulaşabilirsiniz. (cubemx dosyası dahil.)

ST7735_UYG_3_1.5

İster kendiniz ister linkteki projeyi kullanın, kodlama yapısında eklenecek yerler aşağıda belirtilmiştir.

  • ilk önce sistem dosyalarını include ediyoruz
    /* USER CODE BEGIN Includes */
    
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    #include "clock.h"
    #include "ds18b20_mflib.h"
    #include "st7735.h"
    #include "fonts.h"
    #include "testimg.h"
    
    /* USER CODE END Includes */
  • Variables
    /* USER CODE BEGIN PV */
    /* Private variables ---------------------------------------------------------*/
    
    uint32_t time_us;
    float temp=0;
    
    #define Prgver		"1.5"
    
    #define LED        	GPIOA, GPIO_PIN_5// board led
    #define LED_high	HAL_GPIO_WritePin(LED, GPIO_PIN_SET);
    #define LED_low		HAL_GPIO_WritePin(LED, GPIO_PIN_RESET);
    
    
    #define TEMP_SENSOR_AVG_SLOPE_MV_PER_CELSIUS                        2.5f
    #define TEMP_SENSOR_VOLTAGE_MV_AT_25                                760.0f
    #define ADC_REFERENCE_VOLTAGE_MV                                    1210.0f
    #define ADC_MAX_OUTPUT_VALUE                                        4095.0f
    
    #define ADCMAXVALUE                                        4095.0f
    
    
    uint8_t Hour;
    uint8_t Sec=0;
    uint8_t Min;
    uint8_t Year;
    uint8_t Month;
    uint8_t Date;
    uint8_t Weekday;
    uint8_t	selection;
    uint8_t select_zone;
    
    char strtxt[50];
    
    uint8_t strMonth[][12] = {"Ock", "Sub", "Mrt", "Nis", "May", "Haz", "Tem", "Agu", "Ely", "Ekm", "Ksm", "Arl"};
    uint8_t strWeekday[][7] = {"Pzt", "Sal", "Car", "Per", "Cum", "Cmt", "Pzr"};
    
    RTC_TimeTypeDef RTC_Time;
    RTC_DateTypeDef RTC_Date;
    
    
    uint32_t adcResult=0;
    float temperature;
    float voltage;
    
    
    /* USER CODE END PV */
  • Ekran, RTC ayarlama ve ilk açılış
      /* USER CODE BEGIN 2 */
    
    /*------RTC ilk ayarlama-------
      RTC_Time.Hours = 19;
      RTC_Time.Minutes = 01;
      RTC_Time.Seconds = 0;
      HAL_RTC_SetTime(&hrtc,&RTC_Time,RTC_FORMAT_BIN);
    
      RTC_Date.Date = 7;
      RTC_Date.Month = 8;
      RTC_Date.WeekDay = 2;
      RTC_Date.Year = 18;
      HAL_RTC_SetDate(&hrtc,&RTC_Date,RTC_FORMAT_BIN);
    */
    
      ST7735_Init();
    
      ST7735_FillScreen(ST7735_BLACK);
      ST7735_WriteString(5, 5, "STM32F401 Saat", Font_7x10, ST7735_WHITE, ST7735_BLACK);
      HAL_Delay(250);
      ST7735_WriteString(5, 15, "uygulamasi", Font_7x10, ST7735_WHITE, ST7735_BLACK);
      HAL_Delay(250);
      ST7735_WriteString(5, 25, "aciliyor..", Font_7x10, ST7735_WHITE, ST7735_BLACK);
      HAL_Delay(250);
      sprintf(strtxt,"Prg Ver:%s",Prgver);
      ST7735_WriteString(5, 35, strtxt, Font_7x10, ST7735_WHITE, ST7735_BLACK);
      HAL_Delay(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);
    	  HAL_Delay(10);
      }
    
    
      HAL_Delay(2000);
      ST7735_FillScreen(ST7735_WHITE);
      ST7735_WriteString(0, 150, "www.digitalRuh.com", Font_7x10, ST7735_COLOR565(0,0,255), ST7735_WHITE);
    
      /* USER CODE END 2 */
  • While kısmı:

      /* USER CODE BEGIN 3 */
    
    	  HAL_RTC_GetTime(&hrtc,&RTC_Time,RTC_FORMAT_BIN);
    	  HAL_RTC_GetDate(&hrtc,&RTC_Date,RTC_FORMAT_BIN);
    
    	  if(Sec!=RTC_Time.Seconds)
    	  {
    		  Hour = RTC_Time.Hours;
    		  Min = RTC_Time.Minutes;
    		  Sec = RTC_Time.Seconds;
    		  Date = RTC_Date.Date;
    		  Month = RTC_Date.Month;
    		  Year = RTC_Date.Year;
    		  Weekday = RTC_Date.WeekDay;
    
    
    		  ST7735_DrawImage(14,0,100,100,clockface_100_100);
    		  Draw_clock(Hour,Min,Sec,ST7735_BLACK,ST7735_BLUE,ST7735_RED);
    
    		  sprintf(strtxt,"%s",strWeekday[Weekday-1]);
    		  ST7735_WriteString(2, 85, strtxt, Font_7x10, ST7735_MAGENTA, ST7735_WHITE);
    		  sprintf(strtxt,"%s",strMonth[Month-1]);
    		  ST7735_WriteString(104, 85, strtxt, Font_7x10, ST7735_MAGENTA, ST7735_WHITE);
    
    		  sprintf(strtxt,"%02d:%02d:%02d",Hour,Min,Sec);
    		  ST7735_WriteString(20, 100, strtxt, Font_11x18, ST7735_BLUE, ST7735_WHITE);
    		  sprintf(strtxt,"%02d/%02d/%02d",Date,Month,Year);
    		  ST7735_WriteString(20, 120, strtxt, Font_11x18, ST7735_RED, ST7735_WHITE);
    
    
    
    		  //DS18b20 temp
    		  ds18b20_init_seq();
    		  ds18b20_send_rom_cmd(SKIP_ROM_CMD_BYTE);
    		  ds18b20_send_function_cmd(CONVERT_T_CMD);
    		  DelayMicro(100);
    		  ds18b20_init_seq();
    		  ds18b20_send_rom_cmd(SKIP_ROM_CMD_BYTE);
    		  ds18b20_send_function_cmd(READ_SCRATCHPAD_CMD);
    		  temp = ds18b20_read_temp();
    
    		  //ADC int TEMP
    		  if (HAL_ADC_Start(&hadc1) != HAL_OK)
    		  {
    			  //* Start Conversation Error */
    			  // Error_Handler();
    		  }
    		  if (HAL_ADC_PollForConversion(&hadc1, 500) != HAL_OK)
    		  {
    			  //* End Of Conversion flag not set on time */
    			  // Error_Handler();
    			  adcResult=-1;
    		  }
    		  else
    		  {
    			  //* ADC conversion completed */
    			  //*##-5- Get the converted value of regular channel ########################*/
    			  adcResult = HAL_ADC_GetValue(&hadc1);
    		  }
    		  HAL_ADC_Stop(&hadc1);
    		  temperature = 25.0f+(3.3f*(float)adcResult/(float)ADCMAXVALUE-0.76f)/0.0025f;
    		  sprintf((char*)strtxt,"CPU:%2.0f  OUT:%4.2f",temperature,temp); //%4.2f*C
    		  ST7735_WriteString(5, 140, strtxt, Font_7x10, ST7735_BLACK, ST7735_WHITE);
    
    		  //led toogle
    		  HAL_GPIO_TogglePin(LED);
    	  }
    
    
      }
      /* USER CODE END 3 */

    Bu bölümde dikkat etmeniz gereken nokta ilk çalıştırmada rtc yazan ve yoruma alınan kısımda saati ayarlamak için değerleri girmeniz gerekiyor. Enerji verip RTC ayarlandıktan sonra tekrar rtc yi yoruma alıp derleyip yükleyebilirsiniz. Programda saat ayarlama menüsü oluşturmadığım için bu yöntemle bir kez saat ayarlanır. Dikkat etmeniz gereken bir nokta da Vrtc pinine 3V pil bağlamalısınız. Bu pin uA seviyelerinde enerji çekilerek RTC nin çalışmasını sağlamaktadır. İsterseniz programa saat ayar menüsü dahil edebilirsiniz.

    Son hali ile program ekranı aşağıdaki gibi hem analog hemde digital saati göstermektedir. Ekranda görünen sıcaklıklar ise işlemci ve DS18B20 nin değerleridir.

“STM32F4 ile ST7735 SPI TFT LCD kullanarak RTC Saat Uygulaması” için 20 yorum

  1. hocam mükemmel bir kaynak olmuş elinize sağlık benim bir sorum vardı sıcaklık sensörünü başka bir porttan okumak istersek ne yapıcaz anlayamadım pb7 herhangi bir fonksyonda göremedim nereyi değiştirisen mesela pb6 olur anlayamadım

      1. hocam geri döndüğün içinde ayrı teşekkür ederim ciddiyetle soruyorum patreon hesabın falan varmı çok bişey yollayamam öğrenciyim ama gerçekten sitenden faydanlandım birçok kez emeğine en azında küçük bir karşılık vereyim.

        1. Teşekkürler. ilgin için tekrar çok teşekkürler, bu işi diğer siteler gibi para kazanmak için değil bilgi paylaşımı için yapıyorum.

          1. Hocam acaba çoklu olarak çalıştırma yolu varmı tek stmde 6 8 adet olacak şekilde

  2. Hocam öncelikle elinize sağlık. Lcd bağlantılarıyla ilgili sıkıntı var çalıştıramadım.Belki de yazılımda var bilmiyorum. Ekrana enerji geliyor gibi. Ufak bir ışık geliyor ama diğer hiçbir şey gelmiyor yazı, resim vs. Nedeni ne olabilir

          1. Hocam peki 7789 serisi için nasıl bir yol izlemeliyim? Sizin kütüphanenizi kullanarak

  3. Merhaba,

    Elimde ILI9488 spi bir ekran var. Bu ekranı bir türlü çalıştıramadım. Kütüphane bulamadım. Bu konularda biraz acemiyim. Nasıl bir yol izlemeliyim ?

    1. Benim yaptığım uygulama ST7735 için sendeki LCD farklı. Ama onunda HAL kütüphanesini bulursan çalıştırabilir sin. Senin için bende bakayım bulursam bilgi veririm. Kolay gelsin.

  4. arkadaşlar selam ST7735 ekranı nasıl temin edebilirim, aliexpress dışında? Yardımcı olursanız sevinirim..

  5. Hocam iyi günler acaba sıcaklık sensörünü hiç çoklu kullandınızmı ya da nasıl kullanılır biliyormusunuz yani kastettiğim 1 adet değil 2 veya daha fazla ds18b20yi tek bir stm’e takıp çalıştırma olarak header dosyalarından pin değişince başka pinler sıcaklık okuyor fakat nasıl aynı anda çalıştırırım bulamadım

  6. Hocam iyi günler acaba sıcaklık sensörünü çoklu kullanma hakkında bir bilginiz var mı yani 1den fazla ds18b20leri 8 adet tek stmden kullanmak istersek kodda nasıl bir değişiklik yapmalıyız, .h dosyasında TXRX pini değiştirince pinler değişiyor ama nasıl çoklanır anlayamadım acaba siz biliyormusunuz

Bir cevap yazın

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