Skocz do zawartości

ESP32 e-ink polskie znaki


marcusp

Pomocna odpowiedź

Witam,

w ramach nauki obsługi wyświetlaczy z ESP32 złożyłem stację pogodową z wyświetlaczem e-ink 7,5" 800x480 według https://github.com/G6EJD/ESP32-e-Paper-Weather-Display 

Po pokonaniu drobnych problemów wszystko działa. Chciałbym jednak uzyskać polskie czcionki na ekranie. W projekcie jest plik z napisami po polsku, jednak użyte fonty nie zawierają polskich znaków - w wyświetlanych napisach polskie znaki są "wycięte" czyli np. zamiast "Śnieg" widzę "nieg".

Próbowałem użyć fontu unifont z polskimi znakami ze strony ftp://ftp.gnu.org/gnu/unifont/ - efekt jest taki, że napisy z użyciem tego fontu w ogóle się nie wyświetlają.

Konwertowałem czcionki .ttf na stronie https://rop.nl/truetype2gfx/  - ładowałem swoją czcionkę, w pole demo text wpisywałem "ąęś" i na wirtualnym wyświetlaczu widziałem polskie znaki. pobrałem pliki .h dodałem do projektu, skompilowało się bez błędów, ale efekt ten co poprzednio - napisy z użyciem tego fontu nie wyświetlają się.

Co robię źle i jak wyświetlić napisy z polskimi literami na tym wyświetlaczu?

Napisy w języku polskim są z pliku lang-pl.h i pobierane z internetu z openweathermap.org

  • Lubię! 1
Link do komentarza
Share on other sites

- probuję zrobić to samo co kolega marcusp ale na ePapierze 2.9 ".

korzystam z biblioteki U8g2_for_Adafruit_GFX.h i podaje polskie znaki w ten sposób

const char HelloWorld[] = "\Ż\ó\łw \Środa Pi\ątek";

- fonty to naturalnie u8g2_font_unifont_t_polish.

- jak można inaczej podawać polski tekst ? 

- tekst jest statyczny czyli chyba nie ma problemu z tymi "\"

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

- backslashe zlikwidowane, teraz koduję do formatu U8G2, pośrednio poprzez pełny Unikod. 

- poniżej ścieżka 

- w programie Fony wybieram interesujący mnie ttf i jego rozmiar, export do pliku *.bdf.

- import do programu FontForge, przekodowanie na ISO 10646 (pełny Unikod) , generuj fonty, zapisz do *.bdf.

- bdfconv zamień na plik z fontami kodowanymi pod U8G2, czyli przykladowo:

bdfconv -f 1 -m "32-400" -n Tahoma22 -o myTahoma22.c Tahoma22-unicode-47.bdf

- poniżej jak to wygląda na ePapier 2.9"

 

20220304_120407.jpg

20220304_120547.jpg

Edytowano przez 99teki
  • Lubię! 2
Link do komentarza
Share on other sites

- pogodynka na 2.9 cala ePapier z fontami Helvetica a drugie zdjęcie z fontami Sans.

- jeszcze mam problem z ustawieniem Zone.

 

20220311_143450.jpg

20220311_150620.jpg

Link do komentarza
Share on other sites

w programie tak jest ustawione

const char* Timezone    = "CET-1CEST,M3.5.0,M10.5.0/3";		 // Warsaw PL
..
int   gmtOffset_sec     = 3600;    	// UK normal time is GMT
int  daylightOffset_sec = 3600; 	// In the UK DST is +1hr or 3600-secs  

- przy pierwszym obiegu pętli jest dobrze, potem układ się usypia i kolejne przejście daje godzinę do tyłu.

- że wyświetla sobotę zamiast piątku to mały problem w tablicach.

- myslałem że sobie poradzę w ten sposób

if(esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_TIMER) {
   configTime(gmtOffset_sec, daylightOffset_sec, NULL);
  }

- ale cos to nie zadziałało.

- poszukam jeszcze w programie albo przejdę na esp 32 Time bibliotekę od esp32 rtc.

- tylko wtedy generator zegara RTC idzie na oscylatorze 150 kHz i potrafi się spóżniać 5% na dobę. 

Edytowano przez 99teki
Link do komentarza
Share on other sites

- problem rozwiązany a raczej znaleziony na sieci.

- teraz RTC nie opóżnia się o dwie godziny, dalej pozostaje problem dokładności zegara w trybie sleepdown.

- TZ zone działa poprawnie, nawet z wyłączonym Wi-Fi.

// 19.03.2022 add bootCount
// file: Arduino\_utilsy\esp32RTC_NTP_by_rothschopf2.ino
/*
NTP TZ DST - bare minimum
NetWork Time Protocol - Time Zone - Daylight Saving Time

Our target for this MINI sketch is:
- get the SNTP request running
- set the timezone
- (implicit) respect daylight saving time
- how to "read" time to be printed to Serial.Monitor

This example is a stripped down version of the NTP-TZ-DST (v2) from the ESP8266
and contains some #precompiler defines to make it working for
- ESP32 core 1.0.5
- ESP8266 core 2.7.4

by noiasca
2021-03-28
*/
			
	//#include <credentials.h> 						// that's just for my unknown credentials ;-)
			
