Kilka "stron" LCD - shalvan - 19-09-2015
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.
RE: Kilka "stron" LCD - adix - 20-09-2015
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;
}
}
RE: Kilka "stron" LCD - shalvan - 20-09-2015
Wielkie dzięki, ale nie zrozumieliśmy się.
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.
RE: Kilka "stron" LCD - adix - 20-09-2015
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.
RE: Kilka "stron" LCD - shalvan - 20-09-2015
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.
RE: Kilka "stron" LCD - adix - 20-09-2015
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;
}
}
RE: Kilka "stron" LCD - adix - 20-09-2015
mam nadzieje ze pomogłem
RE: Kilka "stron" LCD - shalvan - 20-09-2015
wydaje mi się że opcja 2 będzie ok, zaraz dopiszę te kilka linijek kodu i zobaczymy czy pomogło
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 :/
RE: Kilka "stron" LCD - adix - 20-09-2015
da się to niwelować jeśli taka konieczność wymyśle ci jak to zrobić
RE: Kilka "stron" LCD - shalvan - 20-09-2015
Było by bardzo spoko bo szczerze powiem że jest to drażniące
Generalnie wielkie dzięki za już przekazaną pomoc.
|