piątek, 26 lutego 2021

ARDUINO : prosty sposób na HARMONOGRAM

Delay ? na swoje plusy, ale ... wcześniej czy później trzeba się go pozbyć. Najlepszym sposobem w przypadku Arduino jest MILLIS. To licznik czasu, po upływie którego wykonywane jest określone zadanie - wywoływana funkcja lub instrukcje zawarte w warunku. 

KOD -> DOWNLOAD <- KOD

Do czego więc delay ? a jednak ma sens, przy tworzeniu aplikacji i tylko wtedy w sumie. Bo... warto w setup wstawić tą instrukcję z nawet dość dużym parametrem, np. delay(10000); Teraz pytanie po co ? No niestety, nie jeden z początkujących spotkał się z problemem ... wgrałem szkic, coś poszło nie tak, teraz nie mogę ? co się popsuło... nic, tylko tyle, że ARDUINO IDE jest tak toporne i powolne, za nim nawiąże połączenie z płytką ta wykonuje już źle napisane instrukcje i nie pozwala na to. Zaczynasz kodować ? obowiązkowo w setup na sam początek delay(10000) - uwierz mi, pomoże Ci :-) Jak program przetestowany, nic się nie dzieje - wywalamy. 

Teraz jeszcze jedno ... do czego służy to : 

#define TERMINAL 1
#define USB_SPEED 9600


A do oszczędności :) Po przestawieniu TERMINAL na 0 znikają komunikaty na monitorze SERIAL, kod zawarty w makrach # nie istnieje! Sprawdź ilość wolnej pamięci RAM po skompilowaniu szkicu z parametrem 1 a potem z parametrem 0 -  tak należy to robić. Miałeś kiedyś informację po dołączeniu jakiś tam bibliotek że szkic jest za duży - wykorzystuj MAKRA !!! programuj z głową. MYŚL jak komputer, nie wklejaj kodów cudzych bezmyślnie - skąd gwarancja, że napisał go ktoś kto się zna na rzeczy ?

  1. #define TERMINAL 1
  2. #define USB_SPEED 9600
  3.  

  4. unsigned long czasZERO = 0;                 // --- czas ZERO dla funkcji MILLIS()
  5. unsigned long czas01mt = 0;                 // --- czas01m dla sprawdzania co 1 minutę
  6. unsigned long timeout1 = 0;                 // --- timeout dla czas01mt
  7. unsigned long czas10mt = 0;                 // --- czas10m dla sprawdzania co 10 minut
  8. unsigned long timeout2 = 0;                 // --- timeout dla czas10mt
  9. unsigned long czas01ht = 0;                 // --- czas01ht dla sprawdzania co 60 minut
  10. unsigned long timeout3 = 0;                 // --- timeout dla czas60mt
  11. unsigned long czas06ht = 0;                 // --- czas06ht dla sprawdzania co 06 godzin
  12. unsigned long timeout4 = 0;                 // --- timeout dla czas06ht

  13. void setup()                                                                                    
  14. {                                                                                                    
  15.     #if TERMINAL                                                                              
  16.         Serial.begin(USB_SPEED);
  17.     #endif                                                                                          
  18. }                                                                                                    

  19. void loop()
  20. {               
  21.     czasZERO = millis();
  22.     czas01mt = czasZERO - timeout1;
  23.     czas10mt = czasZERO - timeout2;
  24.     czas01ht = czasZERO - timeout3;
  25.     czas06ht = czasZERO - timeout4;
  26.    
  27. if(czas01mt >= 60000UL)                                                                  
  28.     {                                                                                        
  29.     Demo_1m();
  30.         timeout1 = czasZERO;    
  31.     }
  32.    
  33. if(czas10mt >= 600000UL)                                                                  
  34.     {                                                                                        
  35.         Demo_10m();
  36.         timeout2 = czasZERO;
  37.     }
  38.    
  39.     if(czas01ht >= 3600000UL)                                                              
  40.     {            
  41.         Demo_1h();
  42.         timeout3 = czasZERO;
  43.     }  
  44.    
  45.     if(czas06ht >= 21600000UL)
  46.     {                        
  47.     Demo_6h();
  48.         timeout4 = czasZERO;  
  49.     }                                                                                  
  50. }      
  51.  
  52.  
  53. void Demo_1m()
  54. {
  55.   #if TERMINAL  
  56.       Serial.println("Jestem w Demo_1m, ta funkcja wywołuje się co 60 sekund.");
  57.   #endif
  58. }
  59.  
  60. void Demo_10m()
  61. {
  62.   #if TERMINAL  
  63.       Serial.println("Jestem w Demo_10m, ta funkcja wywołuje się co 10 minut.");
  64.   #endif
  65. }
  66.  
  67. void Demo_1h()
  68. {
  69.   #if TERMINAL  
  70.       Serial.println("Jestem w Demo_1h, ta funkcja wywołuje się co 1 godzinę.");
  71.   #endif
  72. }
  73.  
  74. void Demo_6h()
  75. {
  76.   #if TERMINAL  
  77.       Serial.println("Jestem w Demo_6h, ta funkcja wywołuje się co 6 godzin.");
  78.   #endif
  79. }

