Wyświetlacz OLED 1,3" SH1106
-
Mirek5
- Posts: 120
- Joined: Wed Oct 20, 2021 7:58 am
Ponieważ w GG nie da się wygenerować softu dla zegarka NTP z datą i dniem tygodnia, postanowiłem zaadaptować skecz znaleziony w sieci. Zmieniłem kilka ustawień i działa. Robiłem to w Arduino IDE dla wyświetlacza OLED 1,3" SH1106. Wszystko działa poprawnie. Nie jestem na tyle doświadczony, by zmodyfikować skecz by można było sterować rozjaśnieniem/przyciemnieniem wyświetlacza. Może ktoś podpowie jak to "ugryźć"?
-
maniek
- Posts: 28
- Joined: Sun Oct 15, 2017 7:21 pm
- Location: Góra
A możesz wrzucić kodMirek5 wrote: Sat Feb 10, 2024 4:31 pm Ponieważ w GG nie da się wygenerować softu dla zegarka NTP z datą i dniem tygodnia, postanowiłem zaadaptować skecz znaleziony w sieci. Zmieniłem kilka ustawień i działa. Robiłem to w Arduino IDE dla wyświetlacza OLED 1,3" SH1106. Wszystko działa poprawnie. Nie jestem na tyle doświadczony, by zmodyfikować skecz by można było sterować rozjaśnieniem/przyciemnieniem wyświetlacza. Może ktoś podpowie jak to "ugryźć"?
-
Mirek5
- Posts: 120
- Joined: Wed Oct 20, 2021 7:58 am
maniek wrote: Mon Feb 12, 2024 12:34 pmA możesz wrzucić kodMirek5 wrote: Sat Feb 10, 2024 4:31 pm Ponieważ w GG nie da się wygenerować softu dla zegarka NTP z datą i dniem tygodnia, postanowiłem zaadaptować skecz znaleziony w sieci. Zmieniłem kilka ustawień i działa. Robiłem to w Arduino IDE dla wyświetlacza OLED 1,3" SH1106. Wszystko działa poprawnie. Nie jestem na tyle doświadczony, by zmodyfikować skecz by można było sterować rozjaśnieniem/przyciemnieniem wyświetlacza. Może ktoś podpowie jak to "ugryźć"?
/********************************************************************************************************************
* Board Settings:
* Board: "WeMos D1 R1 or Mini"
* Upload Speed: "921600"
* CPU Frequency: "80MHz"
* Flash Size: "4MB (FS:@MB OTA:~1019KB)"
* Debug Port: "Disabled"
* Debug Level: "None"
* VTables: "Flash"
* IwIP Variant: "v2 Lower Memory"
* Exception: "Legacy (new can return nullptr)"
* Erase Flash: "Only Sketch"
* SSL Support: "All SSL ciphers (most compatible)"
* COM Port: Depends *On Your System*
*********************************************************************************************************************/
/*
This is an example file for using the time function in ESP8266 or ESP32 tu get NTP time
It offers two functions:
- getNTPtime(struct tm * info, uint32_t ms) where info is a structure which contains time
information and ms is the time the service waits till it gets a response from NTP.
Each time you cann this function it calls NTP over the net.
If you do not want to call an NTP service every second, you can use
- getTimeReducedTraffic(int ms) where ms is the the time between two physical NTP server calls. Betwwn these calls,
the time structure is updated with the (inaccurate) timer. If you call NTP every few minutes you should be ok
The time structure is called tm and has teh following values:
Definition of struct tm:
Member Type Meaning Range
tm_sec int seconds after the minute 0-61*
tm_min int minutes after the hour 0-59
tm_hour int hours since midnight 0-23
tm_mday int day of the month 1-31
tm_mon int months since January 0-11
tm_year int years since 1900
tm_wday int days since Sunday 0-6
tm_yday int days since January 1 0-365
tm_isdst int Daylight Saving Time flag
because the values are somhow akwardly defined, I introduce a function makeHumanreadable() where all values are adjusted according normal numbering.
e.g. January is month 1 and not 0 And Sunday or monday is weekday 1 not 0 (according definition of MONDAYFIRST)
Showtime is an example on how you can use the time in your sketch
The functions are inspired by work of G6EJD ( https://www.youtube.com/channel/UCgtlqH ... 4jZLItcsTg )
*/
/*
Pobrano z www.tranzystor.pl
Tłumaczenie PL - Wydawnictwo Tranzystor.pl
*/
#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <time.h>
#include <U8x8lib.h>
#include "credentials.h"
const char* ssid = mySSID; //zmień w pliku credentials.h
const char* password = myPASSWORD; //zmień w pliku credentials.h
const char* NTP_SERVER = "pl.pool.ntp.org";
const char* TZ_INFO = "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00"; // sprawdz swoją strefę na https://remotemonitoringsystems.ca/time ... ations.php
tm timeinfo;
time_t now;
long unsigned lastNTPtime;
unsigned long lastEntryTime;
U8X8_SH1106_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
void setup()
{
u8x8.begin();
Serial.begin(115200);
Serial.println("\n\nNTP test czasi\n");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Laczenie z siecia");
int counter = 0;
while (WiFi.status() != WL_CONNECTED)
{
delay(200);
if (++counter > 100)
ESP.restart();
Serial.print( "." );
}
Serial.println("\nWiFi connected\n\n");
configTime(0, 0, NTP_SERVER);
// See https://github.com/nayarsystems/posix_t ... /zones.csv for Timezone codes for your region
setenv("TZ", TZ_INFO, 1);
if (getNTPtime(10))
{
// wait up to 10sec to sync
}
else
{
Serial.println("Brak czasu");
ESP.restart();
}
showTime(&timeinfo);
lastNTPtime = time(&now);
lastEntryTime = millis();
}
void loop()
{
getNTPtime(10);
showTime(&timeinfo);
delay(1000);
}
bool getNTPtime(int sec)
{
{
uint32_t start = millis();
do
{
time(&now);
localtime_r(&now, &timeinfo);
delay(10);
} while (((millis() - start) <= (1000 * sec)) && (timeinfo.tm_year < (2016 - 1900)));
if (timeinfo.tm_year <= (2016 - 1900))
return false; // the NTP call was not successful
Serial.print("Time Now: ");
Serial.println(now);
}
return true;
}
void showTime(tm *localTime)
{
//print to serial terminal
Serial.print(localTime->tm_mday);
Serial.print('/');
Serial.print(localTime->tm_mon + 1);
Serial.print('/');
Serial.print(localTime->tm_year - 100);
Serial.print('-');
Serial.print(localTime->tm_hour);
Serial.print(':');
Serial.print(localTime->tm_min);
Serial.print(':');
Serial.print(localTime->tm_sec);
Serial.print(" Day of Week ");
Serial.println(localTime->tm_wday);
Serial.println();
//display on OLED
char time_output[30];
u8x8.setFont(u8x8_font_courB18_2x3_f);
u8x8.setCursor(0,0);
sprintf(time_output, "%02d:%02d:%02d", localTime->tm_hour, localTime->tm_min, localTime->tm_sec);
u8x8.print(time_output);
u8x8.setFont(u8x8_font_8x13B_1x2_f);
u8x8.setCursor(4,4);
sprintf(time_output, "%02d/%02d/%02d", localTime->tm_mday, localTime->tm_mon + 1, localTime->tm_year - 100);
u8x8.print(time_output);
u8x8.setCursor(4,6);
u8x8.print(getDOW(localTime->tm_wday));
}
char * getDOW(uint8_t tm_wday)
{
switch(tm_wday)
{
case 1:
return "Poniedzialek";
break;
case 2:
return "Wtorek";
break;
case 3:
return "Sroda";
break;
case 4:
return "Czwartek";
break;
case 5:
return "Piatek";
break;
case 6:
return "Sobota";
break;
case 7:
return "Niedziela";
break;
default:
return "Error";
break;
}
}
Jak chciałbyś realizować to przyciemnianie? O jakiejś godzinie? czy po prostu przyciemnić i tyle?
W tej bibliotece co masz za przyciemnienie odpowiada setContrast();
Dla przykładu: Jeśli chcesz aby przyciemniało o 18tej a rozjaśniało o 6 to wstaw poniższy fragment kodu który masz pomiędzy gwiazdkami
Code: Select all
// display on OLED
u8x8.setFont(u8x8_font_8x13B_1x2_f);
u8x8.setCursor(4, 4);
sprintf(time_output, "%02d/%02d/%02d", localTime->tm_mday, localTime->tm_mon + 1, localTime->tm_year - 100);
u8x8.print(time_output);
u8x8.setCursor(4, 6);
// **************************************************
if (localTime->tm_hour >= 18 || localTime->tm_hour < 6)
{
u8x8.setContrast(20);
}
if (localTime->tm_hour >= 6 && localTime->tm_hour < 18)
{
u8x8.setContrast(200);
}
//***************************************************
u8x8.print(getDOW(localTime->tm_wday));
-
Mirek5
- Posts: 120
- Joined: Wed Oct 20, 2021 7:58 am
zzrr. No i wszystko działa poprawnie - tak, jak chciałem. Serdecznie dziękuję i pozdrawiam.zzrr wrote: Mon Feb 12, 2024 5:58 pmJak chciałbyś realizować to przyciemnianie? O jakiejś godzinie? czy po prostu przyciemnić i tyle?
W tej bibliotece co masz za przyciemnienie odpowiada setContrast();
Dla przykładu: Jeśli chcesz aby przyciemniało o 18tej a rozjaśniało o 6 to wstaw poniższy fragment kodu który masz pomiędzy gwiazdkamiCode: Select all
// display on OLED u8x8.setFont(u8x8_font_8x13B_1x2_f); u8x8.setCursor(4, 4); sprintf(time_output, "%02d/%02d/%02d", localTime->tm_mday, localTime->tm_mon + 1, localTime->tm_year - 100); u8x8.print(time_output); u8x8.setCursor(4, 6); // ************************************************** if (localTime->tm_hour >= 18 || localTime->tm_hour < 6) { u8x8.setContrast(20); } if (localTime->tm_hour >= 6 && localTime->tm_hour < 18) { u8x8.setContrast(200); } //*************************************************** u8x8.print(getDOW(localTime->tm_wday));
-
Mirek5
- Posts: 120
- Joined: Wed Oct 20, 2021 7:58 am
Jest jeszcze jeden problem. Otóż wyświetlanie dni tygodnia po zmianie daty nie są "czyszczone i wygląda to tak:
Poniedzialek
Wtorekzialek
Srodakzialek
Czwartekalek
Po resecie WeMos'a wyświetla prawidłowo.
Brak czyszczenia ekranu w momencie zmiany daty - o północy.
Doradzi ktoś co dopisać do kodu, by działało poprawnie?
Poniedzialek
Wtorekzialek
Srodakzialek
Czwartekalek
Po resecie WeMos'a wyświetla prawidłowo.
Brak czyszczenia ekranu w momencie zmiany daty - o północy.
Doradzi ktoś co dopisać do kodu, by działało poprawnie?
-
klew
- Posts: 13911
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
- Has thanked: 135 times
- Been thanked: 137 times
Aż mi się skojarzyło z generowaniem nazw miesięcy https://www.youtube.com/watch?v=HCH92jt ... =HRejterzyMirek5 wrote: Wed Feb 14, 2024 7:05 am Jest jeszcze jeden problem. Otóż wyświetlanie dni tygodnia po zmianie daty nie są "czyszczone i wygląda to tak:
Poniedzialek
Wtorekzialek
Srodakzialek
Czwartekalek
Po resecie WeMos'a wyświetla prawidłowo.
Brak czyszczenia ekranu w momencie zmiany daty - o północy.
Doradzi ktoś co dopisać do kodu, by działało poprawnie?
Najlepsze suple dla Twojego domu 
-
Mirek5
- Posts: 120
- Joined: Wed Oct 20, 2021 7:58 am
klew wrote: Wed Feb 14, 2024 8:13 amAż mi humor poprawiłoMirek5 wrote: Wed Feb 14, 2024 7:05 am
Aż mi się skojarzyło z generowaniem nazw miesięcy https://www.youtube.com/watch?v=HCH92jt ... =HRejterzy![]()
![]()
![]()
![]()
Klew zlituj się i podpowiedz coś, co w temacie
-
klew
- Posts: 13911
- Joined: Thu Jun 27, 2019 12:16 pm
- Location: Wrocław
- Has thanked: 135 times
- Been thanked: 137 times
Nigdy jeszcze takie wyświetlaczy nie ruszałem, ale wygląda to tak, jakby wyświetlacz pamiętał co było wyświetlone wcześniej i jak coś tam wyświetlasz nowego, to każdy znak/obszar jest traktowany osobno. Innymi słowy, mając na ekranie: 12345, gdy w miejscu 1 chcesz napisać xyz, to pojawi się: xyz45.Mirek5 wrote: Wed Feb 14, 2024 8:28 am Aż mi humor poprawiło![]()
![]()
![]()
Klew zlituj się i podpowiedz coś, co w temacie
Tak najprościej to bym tą metodę getDOW poprawił tak, aby wstawiała spacje w każdym dniu, tak aby każdy dzień miał długość 12 znaków, np:
Code: Select all
"Poniedziałek" (12 znaków)
"Wtorek " (12 znaków)
itd
Najlepsze suple dla Twojego domu 
Pod linią
u8x8.print(getDOW(localTime->tm_wday));
wstaw
u8x8.refreshDisplay();
i napisz czy działa.
Edit...
jak nie zadziała a chyba nie zadziała
to wpisz to poniżej. Będzie git.
Te dwie linie clear dopisz. Zadziała Aaaa.... no i to co klew podpowiedział jest faktycznie prostym dobrym rozwiązaniem . I sobie sam wyśrodkujesz jak Ci pasuje w razie czego.
u8x8.print(getDOW(localTime->tm_wday));
wstaw
u8x8.refreshDisplay();
i napisz czy działa.
Edit...
jak nie zadziała a chyba nie zadziała
Code: Select all
u8x8.setFont(u8x8_font_8x13B_1x2_f);
u8x8.setCursor(4, 4);
sprintf(time_output, "%02d/%02d/%02d", localTime->tm_mday, localTime->tm_mon + 1, localTime->tm_year - 100);
u8x8.print(time_output);
u8x8.clearLine(6);
u8x8.clearLine(7);
u8x8.setCursor(2, 6);
