LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

[e-PAPER] STM32L0538-DISCO w praktyce [3]: dynamiczne zmiany treści na wyświetlaczu e-paper

Uwaga! Wszystkie opublikowane odcinki kursu są dostępne pod adresem.

 

W  trzeciej – ostatniej- części cyklu przedstawimy dwa przykłady dynamicznej modyfikacji treści obrazu wyświetlanego na wyświetlaczu e-paper.

Sygnalizacja stanów przycisków

W przykładzie użyjemy dwóch przełączników: wbudowanego w płytkę User Button oraz zewnętrznego przełącznika, którego stan będzie odczytywany za pomocą linii GPIO PA1. Stan przycisków jest zobrazowany poprzez symbol elektryczny (zamknięty/otwarty) oraz tekst Button On i Button Off (fotografia 1). Przycisk z numerem 1 to przycisk User Button a przycisk z numerem 2 to przycisk zewnętrzny.

 

Fot. 1. Wygląd zestawu z wyświetlonymi przykładowymi stanami przycisków

 

Na początku musimy zainicjalizować użycie typu GPIO_InitTypeDef GPIO_InitStruct. Funkcje ButtonOff i ButtonOn wyświetlają grafiki odpowiadające dwóm stanom przycisków. Kolejne funkcje Button1OffButton2Off, Button1OnButton2Off, Button1OffButton2On i Button1OnButton2On zawierają instrukcje wyświetlające grafikę oraz tekst odpowiadający wszystkim czterem kombinacjom stanów przycisków.

W funkcji main() musimy zainicjalizować użycie następujących funkcji:

  • HAL_Init(); – użycie bibliotek HAL
  • BSP_EPD_Init(); – użycie bibliotek I konfiguracji wyświetlacza e-papierowego
  • BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO); – użycie przycisku User Button w trybie GPIO

Następnie musimy skonfigurować pin, który będzie odczytywał stan przycisku zewnętrznego. Wykorzystamy do tego pin PA1 należący do linii GPIOA, ustawimy ten pin jako wejście (input) w trybie Push/Pull z rezystorem ściągającym do GND.


/* Enable GPIOA clock */
  __GPIOA_CLK_ENABLE();
  /* Configure PA1 pin as input */
  GPIO_InitStruct.Pin =  (GPIO_PIN_1);
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT; 
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

Ustawiamy na pinie PA1 stan niski za pomocą instrukcji:

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);

W nieskończonej pętli zawarte są cztery instrukcje warunkowe, które wyświetlają odpowiedni stan przycisków na wyświetlaczu sprawdzając stan przycisku User Button oraz stan pinu PA1. Dodatkowym warunkiem jest wartość flagi, dzięki której po naciśnięciu przycisku grafika nie jest cały czas odświeżana.

if (BSP_PB_GetState(BUTTON_KEY) == 0 && flag != 0 && HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET) 
	{
		Button1OffButton2Off ();
		flag = 0;
	}

Zewnętrzny przycisk powinien być podłączony przewodami do pinów 3V_O i do pinu PA1.

 

Monitorowanie stanu touch-slidera

Program wyświetla tekst odpowiadający sektorowi panelu dotykowego, który wykrywa dotyk oraz pasek odpowiadający panelowi dotykowemu z wyróżnionym dotkniętym sektorem touch-slidera (fotografia 2).

 

Fot. 2. Widok wyświetlacza e-paper z wyświetlonym ostatnim nastawem touch-slidera

 

Aby zainicjalizować użycie panelu dotykowego trzeba dodać do projektu biblioteki Touch Sensing Library (TSL), które znajdują się w paczce bibliotek od producenta. W projekcie jest zawarta przykładowa konfiguracja panelu dotykowego w pliku tsl_user.c.

W pliku main.c zadeklarowano kilka zmiennych:

  • LINDEAR_DETECT zawiera instrukcję, która wykrywa dotyk na panelu dotykowym.
  • LINEAR_POSITION odczytuje punkt, w którym panel dotykowy wykrywa dotyk.
  • LINEAR_IDLE sprawdza czy panel dotykowy jest w stanie jałowym, czyli nie wykrywa dotyku.

Musimy też zainicjalizować procedurę obsługi dla panelu dotykowego poprzez funkcję TSC_HandleTypeDef TscHandle oraz powołać funkcję dla czujników panelu dotykowego
void Process_Sensors(tsl_user_status_t status). Funkcja static uint8_t press[] wyświetla grafikę odpowiadającą punktowi dotyku.

W funkcji main znajduje się deklaracja użycia bibliotek HAL, bibliotek wyświetlacza i użycia diod, które wskazują na aktualny stan panelu dotykowego – zielona świeci się, gdy panel dotykowy jest w stanie DETECT a czerwona gdy panel dotykowy jest w stanie IDLE. Następnie w programie znajduje się przykładowa konfiguracja panelu dotykowego. Nieskończona pętla while zawiera następujące instrukcje:

tsl_status = tsl_user_Exec();
    if (tsl_status != TSL_USER_STATUS_BUSY)
    {
      Process_Sensors(tsl_status);
    }

Działanie naszego programu znajduje się w funkcji Process_Sensors(tsl_status). W tej funkcji zawarte są cztery instrukcje warunkowe wyświetlające cztery stany panelu dotykowego. Panel jest podzielony na cztery sektory o długości ok. centymetra. Touch-slider ma rozdzielczość 256 punktów, w przykładzie nie jest wymagana tak duża dokładność, więc panel został podzielony na 16 punktów i 4 sektory po 4 punkty. Instrukcja wyświetlająca stan panelu dotykowego wygląda następująco:

if ((LINEAR_POSITION < 4) && (flag !=1))
		{
			BSP_EPD_Clear(EPD_COLOR_WHITE);
			BSP_EPD_DisplayStringAt(0, 10, (uint8_t*)"TS Position = 1", CENTER_MODE);
			BSP_EPD_DrawRect(15, 3 , 140, 4);
			BSP_EPD_DrawImage(16, 3 , 16, 35, press);
			BSP_EPD_RefreshDisplay();
			flag = 1;
		}

Zmienna LINEAR_POSITION przyjmuje wartości od 0 do 15, instrukcja if sprawdza, który z sektorów jest dotknięty, a flaga sprawdza czy należy miejsce, w którym panel dotykowy jest dotknięty się zmieniło i należy odświeżyć wyświetlacz.

  if (LINEAR_IDLE)
  {
    	BSP_LED_On(LED4);
	BSP_LED_Off(LED3);
}

Pętla sprawdzająca czy stan panelu jest jałowy wyłącza diodę zieloną (LED3) i włącza diodę czerwoną (LED4). Panel dotykowy po wykryciu dotyku przechodzi w stan IDLE po kilku sekundach nawet jeśli panel wciąż jest dotknięty.