Pages: [1]   Go Down
Author Topic: lcd.print() raus aus loop  (Read 1394 times)
0 Members and 1 Guest are viewing this topic.
Germany-Leipzig
Offline Offline
Newbie
*
Karma: 0
Posts: 43
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Habe einen Roboter mit Menüsauswahl über LCD.
Das Auswahlmenü wird mit einem Drehencoder gesteuert.

Die Auswertung des Encoders, sowie die lcd.prints hab ich alle im void loop() drin.

Nun kann ich immer nur einne Menüeintrag im Display anzeigen lassen und selbst der flackert ein bisschen, da ja alles im loop steht.

Habt ihr ne Idee wie ich das alles aulagern kann und somit auch en Scrolldownmenü machen kann?

Hier noch der Code

Code:
void loop() {
  n = digitalRead(encoder0PinA);
  Enter = digitalRead(19);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
      encoder0Pos--;
    }
    else {
      encoder0Pos++;
    }

  }
  encoder0PinALast = n;

  if (encoder0Pos == 2 && wii == false && Auto == false) {
    lcd.clear();
    lcd.print("Lichtsucher                     ");
    delay(200);
    ldr = true;

  }
  if (ldr == true && Enter == HIGH) {
    pressed1 = true;
  }
  if (ldr == true && pressed1 == true) {
    LDR();
  }
  if (encoder0Pos == 3) {
    ldr = false;
    pressed1 = false;
  }  
  if (encoder0Pos == 3 && ldr == false && Auto == false) {
    lcd.print("WII-Mode                        ");
    delay(200);
    wii = true;
    lcd.clear();
  }
  if (wii == true && Enter == HIGH) {
    pressed2 = true;
  }
  if (wii == true && pressed2 == true) {
    nunchuck();
  }
  if (encoder0Pos > 3) {
    wii = false;
    pressed2 = false;
  }
  if (encoder0Pos > 3 && ldr == false && wii == false) {
    lcd.print("Autonom                         ");
    delay(200);
    Auto = true;
    lcd.clear();
  }
  if (Auto == true && Enter == HIGH) {
    pressed3 = true;
  }
  if (Auto == true && pressed3 == true) {
    autonomous();
  }

}

Gruß Chris
« Last Edit: February 21, 2010, 07:38:30 am by Chris.Le » Logged

AREA COLOGNE
Offline Offline
Edison Member
*
Karma: 21
Posts: 1148
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn du nur was anzzeigen willst kannst du dir das in einer externen Funktion void() beschreiben die du dann nur alle paar durchläufe im Programm aufrufst.
Am besten ein paar Programmbeispiele durchschauen.Mir hat das auch gut geholfen
Logged

So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich würd ja gern helfen, aber a) ist Dein Code unheimlich unübersichtlich und b) hab ich keine Ahnung, was genau Du eigentlich wissen willst...?

Ich vermute mal: Damits nicht flackert würd ich nur dann was am Display machen, wenn sich auch wirklich das Anzuzeigene ändert. Beim Umschalten flackerts dann zwar vielleicht auvh, aber nur ein Mal, und das fällr kaum auf...
« Last Edit: February 21, 2010, 08:45:19 am by Joghurt » Logged

Germany-Leipzig
Offline Offline
Newbie
*
Karma: 0
Posts: 43
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wenn ich  lcd.print() in einem void auslagere und diesen void dann im void loop aufrufe, habe ich doch noch das selbe Problem des immer wiederkehrenden Aufrufes.

Gibt es diie Möglichkeit das Menü über einen interrupt zu machen. Habe diesbezüglich noch keine Erfahrung.

@Joghurt: Unübersichtlich? Meinst du die fehlenden Kommentare?
« Last Edit: February 21, 2010, 10:52:48 am by Chris.Le » Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Naja, ich denke es wäre zum Verständnis vermutlich hilfreich zu wissen, was Du im Endeffekt bezwecken willst.
Irgendweine Art Fernsteuerung mit Automatikmodus mit Wii und Nunchuck...?

Also ich könnte mich ja irren, aber z.B.
Code:
 if (encoder0Pos == 2 && wii == false && Auto == false) {
    lcd.clear();
    lcd.print("Lichtsucher                     ");
    delay(200);
    ldr = true;
scheint mir alle 200ms das Display zu löchen und beschreibt es neu, richtig?

Warum machst Du das nicht nur, wenn sich wirklich was ändert, dann sparst Du Rechenzeit, und es flackert nicht...?
« Last Edit: February 21, 2010, 12:07:05 pm by Joghurt » Logged

Germany-Leipzig
Offline Offline
Newbie
*
Karma: 0
Posts: 43
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also gut nun ins Detail:

Auf einem RP5 Raupenfahrgestell ist ein Seeeduino Mega montiert.
Sensoriken sind ein paar LDR's, Accelerometer, elektrisches Mikro, Sharp Ir-Detektoren und Sharp Ir-Sensoren.
Die Motoren des Fahrgestelles werden mit einer H-brücke gesteuert.

Desweiteren besitzt der Roboter ein 16x2 LCD, einen Drehencoder und einen Resetknopf.

Auf dem LCD möchte ich mich in die einzelnen Betriebsmodi einwählen.

Diese sind bis jetzt: Lichtsuche (Der Bot such die hellste stelle im  Raum bzw. fährt der Taschenlampe hinterher)
                              WII-Mode (Es Kann ein Nunchuck angeschlossen werden und dient als Steuerung)
                              Autonom (Autonomer Modus)


Wenn man den Bot einschaltet wird nach der Encoderdrehung verlangt.

Dreht man den encoder erscheinen die Einzelnen Modi. Mit drücken des Encoderknopfes wird der Menüpunkt gestartet.
Um den modus zu beenden drückt man den Reset-Knopf und der Spaß beginnt von vorn.

@Joghurt: Dann sag mir doch bitte wie ich etwas im loop nur aufrufen kann wenn sich etwas ändert?
Mir fällt da vielleicht die while()-Schleife ein. Meintest du sowas?

Hab den Code nochmal geändert um so ne Art Scrollmarkierung zu haben.

Code:
void loop() {
  n = digitalRead(encoder0PinA);
  Enter = digitalRead(17);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
      encoder0Pos--;
    }
    else {
      encoder0Pos++;
    }

  }
  encoder0PinALast = n;

  if (encoder0Pos < 2 && wii == false && Auto == false && ldr == false) {
    lcd.clear();
    lcd.print("Bitte Encoder");
    lcd.setCursor(0, 1);
    lcd.print("drehen");
    delay(100);
  }
  if (encoder0Pos == 2 && wii == false && Auto == false && pressed1 == false) {
    lcd.clear();
    lcd.print("<Lichtsucher>");
    lcd.setCursor(0, 1);
    lcd.print(" WII-Mode");
    delay(100);
    ldr = true;

  }
  if (ldr == true && Enter == HIGH) {
    pressed1 = true;
  }
  if (ldr == true && pressed1 == true) {
    LDR();
  }
  if (encoder0Pos == 3) {
    ldr = false;
    pressed1 = false;
  }  
  if (encoder0Pos == 3 && ldr == false && Auto == false && pressed2 == false) {
    lcd.clear();
    lcd.print("<WII-Mode>");
    lcd.setCursor(0, 1);
    lcd.print(" Autonom");
    delay(100);

    wii = true;
    lcd.clear();
  }
  if (wii == true && Enter == HIGH) {
    pressed2 = true;
  }
  if (wii == true && pressed2 == true) {
    nunchuck();
  }
  if (encoder0Pos > 3) {
    wii = false;
    pressed2 = false;
  }
  if (encoder0Pos > 3 && ldr == false && wii == false && pressed3 == false) {
    lcd.clear();
    lcd.print("<Autonom>");
    lcd.setCursor(0, 1);
    lcd.print("......");
    delay(200);
    delay(200);
    Auto = true;
    lcd.clear();
  }
  if (Auto == true && Enter == HIGH) {
    pressed3 = true;
  }
  if (Auto == true && pressed3 == true) {
    autonomous();
  }

}

Gruß Chris
« Last Edit: February 21, 2010, 01:33:49 pm by Chris.Le » Logged

Weinsberg, Germany
Offline Offline
God Member
*****
Karma: 3
Posts: 773
A Coder's Tale
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Nein, Du hast doch sowas schon verwendet...?

Code:
int change = 1;
[...]
void loop() {
  n = digitalRead(encoder0PinA);
  Enter = digitalRead(19);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
      encoder0Pos--;
    }
    else {
      encoder0Pos++;
    }
    change = 1;
  }
  encoder0PinALast = n;

  if (change) {
    change = 0;
    if (encoder0Pos == 2 && wii == false && Auto == false) {
      lcd.clear();
[...]
Damit würd er das LCD einmal initial anfassen, und ansonsten nur, wenn sich was getan hat.
« Last Edit: February 21, 2010, 03:46:14 pm by Joghurt » Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 236
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ohne alles gelesen zu haben:
Das Flackern wird durch das "lcd.clear" kommen.
Als workaround kannste das lcd also einfach nicht "clearen" sondern mit leerzeichen nach dem Text vollschreiben. Dürfte auch helfen.
Logged

Germany-Leipzig
Offline Offline
Newbie
*
Karma: 0
Posts: 43
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mit dem Change klappt ganz gut. Danke dafür.

@Pumbaa : mit den Leerzeichen das mach ich schon, trotzdem danke.

Gibt es denn eine Möglichkeit  eine Textzeile zu markieren. (meine Die Anzeige zu invertieren, also Hintergrund schwarz und Schrift grün)?

Gruß  Chris
Logged

Pages: [1]   Go Up
Jump to: