Poblikávanie LCD displeja

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

jankrizan
Nový člen
Nový člen
Príspevky: 54
Dátum registrácie: 04 Mar 2011, 00:00
Vek: 64

Poblikávanie LCD displeja

Príspevok od používateľa jankrizan » 20 Feb 2022, 16:45

Dobrý deň.
Chcem Vás poprosiť o pomoc pri realizácii jedného programu pre arduino. Na nete som našiel program, ktorý po miernom upravení funguje,ako si predstavujem, ale má jednu chybičku krásy a to, že mierne mrká LCD displej. Neovládam vytváranie programu (príkazy, povely -neovládam totiž angličtinu- i keď niečomu rozumiem), ale po nejakom čase googlovania som čosi podchytil a nejakú úpravu dokážem. Neviem prísť na to, že text na displeji poblikáva (asi v rytme inštrukcií), cca pol sekundy svieti normálne, potom na nejakú desatinku sekundy mrkne. Je to dosť rušivé, ale neviem ako ďalej. Tu je kod.

#include <LiquidCrystal.h>
int sump=A0;
int qut=A1;
int hlf=A2;
int thf=A3;
int ful=A4;
int kon=A5;
int motor=8;
int buz=7;
int s;
int q;
int h;
int t;
int f;
int k;
int i; //motor status flag
int v=100; //comparison variable(needs some adjustment)
int b=0; //buzzer flag
int m=0; //motor flag
int c=0; //sump flag

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// definovanie vlastného znaku, pomocou pixelov (1 - svieti, 0 - nesvieti)
byte zatvorka1[8]
{
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
byte zatvorka2[8]
{
B11111,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B11111
};
byte zatvorka3[8]
{
B11111,
B00000,
B00000,
B00000,
B00000,
B00000,
B00000,
B11111,
};
byte zatvorka4[8]
{
B11110,
B00010,
B00011,
B00011,
B00011,
B00011,
B00010,
B11110,
};
byte zatvorka5[8]
{
B11110,
B11110,
B11111,
B11111,
B11111,
B11111,
B11110,
B11110,
};

void setup()
{
// vytvorenie znaku
lcd.begin(16, 2);
lcd.setCursor(0, 0);

lcd.write(byte(0));
lcd.createChar(1, zatvorka1);
lcd.createChar(2, zatvorka2);
lcd.createChar(3, zatvorka3);
lcd.createChar(4, zatvorka4);
lcd.createChar(5, zatvorka5);
lcd.setCursor(0, 1);

lcd.write(byte(1));
lcd.write(byte(2));
lcd.write(byte(3));
lcd.write(byte(4));
lcd.write(byte(5));

pinMode(qut,INPUT_PULLUP);
pinMode(hlf,INPUT_PULLUP);
pinMode(thf,INPUT_PULLUP);
pinMode(ful,INPUT_PULLUP);
pinMode(kon,INPUT_PULLUP);
pinMode(sump,INPUT_PULLUP);
pinMode(motor,OUTPUT);
pinMode(buz,OUTPUT);
lcd.begin(16, 2);
digitalWrite(buz,LOW);
}

void loop()
{

i=digitalRead(motor);
s=analogRead(sump);
q=analogRead(qut);
h=analogRead(hlf);
t=analogRead(thf);
f=analogRead(ful);
k=analogRead(kon);
lcd.clear();

if(f<v && t<v && h<v && q<v && k>v)
{
lcd.setCursor(0,0);
lcd.print(" kontrola stavu ");
lcd.setCursor(0,1);
lcd.print(" nabitia ");
m=0;
b=0;

}
else
if(f>v && t<v && h<v && q<v && k>v)
{
lcd.setCursor(0,0);
lcd.print("Jemne dobijanie");
lcd.setCursor(0,1);
lcd.print("15% = 0,75 Amper");
m=0;
b=0;
}
else
{
if(f>v && t>v && h<v && q<v && k>v)
{
lcd.setCursor(0,0);
lcd.print(" Plne nabijanie");
lcd.setCursor(0,1);
lcd.print("100% = 5.0 Amper");
m=0;
b=0;
}
else
if(f>v && t>v && h>v && q<v && k>v)
{
lcd.setCursor(0,0);
lcd.print("Setrne nabijanie");
lcd.setCursor(0,1);
lcd.print("10% = 0,5 Amper");
m=0;
b=0;
}
else
{
if(f>v && t>v && h>v && q>v && k>v)
{
lcd.setCursor(0,0);
lcd.print("?? Testovanie ??");
lcd.setCursor(0,1);
lcd.print(" akumulatora ");
m=1;
b=0;
}
else
{
if(f>v && t>v && h>v && q>v && k<v)
{
lcd.setCursor(0,0);
lcd.setCursor(0,0);
lcd.write(byte(1));
lcd.write(byte(1));
lcd.write(byte(1));
lcd.write(byte(5));
lcd.setCursor(6,0);
lcd.print("Nabijanie ");
lcd.setCursor(0,1);
lcd.print("100% ukoncene ");
m=1;
b=0;
}
else
{
digitalWrite(motor,LOW);
lcd.setCursor(0,0);
lcd.print("!!! Neplatne !!!");
lcd.setCursor(0,1);
lcd.print(" zadanie");
m=0;
b=1;
}
}}}
if(i==LOW)

if(s<v && m==1)
{
digitalWrite(motor,HIGH);
}
if(s>v)
{
digitalWrite(motor,LOW);
lcd.setCursor(0,0);
lcd.print("!!! Porucha !!! ");
lcd.setCursor(0,1);
lcd.print(" akumulatora ");
c=1;
}
if(s<v)
{
c=0;
}

if(m==0)
{
digitalWrite(motor,LOW);
}

if(b==1 || c==1)
{
digitalWrite(buz,HIGH);
delay(200);
digitalWrite(buz,LOW);

}
digitalWrite(buz,LOW);
{
delay(200);
lcd.clear();
}
}

Kod je upravovaný mnou, tak ak je niečo nesprávne, nekameňujte ma, sú tam aj pôvodné názvy aj moje úpravy, ale funguje to. Ďakujem za porozumenie. Ešte niečo- displej poblikáva aj na original kode z netu tak isto ako po úprave, tak si myslím, že tam niečo chýba (alebo prebýva).
0

Používateľov profilový obrázok
niki31
Stály člen
Stály člen
Príspevky: 172
Dátum registrácie: 05 Feb 2010, 00:00
Bydlisko: Žilinský kraj
Vek: 49

Re: Poblikávanie LCD displeja

Príspevok od používateľa niki31 » 20 Feb 2022, 17:21

Teda musím uznať že debilnejšie napísaný program som ešte nevidel.
Viacmenej displej musí blikať lebo si ho v každom prechode hlavnou slučkou mažeš.
Niesú tam čísla riadkov tak skontroluj správnosť umestnenia LCD_Clear(); v hlavnej slučke.
Nedal si nám k nahliadnutiu súbor LiquidCrystal.h, tak hádam názov zodpovedá funkcii rutiny.
0
Niki31

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1560
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Poblikávanie LCD displeja

Príspevok od používateľa jirka.jirka. » 20 Feb 2022, 17:24

1. Jaké arduino? Odtud potom otázka, zdali máš správně nastaven krystal.
2. Delay(200) odstraň a vyřeš jinak.
3. Copak je v knihovnách víme? (LiquidCrystal.h)?
4. Zdá se mi, nebo display pořád mažeš?
5. Zdrojové kódy dávej mezi položky: [ code ][ /code ]. Odstraň jenom mezery. Pak ten k=od bude zde na stránkách čitelný.
6. Komentáře ve zdrojácích už nejsou v módě? Nebo proč zde není ani jeden? Vždyť v tom se ani prase nevyzná. :crying:

EDIT: Už jsem byl předběhnut. :thumbup:
0

jankrizan
Nový člen
Nový člen
Príspevky: 54
Dátum registrácie: 04 Mar 2011, 00:00
Vek: 64

Re: Poblikávanie LCD displeja

Príspevok od používateľa jankrizan » 20 Feb 2022, 17:41

Ak ste sa do toho zahryzli tak... Program original-
#include <LiquidCrystal.h>
int sump=A0;
int qut=A1;
int hlf=A2;
int thf=A3;
int ful=A4;
int motor=8;
int buz=7;
int s;
int q;
int h;
int t;
int f;
int i; //motor status flag
int v=100; //comparison variable(needs some adjustment)
int b=0; //buzzer flag
int m=0; //motor flag
int c=0; //sump flag

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{

pinMode(qut,INPUT_PULLUP);
pinMode(hlf,INPUT_PULLUP);
pinMode(qut,INPUT_PULLUP);
pinMode(ful,INPUT_PULLUP);
pinMode(sump,INPUT_PULLUP);
pinMode(motor,OUTPUT);
pinMode(buz,OUTPUT);
lcd.begin(16, 2);
digitalWrite(buz,LOW);
}

void loop()
{

i=digitalRead(motor);
s=analogRead(sump);
q=analogRead(qut);
h=analogRead(hlf);
t=analogRead(thf);
f=analogRead(ful);
lcd.clear();

if(f>v && t>v && h>v && q>v )
{
lcd.setCursor(0,0);
lcd.print(char(219));
lcd.print(char(219));
lcd.print(char(219));
lcd.print(char(219));
lcd.setCursor(5,0);
lcd.print("FULL");
m=0;
b=0;
}
else
{
if(f<v && t>v && h>v && q>v)
{
lcd.setCursor(0,0);
lcd.print(char(219));
lcd.print(char(219));
lcd.print(char(219));
lcd.print("_");
lcd.setCursor(5,0);
lcd.print("3/4th");
b=0;
}
else
{
if(f<v && t<v && h>v && q>v)
{
lcd.setCursor(0,0);
lcd.print(char(219));
lcd.print(char(219));
lcd.print("_");
lcd.print("_");
lcd.setCursor(5,0);
lcd.print("HALF");
m=1;
b=0;
}
else
if(f<v && t<v && h<v && q>v)
{
lcd.setCursor(0,0);
lcd.print(char(219));
lcd.print("_");
lcd.print("_");
lcd.print("_");
lcd.setCursor(5,0);
lcd.print("1/4th");
b=0;
}
else
{
if(f<v && t<v && h<v && q<v)
{
lcd.setCursor(0,0);
lcd.print("_");
lcd.print("_");
lcd.print("_");
lcd.print("_");
lcd.setCursor(5,0);
lcd.print("LOW");
b=0;
}
else

{
digitalWrite(motor,LOW);
lcd.setCursor(0,0);
lcd.print("ERROR!");
b=1;
}
}}}
if(i==HIGH)
{
lcd.setCursor(0,1);
lcd.print("Motor ON");
}
else
{
lcd.setCursor(0,1);
lcd.print("Motor OFF");
}



if(s>v && m==1)
{
digitalWrite(motor,HIGH);
}
if(s<v)
{
digitalWrite(motor,LOW);
lcd.setCursor(11,0);
lcd.print("Low");
lcd.setCursor(11,1);
lcd.print("Sump");
c=1;
}
if(s>v)
{
c=0;
}

if(m==0)
{
digitalWrite(motor,LOW);
}

if(b==1 || c==1)
{
digitalWrite(buz,HIGH);
delay(500);
digitalWrite(buz,LOW);
}
else
{
digitalWrite(buz,LOW);
}
delay(100);
lcd.clear();
}

ako som písal, program neviem tvoriť, (trochu doplniť, alebo vymazať), čiže tvorenie nových príkazov - pre mňa problém. Použité Arduino UNO, ale maká aj na NANO, j na Mega8, je to len hw. Ale, ak by ste mi vedeli s tým pomôcť, budem vďačný. Myslím ako a kde doplniť, prípadne prepísať. S tym lcd.clear -ak ho umiestnim inde nefunguje to poriadne.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1560
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Poblikávanie LCD displeja

Príspevok od používateľa jirka.jirka. » 20 Feb 2022, 17:47

Aspoň si ty příspěvky přečti.
1. Zdrojáky umisťovat mezi [ code ][ /code ]

Potom to vypadá takto a můžeme se o tom bavit.

Kód: Vybrať všetko

#include <LiquidCrystal.h>
int sump = A0;
int qut = A1;
int hlf = A2;
int thf = A3;
int ful = A4;
int motor = 8;
int buz = 7;
int s;
int q;
int h;
int t;
int f;
int i; //motor status flag
int v = 100; //comparison variable(needs some adjustment)
int b = 0; //buzzer flag
int m = 0; //motor flag
int c = 0; //sump flag

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
    
    pinMode(qut, INPUT_PULLUP);
    pinMode(hlf, INPUT_PULLUP);
    pinMode(qut, INPUT_PULLUP);
    pinMode(ful, INPUT_PULLUP);
    pinMode(sump, INPUT_PULLUP);
    pinMode(motor, OUTPUT);
    pinMode(buz, OUTPUT);
    lcd.begin(16, 2);
    digitalWrite(buz, LOW);
}

void loop() {
    
    i = digitalRead(motor);
    s = analogRead(sump);
    q = analogRead(qut);
    h = analogRead(hlf);
    t = analogRead(thf);
    f = analogRead(ful);
    lcd.clear();
    
    if (f > v && t > v && h > v && q > v) {
        lcd.setCursor(0, 0);
        lcd.print(char(219));
        lcd.print(char(219));
        lcd.print(char(219));
        lcd.print(char(219));
        lcd.setCursor(5, 0);
        lcd.print("FULL");
        m = 0;
        b = 0;
    } else {
        if (f < v && t > v && h > v && q > v) {
            lcd.setCursor(0, 0);
            lcd.print(char(219));
            lcd.print(char(219));
            lcd.print(char(219));
            lcd.print("_");
            lcd.setCursor(5, 0);
            lcd.print("3/4th");
            b = 0;
        } else {
            if (f < v && t < v && h > v && q > v) {
                lcd.setCursor(0, 0);
                lcd.print(char(219));
                lcd.print(char(219));
                lcd.print("_");
                lcd.print("_");
                lcd.setCursor(5, 0);
                lcd.print("HALF");
                m = 1;
                b = 0;
            } else if (f < v && t < v && h < v && q > v) {
                lcd.setCursor(0, 0);
                lcd.print(char(219));
                lcd.print("_");
                lcd.print("_");
                lcd.print("_");
                lcd.setCursor(5, 0);
                lcd.print("1/4th");
                b = 0;
            } else {
                if (f < v && t < v && h < v && q < v) {
                    lcd.setCursor(0, 0);
                    lcd.print("_");
                    lcd.print("_");
                    lcd.print("_");
                    lcd.print("_");
                    lcd.setCursor(5, 0);
                    lcd.print("LOW");
                    b = 0;
                } else

                {
                    digitalWrite(motor, LOW);
                    lcd.setCursor(0, 0);
                    lcd.print("ERROR!");
                    b = 1;
                }
            }
        }
    }
    if (i == HIGH) {
        lcd.setCursor(0, 1);
        lcd.print("Motor ON");
    } else {
        lcd.setCursor(0, 1);
        lcd.print("Motor OFF");
    }
    
    if (s > v && m == 1) {
        digitalWrite(motor, HIGH);
    }
    if (s < v) {
        digitalWrite(motor, LOW);
        lcd.setCursor(11, 0);
        lcd.print("Low");
        lcd.setCursor(11, 1);
        lcd.print("Sump");
        c = 1;
    }
    if (s > v) {
        c = 0;
    }
    
    if (m == 0) {
        digitalWrite(motor, LOW);
    }
    
    if (b == 1 || c == 1) {
        digitalWrite(buz, HIGH);
        delay(500);
        digitalWrite(buz, LOW);
    } else {
        digitalWrite(buz, LOW);
    }
    delay(100);
    lcd.clear();
}
A pak ten delay jsi nevyřešil nijak. A taky ten lcd.clear() tam máš stále.

Když to vezmeme trošku hlouběji.

Tvůj program funguje takto:
1. smažeš diplay
2. vypisuješ nějaké texty a kontroluješ nějaké proměnné
3. rozhodneš, jestli se má pískat nebo ne bzučákem
4. počkáš 100ms, kde nic neděláš
5. smažeš display a jdeš na bod 1

Body 1 a 5 máš máš 2x zbytečně za sebou.

Řešení je spousta. Např. zde je moje.
Je dobré si pamatovat stavy a obsah displeje měnit pouze tehdy, pokud se nějaký parametr změní. Potom mazání celého obsahu displeje je zbytečné. Je lepší jej přepsat třeba mezerama. Celý loop nezabíjet tím delay 100. Zde prostě ten program nic nedělá. Tím nic nedělá ber jako realitu.
0

Používateľov profilový obrázok
misocko
Ultimate člen
Ultimate člen
Príspevky: 4464
Dátum registrácie: 14 Jún 2009, 00:00
Vek: 48

Re: Poblikávanie LCD displeja

Príspevok od používateľa misocko » 20 Feb 2022, 18:05

ked som sa kedisy hral s jednym arduino loggerom , zistil som ze musim prepisovat fakt iba polozku ktora sa zmenila , nieco ako lcd.clear iba v pripade ze prepinas na ine menu , kde je vsetok obsah na displeji iny
dokonca aj cas som mal porieseny tak ze kazdu sekundu sa zmenila iba hodnota sekund , raz za minutu sa prepisali minuty. A ziaden delay.
0

jankrizan
Nový člen
Nový člen
Príspevky: 54
Dátum registrácie: 04 Mar 2011, 00:00
Vek: 64

Re: Poblikávanie LCD displeja

Príspevok od používateľa jankrizan » 20 Feb 2022, 18:32

Takže takto. Berme do uvahy kod v prvom príspevku, ten je podstatný. Inak prepáč s tým vkladaním kodu, neviem ako to tam umiestniť?
Tie delaje určujú blikanie indigačnej led, ak ich zmením ovplyvnia aj chovanie programu (oneskorenie reakcie na vstupoch A0-A5). A ak zruším lcd.clear - nič sa nedeje. V tomto by som potreboval poradiť nejak prakticky, čiže upraviť program. To mi pomôže viac o pochopení činnosti. Tak ako som písal, program je z netu a robí to isté. Ja som ho nevymýšľal.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1560
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Poblikávanie LCD displeja

Príspevok od používateľa jirka.jirka. » 20 Feb 2022, 18:36

A co tak popsat co to má řídit? Je tam sice jenom pár nějakých vstupů, ale z toho poznáme :butthead: . Já a asi ani kolegové zde nemáme :fortuneteller:

Takže popiš tvůj HW, popiš chování programu, dej odkaz na stránku, kde jsi co okopíroval a můžeme se vrhnout třeba na přepsání. Ale bez nějakých podrobnějších popisů se na tebe každý vyprdne.
0

