Skocz do zawartości

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


Komentator

Pomocna odpowiedź

SOYER, proponuję zacząć czytać coś o tablicach. W sumie ciekawy i przydatny temat, a jak już będziesz ekspertem to scrollowanie LCD będzie fajnym ćwiczeniem. Jak już będziesz szukał wyzwań programistycznych to możesz nawet doczytać w dokumentacji kontrolera wyświetlacza, że jest instrukcja do ustawiania początkowego adresu pamięci obrazu - większość z nich używa adresu 0 do początku pierwszej linii i 64 dla początku drugiej. Ale można ustawić 1 dla pierwszej i 65 dla drugie - wychodzi scroll. Ale to przy obecnych pojemnościach pamięci raczej ciekawostka.

W każdym razie propnuję proste ćwiczenia z tablic w C, przy okazji możesz na wskaźniki popatrzeć (to prawie to samo). A scroll na razie niech poczeka..

Link do komentarza
Share on other sites

Elvis, dzięki. Myślałem że ktoś pomoże zastosować standardowe polecenia z przykładów biblioteki i zrobię ciekawostkę dzieciakom. Ok poczytam najpierw o tablicach.

Są dwa rodzaje nauczycieli. Nauczania podstawowego i akademickiego. Ja mam szczęście do obu 😉

Link do komentarza
Share on other sites

Elvis mój idoli, Ty leń jesteś!! Kończę robotę i zaraz siadam i próbuję...🙂)

[edit po 1.5 h kombinacji]Zrobiłem, jeszcze raz WIELKIE DZIĘKUJĘ ELVIS:-)

#include <LiquidCrystal.h> //Dołączenie bilbioteki 
#include <SimpleDHT.h> 
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu 
int pinDHT11 = 13; //pin czujnika 
int maphum; //zmienna do sterowania diodami 
SimpleDHT11 dht11; 
#define led1 10 
#define led2 12 
#define led3 9 
#define led4 11 
#define led5 8 
void setup() { 
  pinMode(led1, OUTPUT); 
 pinMode(led2, OUTPUT); 
 pinMode(led3, OUTPUT); 
 pinMode(led4, OUTPUT); 
 pinMode(led5, OUTPUT); 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, LOW); 
 Serial.begin(9600); 
} 

void loop() { 
 byte temperature = 0; 
 byte humidity = 0; 
 maphum = map(((int)humidity), 10, 95, 1, 5);  //mapowanie odczytu wilg. do ster. diodami 
 dht11.read(pinDHT11, &temperature, &humidity, NULL);  //odczyt z czujnika 
 switch(maphum){ //sterowanie diodami na podstawie odczytu wilgotnosci zmapowanego 1-5 
   case 1: 
 digitalWrite(led1, HIGH); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, LOW); 
   break; 
   case 2: 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, HIGH); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, LOW); 
   break; 
   case 3: 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, HIGH); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, LOW); 
   break; 
   case 4: 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, HIGH); 
 digitalWrite(led5, LOW); 
   break; 
   case 5: 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, HIGH); 
   break; 
 } 
Serial.println(maphum); 
 lcd.begin(16, 2); 
 lcd.setCursor(0,0); 
 lcd.print("Czesc Zosia :-)");  //tekst 1 linii 
 lcd.setCursor(0,1); 
 lcd.print("Czesc Franek :-)");  //tekst 2 linii 
 delay(1500);  // czekamy z ww. tekstem 
 for (int positionCounter = 0; positionCounter < 15; positionCounter++) { 
   lcd.scrollDisplayLeft(); // przesuwamy ww tekst o 15 pozycji w lewo czyli "poza ekran" 
   delay(600);  //czas przeskoku o ledną pozycję na wyświetlaczu (szybkosc przewijania) 
 } 
 lcd.begin(16, 2); // ustawiamy lcd dla nast. wyswietlenia 
 lcd.setCursor(2, 0); 
 lcd.print("Wilg.: "); 
 lcd.print((int)humidity); 
 lcd.print("%RH"); 
 lcd.setCursor(2, 1); 
 lcd.print("Temp.: "); 
 lcd.print((int)temperature); 
 lcd.print("*C"); // wyswietlamy temp. i wilgotnosc wraz z jednostkami 
 delay(3000); // czekamy z ww. tekstem 
 for (int positionCounter = 0; positionCounter < 2; positionCounter++) { 
   lcd.scrollDisplayRight(); //przewijamy ww tekst do prawej krawedzi lcd 
   delay(1000);// szybkosc przewijania 
 } 
 for (int positionCounter = 0; positionCounter < 4; positionCounter++) { 
   lcd.scrollDisplayLeft(); //przewijamy do lewej krawedzi ww tekst 
   delay(1000); // szybkosc przeijania 
 } 
 for (int positionCounter = 0; positionCounter < 2; positionCounter++) { 
   lcd.scrollDisplayRight(); // przewijamy teks znowu do srodka lcd 
   delay(1000); //czekamy 
 } 
 delay(3000); 
}

O to mi właśnie chodziło!!

Pięknie przewija 😅 I kto jest debesciak 😋

Piwo dla tego który znajdzie błąd dlaczego maphum ma ciągle wartość 1? Nie umiem znaleźć... 😥

Za późno, sam do tego doszedłem 🤯 , po prostu najpierw wpisałem komendę(?) o mapowaniu, a dopiero za nią komendę(?) odczytania z czujnika. Oczywiście powinno być odwrotnie:

dht11.read(pinDHT11, &temperature, &humidity, NULL);  //odczyt z czujnika 
 maphum = map(((int)humidity), 10, 95, 1, 5);  //mapowanie odczytu wilg. do ster. diodami

No dobra piwo dla tego który nazwie prawidłowo, jak programista 😉 słowo z pytajnikiem...

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

Witam, udał się całkiem fajny stoper zrobić

#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza

float czas = 0; // zmienna do przechowywania danych
boolean stan = false; // moze sie przyda 

void setup() {
 lcd.begin(16, 2); //Deklaracja typu
 lcd.setCursor(0, 0); //Ustawienie kursora
 lcd.print("Stoper:"); // napisa na wyś 
 lcd.setCursor(7, 0); 
 lcd.print("STOP");
 lcd.setCursor(0, 1); //ustawienie kursora w 2 wierszu
 lcd.print("Czas:");
 lcd.setCursor(13, 1);
 lcd.print("[s]");
 pinMode(8, INPUT_PULLUP); // przycisk start
 pinMode(9, INPUT_PULLUP); // przycisk stop
}

void loop() {

 lcd.setCursor(7, 1); // ustawienie kursora pod czas
 lcd.print(czas); // wyświetlanie czasu
 if(stan == true || digitalRead(8) == LOW)
 {
   czas = czas + 0.01;
   stan = true;
   lcd.setCursor(7, 0);
   lcd.print("START");
   delay(10);

 }

 if(digitalRead(9) == LOW && stan == true)
 {
   stan = false;
   lcd.setCursor(7, 0); 
   lcd.print("STOP ");
 }

 if(digitalRead(9) == LOW && digitalRead(8) == LOW && stan == false) // zerowanie stopera
 {
   czas = 0;
   delay(1000);
   lcd.setCursor(11, 1);
   lcd.print("  ");

 }


}

Na jakiej zasadzie ta linijka działa:

zmiana = 0-zmiana; //To zmień znak zmiany (zacznij zmieniać w przeciwną stronę)

Ok, głupie pytanie, bardzo głupie, no normalna matematyka.

Link do komentarza
Share on other sites

zioloiso, równie dobrze można by było napisać "zmiana = 0-zmiana;" wersja z zerem była właśnie po to, aby można było łatwiej zorientować się o co chodzi (od strony matematycznej) 😉

Link do komentarza
Share on other sites

Prosty kod z tutoriala

[

#include

LiquidCristal lcd(2, 3, 4, 5, 6, 7);

void setup() {

lcd.begin(16, 2);

lcd.setCursor(0, 0);

lcd.print("Kurs Arduino");

lcd.setCursor(0, 1);

lcd.Print("Na Forbocie");

}

void loop() {

}

]

a zrzut odpisu błędu to:

Arduino:1.8.5 (Windows 10), Płytka:"Arduino/Genuino Uno"

D:\Arduino\arduino-builder -dump-prefs -logger=machine -hardware D:\Arduino\hardware -tools D:\Arduino\tools-builder -tools D:\Arduino\hardware\tools\avr -built-in-libraries D:\Arduino\libraries -libraries C:\Users\tata\Documents\Arduino\libraries -fqbn=arduino:avr:uno -ide-version=10805 -build-path C:\Users\tata\AppData\Local\Temp\arduino_build_331307 -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=D:\Arduino\hardware\tools\avr -verbose C:\Users\tata\AppData\Local\Temp\arduino_modified_sketch_829993\lcd.ino

D:\Arduino\arduino-builder -compile -logger=machine -hardware D:\Arduino\hardware -tools D:\Arduino\tools-builder -tools D:\Arduino\hardware\tools\avr -built-in-libraries D:\Arduino\libraries -libraries C:\Users\tata\Documents\Arduino\libraries -fqbn=arduino:avr:uno -ide-version=10805 -build-path C:\Users\tata\AppData\Local\Temp\arduino_build_331307 -warnings=none -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.avrdude.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA.path=D:\Arduino\hardware\tools\avr -verbose C:\Users\tata\AppData\Local\Temp\arduino_modified_sketch_829993\lcd.ino

Using board 'uno' from platform in folder: D:\Arduino\hardware\arduino\avr

Using core 'arduino' from platform in folder: D:\Arduino\hardware\arduino\avr

Detecting libraries used...

"D:\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\Arduino\hardware\arduino\avr\cores\arduino" "-ID:\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\tata\AppData\Local\Temp\arduino_build_331307\sketch\lcd.ino.cpp" -o "nul"

"D:\Arduino\hardware\tools\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10805 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\Arduino\hardware\arduino\avr\cores\arduino" "-ID:\Arduino\hardware\arduino\avr\variants\standard" "C:\Users\tata\AppData\Local\Temp\arduino_build_331307\sketch\lcd.ino.cpp" -o "C:\Users\tata\AppData\Local\Temp\arduino_build_331307\preproc\ctags_target_for_gcc_minus_e.cpp"

C:\Users\tata\AppData\Local\Temp\arduino_modified_sketch_829993\lcd.ino:3:28: fatal error: LiquidCristal.h : No such file or directory

#include

^

compilation terminated.

exit status 1

Błąd kompilacji dla płytki Arduino/Genuino Uno.

5 x przeinstalowałem Arduino. Kombinowałem z katalogami. Zawsze wywale błąd kompilacji, że nie może znaleźć biblioteki czy jakiegoś podkatalogu.

Nie mam już pomysłów. Wiem, że coś skopuje ale nie wiem co. Próbowałem grzebać w rejestrach windowsa ale nic nie znalazłem co by podchodziło pod Arduino.

Krótko mówiąc POMOCY!!

to tyle

r

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.

Link do komentarza
Share on other sites

riat, masz błąd w nazwie biblioteki. Powinno być "LiquidCrystal.h". Tak samo w nazwie "LiquidCrystal lcd(2, 3, 4, 5, 6, 7)". Dodatkowo w linijce: "lcd.Print("Na Forbocie");", powinno być: "lcd.print("Na Forbocie"); "

Link do komentarza
Share on other sites

zadanie 7.1

#include <LiquidCrystal.h>
LiquidCrystal wyswietlacz(2,3,4,5,6,7);
void setup() {
 wyswietlacz.begin(16, 2);
 wyswietlacz.setCursor(6,0);
 wyswietlacz.print("Mistus");
 wyswietlacz.setCursor(5,1);
 wyswietlacz.print("forbot.pl");

}

void loop() {

}

zadanie 7.2

nie nadarza zliczać wyświetlacz (zbyt szybkie zmiany na dzielniku)

zadanie 7.3

przy używaniu clear w całej pętli loop

powoduje mruganie tekstu

zadanie 7.4

Miałem mały problem z wyświetlaniem 0 ale jakoś sobie poradziłem ;0

#include <LiquidCrystal.h>// włączenie biblioteki
LiquidCrystal wyswietlacz(2,3,4,5,6,7);//ustawienie pinów wyświetlaczowi
#define przycisk1 9// dajemy nazwę pinom
#define przycisk2 10
int milisec = 0;//zmienne do zliczania
int czas =0;
int sec = 0;
int minu = 0;
int minuta = 0;
int zmiana = true;
void setup() {
 pinMode(przycisk1, INPUT_PULLUP);// ustawiamy przyciski jako wejscie
 pinMode(przycisk2, INPUT_PULLUP);
 wyswietlacz.begin(16,2);//dane ile wierszy i znakow ma wyświetlacz
 wyswietlacz.clear();// czyścimy dane 
 wyswietlacz.setCursor(0,1);//załączamy drugi wiersz
 wyswietlacz.print("00:00");//ustawiamy początkowy stan wyświetlacza
 wyswietlacz.setCursor(5,0);//załączamy pierwszy wiersz i zaczynamy od 5 znaku 
 wyswietlacz.print("Stoper");// nadajemy nazwę stoperowi 
}

void loop() {
 wyswietlacz.setCursor(8,1);//załączamy drugi wiersz i zaczynamy od 8 znaku 
 wyswietlacz.print("mistus");// nazwa użytkownika ;)
  if (digitalRead(przycisk1) == LOW){//jeśli wciśnięty przycisk to :
   delay (800);
   zmiana = true;// ustawiamy by przycisk działał w dwie strony
   while(zmiana == true){//pętla by w kółko zliczał jeśli nie jest przytrzymany przycisk drugi raz 
     wyswietlacz.setCursor(2,1);// wyświetlanie na zmianę dwukropka 
     wyswietlacz.print(" ");
     delay (500);
     wyswietlacz.setCursor(2,1);
     wyswietlacz.print(":");
     delay(200);
     milisec = milisec +1;
     wyswietlacz.setCursor(4,1);
     wyswietlacz.print(milisec);
     delay(350);
      if((milisec == 9)&&(sec == 5)){//zliczanie 00:**
       milisec = 0;
       sec = 0;
       wyswietlacz.setCursor(3,1);
       wyswietlacz.print(sec);
       wyswietlacz.setCursor(4,1);
       wyswietlacz.print(milisec);
       minu = minu +1;
       wyswietlacz.setCursor(1,1);
       wyswietlacz.print(minu);
      }
      else if (milisec == 9){// zliczanie 00:0*
      milisec = 0;
      delay (500);
      wyswietlacz.setCursor(4,1);
      wyswietlacz.print(milisec);
      milisec = 10;
      }
      if (milisec == 10){//zmuszenie wyświetlenia 0 
       sec = sec +1;
       milisec = 0;
       wyswietlacz.setCursor(3,1);
       wyswietlacz.print(sec);
       delay (350);
      }
      if ((minu == 9)&&(minuta == 5)){//zliczanie **:**
       milisec = 0;
       sec = 0;
       minu = 0;
       minuta = 0;
       wyswietlacz.setCursor(4,1);
       wyswietlacz.print(milisec);
       wyswietlacz.setCursor(3,1);
       wyswietlacz.print(sec);
       wyswietlacz.setCursor(1,1);
       wyswietlacz.print(minu);
       wyswietlacz.setCursor(0,1);
       wyswietlacz.print(minuta);// restart jak dojdzie do 59:59
      }
      else if (minu == 9){//zlicznaie 0*:**
       minu = 0;
       wyswietlacz.setCursor(1,1);
       wyswietlacz.print(minu);
       minuta = minuta +1;
       wyswietlacz.setCursor(0,1);
       wyswietlacz.print(minuta);
   }
       if (digitalRead(przycisk1) == LOW){// zatrzymanie stopera
         delay(1000);
         zmiana = false;
      }
   }
   }

      if (digitalRead(przycisk2) == LOW){// reset stopera
       delay (100);
       milisec = 0;
       sec = 0;
       minu = 0;
       minuta = 0;
       wyswietlacz.setCursor(4,1);
       wyswietlacz.print(milisec);
       wyswietlacz.setCursor(3,1);
       wyswietlacz.print(sec);
       wyswietlacz.setCursor(1,1);
       wyswietlacz.print(minu);
       wyswietlacz.setCursor(0,1);
       wyswietlacz.print(minuta);
       zmiana = false;
    } 
   }

a o to jak działa

Link do komentarza
Share on other sites

Mam problem z wyświetlaczem LCD i konwerterem I2C

napisałem coś takiego:

#include <LiquidCrystal_I2C.h> // biblioteka I2C i LCD
#include <Wire.h> // biblioteka I2C i LCD

#define BACKLIGHT_PIN 3 // podłączenie diody podświetlania
#define trigPin 12 // pin tiger czujnika odległości
#define echoPin 11 // pin echo czujnika odległości

LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); // deklaracja wyświetlacza


void setup() {
lcd.begin(16,2);
lcd.clear();
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); // podświetlanie
lcd.setBacklight(HIGH);

 pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
 pinMode(echoPin, INPUT); // echo, jako wejście

lcd.home();
lcd.print("Przeszkoda za");

}

void loop() {
 lcd.setCursor(0,1);
 lcd.print(zmierzOdleglosc());
 lcd.println(" cm");

 delay(500);
} 

int zmierzOdleglosc() {
 long czas, dystans;

 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);

 czas = pulseIn(echoPin, HIGH);
 dystans = czas / 58;

 return dystans;
}


na wyświetlaczu pojawiają się jakieś kreski

na zdjęciu widać podłączenie LCD HC-sr04 2-200cm

i dziwne kreski

co to za śmieszne kreski po cm?

jak je usunąć i skąd się wzięły

Link do komentarza
Share on other sites

chyba wiem pozostają wcześniejsze wpisy w drugiej linii

tylko czy można wyczyścić 1 linie (drugą),
czy trzeba czyścić cały wyświetlacz

[ Dodano: 03-03-2018, 17:11 ]

działa

dzięki za pomoc

końcowy kod

#include <LiquidCrystal_I2C.h>
#include <Wire.h>

#define BACKLIGHT_PIN 3
#define trigPin 12
#define echoPin 11

LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7);


void setup() {
lcd.begin(16,2);
lcd.clear();
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);

 pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
 pinMode(echoPin, INPUT); // echo, jako wejście

lcd.home();
lcd.print("Przeszkoda za");

}

void loop() {
 lcd.home();
 lcd.print("Przeszkoda za");
 lcd.setCursor(0,1);

 lcd.print(zmierzOdleglosc());  
 lcd.print(" cm");

 delay(500);

  lcd.clear();
} 

 int zmierzOdleglosc() {
 long czas, dystans;

 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);

 czas = pulseIn(echoPin, HIGH);
 dystans = czas / 58;

 return dystans;
}


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.