Skocz do zawartości

Problemy z kompilacją i działaniem - menu "oszalało"


Eric00x

Pomocna odpowiedź

Witam, chciałem zrobić menu, aby sprawdzić swoje umiejętności z kursu.

#include <LiquidCrystal.h> /
#define czerwona 11
#define zolta 12
#define zielona 13
#define guziklewo 8
#define guzikprawo 9
#define guzikwyboru 19
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
 int Wybor = 1;
 int Menu = 1;

void setup() {
 lcd.begin(16, 2); //Deklaracja typu
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("==MENU==");
 lcd.setCursor(0,1);
 lcd.print("Czerwona"); 
 pinMode(czerwona, OUTPUT);
 pinMode(zolta, OUTPUT);
 pinMode(zielona, OUTPUT);
 pinMode (guziklewo, INPUT_PULLUP);
 pinMode (guzikprawo, INPUT_PULLUP);
 pinMode (guzikwyboru, INPUT_PULLUP);
 digitalWrite (czerwona, LOW);
 digitalWrite(zolta, LOW); // DIODY
 digitalWrite(zielona, LOW);

}

void loop()
{
 if (Menu == 1){
if (digitalRead(guziklewo) == LOW){
 if (Wybor == 1){
   lcd.setCursor(0,1);
   lcd.print("Zielona");
   Wybor = 3;
   delay (500);
 } else {
   if((Wybor - 1) == 2)
   lcd.setCursor(0,1);
   lcd.print("Zolta");
   Wybor = 2;
   delay (500);
 } 
}
 else {
   if ((Wybor - 1) == 1) {
     lcd.setCursor(0,1);
     lcd.print("Czerwona");
     Wybor = 1;
     delay (500);
   }
}
}
 if (digitalRead(guzikprawo) == LOW){
 if (Wybor == 3){
   lcd.setCursor(0,1);
   lcd.print("Czerwona");
   Wybor = 1;
   delay (500);
 } else {
   if((Wybor + 1) == 2)
   lcd.setCursor(0,1);
   lcd.print("Zolta");
   Wybor = 2;
   delay (500);
 }
 } else {
   if ((Wybor + 1) == 3) {
     lcd.setCursor(0,1);
     lcd.print("Zielona");
     Wybor = 3;
     delay (500);
   }
}
if (digitalRead(guzikwyboru) == LOW){
if (Menu == 1){
   Menu = 0;
   lcd.setCursor(0,0);
   lcd.print("Aby wylaczyc");
   lcd.setCursor(0,1);
   lcd.print("wcisnij srodkG");
   if (Wybor == 1){
     digitalWrite(czerwona, HIGH);
   } else {
     if (Wybor == 2){
       digitalWrite(zolta, HIGH);
   } else {
     digitalWrite(zielona, HIGH);
   }
   }
} else {
 lcd.setCursor(0,1);
 lcd.print("==MENU==");
   if (Wybor == 3){
   lcd.setCursor(0,1);
   lcd.print("Czerwona");
   Wybor = 1;
 } else {
   if((Wybor + 1) == 2)
   lcd.setCursor(0,1);
   lcd.print("Zolta");
   Wybor = 2;
 }
}
 } else {
   if ((Wybor + 1) == 3) {
     lcd.setCursor(0,1);
     lcd.print("Zielona");
     Wybor = 3;
   }
}
delay (1000);
}

Schematu projektu na razie nie ma, gdyż nie pobrałem jeszcze Fritzing a(spróbuję chociaż).

EKRAN JEST Z ZESTAWU, 2x16

Menu działa nie do końca, tzn. można przewijać prawym guzikiem tylko (na LCD zostają resztki po napisie Czerwona, np Zoltaona, Zielonaa), środkowy guzik (wyboru) włącza diodę, lecz nie da się jej wyłączyć środkowym guzikiem, tylko po wciśnięciu niego aktywuje się uszkodzone menu , które można przewijać środkowym i prawym guzikiem (lewy nic nie robi). Zawsze gdy chcę uzyskać żółtą diodę, menu przewija mi do zielonego. Lewym guzikiem nie da się przewijać, gdyż po przewinięciu jest na zielonej i nie da się przewinąć dalej (menu cofa). Co do konstrukcji, jest to wielki pająk (z zestawu zostały mi zaledwie 13 kable (jeden uszkodzony) ) i o dziwo wystarcza mu napięcie z USB. Potencjometr zwiększa/zmniejsza widoczność liter (gamma chyba) poprawnie. Wiem że wielki problem z takiej prostej rzeczy jest (no bynajmniej dla mnie), ale chyba warto spróbować własnymi siłami coś zrobić 🙄 .

A i , ostatnie logi to :

*ścieżka do folderu*\Arduino\Szkice\menu_diody_lcd_22_12_2017\menu_diody_lcd_22_12_2017.ino:1:28: warning: extra tokens at end of #include directive

#include <LiquidCrystal.h> /

                           ^

Szkic używa 2750 bajtów (8%) pamięci programu. Maksimum to 32256 bajtów.
Zmienne globalne używają 109 bajtów (5%) pamięci dynamicznej, pozostawiając 1939 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów.
Link do komentarza
Share on other sites

Eric00x, bez komentarzy dość ciężko "wgryźć się" w czyjś kod. Na pierwszy rzut oka podejrzane wydaje się te linie, gdzie wewnątrz sprawdzanego warunku dodajesz/odejmujesz coś od sprawdzanej wartości, np.: "if ((Wybor + 1) == 3) {". Dlaczego właśnie tak?

Jeśli chodzi o "pozostałości" na wyświetlaczu. To jest to normalne zachowanie. Aby tego uniknąć musisz "ręcznie" czyścić najpierw miejsce, w którym chcesz pisać. W tym przypadku można to zrobić też łatwiej. Wystarczy, że wszystkie wypisywane ciągi znaków będą tej samej długości. Czyli, gdy wypisujesz "Czerwona", co ma 8 znaków, to w przypadku "Zolta" możesz dodać 3 znaki spacji i wypisywać "Zolta___". Nie będzie to eleganckie rozwiązanie, ale zadziała 😉

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

Jeżeli chodzi o wyrażenie Wybor , miało być to wyrażenie, które przechowuje opcję, która była wyświetlana na wyświetlaczu (np. czerwona = 1 , żółta = 2 itd.), a przy okazji można było zrobić tak, żeby ze stanu 3 po wciśnięciu prawego guzika przechodziło do 1ki. Sposób jest jaki jest, bynajmniej jakoś działa (ale "instalacja" została rozłożona - głównie ze względu na to , że dość dużo kabli poszło

na nią i była głównie bezużyteczna)

Komentarzy głównie nie piszę, bo głównie nie chce mi się.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.