#ifndef STASSID
#define STASSID "aaa" 									// set your SSID
#define STAPSK "bcbccb" 								// set your wifi password
#endif
			
	// choose the best fitting NTP server pool for your country
#define MY_NTP_SERVER "pl.pool.ntp.org"
			
	// choose your time zone from this list
	// https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
#define MY_TZ "CET-1CEST,M3.5.0/02,M10.5.0/03"		// Warszawa, Berlin
#define uS_TO_S_FACTOR 1000000ULL  								// Conversion factor for micro seconds to seconds 
#define TIME_TO_SLEEP  300        								// Time ESP32 will go to sleep (in seconds) 
		
RTC_DATA_ATTR int 		bootCount = 0;			
	// --- Necessary Includes ----
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>  									// we need wifi to get internet access
#endif
#ifdef ARDUINO_ARCH_ESP8266
#include <ESP8266WiFi.h> 
#endif
#include <time.h> 									// time() ctime()
				
	// ------- Globals -------------
time_t now;    											// this is the epoch
tm tm;         											// the structure tm holds time information in a more convient way
		
	// ------------------	
void showTime() {
 time(&now); // read the current time
 localtime_r(&now, &tm); // update the structure tm with the current time
 Serial.print("year:");
 Serial.print(tm.tm_year + 1900); // years since 1900
 Serial.print("\tmonth:");
 Serial.print(tm.tm_mon + 1); // January = 0 (!)
 Serial.print("\tday:");
 Serial.print(tm.tm_mday); // day of month
 Serial.print("\thour:");
 Serial.print(tm.tm_hour); // hours since midnight 0-23
 Serial.print("\tmin:");
 Serial.print(tm.tm_min); // minutes after the hour 0-59
 Serial.print("\tsec:");
 Serial.print(tm.tm_sec); // seconds after the minute 0-61*
 Serial.print("\twday");
 Serial.print(tm.tm_wday); // days since Sunday 0-6
 if (tm.tm_isdst == 1) // Daylight Saving Time flag
  Serial.print("\tDST");
 else
  Serial.print("\tstandard");
 Serial.println();
 Serial.println(&tm, "%A, %B %d %Y %H:%M:%S");
}
		
	// -----------
void sleep(){
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  Serial.println(" Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) + " Seconds");
			
  Serial.println("Going to sleep now");
  Serial.println("------------------");
  Serial.println(" ");
  Serial.flush();
  esp_deep_sleep_start();
}
				
	// ----------------------------------- setup -------------------------	
void setup() {
	Serial.begin(115200);
	Serial.println("\nNTP TZ DST - bare minimum");
	Serial.printf("Bootcount = %d\n", bootCount);
			
	if ( !bootCount)	{
			// start network
		WiFi.persistent(false);
		WiFi.mode(WIFI_STA);
		WiFi.begin(STASSID, STAPSK);
		while (WiFi.status() != WL_CONNECTED) {
			delay(200);
			Serial.print ( "." );
		}
		Serial.println("\nWiFi connected");
				
		#ifdef ARDUINO_ARCH_ESP32
			// ESP32 seems to be a little more complex:
		configTime(0, 0, MY_NTP_SERVER); 								// 0, 0 because we will use TZ in the next line
		delay(500);
		setenv("TZ", MY_TZ, 1); 													// Set environment variable with your time zone
		tzset();
		#else
			// ESP8266
		configTime(MY_TZ, MY_NTP_SERVER); 								// --> for the ESP8266 only
		#endif
			//disconnect WiFi as it's no longer needed
    WiFi.disconnect(true);
    WiFi.mode(WIFI_OFF);
	}		
	bootCount++;		
	setenv("TZ", MY_TZ, 1); 													// Set environment variable with your time zone
	tzset();
	delay(1000); 																			// dirty delay
	showTime();
  sleep();
}
		
	// -------------------------------------- loop ----------------------------
void loop() {
			
}
// --------------------------- end --------------------------

- poniżej jeszcze log z programu, nie sprawdzałem jak się program zachowa dla TIME_TO_SLEEP np 1 lub 2 godziny.

NTP TZ DST - bare minimum
Bootcount = 0
...........
WiFi connected
year:2022	month:3	day:19	hour:19	min:51	sec:58	wday6	standard
Saturday, March 19 2022 19:51:58
 Setup ESP32 to sleep for every 300 Seconds
Going to sleep now
------------------
 
ets Jul 29 2019 12:21:46

rst:0x5 (DEEPSLEEP_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4

NTP TZ DST - bare minimum
Bootcount = 1
year:2022	month:3	day:19	hour:19	min:56	sec:59	wday6	standard
Saturday, March 19 2022 19:56:59
 Setup ESP32 to sleep for every 300 Seconds
Going to sleep now
------------------

 

Edytowano przez 99teki
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.