Arduino Polska Forum

Pełna wersja: Kilka "stron" LCD
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3
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.
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;
    }
  
  
  



}
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.
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.
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.
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;
      
    }
  
  
  



}
mam nadzieje ze pomogłem
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 :/
da się to niwelować jeśli taka konieczność wymyśle ci jak to zrobić
Było by bardzo spoko bo szczerze powiem że jest to drażniące Tongue

Generalnie wielkie dzięki za już przekazaną pomoc.
Stron: 1 2 3