Chciałem prosić was o pomoc ponieważ pomyślałem że zrobie sobie zegarek z wyświetlaniem temperatury i wilgotności( na ds18b20 i dht11) postanowiłem wykorzystać bibliotekę MenuBackend lecz mam problem ponieważ czas wyświetlany na wyświetlaczu nie jest aktualizowany. Z temperaturą jeszcze nie sprawdzałem ale pewnie będzie to samo.
chodzi mi dokładnie o część w funkcjii void menuUseEvent(MenuUseEvent used)
Kod: Zaznacz cały
#include <MenuBackend.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
// --- definiujemy dla LCD własne znaki strzałek: dół, lewo, prawo, gora-dół i powrót ---
uint8_t arrowUpDown[8] = {0x4,0xe,0x15,0x4,0x15,0xe,0x4};
uint8_t arrowDown[8] = {0x4,0x4,0x4,04,0x15,0xe,0x4};
uint8_t arrowRight[8] = {0x0,0x4,0x2,0x1f,0x2,0x4,0x0};
uint8_t arrowLeft[8] = {0x0,0x4,0x8,0x1f,0x8,0x4,0x0};
uint8_t arrowBack[8] = {0x1,0x1,0x5,0x9,0x1f,0x8,0x4};
LiquidCrystal lcd(5, 6, 7, 8, 9, 10);
volatile int zm =-1; // to dla kontroli zmiany stanu klawiatury
volatile int x=-1; // zmienna pomocnicza
volatile int stan_Analog; // wartość na wejściu Analogowym dla klawiaturki analogowej
char *linia1; // pierwsza linia wyświetlanego tekstu na LCD
char *linia2;
/*
CZAS
Pokaz Czas
Ustaw Czas
TEMPERATURA
Pokój
Pole
*/
MenuBackend menu = MenuBackend(menuUseEvent,menuChangeEvent);
MenuItem P1 = MenuItem(" CZAS",1);
MenuItem P2 = MenuItem(" TEMPERATURA",1);
MenuItem P21 = MenuItem(" Pokoj",2);
MenuItem P22 = MenuItem(" Pole",2);
void menuSetup()
{
menu.getRoot().add(P1);
P1.addRight(P2);
P2.add(P21);
P21.add(P22);P21.addLeft(P2);
P22.addLeft(P1);P22.add(P21);
P2.addRight(P1);
}
void menuUseEvent(MenuUseEvent used)
{
Serial.print("wybrano: "); Serial.println(used.item.getName());
if (used.item.getName() ==" CZAS")
{
DateTime now = RTC.now();
lcd.setCursor(2, 0);
lcd.print(now.year(), DEC);
lcd.setCursor(6,0);
lcd.print(".");
lcd.setCursor(7,0);
lcd.print(now.month(), DEC);
lcd.setCursor(9,0);
lcd.print(".");
lcd.setCursor(10,0);
lcd.print(now.day(), DEC);
lcd.setCursor(3, 1);
lcd.print(now.hour(), DEC);
lcd.print(':');
lcd.print(now.minute(), DEC);
lcd.print(':');
lcd.print(now.second(), DEC);
int akcja=-1;delay(1000);/ zmienna pomocnicza, sterująca dla petli while
// jesli nie puścisz klawisza OK w ciągu 1 sek. to powrót do menu
while(akcja!=4) // ta pętla trwa tak długo aż wciśniesz klawisz OK
{
zm=-1;
akcja=czytaj_1(0); // odczyt stanu klawiatury - funkcja czytaj_1 lub czytaj_2 lub czytaj_3
// opis poniżej przy 3 różnych definicjach funkcji czytaj
// ruszamy do pracy tylko wtedy gdy zmienił sie stan klawiatury
if(zm!=akcja)
{
if(akcja==4) // jeśli wciśnieto OK
{
lcd.setCursor(1,1);lcd.print(" ");
lcd.setCursor(0,0);lcd.print("* MENU *");delay(2500);
lcd.setCursor(1,0);lcd.print(" ");// czyścimy linie odtwarzamy poprzedni stan na LCD
lcd.setCursor(1,0);lcd.print(linia1);
}
}
} zm=akcja;// aktualizacja zmiennej zm, po to aby reagować tylko na zmiany stanu klawiatury
// tu WAŻNY MOMENT - kończy się pętla while i zwracamy sterowanie do głównej pętli loop()
}
// a tutaj obsługa pozostałych opcji
}
void menuChangeEvent(MenuChangeEvent changed)
{
int c=changed.to.getShortkey(); // pobieramy shortkey (1,2,3, lub4)
lcd.clear(); // bez komentarza
lcd.setCursor(0,0);
if(c==1) // jeśli to menu głowne (shortkey=1) to:
{
lcd.write(3); // strzałka w lewo
strcpy(linia1,changed.to.getName()); // tworzymy napis w pierwszej linii
lcd.print(linia1); // wyświetlamy ją
lcd.setCursor(15,0);lcd.write(4); // strzałka w prawo
lcd.setCursor(0,1);lcd.write(5); // strzałka w dół
lcd.setCursor(15,1);lcd.write(5); // strzałka w dół
}
if(c==2) // jeśli to podmenu dla dziecka - (shortkey=2) to:
{
lcd.print("*"); // rysujemy gwiazdkę
strcpy(linia2,changed.to.getName()); // tworzymy napis w pierwszej linii
lcd.print(linia1); // wyświetlamy ją
lcd.setCursor(15,0);lcd.print("*"); // gwiazdka
lcd.setCursor(0,1);lcd.write(6); // druga linia i strzałka powrotu (arrowBack)
lcd.print(changed.to.getName()); // wyświetlamy nazwe "dziecka"
lcd.setCursor(15,1);lcd.write(7); // strzałka góra-dół
}
if(c==3) // jeśli dziecko ma dziecko - (shortkey =3) to:
{
lcd.print("*"); // gwiazdka
strcpy(linia2,changed.to.getName()); // kopiujemy akt. nazwe opcji menu do zmiennej linia2
lcd.print(linia1); // i wyświetlamy pierwszą linię
lcd.setCursor(15,0);lcd.print("*"); // gwiazdka
lcd.setCursor(0,1);lcd.write(6); // druga linia i strzałka arrowBack
lcd.print(changed.to.getName()); // wyświetlamy wnuka w drugiej linii
lcd.setCursor(15,1);lcd.write(4); // strzałka w prawo bo są wnuki
}
if(c==4) // jeśli to wnuk (shortkey =4) to:
{
lcd.print("*"); // gwaizdka
lcd.print(linia2); // w pierwszej linii wyświetlamy dziecko ( czyli rodzica wnuka)
lcd.setCursor(15,0);lcd.print("*"); // gwaizdka
lcd.setCursor(0,1);lcd.write(6); // druga linia i strzałka arrowBack
lcd.print(changed.to.getName()); // wyświetlamy wnuka
lcd.setCursor(15,1);lcd.write(7); // strzałka góra-dół
}
}
volatile int czytaj_1(int analog)
{
int stan_Analog = analogRead(analog);delay(30);//Serial.println(stan_Analog);
if (stan_Analog < 50) return -1; // dla wartosci poza zakresem
if (stan_Analog < 185) return 0; // w prawo
if (stan_Analog < 215) return 1; // do gĂłry
if (stan_Analog < 275) return 2; // w dół
if (stan_Analog < 360) return 3; // w lewo
if (stan_Analog < 550) return 4; // OK
return -1; // nic nie wcisnieto
}
void setup()
{
linia1=new char[16]; // zainicjowanie dynamicznego wskaźnika do tekstu
linia2=new char[16];
Serial.begin(9600); // inicjacja Seriala, głównie do testów
lcd.begin(16, 2); // inicjacja LCD
lcd.createChar(3,arrowLeft); // tworzymy w pamięci LCD 5 własnych znaków dla strzałek
lcd.createChar(4,arrowRight);
lcd.createChar(5,arrowDown);
lcd.createChar(6,arrowBack);
lcd.createChar(7,arrowUpDown);
pinMode(0,OUTPUT);digitalWrite(0,LOW);
menuSetup(); // funkcja klasy MenuBackend - tu tak naprawdę tworzymy nasze menu
menu.moveDown();
Wire.begin();
RTC.begin();
//RTC.adjust(DateTime(__DATE__, __TIME__));
}
void loop()
{
x=czytaj_1(0);delay(30);
if(zm!=x) // jesli była zmiana stanu to :
{
switch(x) // sprawdzamy co nacisnieto
{
case 0: menu.moveRight();break; // jesli naciśnięto klawisz w Prawo to przesuń menu w prawo
case 1: menu.moveUp();break; // menu do góry
case 2: menu.moveDown();break; // menu w dół
case 3: menu.moveLeft();break; // menu w lewo
case 4: menu.use();break; // wciśnięto OK więc skok do funkcji menuUseEvent(MenuUseEvend used)
// to w tej funkcji właśnie obsługujemy nasze Menu, tu sprawdzamy
// jaką opcję wybrano i tutaj tworzymy kod do obslugi zdarzenia.
}
} zm=x;
}
Z góry dziękuje za pomoc