Wyświetlacz OLED 1,3" SH1106

Mirek5
Posts: 120
Joined: Wed Oct 20, 2021 7:58 am

Post

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

Post

Mirek5 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źć"?
A możesz wrzucić kod
Mirek5
Posts: 120
Joined: Wed Oct 20, 2021 7:58 am

Post

maniek wrote: Mon Feb 12, 2024 12:34 pm
Mirek5 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źć"?
A możesz wrzucić kod

/********************************************************************************************************************
* 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;
}
}
zzrr
Posts: 1864
Joined: Wed Oct 26, 2022 7:35 pm
Has thanked: 76 times
Been thanked: 119 times

Post

Mirek5 wrote: Sat Feb 10, 2024 4:31 pm Może ktoś podpowie jak to "ugryźć"?
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

Post

zzrr wrote: Mon Feb 12, 2024 5:58 pm
Mirek5 wrote: Sat Feb 10, 2024 4:31 pm Może ktoś podpowie jak to "ugryźć"?
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));
zzrr. No i wszystko działa poprawnie - tak, jak chciałem. Serdecznie dziękuję i pozdrawiam.
Mirek5
Posts: 120
Joined: Wed Oct 20, 2021 7:58 am

Post

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?
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 135 times
Been thanked: 137 times

Post

Mirek5 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?
Aż mi się skojarzyło z generowaniem nazw miesięcy https://www.youtube.com/watch?v=HCH92jt ... =HRejterzy ;)
Najlepsze suple dla Twojego domu :mrgreen:
Mirek5
Posts: 120
Joined: Wed Oct 20, 2021 7:58 am

Post

klew wrote: Wed Feb 14, 2024 8:13 am
Mirek5 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 ;)
Aż mi humor poprawiło :lol: :lol: :lol:
Klew zlituj się i podpowiedz coś, co w temacie
User avatar
klew
Posts: 13911
Joined: Thu Jun 27, 2019 12:16 pm
Location: Wrocław
Has thanked: 135 times
Been thanked: 137 times

Post

Mirek5 wrote: Wed Feb 14, 2024 8:28 am Aż mi humor poprawiło :lol: :lol: :lol:
Klew zlituj się i podpowiedz coś, co w temacie
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.
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
Wtedy wyświetlacz dopisze zawsze spacje na końcu i ten "ełeki" znikną ;)
Najlepsze suple dla Twojego domu :mrgreen:
zzrr
Posts: 1864
Joined: Wed Oct 26, 2022 7:35 pm
Has thanked: 76 times
Been thanked: 119 times

Post

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 :mrgreen: to wpisz to poniżej. Będzie git.

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);
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.

Return to “Pomoc”