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

A "60 nap alatt Arduino" tanfolyam házi feladatai és közvetlen témái
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ásSzerző: viktorgtr » 2015. február 17. kedd, 10:23

Ü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: 9904
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ásSzerző: Robert » 2015. február 17. kedd, 13:00

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ásSzerző: viktorgtr » 2015. február 17. kedd, 13:04

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: 9904
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ásSzerző: Robert » 2015. február 17. kedd, 23:31

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ásSzerző: viktorgtr » 2015. február 18. szerda, 10:50

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ásSzerző: Attika » 2016. október 5. szerda, 19:33

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: 9904
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ásSzerző: Robert » 2016. október 5. szerda, 20:02

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ásSzerző: Attika » 2016. október 5. szerda, 23:49

Í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: 9904
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ásSzerző: Robert » 2016. október 6. csütörtök, 5:30

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: 283
Csatlakozott: 2015. március 27. péntek, 21:27

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

HozzászólásSzerző: csegebiga » 2016. október 6. csütörtök, 9:57

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())


Vissza: “60 nap alatt Arduino - Házi feladatok”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég