Kiírás LCD kijelzőre

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
László
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2015. április 6. hétfő, 10:32

Kiírás LCD kijelzőre

Hozzászólás Szerző: László »

Üdv Mindenkinek!

Azt szeretném megoldani, hogy az LCD-re kiírt 2 tizedes jegy pontosságú számnál a tizedes vessző mindig ugyan arra a helyre kerüljön. A szám álandóan válltozik, -150 és 150 között. A kiírást jelenleg így oldom meg:
lcd.setCursor(6, 1);
lcd.print(eredmeny,2);

Itt az a probléma, hogy a kiírás a 6. helyen a második oszlopban kezdődik. Ami így néz ki:

0,00
12,25
100,41
-125,99

én így szertném látni:

0,00
12,25
100,41
-125,99
Hogyan lehet ezt megoldani?
A javaslatokat előre is köszönöm
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: Robert »

Ha rövid a szám (<10 és >=0, akkor tegyél elé 2 szóközt.)
Ha 2 karakteres a szám (10...99 illetve -1...-9), akkor elég 1 szóköz.

Így a pozíció is megvan ......
László
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2015. április 6. hétfő, 10:32

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: László »

Köszönöm a választ.
A programban ezt hogy tudom megoldani? Figyelnem kell az "eredmeny" értékét és annak megfelelően a szóközök számát válltoztani?
Vagy van egyszerübb megoldás is?
Avatar
csegebiga
Chipgyilok
Hozzászólások: 288
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: csegebiga »

hully-haw!

itt egy Robert által talált példa, itt lcd-re dátmot-időt írnak ki.
a probléma hasonló: pl a 10-nél kevesebb kiírandó percnél 1-- ig pozicionált 01-09-et kell kiíratni. az OO:PP formátmhoz:

Kód: Egész kijelölése

if(minutes < 10)
  {
    lcd.print("0");
  }
  lcd.print(itoa(minutes, buf, 10));
 //- See more at: http://www.codingcolor.com/2010/06/01/an-arduino-lcd-clock-using-a-chronodot-rtc/#sthash.f4VcJU0D.dpuf
ez alapján megírhatod a decTab() függvényt, ami bemenetként egy számot vár, kimenetként egy "nnn.nn" formátmú stringet ad vissza, az előző nullák helyett szóközökkel

vagy "_ _ _ _ _ _ "(6db szóköz) stringhez hozzáadod a számod string alakját, majd veszed az eredmény utolsó 6 karakternyi substringjét és ezt iratod ki az lcd-n
(habár az arduino mostohán bánik a string műveletekkel, megírhatod a rightStr(string, db) függvényt, ami a string végéről vesz ki db számú karaktert egy string változóba, az elejét (ha kell) szóközökkel feltöltve
László
DrótVégénSzéndarab
Hozzászólások: 17
Csatlakozott: 2015. április 6. hétfő, 10:32

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: László »

Helló,

Köszömön a segítséget. Mivel nagyon kezdő vagyok, lesz mivel szórakoznom, míg megoldom. De ez a hobby lényege :-)
csip
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2016. július 5. kedd, 9:17

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: csip »

Sziasztok,

Arduino-val szeretnék LCD-re (4x20) kiírni adatokat.
Minden sorban lenne 1 adat összesen 4 látszana egyszerre, de nekem van 6 adatom, amit folyamatosan föl-le tologatással kellene megjeleníteni.
Tehát az első sor eltűnne, a második lépne a helyére a második helyére a harmadik stb stb az utolsó sorba megjelenne az új adat, aztán visszagörgetés.
Scroll parancsot láttam, de az jobb-bal eltolást csinál, nekem meg fel-le kellene.
Mi a legegyszerűbb megoldás erre, ki hogyan csinálná.
köszönettel.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: Robert »

Fel-le scroll nincs.
Neked kell leprogramoznod

Pl.

Kód: Egész kijelölése

kiiratás utáni rész:
locate 1,1
lcd.print(2.sor); space(20-lenght(2.sor)); //1. sor kiírása
lcd.print(4.sor); space(20-lenght(4.sor)); //3. sor kiírása
lcd.print(3.sor); space(20-lenght(2.sor)); //2. sor kiírása
lcd.print(5.sor); space(20-lenght(4.sor)); //4. sor kiírása

wait 10 sec

locate 1,1
lcd.print(3.sor); space(20-lenght(3.sor)); //1. sor kiírása
lcd.print(5.sor); space(20-lenght(5.sor)); //3. sor kiírása
lcd.print(4.sor); space(20-lenght(4.sor)); //2. sor kiírása
lcd.print(6.sor); space(20-lenght(6.sor)); //4. sor kiírása


csip
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2016. július 5. kedd, 9:17

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: csip »

Köszönöm,

Ki fogom próbálni.
csip
Újonc
Újonc
Hozzászólások: 5
Csatlakozott: 2016. július 5. kedd, 9:17

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: csip »

Azt hittem értem, de kiderült mégsem.

Szóval a locate 1,1 talán az lcd.setCursor(1, 1);
de miért nem 0,0

1.2.3. stb sor gondolom a megjelenítendő adat/szöveg
a space –t azt gondoltam, hogy utasítás, de mégsem

tehát szeretnék igényelni egy kis segítséget, ha valaki tud rám szánni idő, persze csak a saját szintemen az az totál kezdő.

köszönöm
üdv.


Robert írta:Fel-le scroll nincs.
Neked kell leprogramoznod

Pl.

Kód: Egész kijelölése

kiiratás utáni rész:
locate 1,1
lcd.print(2.sor); space(20-lenght(2.sor)); //1. sor kiírása
lcd.print(4.sor); space(20-lenght(4.sor)); //3. sor kiírása
lcd.print(3.sor); space(20-lenght(2.sor)); //2. sor kiírása
lcd.print(5.sor); space(20-lenght(4.sor)); //4. sor kiírása

wait 10 sec

locate 1,1
lcd.print(3.sor); space(20-lenght(3.sor)); //1. sor kiírása
lcd.print(5.sor); space(20-lenght(5.sor)); //3. sor kiírása
lcd.print(4.sor); space(20-lenght(4.sor)); //2. sor kiírása
lcd.print(6.sor); space(20-lenght(6.sor)); //4. sor kiírása


Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: Robert »

A kiírásban itt a trükkök: nem villog a kijelző, mert folymatosan írod adattal.

Egyszerűbb változat:

Kód: Egész kijelölése

képernyőtörlés
locate 1. sor eleje
1. sor kiír
locate 2. sor eleje
2. sor kiír
locate 3. sor eleje
3. sor kiír
locate 4. sor eleje
4. sor kiír
wait 5000msec
képernyőtörlés
locate 1. sor eleje
2. sor kiír
locate 2. sor eleje
3. sor kiír
locate 3. sor eleje
4. sor kiír
locate 4. sor eleje
5. sor kiír
wait 5000msec
képernyőtörlés
locate 1. sor eleje
3. sor kiír
locate 2. sor eleje
4. sor kiír
locate 3. sor eleje
5. sor kiír
locate 4. sor eleje
6. sor kiír
Ezzel 2 sort gögettél felfele...
Daszkalosz
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2016. május 22. vasárnap, 20:26

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: Daszkalosz »

Sziasztok!
Szenvedek egy kiíratással!
Egy relé állapotát szeretném kiíratni,már mindent kipróbáltam,de nem sikerül.
a "Vizmelegito" után szeretném kiíratni a relé állapotát ON/OFF
segítsetek egy kicsit!

Kód: Egész kijelölése

    #include "DHT.h" 
    #define DHTPIN 2     // what pin we're connected to
    #define DHTTYPE DHT22   // DHT 22  (AM2302)
    #define Relay 4
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    
    LiquidCrystal_I2C lcd(0x27, 20, 4);
     byte e1[8] = {B10,B100,B1110,B10001,B11111,B10000,B1110};     // Ez az é betű
     byte o1[8] = {B100,B100,B0,B1110,B10001,B10001,B1110};        // Ez a hosszú ó betű
     byte o2[8] = {B1010,B0,B1110,B10001,B10001,B10001,B1110};     // Ez a rövid ö betű
     byte o3[8] = {B1010,B1010,B0,B1110,B10001,B10001,B1110};      // Ez a hosszú ő betű
     byte a1[8] = {B10,B100,B1110,B1,B1111,B10001,B1111};          // Ez az á betű
     
     byte u2[8] = {B1010,B0,B0,B10001,B10001,B10011,B1101};        // Ez a rövid ü betű
     byte u3[8] = {B1010,B1010,B0,B10001,B10001,B10011,B1101};     // Ez a hosszú ű betű
     byte i1[8] = {B10,B100,B0,B1110,B100,B100,B1110};             // Ez a hosszú í betű
     
    int maxHum = 80;
    int maxTemp = 33;
     
     
    DHT dht(DHTPIN, DHTTYPE);
     
    void setup() {
      pinMode(Relay, OUTPUT);
      Serial.begin(9600);
      Wire.begin(); 
      dht.begin();
      
      lcd.begin(20, 4);
      lcd.backlight();
      {
      lcd.setCursor(2, 0);
      lcd.print("Kelteto vezerles");
      lcd.setCursor(8, 0);
      lcd.write(4);
      lcd.setCursor(13, 0);
      lcd.write(1);
      lcd.setCursor(16, 0);
      lcd.write(1);
      lcd.setCursor(3, 1);
      lcd.print(" By:Daszkalosz  ");
      lcd.setCursor(4, 2);
      lcd.println(" 2016.07.26      ");
      delay(3000);
      lcd.clear();
      }
      
      lcd.createChar(1, e1);       // Ez az é betű
      lcd.createChar(2, a1);       // Ez az á betű      
      lcd.createChar(3, o1);       // Ez a hosszú ó betű
      lcd.createChar(4, o3);       // Ez a hosszú ő betű

      lcd.createChar(6, u2);       // Ez a rövid ü betű
      lcd.createChar(7, u3);       // Ez a hosszú ű betű
      lcd.createChar(0, i1);       // Ez a hosszú í betű
    
    }
   
     
    void loop() {
      // Wait a few seconds between measurements.
      delay(2000);
     
      // Reading temperature or humidity takes about 250 milliseconds!
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      float h = dht.readHumidity();
      // Read temperature as Celsius
      float t = dht.readTemperature();
      
      // Check if any reads failed and exit early (to try again).
      if (isnan(h) || isnan(t)) {
        lcd.println("Szenzor ERROR!");
        return;
      }
      
      if(h > maxHum || t > maxTemp) {
          digitalWrite(4, HIGH);
         
      } else {
         digitalWrite(4, LOW);
         
      
     
    
          
      }
      
// Hőmérséklet.  
  lcd.setCursor(0, 0);
  lcd.print("Homerseklet: ");
  lcd.setCursor(1, 0);         //Kurzor 3. sor 2. karakternél
  lcd.write(4);                //Átírjuk az o betüt ő-re
  lcd.setCursor(3, 0);         //Kurzor 3. sor 4-es karakternél
  lcd.write(1);                //Átírjuk az e betüt é-re
  lcd.setCursor(6, 0);         //Kurzor 3. sor 7-es karakternél
  lcd.write(1);                //Átírjuk az e betüt é-re
  lcd.setCursor(13, 0);        //Kurzor 3. sor 14-es karakternél
  lcd.print(t);                //Hőmérséklet érték kiírása
  lcd.print((char)223);        //Fokjel előhívása memoriából
  lcd.print("C");
  
// Páratartalom.
  lcd.setCursor(0, 1);
  lcd.print("Paratartalom: ");
  lcd.setCursor(1, 1);
  lcd.write(2);                 //Átírjuk az a betüt á-re
  lcd.setCursor(14, 1);         // A páratartalom kijelzés a 14.sortól kezdődik
  lcd.print(h);
  lcd.print("%");
  delay(200);
  
//Vízmelegítő.
  lcd.setCursor(0, 2);
  lcd.print("Vizmelegito :");
  lcd.setCursor(1 ,2);
  lcd.write(0);
  lcd.setCursor(8 ,2);
  lcd.write(0);
  lcd.setCursor(10 ,2);
  lcd.write(4);
  
  
  if(Relay == HIGH)
{
  lcd.setCursor(13,2);
  lcd.print(" ON ");
}
else
{
  lcd.setCursor(13,2);
  lcd.print(" OFF ");
 }
  
   }
Avatar
csegebiga
Chipgyilok
Hozzászólások: 288
Csatlakozott: 2015. március 27. péntek, 21:27

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: csegebiga »

mondjuk, csak azt nem mondtad, hogy mit (nem) csinál a kijelző, mi a hibajelenség?

egyszerűsítsd az életed:
a hibakeresés idejére vedd ki az ékezetes kiírást,
tedd egyenlő hosszúvá a két kiíratást

Kód: Egész kijelölése

  
lcd.print(" ON  "); //két szóköz a végén
vs
lcd.print(" OFF ");
vagy, ha ennyire szíveden viseled a magyar üzeneteket, akkor:

Kód: Egész kijelölése

  
lcd.print(" BE "); 
vs
lcd.print(" KI ");
majd, ha minden megy,
egyenként tedd vissza az ékezetes betűket.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: Robert »

LCD esetén nem állandóan újraírjuk - csak a változást frissítjük rajta. Különben a kezelése nagyon lassú lesz!
Tegyél be egy kiírás előtt kezdet= millis(); és a végén egy veg=millis(); sort és a különbözetet írasd sorosporton/kijelzőn. Nagyon nagy számot fogsz látni (~250...500 msec!)
Daszkalosz
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2016. május 22. vasárnap, 20:26

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: Daszkalosz »

Sziasztok!
Köszönöm a segítségeteket!
A hibajelenség abban áll,hogy a reléállapotát nem írja ki hogy on vagy off.
Jelenleg OFF állapotot jelez még akkor is,ha a relé ON állapotban van.
Az ékezetes betűket csak próbálgattam. Viszont halványan villognak az ékezetes betűk.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Kiírás LCD kijelzőre

Hozzászólás Szerző: Robert »

Minthogy relay= 4 definíciószinten:

if(Relay == HIGH)
High = 1 alapértelmezetten....ű

Javítás:
if(digitalread(Relay) == HIGH)....
Válasz küldése