Skocz do zawartości
Komentator

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

Pomocna odpowiedź

Potrzebne byłoby więcej szczegółów. Jak bardzo wahają się napięcia, jak częste są zmiany, do czego chciałbyś właściwie to wykorzystać itd. Załóż osobny temat i opisz dokładniej swój problem to łatwiej będzie pomóc 😉

Udostępnij ten post


Link to post
Share on other sites
4 godziny temu, Treker napisał:

Potrzebne byłoby więcej szczegółów. Jak bardzo wahają się napięcia, jak częste są zmiany, do czego chciałbyś właściwie to wykorzystać itd. Załóż osobny temat i opisz dokładniej swój problem to łatwiej będzie pomóc 😉

OK, będzie nowy temat, tutaj rozmawiajmy stricte o kursie. Dzięki!

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Hej, po próbie kompilacji tego z kursu: 

#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza
 
void setup() {
  lcd.begin(16, 2); //Deklaracja typu
  lcd.setCursor(0, 0); //Ustawienie kursora
  lcd.print("Kurs Arduino"); //Wyświetlenie tekstu
  lcd.setCursor(0, 1); //Ustawienie kursora
  lcd.print("Na Forbocie!"); //Wyświetlenie tekstu
  lcd.cursor(); //Włącznie kursora
}
 
void loop() {
}

wyświetla mi się taki błąd:

Arduino:1.8.8 (Windows Store 1.8.19.0) (Windows 10), Płytka:"Arduino/Genuino Uno"

C:\Users\Karol\Documents\Arduino\sketch_dec15a\sketch_dec15a.ino: In function '_GLOBAL__sub_I_lcd':

C:\Users\Karol\Documents\Arduino\sketch_dec15a\sketch_dec15a.ino:14:1: internal compiler error: Segmentation fault

 }

 ^

Please submit a full bug report,

with preprocessed source if appropriate.

See <http://gcc.gnu.org/bugs.html> for instructions.

lto-wrapper.exe: fatal error: C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.19.0_x86__mdqgnx93n4wtt\hardware\tools\avr/bin/avr-gcc returned 1 exit status

compilation terminated.

c:/program files/windowsapps/arduinollc.arduinoide_1.8.19.0_x86__mdqgnx93n4wtt/hardware/tools/avr/bin/../lib/gcc/avr/5.4.0/../../../../avr/bin/ld.exe: error: lto-wrapper failed

collect2.exe: error: ld returned 1 exit status

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

Ten raport powinien zawierać więcej informacji jeśli w 
File -> Preferencje zostanie włączona opcja "Pokaż
szczegółowe informacje podczas kompilacji"

Ktoś może wiedzieć o co chodzi?

Udostępnij ten post


Link to post
Share on other sites

"Segmentation fault" to błąd niezwiązany bezpośrednio z Twoim programem. To wewnętrzny błąd kompilatora i nie ma na to dobrej rady, choć ludzie wskazywali na pewne pomysły. Spróbuj zmienić w programie cokolwiek. Czasem pomaga nawet pusta linia w kodzie, czasem zamiana kolejności dwóch instrukcji, jakaś dodatkowa linia programu a nawet inna nazwa zmiennej. Napisz jak poszło.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
55 minut temu, marek1707 napisał:

"Segmentation fault" to błąd niezwiązany bezpośrednio z Twoim programem. To wewnętrzny błąd kompilatora i nie ma na to dobrej rady, choć ludzie wskazywali na pewne pomysły. Spróbuj zmienić w programie cokolwiek. Czasem pomaga nawet pusta linia w kodzie, czasem zamiana kolejności dwóch instrukcji, jakaś dodatkowa linia programu a nawet inna nazwa zmiennej. Napisz jak poszło.

Niestety, żadna z twoich możliwości rozwiązania problemu nie pomogła. To ogółem wina kompilatora i będzie potrzebna aktualizacja?

Udostępnij ten post


Link to post
Share on other sites

No to kombinuj dalej. Wywal połowę kodu albo wstaw jakąś dodatkową bibliotekę tak na próbę np. "#include <wire.h>". U mnie to zwykle pomagało. Tak, to jest jakiś problem wewnątrz kompilatora, ale ciągnie się to za avr-gcc już parę lat i przybrało na sile wraz z Windowsami 8 i 10 więc nie liczyłbym na to, że nagle jakaś magiczna aktualizacja pomoże. Próbuj dalej. U mnie pomogło (tj. znacznie zmniejszyło liczbę tego typu zachowań, ale nie zera) dodanie do linii wywołania kompilatora przełącznika "-fno-devirtualize".

Udostępnij ten post


Link to post
Share on other sites

Mam takie pytanie. Nie wiem czy w dobrym miejscu piszę, ale wiąże się to z lekcją. Moja ciekawska natura kazała mi sprawdzić ile amperów bierze wyświetlacz. W tym celu przyłożyłem miernik ustawiony na 20m między kabel podświetlenia a masę. Dostałem jakiś niezbyt zrozumiały dla mnie wynik, więc postanowiłem poćwiczyć na baterii. Wziąłem paluszka przyłożyłem i miałem wynik ok 2,5. Pomyślałem jakoś mało chyba. Potem wziąłem baterią 9V i przez rezystor dostałem wynik 4,5 to znaczy, że to było 4,5 ampera? Ale moja ciekawska natura kazała mi zrobić to samo bez rezystora a, że nie przełożyłem kabla to chyba zjarałem miernik 😕 (cały ja). 

Teraz pytania:
Jaki kupić fajny miernik?
jak się ustrzec przed takimi niespodziankami że chcemy coś sprawdzić a tam jakieś duże wartości?

Są jakiś mierniki którymi można mierzyć ile się chce amperów?
Ile amperów to dużo? Składam drony wyścigowe i tam regulatory obrotów zabierają mi po 30A a płytka dystrybucyjna wytrzymuj 190A więc miałem wrażenie że 2 Ampery to jakoś bardzo mało ;P.

Udostępnij ten post


Link to post
Share on other sites
11 godzin temu, DraveS napisał:

Ile amperów to dużo? Składam drony wyścigowe i tam regulatory obrotów zabierają mi po 30A a płytka dystrybucyjna wytrzymuj 190A więc miałem wrażenie że 2 Ampery to jakoś bardzo mało ;P.

W takiej elektronice, o której my tutaj piszemy 2 ampery to bardzo dużo. Jeśli w układzie nie ma silników to powinieneś się spodziewać < 0,5A, a często znacznie mniej.

11 godzin temu, DraveS napisał:

Mam takie pytanie. Nie wiem czy w dobrym miejscu piszę, ale wiąże się to z lekcją. Moja ciekawska natura kazała mi sprawdzić ile amperów bierze wyświetlacz. W tym celu przyłożyłem miernik ustawiony na 20m między kabel podświetlenia a masę. Dostałem jakiś niezbyt zrozumiały dla mnie wynik, więc postanowiłem poćwiczyć na baterii.

W tym momencie nie mierzyłeś ile pobiera wyświetlacz tylko jego podświetlenie. Nie podałeś żadnej zmierzonej wartości, więc ciężko ocenić czy była dziwna - na pewno powinna być to jakaś bardzo mała wartość (w miliamperach).

11 godzin temu, DraveS napisał:

Potem wziąłem baterią 9V i przez rezystor dostałem wynik 4,5 to znaczy, że to było 4,5 ampera? 

Jeśli miernik był ustawiony na zakres 20 mA, to wskazanie oznacza 4,5 mA. Nie ma żadnych szans, abyś mógł z baterii 9V pobrać 4,5A 😉

11 godzin temu, DraveS napisał:

Ale moja ciekawska natura kazała mi zrobić to samo bez rezystora a, że nie przełożyłem kabla to chyba zjarałem miernik 😕 (cały ja).

Dokładnie tak, wtedy uszkodziłeś bezpiecznik w mierniku.

11 godzin temu, DraveS napisał:

Jaki kupić fajny miernik?
jak się ustrzec przed takimi niespodziankami że chcemy coś sprawdzić a tam jakieś duże wartości?

Nie kupuj nowego miernika tylko go rozkręć i wymień bezpiecznik - z tyłu będzie napisane jaki trzeba kupić. Aby nie uszkodzić miernika trzeba troszkę myśleć o tym jaki w układzie może płynąć prąd i ustawiać odpowiedni zakres na mierniku. Gdybyś ustawił największy, tj. zapewne 10A, to nic by się nie stało - ewentualnie rozładowałbyś baterię.

Udostępnij ten post


Link to post
Share on other sites

Dzięki Ci panie. Mój miernik za 2 dychy będzie żył 😉

Tak w ogóle to kapitalną robotę tu robisz 🙂  Masz czytelnika i klienta na kolejne zestawy 😉

Udostępnij ten post


Link to post
Share on other sites
8 godzin temu, DraveS napisał:

Tak w ogóle to kapitalną robotę tu robisz 🙂  Masz czytelnika i klienta na kolejne zestawy 😉

Dzięki, miło słyszeć 😉 Powodzenia przy dalszych eksperymentach!

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Skończyłem w zasadzie ten wątek kursu, więc wrzucam zadanka domowe.

Zad 7.1

IMG_2221.thumb.jpg.407cc3efbe170d9d246a78997c31ea73.jpg

 

Zad. 7.2

tekst na wyświetlaczu po ciągłym odświeżaniu lekko "migał", ale prawie niezauważalnie

Zad 7.3

Wynik jest bardzo trudny do odczytania

Zad 7.4

Nie wiem, czy o to chodziło:

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

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


void setup() {
  lcd.begin(16, 2); //Deklaracja typu
  lcd.clear();
 
  pinMode(8, INPUT_PULLUP); //przycisk stop
  pinMode(9, INPUT_PULLUP); //przycisk start
  lcd.setCursor(0, 0);
  lcd.print("Pomiar czasu");
}
 
 
void loop()
{ 
czas = 0;
  if (digitalRead(9) == LOW){  //kiedy start wcisniety
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Czas pomiaru w s");

  while(digitalRead(8) == HIGH) { //dopoki stop nie bedzie wcisniety
  czas = czas+1;
  lcd.setCursor(0, 1);
  lcd.print(czas/10);  //pomiar czasu dzielimy przez 10,
  delay(100); // wtedy nie trzeba delay'a 1s i przycisk dziala bez zarzutow

  }
}
  if(digitalRead(8) == LOW) { // kiedy stop wcisniety
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Koniec: ");
    lcd.setCursor(0,1);
    lcd.print(czas/10);
    lcd.print(" sek");
    while(digitalRead(9) == HIGH); //pusta petla do ponownego restartu przyciskiem start
    
  }
}

Zdjęcie:

IMG_2224.thumb.jpg.f819b5c2212792af5dcee35200e7e061.jpg

 

Zrodziło się pytanie, bo o tej godzinie ciężko szukać, a ktoś może zna odpowiedź od razu. Czy jak pomiar natężenia prądu u mnie na diodzie podświetlającej wyniki pomiędzy 13 -15 mA, to czy potrzebuję stosować dodatkową rezystancję, aby móc przerobić układ do sterowania podświetleniem na PWM?
 

Edytowano przez miszczur
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
12 godzin temu, miszczur napisał:

Czy jak pomiar natężenia prądu u mnie na diodzie podświetlającej wyniki pomiędzy 13 -15 mA, to czy potrzebuję stosować dodatkową rezystancję, aby móc przerobić układ do sterowania podświetleniem na PWM?
 

Prawdopodobnie na wyświetlaczu jest już jakiś rezystor ograniczający prąd podświetlenia, więc możesz zasilać układ prosto z Arduino, ale nie zaszkodzi jednak dodać mały rezystor "dla świętego spokoju" 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dzień dobry, a oto moja wersja zadania domowego 7.4, z tego co przeglądałem forum nie było takiego więc postanowiłem, że podzielę się moim pomysłem na rozwiązanie. Od razu mówię że mam inny rodzaj wyświetlacza, ale to tylko są inne biblioteki i inicjalizacja LCD

Zad 7.4

Mówiono wiele razy ze mają być komentarze, więc  proszę bardzo 🙂 szczegółowo

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

LiquidCrystal_I2C lcd(0x3F, 16,2);  //Tworze obiekt, dzięki któremu mogę odwołać się do wyświetlacza

int sekunda = 0;  //Zmienna
int minuta = 0;   //Zmienna
int godzina = 0;  //Zmienna
void setup() {
  pinMode(7, INPUT_PULLUP); //Przycisk jako wejście
  pinMode(8, INPUT_PULLUP); //Przycisk jako wejscie

  lcd.init();         //Inicjalizacja LCD
  lcd.backlight();    //Właczenie podswietlenia
}

void loop() {

  lcd.setCursor(1,0);                   //Ustawienie kursora
  lcd.print("Aktualny czas:");          //Wyswietlamy tekst
  
  if(digitalRead(7) == LOW) {           //Jesli przycisk wcisniety
      while(digitalRead(8) == HIGH) {   //Do momentu gdy przycisk nie jest wcisniety
        delay(995);                     //Opoznienie[ms]
        sekunda = sekunda + 1;          //Do zmiennej "sekunda" dodaje 1
        
          if(sekunda < 10) {            //Jesli sekunda jest mniejsza od 10
            lcd.setCursor(11,1);        //Ustawienie kursora
            lcd.print("0");             //Wyswietlenie "0"
            lcd.setCursor(12,1);        //Ustawienie kursora
            lcd.print(sekunda);         //Wyswietlenie zmiennej "sekunda"
            lcd.print("s");             //Jednostka
          }
      
            if(sekunda >= 10 && sekunda < 60) {  //Jesli zmienna "sekunda" jest wieksza badz równa 10 i mniejsza od 60
              lcd.setCursor(11,1);                //Ustawienie kursora
              lcd.print(sekunda);                 //Wyswietlanie zmiennej "sekunda"
              lcd.print("s");                     //Jednostka
              }
      
                if(sekunda == 60) {               //Jesli sekunda bedzie równa 59
                  sekunda = 0;                    //Wyzerowanie zmiennej "sekunda"
                  minuta = minuta + 1;            //Do zmiennej "minuta" dodaje 1
                  lcd.setCursor(11,1);            //Ustawienie kursora
                  lcd.print("00");                //Wyswietlenie "00"
                  lcd.setCursor(5,1);             //Ustawienie kursora
                  lcd.print(minuta);              //Wyswietlanie zmiennej "minuta"
                  lcd.print("min");               //Jednostka
                  }

      if(minuta > 0 && minuta < 10) {           //Jesli zmienna "minuta" jest wieksza 0 i mniejsza od 10
          lcd.setCursor(5,1);                   //Ustawienie kursora
          lcd.print("0");                       //Wyswietlenie "0"
          lcd.setCursor(6,1);                   //Ustawienie kursora
          lcd.print(minuta);                    //Wyswietlenie zmiennej "godzina"
          lcd.print("min");                     //Jednostka
          }
          
          if(minuta >= 10 && minuta < 60) {     //Jesli zmienna "minuta" jest wieksza badz równa 10 i mniejsza od 60
            lcd.setCursor(5,1);                 //Ustawienie kursora
            lcd.print(minuta);                  //Wyswietlanie zmiennej "sekunda"
            lcd.print("min");                   //Jednostka
      
              if(minuta == 60) {                //Jesli minuta jest równa 59
                minuta = 0;                     //Wyzerowanie zmiennej"minuta"
                godzina = godzina + 1;          //Do zmiennej "godzina" dodaje 1
                lcd.setCursor(5,1);             //Ustawienie kursora
                lcd.print("00");                //Wyswietlenie "00"
                lcd.setCursor(0,1);             //Ustawienie kursora na 10 miejsce w 2 wersie 
                lcd.print(godzina);             //Wyswietlenie zmiennej "godzina"
                lcd.print("h");                 //Jednostka
              
  }           
    }         
      if(godzina > 0 && godzina < 10) {         //Jesli godzina jest wieksza 0 i mniejsza od 10
        lcd.setCursor(0,1);                     //Ustawienie kursora
        lcd.print("0");                         //Wyswietlenie "0"
        lcd.setCursor(1,1);                     //Ustawienie kursora
        lcd.print(godzina);                     //Wyswietlenie zmiennej "godzina
        lcd.print("h");                         //Jednostka
      }
          if(godzina >= 10 && godzina < 24) {   //Jesli zmienna "godzina" jest wieksza badz równa 10 i mniejsza od 24
            lcd.setCursor(0,1);                 //Ustawienie kursora
            lcd.print(godzina);                 //Wyswietlenie zmiennej "godzina"
            lcd.print("h");                     //Jednostka
          }
              
              if(godzina == 24) {           //Jesli zmienna "godzina" jest rowna 24
                  godzina = 0;              //Zerujemy zmiennna "godzina"
                  lcd.setCursor(0,1);       //Ustawienie kursora
                  lcd.print("00");          //Wyswietlenie "00"
                  lcd.setCursor(0,1);       //Ustawienie kursora
                  lcd.print(godzina);       //Wyswietlenie zmiennnej"godzina"
                  lcd.print("h");           //Jednostka
    }
  }
  }
  //Zatrzymywanie stopera       
    if(digitalRead(8) == LOW) {             //Jesli przycisk wcisniety
      godzina = godzina;                    //Zeby nie zmieniac wartosci
      minuta = minuta;
      sekunda = sekunda;                    
  
    //Jesli jest godzina mniejsza od 10
      if(godzina < 10) {      
        lcd.setCursor(0,1);                 //Ustawienie kursora
        lcd.print("0");                     //Wyswietlenie "0"
        lcd.setCursor(1,1);                 //Ustawienie kursora
        lcd.print(godzina);                 //Wyswietlenie zmiennnej "godzina"
        lcd.print("h");                     //Jednostka
        }
        
    //Jesli minuta jest mniejsza od 10
      if(minuta < 10) {
        lcd.setCursor(5,1);                 //Ustawienie kursora
        lcd.print("0");                     //Wyswietlenie "0"
        lcd.setCursor(6,1);                 //Ustawienie kursora
        lcd.print(minuta);                  //Wyswietlenie zmiennnej "minuta"
        lcd.print("min");                   //Jednostka
        }
        
    //Jesli sekunda jest mniejsza od 10  
      if(sekunda < 10) {
        lcd.setCursor(11,1);                //Ustawienie kursora
        lcd.print("0");                     //Wyswietlenie "0"
        lcd.setCursor(12,1);                //Ustawienie kursora
        lcd.print(sekunda);                 //Wyswietlenie zmiennej "sekunda"
        lcd.print("s");                     //Jednostka
        }
        
    //Jesli godzina jest wieksza badz równa 10 i mniejsza od 24 
      if(godzina >= 10 && godzina < 24) {
        lcd.setCursor(0,1);                 //Ustawienie kursora  
        lcd.print(godzina);                 //Wyswietlenie zmiennnej "godzina"
        lcd.print("h");                     //Jednostka
        }                                   
                                            
    //Jesli minuta jest wieksza badz równa 10 i mniejsza od 60
      if(minuta >= 10 && minuta < 60) {     
        lcd.setCursor(5,1);                 //Ustawienie kursora
        lcd.print(minuta);                  //Wyswietlenie zmiennej "minuta"
        lcd.print("min");                   //Jednostka
        }                                    
    //Jesli sekunda jest wieksza badz równa 10 i mniejsza od 60 
      if(sekunda >= 10 && sekunda < 60) {   
        lcd.setCursor(11,1);                //Ustawienie kursora
        lcd.print(sekunda);                 //Wyswietlenie zmiennej "sekunda"
        lcd.print("s");                     //Jednostka
    } 
  }
  

  if(digitalRead(7) == LOW && digitalRead(8) == LOW) {    //Jesli oba przyciski sa wcisniete to resetuje zegar
    sekunda = 0;                                          //Zeruje zmienna "sekunda"
    minuta = 0;                                           //Zeruje zmienna "minuta"
    godzina = 0;                                          //Zeruje zmienna "godzina"
  }
}
  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

@KaPl, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.
Dnia 18.01.2019 o 23:17, KaPl napisał:

Dzień dobry, a oto moja wersja zadania domowego 7.4, z tego co przeglądałem forum nie było takiego więc postanowiłem, że podzielę się moim pomysłem na rozwiązanie.

Bardzo ładnie sformatowany i opisany program - oby wszystkie takie były 😉

Udostępnij ten post


Link to post
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ę »

×