Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Witam dlaczego pin 5 naszego wyświetlacza (RW) podłączamy do masy? Skoro jest to wybór opcji zapis/odczyt?

 

Udostępnij ten post


Link to post
Share on other sites

@pawel1218 ponieważ korzystamy z 4-bitowego trybu komunikacji bez odczytu flagi zajętości (to jest najpopularniejsza opcja) 🙂 Więcej na ten temat znajdziesz np. w dokumentacji sterownika HD44780.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Zadanie 7.4

#include <LiquidCrystal.h>
#define S1 6
#define S2 7
int czas=1;
byte blokada=0;
bool blokadabool=0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int foto=0;
float napiecie=0;

void setup(){
  pinMode(S1,INPUT_PULLUP);
  pinMode(S2,INPUT_PULLUP);
  
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("Stoper");
  lcd.setCursor(0,1);
  lcd.print("S1 - START");
  
  Serial.begin(9600);
}

void loop(){
  
  if (digitalRead(S1)==LOW &&blokadabool==0){
    blokada++;
    blokadabool=1;
    
    while (digitalRead(S1)==LOW){}
  }
    
  if (digitalRead(S2)==LOW){
     blokada=3;
  }
  
  switch (blokada){
    case 1:
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Stoper wyzerowany");
      lcd.print("wcisnij S1");
      lcd.setCursor(0,1);
      czas=0;
      lcd.print(czas);
      delay(250);    
      blokadabool=0;
      break; 
    case 2:
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Pomiar start");
      lcd.setCursor(0,1);
      lcd.print(czas);
      czas++;
      delay(1000);
    break;
    case 3:     
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("Pomiar stop");
      lcd.setCursor(0,1);
      lcd.print(czas);   
      delay(250);
      blokada=0;    
     blokadabool=0;
    break;   

  }
  
  
}

oraz link jak działa 

https://drive.google.com/file/d/18mGBxmrTXebu3yKe6bRSTS851vt-fS10/view?usp=sharing

 

Jest to trochę ulepszona wersja gdyż S1 najpierw zeruje pomiar, drugie naciśnięcie S1 powoduja rozpoczęcie pomiaru. Teraz program nie reaguje więcej na naciskanie S1 i czeka aż S2 będzie naciśnięte. Po naciśnięciu S2 pomiar jest zatrzymywany i teraz dopiero naciskając S1 pomiar można wyzerować a ponowne nacisnięcie S1 rozpoczyna pomiar od nowa.

 

@Treker  Czy dałoby się jakoś usprawnić działąnie kodu aby był jak najbardziej optymalny? Czy taki zapis będzie wystarczająco lekki dla procesora? Pytam gdyż chcę się uczyć dobrych nawyków programowania w trakcie nauki i za bardzo nie wiem na co jeszcze mogę zwrócić uwagę aby się poprawić.

ps. poradnik 1 klasa, moim zdaniem żadna z książek o arduino nie jest tak przyjazna użytkownikom którzy nigdy nie mieli wcześniej z tym styczności, jak właśnie ten kurs. Spokojnie mógłby on być płatny gdyż kontent jest na prawdę bardzo pomocny i konkretny, a do tego można rozmawiać z autorem kursu - dla mnie bomba.

 

ps2 powiedz jak inaczej i lepiej byś zapisał warunek if który ma się wykonać tylko raz? czy taki zapis byłby odpowiedni czy masz na to lepszy sposób ? Wydaje mi się że mój jest trochę zawiły z tą blokadabool, ciekaw jestem jak ty rozwiązujesz ten problem.

image.thumb.png.d4ad258b0b01c24bb01bdff119e42b75.png

Blokada while jest tylko po to aby jak trzymam przycisk S1 żeby zablokować program tak aby nie dodawał zmiennej blokada++ bo jak wiemy w ciągu sekundy dodał by ją jakieś 16 milionów razy a ja chcę żeby blokada++ była dodana tylko po jednym fizycznym wciśnięciu.

Edytowano przez bakardi92
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
2 godziny temu, bakardi92 napisał:

ps. poradnik 1 klasa, moim zdaniem żadna z książek o arduino nie jest tak przyjazna użytkownikom którzy nigdy nie mieli wcześniej z tym styczności, jak właśnie ten kurs. Spokojnie mógłby on być płatny gdyż kontent jest na prawdę bardzo pomocny i konkretny, a do tego można rozmawiać z autorem kursu - dla mnie bomba.

Dziękuję za miłe słowa, cieszę się, że kurs jest pomocny! Na ten moment wszystkie nasze materiały pozostają darmowe, jeśli kursy są ciekawe to warto po prostu zamawiać nasze zestawy, bo dzięki temu mogą powstawać kolejne materiały 😉

2 godziny temu, bakardi92 napisał:

@Treker  Czy dałoby się jakoś usprawnić działąnie kodu aby był jak najbardziej optymalny? Czy taki zapis będzie wystarczająco lekki dla procesora? Pytam gdyż chcę się uczyć dobrych nawyków programowania w trakcie nauki i za bardzo nie wiem na co jeszcze mogę zwrócić uwagę aby się poprawić.

Program wygląda dobrze, na pewno coś tam da się zmienić, ale nie będą to zmiany zauważalne pod względem wydajności 🙂

2 godziny temu, bakardi92 napisał:

ps2 powiedz jak inaczej i lepiej byś zapisał warunek if który ma się wykonać tylko raz? czy taki zapis byłby odpowiedni czy masz na to lepszy sposób ? Wydaje mi się że mój jest trochę zawiły z tą blokadabool, ciekaw jestem jak ty rozwiązujesz ten problem.

Taka metoda jest dość popularna - zmienna pomocnicza w takich sytuacjach zawsze się przydaje 🙂

2 godziny temu, bakardi92 napisał:

Blokada while jest tylko po to aby jak trzymam przycisk S1 żeby zablokować program tak aby nie dodawał zmiennej blokada++ bo jak wiemy w ciągu sekundy dodał by ją jakieś 16 milionów razy a ja chcę żeby blokada++ była dodana tylko po jednym fizycznym wciśnięciu.

Pamiętaj tylko, że istnieją drgania styków. Program zadziała w symulatorze, ale w praktyce mogą już być problemy - wróć do tego przykładu jak będziesz miał sprzęt i wtedy sprawdź jak to zadziała. W między czasie polecam lekturę tego artykułu: Kurs elektroniki II – #3 – przyciski, diody RGB, kontaktron 😉

Udostępnij ten post


Link to post
Share on other sites

Kolejna część kursu za mną. Super dawka wiedzy.

Prace domowe: 7.1: 

84272584_2497630967169528_4085200577867284480_n.thumb.jpg.401aa99742392b0dbbfa25d572608f74.jpg

Tutaj raczej nic innowacyjnego 🙂

7.2. 

Przy całkowitym usunięciu opóźnienia widać jakby wyświetlane wyniki "falowały" rysując się z góry na dół. 

7.3. 

U mnie nie dało to w zasadzie żadnych zmian, tekst w pierwszej linijce był cały czas na swoim miejscu, a w drugiej zmieniał się normalnie. Chyba, że mówimy tu o bardzo niskim czasie odświeżania. 

7.4. to trochę pokombinowałem. Zrezygnowałem ze stopera. Postanowiłem wykorzystać pomiar napięcia na fotorezystorze. Dołożyłem opcje regulacji jasności wyświetlacza przy pomocy potencjometru, do tego dołożyłem analogowy wskaźnik jasności podświetlenia oraz dwa przyciski. Jeden do zatrzymania pomiaru i drugi do ponownego wystartowania. Jedyna wada to taka, że w momencie zatrzymania pomiaru nie działa regulacja podświetlenia. Musiałbym po prostu zdefiniować odpowiednią funkcję na zmianę podświetlenia i wrzucić ją w pętle while w momencie zatrzymania. Jednak tworzenie funkcji to coś co muszę sobie przypomnieć, a dziś już niestety zabrakło czasu. Mógłbym oczywiście w pętle while wrzucić cały kod odpowiedzialny za zmianę podświetlenia, ale czy jest sens tak sztucznie wydłużać kod? Jeśli udoskonalę kod i regulacja podświetlenia będzie również działać po zatrzymaniu pomiaru to oczywiście się nim podzielę 😉 .

#include <LiquidCrystal.h> //dołączenie biblioteki ekranu
#include <Servo.h> //implementacja serva
#define fotorezystor A5
#define wyswietlacz 11
#define potencjometr A4
#define przyciskStart 8
#define przyciskStop 9

Servo serwomechanizm; //utworzenie obiektu serwo
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //informacja o podłączeniu nowego wyświetlacza
double odczyt = 0; //deklaracja zmiennej dla odczytu
byte jasnosc = 0; //deklaracja zmiennej do sterowania jasnoscia wyswietlacza
int wartoscPotencjometr = 0; //zmienna do odczytu wartosci z potencjometru
byte pozycja = 0; //zmienna odpowiedzialna za pozycje serwa
byte poprzedniaPozycja = 40; //zmienna potrzebna do likwidacji zbyt małych zmian pozycji serva

void setup()
{
    serwomechanizm.attach(10); //serwinecgabuzn na pinie 10
    lcd.begin(16, 2); //Deklaracja typu
    lcd.setCursor(0, 0); //ustawienie kursora
    lcd.print("Nap. odczytane:"); //wyswietlenie tekstu
    pinMode(przyciskStart, INPUT_PULLUP); //zdefiniowanie pinow dla przyciskow
    pinMode(przyciskStop, INPUT_PULLUP);

}

void loop()
{

    odczyt = analogRead(A5) * 5.0 / 1024.0; // odczytanie wartosci napiecia
    lcd.setCursor(0, 1); //ustawienie kursosa
    lcd.print(String(odczyt) + "V");
    wartoscPotencjometr = analogRead(potencjometr); //odczytanie wartosci z potencjometru
    pozycja = map(wartoscPotencjometr, 0, 1024, 180, 40); //wykorzystanie odczytu z potencjometru do sterowania serverm
    jasnosc = map(wartoscPotencjometr, 0, 1024, 0, 255); //wykorzystanie odczytu z potencjometru do sterowanie jasnoscia LCD
    analogWrite(11, jasnosc); //generuje sygnal PWM dla podswietlenia

    if (abs(poprzedniaPozycja - pozycja) > 5)
    {//usunięcie zbyt małych zmian położenia ramienia serva
        serwomechanizm.write(pozycja); //zmiana pozycji ramienia
        poprzedniaPozycja = pozycja; //zapamiętanie nowej poprzedniej pozycji
    }

    while (digitalRead(przyciskStop) == LOW)
    { //wcisniecie przycisku stop

        delay(50);

        while (digitalRead(przyciskStart) == HIGH)
        { //oczekiwanie na wcisniecie przycisku start
            delay(50);
        }

    }

    delay(100);

}

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@BHBmacieg miło obserwować Twoje postępy! Gratuluję ładnie sformatowanego i skomentowanego programu 🙂

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Coś się udało zrobić 🙂 

#include <LiquidCrystal.h> //Dołączenie bilbioteki

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza

String linia1="Dbaj o innych";
int n1=linia1.length();
String linia2="#zostanwdomu";
int n2=linia2.length();

void setup() {

  lcd.begin(16, 2); //Deklaracja typu
}

void loop() 
{
  lcd.setCursor(0, 0); //Ustawienie kursora
  for(int i=0; i<n1; i++)
  {
    lcd.print(linia1[i]);
    delay(500);
  }
  lcd.setCursor(0, 1); //Ustawienie kursora
  for(int i=0; i<n2; i++)
  {
    lcd.print(linia2[i]);
    delay(500);
  }
  delay(1000);
  for(int i=0; i<5; i++)
  {
    lcd.noDisplay();
    delay(500);
    lcd.display();
    delay(500);
  }
  lcd.clear();
}

BF8C66CF-5A7E-4D10-95C4-27AEFBD83210.png

Edytowano przez ceiem
  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

@ceiem witam na forum! Super, że działa - akurat na czasie 😉 Zaraz udostępnię na naszym Facebooku!

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

 Dziękuję 🙂 Przeskoczyłam 4 lekcje, by zrobić coś z wyświetlaczem 🙂 Pytanie jednak brzmi jak zapamiętać ten system połączeń...? Samo programowanie jest bardzo łatwe, ale ten system podłączeń, połączeń... Mimo iż zrobiłam Wasz kurs elektroniki poziom 1, to nadal jest to dla mnie trudne do ogarnięcia.

Udostępnij ten post


Link to post
Share on other sites

@ceiem są wyświetlacze w których większość połączeń komunikacji równoległej zastąpiono szeregowym ekspanderem I2C - sytuacja jest tam nieco prostsza ale jak kto woli 🙂 W tym przypadku nie obędzie się raczej bez tabelki oznaczeń wyprowadzeń wyświetlacza (bo któż to spamięta). Jeżeli chodzi o to jak to później podłączyć, to sytuacja jest raczej prosta, tylko później musisz konsekwentnie wprowadzić zmiany w programie 🙂 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Witam, tutaj moje zadanie domowe 😄

90522292_547374455984525_6327364031128535040_n.thumb.jpg.8d97d07a8ab56dcfd7f4a4c21bb37f77.jpg

Edytowano przez Gieneq

Udostępnij ten post


Link to post
Share on other sites

@ciesla1220 fajnie że wszystko działa, powodzenia w kolejnych projektach! 🙂 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Hi,

Postępowałem zgodnie z instrukcją. LCD zadziałał, potencjometr działa, Nie można sterować LCD tzn nie reaguje na kod programu. Nie pojawia się kursor ani tekst

Czy można w jakiś sposób przetestować LCD czy nie jest uszkodzony?

Rsx

Edytowano przez Rsx_Wroclaw

Udostępnij ten post


Link to post
Share on other sites

@Rsx_Wroclaw witam na forum 🙂 mógłbyś wrzucić zdjęcie układu? Może gdzieś jakiś kabelek nie styka?

Udostępnij ten post


Link to post
Share on other sites

Witam!

Zrobiłem zadania z kursu Arduino na temat wyświetlaczy LCD. Tworzenie tego układu sprawiło mi wiele frajdy, bo musiałem powtarzać łaczenie chyba z 5 razy ponieważ zawsze kabelka brakowało. Przysyłam zdjęcie mojego układu 🙂

15859509609244160947450566964980.jpg

  • Lubię! 2

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!

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