Skocz do zawartości
Nocti

LCD miga. Co jest nie tak z tym kodem? (Arduino)

Pomocna odpowiedź

#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C  lcd(0x3F,2,1,0,4,5,6,7);
  
  String a[14];
  
void setup()
  { 
    lcd.begin (16,2);
    lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); 
    lcd.setBacklight(HIGH); 
    
    pinMode(13,OUTPUT);
    pinMode(12, INPUT_PULLUP);
    
    a[14]="434.30";
    a[13]="426.03";
    a[12]="664.01";
    a[11]="649.35";
    a[10]="568";
    a[9]="346";
    a[8]="256";
    a[7]="545.44";
    a[6]="454";
    a[5]="265.26";
    a[4]="257.04";
    a[3]="364.03";
    a[2]="858";
    a[1]="750.10";
    a[0]="100";
    
  }

      
void loop()
  {
    lcd.setCursor(0,0);
    lcd.print("Aktualny: ");
    lcd.print(a[1]);
    lcd.setCursor(0,1);
    lcd.print("Nastepny: ");
    lcd.print(a[0]);
    
    if(digitalRead(12) == LOW); //Jeśli przycisk wciśnięty
      {
        digitalWrite(13, HIGH); //Włącz diodę
        delay(100);
        digitalWrite(13,LOW);
      }
   }

Po wgraniu podświetlenie wyświetlacza LCD miga, i niczego nie wyświetla.

Proszę o pomoc!

Z góry dziękuję!

Udostępnij ten post


Link to post
Share on other sites

@Nocti, 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.

18 godzin temu, Nocti napisał:

Po wgraniu podświetlenie wyświetlacza LCD miga, i niczego nie wyświetla.

Wyświetlasz dane na LCD w pętli, bez żadnego opóźnienia. Wyświetlacze tego typu nie nadają się do takich szybkich operacji. Jeśli dobrze rozumiem to w Twoim programie w koło wyświetlasz dokładnie to samo na LCD. Nie ma więc sensu robić tego w pętli. Wyświetl tekst raz i nie wysyłaj go ciągle od nowa na ekran, wtedy nic nie będzie migało.

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

@Treker, dzięki za odpowiedź!

Chciałbym cię zapytać o jeszcze jedną rzecz. Mój program ma zwiększać wyświetlany "poziom" tablicy o  jeden. problem jest w tym że nie wiem, jak zrobić, aby po jednym naciśnięciu tablica zmieniał się o jeden, nawet jeżeli naciskam przycisk długo.(później zamierzam zrobić coś jeszcze w tym programie po przytrzymaniu przycisku.)Teraz po naciśnięciu przycisku pętla while wykonuje się kilka razy.

Ps. Przepraszam, że problem opisuje dosyć nieudolnie ale pisze to na kolanie.

Na razie kod wygląda tak:

#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define BACKLIGHT_PIN 3
LiquidCrystal_I2C  lcd(0x3F,2,1,0,4,5,6,7);
  
  int array[15] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 };
  int i,b;
void setup()
  { 
    pinMode(13,OUTPUT);
    pinMode(12, INPUT_PULLUP);
    lcd.begin (16,2);
    lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); 
    lcd.setBacklight(HIGH);
    
  }
      
void loop()
  {
    String a[15];

    int b=0;

    a[14]="434.30";
    a[13]="426.03";
    a[12]="664.01";
    a[11]="649.35";
    a[10]="568";
    a[9]="346";
    a[8]="256";
    a[7]="545.44";
    a[6]="454";
    a[5]="265.26";
    a[4]="257.04";
    a[3]="364.03";
    a[2]="858";
    a[1]="750.10";
    a[0]="388";
    
    while (digitalRead(12) == LOW) 
    {
       
  
      lcd.setCursor(0,0);
      lcd.print("Aktualny: ");
      lcd.print(a[b]);
      lcd.setCursor(0,1);
      lcd.print("Nastepny: ");
      lcd.print(a[b+1]);

       b++;

       
       
      if (digitalRead(12) == LOW) //Jeśli przycisk wciśnięty
      { 
      digitalWrite(13, HIGH); //Włącz diodę   
      } 
      else //Jeśli warunek nie został spełniony (przycisk nie jest wciśnięty)
      { 
      digitalWrite(13, LOW); //Wyłącz diodę
      }    

    }

  }

 

Udostępnij ten post


Link to post
Share on other sites

Zapisz dwa stany przycisku w zmiennych. W pętli sprawdzaj stan aktualny i poprzedni. 

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
5 godzin temu, Nocti napisał:

Chciałbym cię zapytać o jeszcze jedną rzecz. Mój program ma zwiększać wyświetlany "poziom" tablicy o  jeden. problem jest w tym że nie wiem, jak zrobić, aby po jednym naciśnięciu tablica zmieniał się o jeden, nawet jeżeli naciskam przycisk długo.(później zamierzam zrobić coś jeszcze w tym programie po przytrzymaniu przycisku.)Teraz po naciśnięciu przycisku pętla while wykonuje się kilka razy.

Po pierwsze, poczytaj o drganiach styków. Po drugie, musisz reagować na zbocze (np. puszczenie przycisku), a nie na sam fakt zwarcia wejścia do masy. Jeśli będziesz inkrementował pozycję za każdym razem, gdy przycisk jest wciśnięty to Arduino zdąży zwiększyć zmienną tysiące razy nawet, jeśli będziesz starał się wciskać przycisk bardzo szybko. Taka pętla bez opóźnień wykonywana jest "miliony razy na sekundę", Twoje wciśnięcie dla Arduino jest wiecznością 😉

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Cześć!!!😀

Przepraszam, że tak długo nie odpowiadałem.  Za namową @Treker , poczytałem trochę o drganiach styków. Pogrzebałem trochę w internecie i znalazłem bibliotekę Easy Button. 

Dzięki niej rozwiązałem problem.

Kod trochę się pozmieniał :

#include <LCD.h>
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <EasyButton.h>

#define czasDef 1000
#define czas000 5000
#define czasPrzy 5000
#define BACKLIGHT_PIN 3

LiquidCrystal_I2C  lcd(0x3F,2,1,0,4,5,6,7);
EasyButton zatw(A0);
EasyButton wdol(A1);
EasyButton wgore(A2);

  int array[15] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14 };
  String a[17];
  int b=0; 
  
void setup()
  { 
    Serial.begin(115200);
    zatw.begin();
    wdol.begin();
    wgore.begin();
    
    zatw.onPressed(ztawierdz);
    wdol.onPressed(dol);
    wgore.onPressed(gora);
    
    pinMode(13,OUTPUT);
    lcd.begin (16,2);
    lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); 
    lcd.setBacklight(HIGH);

    lcd.setCursor(0,0);
    lcd.print("Aktualny: ");
    lcd.print(a[b]);
    lcd.setCursor(0,1);
    lcd.print("Nastepny: ");
    lcd.print(a[b+1]);

    a[16]="------";
    a[15]="------";
    a[14]="15.30";
    a[13]="14.03";
    a[12]="13.01";
    a[11]="12.35";
    a[10]="11";
    a[9]="10";
    a[8]="9";
    a[7]="8.44";
    a[6]="7";
    a[5]="6.26";
    a[4]="5.04";
    a[3]="4.03";
    a[2]="3";
    a[1]="2.10";
    a[0]="1";
  }
  
 void ztawierdz() 
  {
     Serial.println("zatwierdzono!!!"); //Niedokończone
  }
  
 void dol() 
  {
    if(b<16){    
    lcd.clear();
    Serial.println("w dol!!!");
    digitalWrite(13, HIGH);
 
    lcd.setCursor(0,0);
    lcd.print("Aktualny: ");
    lcd.print(a[b]);
    lcd.setCursor(0,1);
    lcd.print("Nastepny: ");
    lcd.print(a[b+1]);
    
    b--;
    } 
    else b=0;
  }
  
  void gora() 
  {
    if(b<16)
    {
    lcd.clear();
    Serial.println("w gore!!!");
    lcd.setCursor(0,0);
    lcd.print("Aktualny: ");
    lcd.print(a[b]);
    lcd.setCursor(0,1);
    lcd.print("Nastepny: ");
    lcd.print(a[b+1]);
    
    b++;
    }
  }

void loop()
  {
    zatw.read();
    wdol.read();
    wgore.read();
  }

 

  • Lubię! 1

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ę »

×