Skocz do zawartości
Komentator

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

Pomocna odpowiedź

@jogaszu ładny program. Widzę, że zadbałeś też o odpowiednie przesuwanie wyniku na wyświetlaczu 🙂 Ciekawa metoda, ładnie to wykombinowałeś! Jakbyś chciał podziałać więcej w tym kierunku to sprawdź sobie funkcję printf (bo to chyba najlepsze rozwiązanie tego problemu). Jednak podaję to oczywiście jako ciekawostkę, bo w kursie tego nie omawiałem. Szczegóły: https://playground.arduino.cc/main/printf

Udostępnij ten post


Link to post
Share on other sites

@Alias super, że działa - powodzenia w dalszych eksperymentach 😉

Udostępnij ten post


Link to post
Share on other sites

Hej,

Jestem tu nowy uczę się z tego kursu. Postanowiłem zrobić też własny projekt. Na podstawie zadania o stoperze jestem w trakcie tworzenia programu pod nazwą minutnik. Czas ustawiam z przycisku i to mam ogarnięte. Natomiast mam problem z odliczeniem ustawionego czasu. Uruchomienie odliczania czasu ma być z przycisku. Niestety moje próby z pętlą for, if nie wychodzi. Znalazłem coś takiego jak biblioteka Timers lecz jeszcze nie miałem czasu jej sprawdzić. Czy to może pomóc? Pomiar również ma być widoczny na wyświetlaczu 2x 16.

Udostępnij ten post


Link to post
Share on other sites

@tiger333 witam na forum 🙂 Załóż najlepiej osobny temat i wklej program, który napisałeś łatwiej będzie coś doradzić 😉

Udostępnij ten post


Link to post
Share on other sites

Ja mam problem z tym wyświetlaczem. Podłączyłam wyświetlać, wszystko działa, kwadraciki się świecą, ale żadnego napisu mi nie pokazuje, cały czas te kwadraciki. już nie wiem co mam robić, bo żaden program nie działa.

Pozdrawiam

IMG_20190627_142254.jpg

Udostępnij ten post


Link to post
Share on other sites

@annette witam na forum 🙂 Widzę, że korzystasz z innego sprzętu niż ten, który jest używany w kursie. Zakładając, że masz poprawne elementy to proponowałbym zacząć od przylutowania złącza do wyświetlacza. Nie możesz podłączać go w taki sposób jak na zdjęciu - jest duża szansa, że tam kryje się problem.

Udostępnij ten post


Link to post
Share on other sites

Odnośnie zadania 7.4, to wykonałem stoper w symulatorze "Tinkercad" (nie mam jeszcze płytki) i mam jeden problem. Stoper ma opóźnienie równe około połowie aktualnie wyświetlonego czasu. Wie ktoś dlaczego?

#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
int time_s = 0;//sekundy
byte time_ds = 0;//decysekundy
byte time_cs = 0;//centysekundy
byte step = 0;

void setup() {
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Nacisnij lewy");
  lcd.setCursor(0,1);
  lcd.print("przycisk"); 
}

void loop(){
  if(step==0&&digitalRead(10)==LOW){
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Czas:");
    step = 1;
  }
  while(step==1){
    lcd.setCursor(0, 1);
    lcd.print(time_s);
    lcd.print(".");
    lcd.print(time_ds);
    lcd.print(time_cs);
    lcd.print("s");
    if(digitalRead(11)==LOW){
      step = 2;
      lcd.setCursor(0, 0);
      lcd.print("Koniec. Czas:");
      break;
    }
    time_cs ++;
    if(time_cs==10){
      time_ds ++;
      time_cs = 0;
    }
    if(time_ds==10){
      time_s ++;
      time_ds = 0;
    }
    delay(10);
  }
}

obraz.thumb.png.ac2613438f55404e542def2eee576e74.png

Udostępnij ten post


Link to post
Share on other sites

@Itap88 przyczyn może jest kilka. Po pierwsze, delay nie jest dokładne i zawsze wprowadza jakieś przekłamanie. Po drugie, wyświetlanie wyników na wyświetlaczu również zabierać jakiś czas, który tutaj może powodować błędy. Po trzecie, nie wiemy też jak dokładnie działa symulacja - możliwe, że przyczyną tak dużego opóźnienia jest sam symulator 😉 Jeśli chcesz zoptymalizować program to na pewno warto rozważyć zmianę częstotliwości wyświetlania pomiaru na LCD. Może warto podmieniać czas tylko co sekundę?

Udostępnij ten post


Link to post
Share on other sites

Raczej nie jest to wina symulacji, bo przyrównywałem wskazanie wyświetlacza do jej wewnętrznego czasomierza. Jak widać, oczekiwałem od tego stopera zbyt dużej precyzji.

Udostępnij ten post


Link to post
Share on other sites

Robisz podstawowy błąd - zakładasz, że wyświetlanie jest natychmiastowe. Dlatego pętla wykonuje się nie co 10 msec, a 10 msec + czas transmisji do wyświetlacza.

Spróbuj to rozwiązać (np.zmierz czas jaki zajmuje wyświetlanie i do delay wrzuć tyle ile trzeba - czyli 10 msec minus czas wyświetlania). Też będziesz miał błąd, ale mniejszy.

Pokombinuj, jak się można w ogóle pozbyć tego błędu.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Chyba najlepszym sposobem pozbycia się błędu byłoby mierzenie czasu niezależnie od reszty programu. Spotkałem się ze stwierdzeniem, że są na to gotowe metody, ale na razie idę tokiem tego kursu, a potem zobaczę czego będę się potrzebował jeszcze dowiedzieć.

Udostępnij ten post


Link to post
Share on other sites

@Itap88 to jedna z metod, ale na początek wystarczyłoby, abyś nie "wyrzucał" pomiarów na ekran w każdym obiegu pętli.

Wystarczy, że poniższy kod przeniesiesz np. do warunku "if(time_cs==10){": 

    lcd.setCursor(0, 1);
    lcd.print(time_s);
    lcd.print(".");
    lcd.print(time_ds);
    lcd.print(time_cs);
    lcd.print("s");

Już wtedy powinien być zauważalnie lepszy efekt 😉

Udostępnij ten post


Link to post
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!

Gość
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...