60 nap alatt Arduino #18 - LCD kezelése II.

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
Válasz küldése
Avatar
viktorgtr
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2009. szeptember 16. szerda, 6:00

60 nap alatt Arduino #18 - LCD kezelése II.

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

Üdv mindenki!
Az alábbi LCD karakterkiirás sebesség mérő program nem lett befejezve vagy valami, mert hibaüzenetet dob a fordito a végén(leckéből kimásolt):

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

/*  LiquidCrystal
 LCD fuggvenykonyvtar
 A 2x16 karakteres LCD mintaprogram
 EXT1 aramkorre hangolva
 LCD Sebessegteszt
 60 nap alatt arduino tanfolyam
 (c) TavIR http://www.tavir.hu  */
 
  // LCD-t hasznalunk
#include "LiquidCrystal.h"
  //bekotjuk az LCD-t (RS,E,D4,D5,D6,D7)
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
 
unsigned long oldtime;
unsigned long karakterszam=0;
  //idomereshez alapadatok
 
void setup() {
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
       //LCD hattervilagitas bekapcsol (D13)
    lcd.begin(20, 4);
       //4x20 karakteres LCD
    lcd.clear();
    Serial.begin(9600);
       //9600 bps sorosport nyitas
    Serial.println("Start..");
    oldtime=millis();
    oldtime=oldtime+10000;
      //10 sec a meres ideje
}
 
void loop() {
  if (millis()     karakterszam=0;
      //10 sec a meres ideje
  } 
}
Segitségeteket köszönöm.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10122
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

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

/*  LiquidCrystal
 LCD fuggvenykonyvtar
 A 2x16 karakteres LCD mintaprogram
 EXT1 aramkorre hangolva
 LCD Sebessegteszt
 60 nap alatt arduino tanfolyam
 (c) TavIR http://www.tavir.hu  */
 
  // LCD-t hasznalunk
#include "LiquidCrystal.h"
  //bekotjuk az LCD-t (RS,E,D4,D5,D6,D7)
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
 
unsigned long oldtime;
unsigned long karakterszam=0;
  //idomereshez alapadatok
 
void setup() {
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
       //LCD hattervilagitas bekapcsol (D13)
    lcd.begin(20, 4);
       //4x20 karakteres LCD
    lcd.clear();
    Serial.begin(9600);
       //9600 bps sorosport nyitas
    Serial.println("Start..");
    oldtime=millis();
    oldtime=oldtime+10000;
      //10 sec a meres ideje
}
 
void loop() {
  if (millis() 

[color=#FF0000]innen hiányzik valami....[/color]

    karakterszam=0;
      //10 sec a meres ideje
  } 
}
Avatar
viktorgtr
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2009. szeptember 16. szerda, 6:00

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

Igen az feltűnt, hogy hiányzik valami csak pont ez lett volna a kérdés, hogy mi? :wink:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10122
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

2 kódom van:

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

/*  LiquidCrystal
 LCD fuggvenykonyvtar
 A 2x16 karakteres LCD mintaprogram
 EXT1 aramkorre hangolva
 LCD Sebessegteszt
 
 60 nap alatt arduino tanfolyam
 (c) TavIR http://avr.tavir.hu  */

  // LCD-t hasznalunk
#include <LiquidCrystal.h>

  //bekotjuk az LCD-t (RS,E,D4,D5,D6,D7)
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

unsigned long oldtime;
unsigned long karakterszam=0;
  //idomereshez alapadatok

void setup() {
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
       //LCD hattervilagitas bekapcsol (D13)
    lcd.begin(20, 4);
    lcd.clear();
       //2x16 karakteres LCD
    Serial.begin(9600);
       //9600 bps sorosport nyitas
    Serial.println("Start..");
    oldtime=millis();
    oldtime=oldtime+10000;
      //10 sec a meres ideje
}

void loop() {
  if (millis() <= oldtime) {
    //10 sec-ig merunk
    lcd.print("a");
    //delay(30);
    //kiirasi tesztkesleltetes
    karakterszam=karakterszam+1;
    //ha meg nincs 10 sec: kiirunk
  } else {
    //10 sec letelt, kiirjuk az eredmenyt
    Serial.print("10 sec alatt ");
    Serial.print(karakterszam,DEC);
    Serial.println(" karakterkiiras volt.");
    delay(1000);
    lcd.clear();
    oldtime=millis();
    oldtime=oldtime+10000;
    karakterszam=0;
      //10 sec a meres ideje
  } 
}

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

/*  LiquidCrystal
 LCD fuggvenykonyvtar
 A 2x16 karakteres LCD mintaprogram
 EXT1 aramkorre hangolva
 LCD Sebessegteszt
 
 60 nap alatt arduino tanfolyam
 (c) TavIR http://avr.tavir.hu  */

  // LCD-t hasznalunk
#include <LiquidCrystal.h>
  //bekotjuk az LCD-t (RS,E,D4,D5,D6,D7)
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
  //idomereshez alapadatok
unsigned long starttime;
unsigned long endtime;
unsigned long totaltime;

void setup() {
    pinMode(13, OUTPUT);
    digitalWrite(13, HIGH);
       //LCD hattervilagitas bekapcsol (D13)
    Serial.begin(9600);
       //9600 bps sorosport nyitas
    Serial.println("Start..");
}

void loop() {
  starttime=micros();
  lcd.begin(20,4);
  endtime=micros();
  totaltime=endtime-starttime;
  Serial.print("LCD init           :");
  Serial.print(totaltime);
  Serial.println(" usec");
    //az inicializalas ideje
  starttime=micros();
  lcd.setCursor(0,0);
  endtime=micros();
  totaltime=endtime-starttime;
  Serial.print("setCursor(0,0)     :");
  Serial.print(totaltime);
  Serial.println(" usec");
    //a pozicionalas ideje
  starttime=micros();
  lcd.setCursor(1,1);
  endtime=micros();
  totaltime=endtime-starttime;
  Serial.print("setCursor(1,1)      :");
  Serial.print(totaltime);
  Serial.println(" usec");
    //az atpozicionalas ideje
  starttime=micros();
  lcd.print("A");
  endtime=micros();
  totaltime=endtime-starttime;
  Serial.print("1 character kiiras :");
  Serial.print(totaltime);
  Serial.println(" usec");
    //egy karakter kiirasa
  starttime=micros();
  lcd.print("BC");
  endtime=micros();
  totaltime=endtime-starttime;
  Serial.print("2 character kiiras :");
  Serial.print(totaltime);
  Serial.println(" usec");
    //ket karakter kiirasa
  starttime=micros();
  lcd.clear();
  endtime=micros();
  totaltime=endtime-starttime;
  Serial.print("clear()            :");
  Serial.print(totaltime);
  Serial.println(" usec");
    //kepernyotorles ideje
  starttime=micros();
  //lcd.clear();
  endtime=micros();
  totaltime=endtime-starttime;
  Serial.print("korrekcio          :");
  Serial.print(totaltime);
  Serial.println(" usec");
  lcd.print("Teszt vege");
  delay(10000); 
}
Avatar
viktorgtr
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2009. szeptember 16. szerda, 6:00

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

Köszönöm. Program lefordítva, feltöltve, működik, megértve.
Attika
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2016. október 5. szerda, 19:15

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

Sziasztok!
Ezt a kódot szerettem volna úgy átírni, hogy a ha kiírja lcd-re a szöveget akkor egy kis várakozás után törölje a kijelzőt és ne teljen be teljesen.

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

/*  LiquidCrystal
 LCD fuggvenykonyvtar
 A 2x16 karakteres LCD mintaprogram
 EXT1 aramkorre hangolva
 Soros -> LCD kiiras (switch/case)
 
 60 nap alatt arduino tanfolyam
 (c) TavIR http://avr.tavir.hu  */
 
#include "LiquidCrystal.h"
  //LCD-t hasznalunk
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
  //bekotjuk az LCD-t
  
byte a1[8] = {B10,B100,B1110,B1,B1111,B10001,B1111};
byte e1[8] = {B10,B100,B1110,B10001,B11111,B10000,B1110};
byte i1[8] = {B10,B100,B0,B1110,B100,B100,B1110};
byte o1[8] = {B100,B100,B0,B1110,B10001,B10001,B1110};
byte o2[8] = {B1010,B0,B1110,B10001,B10001,B10001,B1110};
byte o3[8] = {B1010,B1010,B0,B1110,B10001,B10001,B1110};
byte u1[8] = {B10,B100,B10001,B10001,B10001,B10011,B1101};
byte u2[8] = {B1010,B0,B0,B10001,B10001,B10011,B1101};
byte u3[8] = {B1010,B1010,B0,B10001,B10001,B10011,B1101};
   //kis ekezetes betuk
 
byte b;
  //atmeneti valtozo
   
void setup() {
   pinMode(13, OUTPUT);
   digitalWrite(13, HIGH);
   //LCD hattervilagitas bekapcsol (D13)
 
  lcd.createChar(0, a1);
  lcd.createChar(1, e1);
  lcd.createChar(2, i1);
  lcd.createChar(3, o1);
  lcd.createChar(4, o3);
  lcd.createChar(5, u1);
  lcd.createChar(6, u2);
  lcd.createChar(7, u3);
    //karakterdefinialas
    //o:-nek nincs hely!
    
  lcd.begin(16, 2);
    //2x16 karakteres LCD
  Serial.begin(9600);
    //Sorosport 9600 bps nyitasa
}
 
void loop()
{
  if (Serial.available()) {
    b = Serial.read();
       //ha van karakter: beolvassuk
    Serial.print(b);
    Serial.print(":");
      //kiirjuk a karaktert  
      
      //karakterkod alapjan csere:
    switch (b){
        case 225:
          b = 0;
          break;
        case 233:
          b = 1;
          break;
        case 237:
          b = 2;
          break;
        case 243:
          b = 3;
          break;
        case 245:
          b = 4;
          break;
        case 250:
          b = 5;
          break;
        case 252:
          b = 6;
          break;
        case 251:
          b = 7;
          break;
        default:
          //egyiksem teljesult
          break;
    }
      //kiirjuk a LCD karakterkodjat
    Serial.println(b,DEC);
      //akkor irjuk ki az LCD-re
    lcd.write(b);
      //ha sokat irtunk egyszerre
    delay(150);
  }
}
Ha a delay alá beteszek még egy sort lcd.clear(); akkor rögtön törli a kijelzőt, hogy még látni se látom mit küldtem rá.
Annyit szeretnék csak elérni, hogy amit soros porton küldök neki azt szép lassan betűnként kiírja és utána várakozzon egy megadott ideig és törölje a kijelzőt, hogy a következő küldendő szöveget ne utána írja ki.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10122
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

Mikor akarod a törlést? -> Ha kiürült a soros buffer.
Azaz rossz helyre került a LCDtörlés. Most a program folyamatábrát ha lerajzolod:
...
Ha van valami a soros bufferban...
Írd ki...
Várakozz...
Törölj...
Start előlről.

Neked ami kellene:
...
Ha van valami a soros bufferban...
Írd ki...
Várakozz...
Ha NINCS semmi sem már a soros bufferban...
Törölj...
Start előlről.


Ez így:

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

 if (Serial.available()) {
.
.
.
 }
else   ' különben...
{ 
delay(10000);
lcd.clear();
}
http://www.tavir.hu - a gazda :)
Attika
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2016. október 5. szerda, 19:15

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

Így sikerült majdnem azt elérnem amit szerettem volna, viszont így meg az a baj, hogy egy véletlenszerű karakter mindig benne marad valamiért a kijelzőbe.

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

/*  LiquidCrystal
 LCD fuggvenykonyvtar
 A 2x16 karakteres LCD mintaprogram
 EXT1 aramkorre hangolva
 Soros -> LCD kiiras
 
 60 nap alatt arduino tanfolyam
 (c) TavIR http://avr.tavir.hu  */
 
#include "LiquidCrystal.h"
  //LCD-t hasznalunk
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
  //bekotjuk az LCD-t
  
byte a1[8] = {B10,B100,B1110,B1,B1111,B10001,B1111};
byte e1[8] = {B10,B100,B1110,B10001,B11111,B10000,B1110};
byte i1[8] = {B10,B100,B0,B1110,B100,B100,B1110};
byte o1[8] = {B100,B100,B0,B1110,B10001,B10001,B1110};
byte o2[8] = {B1010,B0,B1110,B10001,B10001,B10001,B1110};
byte o3[8] = {B1010,B1010,B0,B1110,B10001,B10001,B1110};
byte u1[8] = {B10,B100,B10001,B10001,B10001,B10011,B1101};
byte u2[8] = {B1010,B0,B0,B10001,B10001,B10011,B1101};
byte u3[8] = {B1010,B1010,B0,B10001,B10001,B10011,B1101};
   //kis ekezetes betuk
 
byte b;
  //atmeneti valtozo
   
void setup() {
   pinMode(13, OUTPUT);
   digitalWrite(13, HIGH);
   //LCD hattervilagitas bekapcsol (D13)
 
  lcd.createChar(0, a1);
  lcd.createChar(1, e1);
  lcd.createChar(2, i1);
  lcd.createChar(3, o1);
  lcd.createChar(4, o3);
  lcd.createChar(5, u1);
  lcd.createChar(6, u2);
  lcd.createChar(7, u3);
    //karakterdefinialas 
    
  lcd.begin(16, 2);
    //2x16 karakteres LCD
  Serial.begin(9600);
    //Sorosport 9600 bps nyitasa
}
 
void loop()
{
  if (Serial.available()) {
    b = Serial.read();
       //ha van karakter: beolvassuk
    Serial.print(b);
    Serial.print("-");
      //kiirjuk a karaktert
  }else
  {       
     delay(1000);
     lcd.clear();
  } 
      //karakterkod alapjan csere:
    if (b == 225) {
      b = 0;
    }
    if (b == 233) {
      b = 1;
    }
    if (b == 237) {
      b = 2;
    }
    if (b == 243) {
      b = 3;
    }
    if (b == 245) {
      b = 4;
    }
    if (b == 250) {
      b = 5;
    }
    if (b == 252) {
      b = 6;
    }
    if (b == 251) {
      b = 7;
    }
      //kiirjuk a LCD karakterkodjat
    Serial.println(b,DEC);
      //akkor irjuk ki az LCD-re
    lcd.write(b);
      //ha sokat irtunk egyszerre
    delay(550);
  }
Így az első helyre nem is tudok írni a kijelzőre mert egy teljesen véletlen karakter beíródik valamiért,í,á,stb.
Elküldés után szépen karakterenként kiírja a szöveget, utána várakozik a megadott ideig és törli a kijelzőt, de az első négyzetbe benne marad egy karakter.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10122
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

A setup() részen kukázd az eddig bejött soros adatokat.
Lehet a bootloader szemetelt bele, vagy az Arduino a kapcsolódáskor.
http://www.tavir.hu - a gazda :)
Avatar
csegebiga
Chipgyilok
Hozzászólások: 288
Csatlakozott: 2015. március 27. péntek, 21:27

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

A b változónak nem adsz induló értéket, de kiíratod.
mert mit csinálsz most?

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

 ha van serial input, 
    beulvasod,
    beteszed b-be,
egyébként  várakozol

majd megy tovább a progi, 
és kiértékeli, 
majd kiírja b-t 
igen ám, de mi a b értéke, ha nincs serial input?

adj a b nek kezdő értéket a setup() részben,
b=" ";
vagy
a teljes kiértékelő-kiírató részt tedd az if igaz ágába
valahogy így:

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

ha van serial input, 
{
    beolvasod,
    teszed b-be,
    kiértékeled
    kiíratod 
    üríted b-t
}
és vársz egy kicsit,
lcd törlés 
estébé
a while ciklust tanultátok-e már?

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

while (Serial.available())
Veratrum
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2021. március 29. hétfő, 10:05

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

Sziasztok!

Abszolút kezdőként most végzem el a 60 napos tanfolyamot.
A 18-as leckéből (LDC II., ékezetes karakterek) a második, rövidebb, smiley-s példa jól működik, de az első sajnos nem.
Már a soros monitoron is, ha bármely karaktert ütök be, nem a karakter íródik ki (ami, gondolom, a cél lenne), hanem csak annak a kódja, tehát pl az "a" esetén nem így "a:97", hanem így "97:97".
Az LCD kijelzőn viszont minden ékezetes karakter helyett 2 karaktert elfoglaló valami "arab betű-szerűség" jelenik meg.

Egy 2x16-os LCD shield-et használok, de az inicializáló függvény paramétereit átírtam a bekötésnek megfelelően, így ezzel talán nincs baj. A nem ékezetes karakterek szépen megjelennek rajta.
Veratrum
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2021. március 29. hétfő, 10:05

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

Utóirat:
Közben próbálgattam, de úgy tűnik, nem a programkóddal van a baj, hanem azzal, hogy a soros port nem megfelelő kódolással küldi a karaktereket. Ékezetes karaktereknél 2 értéket küld, és nem azokat, amik a kódban meg lettek adva.
De ezzel nem tudom, mit tegyek.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10122
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

Semmi baj sincs. A mintakód a korai Arduinoval készült, amikor a kódolás még ASCII-ban történt. Az 1.5 utáni Arduino keretrendszerekben már UTF-8 kódolást használ, ami az ékezetes esetben 2 byte-n történik.
http://www.tavir.hu - a gazda :)
Veratrum
Újonc
Újonc
Hozzászólások: 3
Csatlakozott: 2021. március 29. hétfő, 10:05

Re: 60 nap alatt Arduino #18 - LCD kezelése II.

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

Köszönöm, így már világos.
Válasz küldése