jankrizan
Nový člen
Nový člen
Príspevky: 54
Dátum registrácie: 04 Mar 2011, 00:00
Vek: 64

Re: Poblikávanie LCD displeja

Príspevok od používateľa jankrizan » 20 Feb 2022, 18:58

Takže sa s tým teraz trochu hrám a jirkra.jirka si ma dobre naviedol na -lcd.clear.

1. smažeš diplay
2. vypisuješ nějaké texty a kontroluješ nějaké proměnné
3. rozhodneš, jestli se má pískat nebo ne bzučákem
4. počkáš 100ms, kde nic neděláš
5. smažeš display a jdeš na bod 1

Body 1 a 5 máš máš 2x zbytečně za sebou.

Jeden, ktorý je napísaný pod void loop, som vymazal a funguje to správne. Prestal blikať. Veľmi pekne Ti ďakujem za príspevky. Ale učím sa. ĎAKUJEM.

[url]Water level controller using arduino. Water level indicator using arduino.htm[/url]

to je original článok.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1560
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: Poblikávanie LCD displeja

Príspevok od používateľa jirka.jirka. » 20 Feb 2022, 19:03

Jestli máš zájem se něco naučit, tak jsi dostal, dle mého názoru, dost informací na to, abys to zkusil přepsat dle nějaké štábní kultury:

Zde ti to nějak shrnu:
1. Začni používat funkce. Pak se kód zjednoduší a zpřehlední. Nebude z toho nepřehledný špagetový kód. Klidně to rozděl do více souborů. A používej komentáře.
2. Odstraň delay, umrtvuje to procesor zbytečně. Místo toho můžeš dělat něco užitečného.
3. Uprav kód tak, ať se display aktualizuje pouze tehdy, pokud se změní jeho předchozí stav nebo je to žádoucí. Je zcela zbytečné na display stále vypisovat třeba LOW, když už je jednou napsán.
0

jankrizan
Nový člen
Nový člen
Príspevky: 54
Dátum registrácie: 04 Mar 2011, 00:00
Vek: 64

Re: Poblikávanie LCD displeja

Príspevok od používateľa jankrizan » 20 Feb 2022, 19:21

Súhlasím s Tebou.Arduinu som sa začal venovať pred par mesiacmi preto niektoré informácie vstrbávam pomalšie. Ale na budúci rok idem do dôchodku a mám v pláne "zabrať" na tomto poli. Ešte raz Ďakujem.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok