Skocz do zawartości

Kurs Arduino - #7 - Wyświetlacz tekstowy, LCD 2x16


Komentator

Pomocna odpowiedź

JurijR13, musisz kupić i przylutować odpowiednie złącza. W zestawach do kursu przygotowanych przez Forbota znajdują się wyświetlacze z już wlutowanymi złączami - aby ułatwić start początkującym 🙂

Link do komentarza
Share on other sites

Mam takie pytanie. Otóż wszystko działa ok, ale jest problem. Czasem, gdy włączam lub ładuję program na płytkę na ekranie pokazują się jakieś dziwne ciągi znaków. OmegaB*9G coś w ten deseń (podaję przykładowo, bo kombinacje są różne). Czy to problem z płytką, wyświetlaczem czy coś robię źle?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Zadania 7.1

Zadanie 7.4

Trochę długi ten kod wyszedł ale chyba nie da się krócej, przynajmniej z komendami, które były dotychczas w kursie.

#include <LiquidCrystal.h>

LiquidCrystal lcd (13,11,9,7,5,3);
byte sekundy = 0;
byte minuty = 0;
byte godziny = 0;
bool statusStopera = 0;

void setup() {
 lcd.begin(16,2);
 pinMode(0, INPUT_PULLUP);
 pinMode(1, INPUT_PULLUP);
 lcd.setCursor(0,0);
 lcd.print("Stoper");
 lcd.setCursor(0,1);
 lcd.print("00:00:00");

}

void loop() {
 if (digitalRead(0) == LOW && digitalRead(1) == LOW){ // wcisniecie obu guzikow zeruje stoper
   sekundy = 0;
   minuty = 0;
   godziny = 0;
   lcd.setCursor(0,1);
   lcd.print("00:00:00");
   statusStopera = 0;
 }
 if (digitalRead(0) == LOW){     // wlaczenie stopera 
   statusStopera = 1;
 }
 if (digitalRead(1) == LOW){     // zastopowanie stopera
   statusStopera = 0;
 }
 if (statusStopera == 1){        // zaczyna odliczanie po wcisnieciu pierwszego guzika
   sekundy = sekundy + 1;
   if (sekundy == 60){           // zmienia 60 sekund na kolejna minute
     minuty = minuty + 1;
     sekundy = 0;
     if (minuty == 60){          // zmienia 60 minut na kolejna godzine
       godziny = godziny + 1;
       minuty = 0;
       if (godziny < 10){        // ustawia kursor w odpowiednie miejsce dla godzin
         lcd.setCursor(1,1); 
       } else {
         lcd.setCursor(0,1);
       }
       lcd.print(godziny);
       lcd.setCursor(3,1);
       lcd.print("00");         // zeruje minuty na wyswietlaczu po przekroczeniu 59
     }
     if (minuty < 10){          // ustawia kursor w odpowiednie miejsce dla minut
       lcd.setCursor(4,1);
     } else {
       lcd.setCursor(3,1);
     }
     lcd.print(minuty);
     lcd.setCursor(6,1);
     lcd.print("00");          // zeruje sekundy na wyswietlaczu po przekroceniu 59
   }
   if (sekundy < 10){          // ustawia kursor w odpowiednie miejsce dla sekund
     lcd.setCursor(7,1);
   } else {
     lcd.setCursor(6,1);
   }
   lcd.print(sekundy);
   delay(1000);
 }
}

Jedyne co mi tu przeszkadza to to, że żeby zastopować stoper trzeba guzik trzymać około sekundę. Czas zmierzy dobrze bo nie przeskoczy do następnej sekundy ale denerwuje mnie to.

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

Witam, mam problem poniewaz pomimo dobrego podlaczenia i wgranego pierwszego programu na ekranie nadal sa czarne prostokaty na gornym pasku i dolne prostokaty sa zapalone tylko w gornej czesci :/ kontrast ustawilem poprawnie, polaczenia kabli takze sprawdzilem kilka razy i wszystkie sa poprawnie podlaczone :/

Link do komentarza
Share on other sites

Mehip, milionom osób działa, więc jednak coś musi być u Ciebie nie tak. Na pewno wgrałeś dobry program? Nie pomyliłeś numeracji pinów wyświetlacza?

Link do komentarza
Share on other sites

Zadanie 7.4
#include <LiquidCrystal.h>
#define przyciskStart 8
#define przyciskStop 9
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
double czasStart;
double czasStop;
bool start = false;

void setup() {
 // put your setup code here, to run once:
 lcd.begin(16, 2);
 pinMode(przyciskStart, INPUT_PULLUP);
 pinMode(przyciskStop, INPUT_PULLUP);
 millis();
}

void loop() {
 poczatek();
 stoperStart();
 stoperStop();
}

void poczatek() {
 if (start == false) {
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("Wcisni przycisk");
   lcd.setCursor(0, 1);
   lcd.print("start");
   delay(5);
 }
}
void stoperStart() {
 while (digitalRead(przyciskStart) == LOW) {
   czasStart = millis() / 1000.0;
   lcd.clear();
   start = true;
 }
 if (start == true) {
   lcd.setCursor(0, 0);
   lcd.print("Aktualny czas");
   lcd.setCursor(0, 1);
   lcd.print((millis() / 1000.0) - czasStart);
   lcd.print("sek");
 }
}

void stoperStop() {
 while (digitalRead(przyciskStop) == LOW) {
   czasStop = millis() / 1000.0;
   lcd.clear();
   lcd.setCursor(0, 0);
   lcd.print("Koniec");
   lcd.setCursor(0, 1);
   lcd.print(czasStop - czasStart);
   lcd.print("sek");
   delay(4000);
   start = false;
 }
}

dlaczego ten programda radę zrobić na samych pętlach if a nie da się na pętlach while ?

Link do komentarza
Share on other sites

dlaczego po zastąpieniu if while program stoi w miejscu ( początek ). Czy while ma większy priorytet niż if ? a jeśli są same while to wykonywana jest po prostu pierwsza pętla while tylko ?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.