• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Kilka "stron" LCD
#1
Witam,

Od jakiegoś czasu borykam się z problemem zrobienia kilku że tak powiem "stron" na wyświetlaczy LCD 4x20 ze sterownikiem HD44780. 

Mam taki pomysł przyjmijmy że LCD1 to pierwszy a zarazem główny ekran, teraz po wciśnięciu przycisku button1 zmieni się to na LCD2 na którym będą wyświetlane inne informacje i pozostanie tak aż button1 wróci do poprzedniego stanu.

zrobiłem coś na styl 

if (digitalRead(buttonPin1) == HIGH)
{
  lcd.clear();
  LCD2;
}
else
{
  LCD1
}

Ale jest problem właśnie w komendzie lcd.clear() która wykonuje się cały czas, a ja chciał bym żeby wykonała się tylko 1 raz w momencie zmiany wartości ButtonPin1, potem ma się dziać już tylko to co zawarte jest w LCD1 lub LCD2.
 
Odpowiedź
#2
proszę masz przykład wyświetlania na wielu LCD wystarczy zmienić nazwę i piny w konfiguracji masz na 2 LCD ale jeśli skopujesz config i pozmieniasz masz kolejne
Kod:
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
LiquidCrystal lcd1(30, 31, 32, 33, 34, 35);
LiquidCrystal lcd2(11, 12, 13, 14, 15, 16);
LiquidCrystal lcd3(40, 41, 42, 43, 44, 45);
tak można na 4 LCD wyświetlać
i nie musza byc 2x16 moga byc 4x20 i ine
Kod:
lcd.begin(16, 2);
    lcd1.begin(16, 2);
  lcd2.begin(20, 4);
    lcd3.begin(20, 4);

Kod:
#include <LiquidCrystal.h>
const int s1 = 48;
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
LiquidCrystal lcd1(40, 41, 42, 43, 44, 45);
int s1stan;
int a=0;
int b=0;
void setup() {

  lcd.begin(16, 2);
    lcd1.begin(16, 2);
  pinMode(s1, INPUT);
    pinMode(s1, OUTPUT);
  
digitalWrite(s1, HIGH);  
    

}

void loop() {
    s1stan = digitalRead(s1);
    if(s1stan == 0){
      
    
      if(a == 5)a=0;
      a++;
      b=a;
     delay(900);
    }
    
    switch(b){
      case 1:{
       lcd1.setCursor(0, 0);
   lcd1.print("lcd1");
  
   lcd1.setCursor(0, 1);
   lcd1.print("lcd2");
   b=255;
      }
      return;
          case 2:{
       lcd.setCursor(0, 0);
   lcd.print("lcd3");
  
   lcd.setCursor(0, 1);
   lcd.print("lcd4");
      b=255;
      }
      return;
          case 3:{
       lcd.setCursor(0, 0);
   lcd.print("lcd5");
  
   lcd.setCursor(0, 1);
   lcd.print("lcd6");
      b=255;
      }
      return;
                case 4:{
       lcd1.setCursor(0, 0);
   lcd1.print("lcd7");
  
   lcd1.setCursor(0, 1);
   lcd1.print("lcd8");
      b=255;
      }
      return;
                case 5:{
       lcd.setCursor(0, 0);
   lcd.print("lcd9");
  
   lcd.setCursor(0, 1);
   lcd.print("lcd10");
      b=255;
      }
      return;
    }
  
  
  



}
 
Odpowiedź
#3
Wielkie dzięki, ale nie zrozumieliśmy się. Smile

wiem jak zrobić wile wyświetlaczy, mi chodzi o to żeby na 1 fizycznym wyświetlaczu zrobić kilka stron coś w rodzaju menu tyle że nie ze statycznymi wartościami tylko z faktycznymi danymi z czujników .

może nie potrzebnie napisałem LCD1 i LCD2 mogło to faktycznie wprowadzić w błąd.

tak w ogóle i poza tematem to można by zrobić tutaj na forum wątek dla początkujących odnośnie LCD, metody połączenia jak napisał wyżej kolega metody na I2C (TWI), jest jeszcze 1 fajna metoda która drastycznie zmniejsza ilość potrzebnych pinów, łączy się równolegle piny lcd RS, d4, d5, d6, d7 natomiast E daje się już do osobnych pinów.
 
Odpowiedź
#4
Napisz mi jak widzisz to menu w punktach 1 strona 2 np3 bo nie rozumie co tam chcesz zamieścić jeśli maja być to zmienne które zmieniała się dynamicznie to trochę komplikuje chodź już wiem jak się z ty uporać jeśli mają być statyczne to prosta sprawa.
 
Odpowiedź
#5
ok przyjmijmy że struktura programu miała by wyglądać tak:

Kod:
if (digitalRead(ButtonPin) == HIGH)
{
  lcd.setCursor(0, 0);
  lcd.print("N:1 - ");
  lcd.print("P:");
  lcd.print(NodeCounter[01]);
  lcd.setCursor(0, 1);
  lcd.print("N:2 - ");
  lcd.print("P:");
  lcd.print(NodeCounter[02]);
  lcd.setCursor(0, 2);
  lcd.print("N:3 - ");
  lcd.print("P:");
  lcd.print(NodeCounter[03]);
  lcd.setCursor(0, 3);
  lcd.print("N:4 - ");
  lcd.print("P:");
  lcd.print(NodeCounter[04]);
}
else
{
  lcd.setCursor(0, 0);
  lcd.print("Temp1:");
  lcd.print(NodeTempC[01], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 1);
  lcd.print("Temp2:");
  lcd.print(NodeTempC[02], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 2);
  lcd.print("Temp3:");
  lcd.print(NodeTempC[03], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 3);
  lcd.print("Temp4:");
  lcd.print(NodeTempC[04], 1);
  lcd.write((uint8_t)0);
}

Teraz żeby to zadziałało potrzeba jeszcze dodać lcd.clear() żeby przy każdym przełączeniu wyczyścić ekran i tu pojawia się problem, bo jeśli to dodamy na początku pętli to czyszczenie będzie się wykonywało zawsze przy rozpoczynaniu pętli, a ja bym chciał żeby czyszczenie następowało tylko 1 raz dokładnie po zmianie wartości ButtonPin z LOW na HIGH i na odwrót.

Generalnie chodzi o to żeby wykorzystać 1 LCD 4x20 do wyświetlenia dużej ilości parametrów.
 
Odpowiedź
#6
nie musisz używać clear mozesz czysci w ten sposób
Kod:
if (digitalRead(ButtonPin) == HIGH)
{
  lcd.setCursor(0, 0);
  lcd.print("N:1 -               ");
  lcd.print("P:                  ");
  lcd.print(NodeCounter[01]);
  lcd.setCursor(0, 1);
  lcd.print("N:2 -               ");
  lcd.print("P:                  ");
  lcd.print(NodeCounter[02]);
  lcd.setCursor(0, 2);
  lcd.print("N:3 -               ");
  lcd.print("P:                  ");
  lcd.print(NodeCounter[03]);
  lcd.setCursor(0, 3);
  lcd.print("N:4 -               ");
  lcd.print("P:                  ");
  lcd.print(NodeCounter[04]);
}
else
{
  lcd.setCursor(0, 0);
  lcd.print("Temp1:              ");
  lcd.print(NodeTempC[01], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 1);
  lcd.print("Temp2:              ");
  lcd.print(NodeTempC[02], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 2);
  lcd.print("Temp3:               ");
  lcd.print(NodeTempC[03], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 3);
  lcd.print("Temp4:               ");
  lcd.print(NodeTempC[04], 1);
  lcd.write((uint8_t)0);
}
albo tak
Kod:
bool a=0;
bool b=0;
void loop() {



if (digitalRead(ButtonPin) == HIGH)
{
  if(a == 0){
    a=1;
    b=0;
    czysc();
  }
  lcd.setCursor(0, 0);
  lcd.print("N:1 -");
  lcd.print("P:");
  lcd.print(NodeCounter[01]);
  lcd.setCursor(0, 1);
  lcd.print("N:2 -");
  lcd.print("P:");
  lcd.print(NodeCounter[02]);
  lcd.setCursor(0, 2);
  lcd.print("N:3 -");
  lcd.print("P:");
  lcd.print(NodeCounter[03]);
  lcd.setCursor(0, 3);
  lcd.print("N:4 -");
  lcd.print("P:");
  lcd.print(NodeCounter[04]);
}
else
{
    if(b == 0){
    a=0;
    b=1;
    czysc();
  }
  lcd.setCursor(0, 0);
  lcd.print("Temp1:");
  lcd.print(NodeTempC[01], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 1);
  lcd.print("Temp2:");
  lcd.print(NodeTempC[02], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 2);
  lcd.print("Temp3:");
  lcd.print(NodeTempC[03], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 3);
  lcd.print("Temp4:");
  lcd.print(NodeTempC[04], 1);
  lcd.write((uint8_t)0);
}

}

void czysc(){
if(b == 1)a=0;
if(a == 1)b=0;
lcd.clear();
return;
}



i 3 rozwiozanie na trzymanie butona
Kod:
#include <LiquidCrystal.h>
const int s1 = 48;
LiquidCrystal lcd(40, 41, 42, 43, 44, 45);

int s1stan;
int a=0;
int b=0;
int NodeTempC[1];
int NodeCounter[1];

void setup() {

  lcd.begin(16, 2);

  pinMode(s1, INPUT);
    pinMode(s1, OUTPUT);
  
digitalWrite(s1, HIGH);  
  lcd.clear();  
NodeCounter[1]=1;
NodeTempC[1]=1;
a=1;
}

void loop() {
    s1stan = digitalRead(s1);
    if(s1stan == 0){
      a=2;
       b=a;
delay(900);
    }
    else
    {
      
      a=1;
      b=a;
   delay(900);
    }
    
    switch(b){
    
            case 1:{
              lcd.clear();
              lcd.setCursor(0, 0);
  lcd.print("N:1 -");
  lcd.print("P:");
  lcd.print(NodeCounter[1]);
  lcd.setCursor(0, 1);
  lcd.print("N:2 -");
  lcd.print("P:");
  lcd.print(NodeCounter[02]);
  lcd.setCursor(0, 2);
  lcd.print("N:3 -");
  lcd.print("P:");
  lcd.print(NodeCounter[03]);
  lcd.setCursor(0, 3);
  lcd.print("N:4 -");
  lcd.print("P:");
  lcd.print(NodeCounter[04]);
   b=255;
      }
      return;
       case 2:{
        lcd.clear();
    lcd.setCursor(0, 0);
  lcd.print("Temp1:");
  lcd.print(NodeTempC[1], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 1);
  lcd.print("Temp2:");
  lcd.print(NodeTempC[02], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 2);
  lcd.print("Temp3:");
  lcd.print(NodeTempC[03], 1);
  lcd.write((uint8_t)0);
  lcd.setCursor(0, 3);
  lcd.print("Temp4:");
  lcd.print(NodeTempC[04], 1);
  lcd.write((uint8_t)0);
   b=255;
      }
      return;
      
    }
  
  
  



}
 
Odpowiedź
#7
mam nadzieje ze pomogłem
 
Odpowiedź
#8
wydaje mi się że opcja 2 będzie ok, zaraz dopiszę te kilka linijek kodu i zobaczymy czy pomogło Smile

ok dodałem wersję nr 2 - faktycznie działa jak powinno.

z tym że teraz gdy buttonPin == LOW co jakiś czas następuje lcd.clear co objawia się bardzo denerwującym miganiem ekranu :/
 
Odpowiedź
#9
da się to niwelować jeśli taka konieczność wymyśle ci jak to zrobić
 
Odpowiedź
#10
Było by bardzo spoko bo szczerze powiem że jest to drażniące Tongue

Generalnie wielkie dzięki za już przekazaną pomoc.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości