Skocz do zawartości
Komentator

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

Pomocna odpowiedź

ko4, tak wystartuje 🙂 Właściwie, to plan zakładał start kursu Arduino II nawet do końca maja, jednak przez aktualny długi weekend postanowiłem lekko przesunąć start (o 2-3 dni). Tak, czy inaczej nowy kurs ruszy na pewno w następnym tygodniu.

Udostępnij ten post


Link to post
Share on other sites

Zadanie 7.1

Zadanie 7.4 - może stoper nie taki wypasiony jak mają koledzy w poprzednich postach, ale przyjdzie kiedyś czas na lepszy 😉

#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja ja podlaczony wyświetlacz

float czas = 0.0; //Na potrzeby 'uciekajacych' cyferek
int stan = 0; //Zmiana stanu żeby przy ifie nie wlaczło

void setup() {
 lcd.begin(16, 2); //Deklaracja typu
 lcd.setCursor(0, 0); //Ustawienie kursora
 lcd.print("Stoper:"); //Wyświetlenie tekstu
 pinMode(8, INPUT_PULLUP); //Przycisk włączania
 pinMode(9, INPUT_PULLUP); //Przycisk zatrzymania
}

void loop() {
 if (digitalRead(8) == LOW) //Jezeli switch 1 wcisniety
 {
   czas = 0; //Ustawienie zera po ponownym wcisnieciu (po zatrzymaniu)
   lcd.clear(); //Wyczyszczenie ekranu
   stan = 1; //Zmiana stanu

   while (stan == 1) //Petla gdy stan
   {
 lcd.setCursor(0, 0); //Ustawienie kursora
 lcd.print("Czas w sek.:"); //Wyświetlenie tekstu
 lcd.setCursor(0, 1); //Ustawienie kursora w odpowiednim momencie
 lcd.print(czas); //Wyświetlenie tekstu
 czas = czas + 0.1; 
 delay(100); //Opóźnienie niby sekundy


 if (digitalRead(9) == LOW) //Jezeli switch 2 wcisniety
   {
   lcd.clear(); //Wyczyszczenie ekranu
   delay(100); //Małe opóznienie
   lcd.setCursor(0, 0); //Ustawienie kursora
   lcd.print("Zatrzymano w: "); //Jakies teksty
   lcd.setCursor(0, 1); //Ustawienie kursora
   lcd.print(czas); //Wyświetlenie tekstu 
   lcd.print(" s"); 
   stan = 0 ; //Zmiana stanu
    }
   }
  }
 }

Jak zawsze wielkie dzięki za kolejną lekcję.

Udostępnij ten post


Link to post
Share on other sites

MaciejBurchardt, super 🙂 Również mam swoją kaczkę na biurku 😉

Udostępnij ten post


Link to post
Share on other sites

Mam pytanie dotyczące części "Wyświetlanie wyniku ADC na wyświetlaczu". Chciałem zrobić bardzo podobny układ jak w przykładzie ale pokazujący naświetlenie (w domyślnym przedziale 0 - 1023). Zamiast

odczyt = analogRead(A0)*5.0/1023.0;

zrobiłem po prostu

odczyt = analogRead(A0);

i ku mojemu zaskoczeniu urządzenie działa odwrotnie (wyświetlana wartość zmniejsza się wraz ze wzrostem naświetlenia) niż oczekiwałem. Nie bardzo wiem gdzie szukać winy ale domyślam się że albo niedostatecznie rozumiem sam dzielnik napięcia, albo zasadę odczytu na wejściach analogowych. Podpowie ktoś?

Udostępnij ten post


Link to post
Share on other sites

MaciejBurchardt, sprawdź jak podłączyłeś dzielnik. Konkretnie chodzi o miejsce, w którym jest fotorezystor i to, gdzie jest zwykły rezystor.

Udostępnij ten post


Link to post
Share on other sites

Próbowałem po napisaniu posta odwrócić sytuację i zamienić miejscami zasilanie oraz uziemienie na dzielniku. Wtedy działo się coś szczególnie dziwnego - wyświetlana wartość była wysoka (600-900) przy oświetleniu latarką oraz zakryciu ręką, a niska (spadała do przedziału 150-200) przy średnim oświetleniu pomieszczenia. Jutro spróbuję powtórzyć eksperyment i wkleić zdjęcie lub grafikę zmontowanego układu (choć, o ile się nie pomyliłem, wszystko jest tak jak na poglądowym schemacie w artykule).

Edit - nie mam pojęcia o co chodziło. Zmontowałem układ od nowa i napisałem kod od zera. Teraz wszystko działa.

Udostępnij ten post


Link to post
Share on other sites

Zadanie 7.4 (Stoper), nieco zmodyfikowane, co pokazuje załączony film. Do lcd użyłem I2C aby zmniejszyć ilość kabelków 🙂

Pozdrawiam!

__________

Komentarz dodany przez: Treker

Poprawiłem umieszczenie filmu - na przyszłość nie ma potrzeby wgrywać jeszcze osobno plików w formie załącznika 🙂

Udostępnij ten post


Link to post
Share on other sites

Jak za pomocą lcd.clear() wyczyścić tylko pierwszy wiersz? Albo nawet pojedyncze miejsca na wyświetlaczu?

Udostępnij ten post


Link to post
Share on other sites

thequeash, funkcja lcd.clear(); nie daje takich możliwości, za jej pomocą można jedynie całkowicie wyczyścić wyświetlacz. Jeśli chcesz usunąć dane z pojedynczego miejsca, to najlepiej ustawić tam kursor i nadpisać dane pole znakiem spacji.

Udostępnij ten post


Link to post
Share on other sites

Poniżej mój kod do zadania 7.4

/* 7.4 wyswietla na ekranie powitalny napis
* po wcisnieciu przycisku zaczyna liczyc czase i wyswietla na ekranie az do nacisniecja drugiego przycisku
* po nacisnieciu drugiego przycisku zatrzymuje prace i wyswietla rezultat
*/

#include <LiquidCrystal.h>        //dolaczenie biblioteki LCD

#define START 13                  //wejscie cyfrowe do ktorego dolaczono START                  
#define STOP 12                   //wejscie cyfrowe do ktorego dolaczono STOP             

LiquidCrystal myLCD(2,3,4,5,6,7); //inicjacja obiektu myLCD podpietego do pinow
                                 //2 RS, 3 Enable, 4 D4, 5 D5, 6 D6, 7 D7
float czas=0;                     //licznik czasu
boolean start_test=false;         //testownie czy byl wcisniety przycisk START
boolean stop_test=false;          //testownie czy byl wcisniety przycisk STOP

void setup() {
 pinMode (START, INPUT_PULLUP);    //definicja przycisku start
 pinMode (STOP, INPUT_PULLUP);     //definicja przycisku stop

 myLCD.begin(16,2);                //okreslenie wielkosci LCD 16 znakow 2 wiersze
 myLCD.setCursor(0,0);             //przesuniecie kursora na poczatek pierszego wiersza
 myLCD.print("Program stoper");    //wyslanie znakow na wyswietlacz
 myLCD.setCursor(0,1);             //przesuniecie kursora na poczatek drugiego wiersza
 myLCD.print("START  STOP");
 delay(2000);
 myLCD.setCursor(0,1);
 myLCD.print("Czas:           ");
}

void loop() {
 while (digitalRead(START)==HIGH  && start_test==false){} //nie rob nic az wcisniety przycisk START, sprawdza tez czy start byl wczesniej wcisniety
 start_test=true;                                         //po wcisnieciu zapmietaj, ze START byl wcisniety

 while (digitalRead(STOP)==HIGH && stop_test==false){     //dopoki nie wcisnieto stop i stop nie byl wcisniety wczesniej rob:
   myLCD.setCursor(7,1);                                  //przesun kursor
   myLCD.print(czas/20);                                  //wyswietl czas zamieniony na sekundy
   czas+=1.00;                                            //zwieksz licznik czasu
   delay(50);                                             //czekaj 50ms; nie 1s aby nie trzeba bylo czekac 1s z nacisnietym przyciskiem STOP
 }

  stop_test=true;                                         //jesli tutaj jestes tp znaczy, ze byl wcisniety STOP i trzeba to zapamietac
  myLCD.setCursor(0,1);                                      
  myLCD.print("Wynik: ");                                 //Wyswietl tylko napis wynik, czas jest juz na ekranie

}
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Napisałem kod będący połączeniem obsługi przycisków (stoper 7.4) i regulacji podświetlenia. Zmiana podświetlenia zawsze o jeden krok niezależnie od długości wciśnięcia. Stan podświetlenia prezentowany w postaci paska na ekranie.

/* 7.4 wyswietla na ekranie przewijany napis powitalny
* jasnosc podswietlenie regulowana dwoma przyciskami
* przyciski reaguja tylko na zmiane stanu, czyli wcisniecie i trzymanie spowoduje zmiane tylko o 1
* slupek na ekranie obrazuje poziom podswietlenia
*/

#include <LiquidCrystal.h>       //dolaczenie biblioteki LCD

#define MINUS 13                 //wejscie cyfrowe do ktorego dolaczono PLUS                  
#define PLUS 12                  //wejscie cyfrowe do ktorego dolaczono MINUS        
#define backlight_port 9         //port do ktorego podlaczone podswietlanie, sterowanie sygnalem PWM     

LiquidCrystal myLCD(2,3,4,5,6,7); //inicjacja obiektu myLCD podpietego do pinow
                                 //2 RS, 3 Enable, 4 D4, 5 D5, 6 D6, 7 D7

int stan_plus=0;                //stan przycisku plus
int stan_plus_old=0;            //poprzedni stan przycisku plus
int stan_minus=0;               //stan przycisku minus
int stan_minus_old=0;           //poprzedni stan przycisku minus
int level=8;                    //poziom podswietlenia 1-16 tyle ile pozycji na ekranie
int level_old=0;                //poprzedni poziom podswietlenia potrzebne do podjecia decyzji, czy potrzebna zmiana
int wypelnienie=0;              //jasnosc podwsietleania

void setup() {
 pinMode (PLUS, INPUT_PULLUP);     //definicja przycisku start
 pinMode (MINUS, INPUT_PULLUP);    //definicja przycisku stop

 analogWrite(backlight_port, 128); //ustawienie poczatkowego podswietlenia
 myLCD.begin(16,2);                //okreslenie wielkosci LCD 16 znakow 2 wiersze
 myLCD.setCursor(0,0);             //przesuniecie kursora na poczatek pierszego wiersza
 myLCD.print("Regulacja jasnosci podswietlania");    //wyslanie znakow na wyswietlacz

 for (int position=0; position<16; position++){      //przewijanie wyswietlacza, aby pokazal sie caly napis
    myLCD.scrollDisplayLeft();
    delay(500);
 }

 myLCD.clear();
 myLCD.setCursor(0,0);             //przesuniecie kursora na poczatek pierwszego wiersza
 myLCD.print("MINUS       PLUS");
 myLCD.setCursor(0,1);
 myLCD.print("                ");  //wyczyszczenie drugiego wiersza
}

void loop() {
 stan_plus=digitalRead(PLUS);
 stan_minus=digitalRead(MINUS); 

 if (stan_plus!=stan_plus_old && level<16)      //jesli zmienil sie stan przycisku PLUS i nie osiagnieto poziomu max
   if(stan_plus==HIGH)
     level++;                                    //zwieksz poziom jasnosci

 if (stan_minus!=stan_minus_old && level>0)      //jesli zmienil sie stan przycisku MINUS i nie osiagnieto poziomu max
   if(stan_minus==HIGH)
     level--;                                     //zmniejsz pozion jasnosci

 stan_plus_old=stan_plus;
 stan_minus_old=stan_minus;

 if (level_old!=level){
   wypelnienie=map(level,0,16,0,255);
   myLCD.setCursor(0,1);             //przesuniecie kursora na poczatek drugiego wiersza
   myLCD.print("                ");  //wyczyszczenie wiersza 16 spacji
   myLCD.setCursor(0,1);             //przesuniecie kursora na poczatek drugiego wiersza
   for (int i=0; i<level; i++)
           myLCD.print(char(255));   //wyswietlenie znaku o danym kodzie ascii tutaj prostokat

    level_old=level;
    analogWrite(backlight_port, wypelnienie);
  }
 delay(50);                          //odstep czasy pomiedzy kolejnymi odczytami przyciskow                            
}

Udostępnij ten post


Link to post
Share on other sites

Robur, super, wygląda bardzo fajnie 🙂 Szczerze polecam jednak dodawać zawsze nawiasy klamrowe (nawet jeśli w warunku wykonujemy tylko jedno polecenie) - znacznie trudniej wtedy o błąd przy edycji programu. Decyzja należy do Ciebie, jeśli czujesz się pewnie w programowaniu, to oczywiście można pomijać nawiasy (tak jak to zrobiłeś), ale ich dodanie na pewno nie zaszkodzi 😉

Udostępnij ten post


Link to post
Share on other sites

Miałem tylko jakieś stare, nie-bardzo typowe wyświetlacze (dostałem je z jakiś złomków)

To jakiś stareńki typ, nic o nich nie wiedziałem, podświetlenie jest typu CCFL (jak w lampach Nixie???), i zasilane z 42V. Z dokumentacją też ciężko - zwykle był tylko rysunek z wymiarami i rozkładem pinów,

nawet na stronie producenta (DataVision) było niewiele danych, tyle że dowiedziałem się, że mają sterownik typu ST7066.

Z kolei sterownik ST7066 -podobobno jest (częściowo?) zgodny z HD44780. Jak patrzyłem na forum Arduino.cc - to też były z nim jakieś problemy...

Zeby było śmieszniej - jak patrzyłem na dokumentację na stronie producenta!!! (DataVision) to inny był rozkład pinów niż wg opisów na płytce!!! A która z tych wersji jest prawdziwa???

Szkoda mi było upalić Arduino, to trochę miałem stracha, skoro nawet producent nie wie co czyni...

No, ale Arduino nadal działa;) :

Nie miałem skąd wziąć zasilania 42V (podświetlenie- lampy CCFL) więc tekst na wyświetlaczu jest bardzo słabo widoczny (a na fotce - jeszcze słabiej). Po obróbce w programie komputerowym:

Mój pierwszy wyświetlacz!

😉

A kurs Forbota - rewelacja!

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