Skocz do zawartości

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


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 🙂

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?

  • 2 tygodnie później...

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

hawaya, z problemem, o którym piszesz można sobie poradzić dość łatwo. Za jakiś czas pojawi się artykuł, który to wyjaśni 🙂

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 :/

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?

  • 1 miesiąc później...
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 ?

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 ?

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