czwartek, 18 lutego 2021

ESP-32 Stacja Pogody

ESP-32 Stacja Pogody (BAZA)

CODE ->>>    DOWNLOAD    <--- CODE

Dzisiaj darmowa wersja podstawowego projektu dla ESP-32. służącego do odczytania aktualnej pogody dla Twojego miasta z serwera openweathermap.org oraz czasu z serwera pool.ntp.org 

Projekt jest w dwóch językach, domyślnie wszystkie komunikaty wyświetlane na monitorze szeregowym są po Polsku. Aby zmienić język na angielski należy w linijce kodu nr. 24 - przestawić na 1 

#define LANGUAGE 0  

Projekt posiada też konfigurowalny DEBUG'er i TERMINAL. Domyślnie DEBUG ma wartość 0 (wyłączone dodatkowe komunikaty), TERMINAL ma wartość 1 (włączone komunikaty na monitor szeregowy). Przestawienie wartości TERMINAL na 0 powoduje wyłączenie także w funkcji setup() komunikacji szeregowej.

#define TERMINAL 1
#define DEBUG 0

Jedyne co potrzebujecie do uruchomienia projektu, to ustawienie nazwy swojej sieci WiFI oraz hasła do niej. Te dane do zmiany znajdują się w linijce 49 i 50

const char *ssid   = "Nazwa Twojej Sieci WiFI";
const char *password = "Twoje hasło do sieci WiFI";

Token zostaje, nie będę go usuwał, aczkolwiek warto założyć sobie darmowe konto i utworzyć swoje. Nie wiem kiedy go usunę, powiedzmy, że do końca 2021 roku pozostanie.  W linijce 52 należy zmienić miasto w którym mieszkacie lub jest nieopodal was, warto sprawdzić na liście OpenWeatherMap.org czy jest Wasze bo inaczej nie będzie odczytów. 

String city = "Legnica";  

Kod nie będzie więcej modyfikowany, oczywiście są już kolejne rozbudowane wersje które wyświetlają wszystkie dane ze struktur: pogoda i czas na stronie WWW (wifi) i na apce (BT) - ale to już moja intelektualna praca. Każdy na podstawie tego jest już w stanie sam sobie zbudować stronę czy w inny sposób wykorzystać te dane. 

CODE ->>>    DOWNLOAD    <--- CODE





poniedziałek, 15 lutego 2021

ESP2886 + Max7219

 Dziś inaczej, dziś prościej, dziś taniej. Tak się zastanawiam, czemu w ogóle ludzie mają takiego fioła na punkcie Arduino ? A czemu nie ESP2886 (nie wspomnę o ESP32, ale to temat na później)
  • jest tańsze (8zł za model ESP2886)
  • ma więcej możliwości
  • ma WiFI
  • jest 32-bitowe 
  • procesor 80Mhz
  • czujniki zastępujemy danymi z sieci WWW

Także dziś inny projekt. Do budowy wykorzystano najtańszą wersję ESP, czyli słynny model ESP12e z obsługą WiFi, 32-bitowym procesorem Tensilica Xtensa LX106 RISC taktowany z prędkością 80MHz i pamięcią o pojemności 4Mbita. Arduino przy nim wypada słabo, bardzo jak Commodore64 przy Pentium 100. 

Stacja pogody (Temperatura, wilgotność, ciśnienie atmosferyczne, prędkość wiatru) z możliwością rozbudowy na podstawie danych z serwera openweathermap.org
) + zegar czasu rzeczywistego aktualizowanego z serweta pool.ntp.org + napisy z efektami duszków i wizualizacji, tylko 2 urządzenia, 5 kabelków :-)

Kod pliku projektu       :  MojProjekt.ino
Kod klasy dodatkowej :  matryca.h
  

Oto co potrzebujemy 

ESP2886 ok. 8zł na Aliexpress :

MAX7219 ok. 25zł na Aliexpress


                    

niedziela, 14 lutego 2021

Daily update : TMatrix.h v0.057

Aktualizacja klasy TMatrix (14.02.2021) v0.057 gotowa do pobrania!


Plik do pobrania :  matrix.h  

Dodano 2 metody publiczne:

ShowShortDate(uint8_t dzien, uint8_t miesiac, uint16_t rok);

ShowLongDate(uint8_t dzien_tygodnia, uint8_t dzien, uint8_t miesiac, uint16_t rok);

  1. // ------------------------------------------------------------------------------------------------------------------------ //
  2. int TMatrix::ShowShortDate(uint8_t *day, uint8_t *month, uint16_t *year)
  3. {
  4.     if(isBUSY()) return 0;
  5.     else
  6.     if(P.displayAnimate())
  7.     {
  8.         // --- bufory ----------------- //
  9.         char bufor_main[30];            //
  10.         char bufor_temp[15];            //
  11.         char chtmp[6];                  //
  12.         // ---------------------------- //
  13.         sprintf(chtmp, "%d", day);
  14.         strcpy(bufor_main, chtmp);
  15.         MonthExtract(month, bufor_temp, sizeof(bufor_temp)-1);
  16.         strcat(bufor_main, " ");
  17.         strcat(bufor_main, bufor_temp);
  18.         strcat(bufor_main, " ");
  19.         sprintf(chtmp, "%d", year);
  20.         strcat(bufor_main, chtmp);
  21.         P.displayText(bufor_main, PA_CENTER, 20, 0 ,Efect[3].effect, Efect[3].effect);
  22.     }
  23.     return 1;
  24. }
  25. // ------------------------------------------------------------------------------------------------------------------------ //
  26. // metoda wyświetla (scroll w lewo) dzien tygodnia, dzień miesiąca, nazwę miesiąca, rok ----------------------------------- //
  27. // ------------------------------------------------------------------------------------------------------------------------ //
  28. int TMatrix::ShowLongDate(uint8_t *day_of_week, uint8_t *day, uint8_t *month, uint16_t *year)
  29. {
  30.     if(isBUSY()) return 0;
  31.     else
  32.     if(P.displayAnimate())
  33.     {
  34.         // --- bufory ----------------- //
  35.         char bufor_main [60];           //
  36.         char bufor_temp[15];            //
  37.         char chtmp[6];                  //
  38.         // ---------------------------- //
  39.         DayExtract(day_of_week, bufor_temp, sizeof(bufor_temp)-1);        
  40.         strcpy(bufor_main, bufor_temp);
  41.         strcat(bufor_main, " ");        
  42.         sprintf(chtmp, "%d", day);
  43.         strcat(bufor_main, chtmp);        
  44.         MonthExtract(month, bufor_temp, sizeof(bufor_temp)-1);
  45.         strcat(bufor_main, " ");
  46.         strcat(bufor_main, bufor_temp);
  47.         strcat(bufor_main, " ");
  48.         sprintf(chtmp, "%d", year);
  49.         strcat(bufor_main, chtmp);
  50.         P.displayText(bufor_main, PA_CENTER, 20, 0 ,Efect[3].effect, Efect[3].effect);        
  51.     }
  52.     return 1;
  53. }
  54. // ------------------------------------------------------------------------------------------------------------------------ //

BME280 - Sensor temperatury, wilgotności i ciśnienia

  BME280 (ESP32/ESP2866) BME280 to prosty w użyciu czujnik temperatury, wilgotności oraz ciśnienia atmosferycznego. Zasilany jest napię...