Go Down

Topic: LCD Zeile mit One_Button löschen (Read 3126 times) previous topic - next topic

Floetzinger

guten Abend meine Lieben,
können wir gemeinsam ein vermutlich recht banales Problem lösen?
ok, Aufgabenstellung:
Anzeige von Text nach Tastendruck auf dem LCD Display.
Löschen vom Text nach erneuten Tastendruck.
Testaufbau mit Taster, Widerstand und LEDs fluppt hervorragend.
Erste Hürde quasi geschfft.
Nun kommt die Schwiriegkeit.
Nach dem ersten Tastendruck erscheint tatsächlich der Text, verschwindet allerdings wohl aufgrund einer
von mir angewandten Anweisung im Sketch.
Ziel soll sein, das der Text erst beim zweiten Tastendruck überschrieben werden soll (hier mit Space/ Leerzeichen).
kriegt man das sauber gelöst?
um ne Menge zus. Text zu vermeiden sind statt Millis Delay Anweisungen drin :o

Code: [Select]

 /* die zur Zeit verwendete Delay Anweisungen werden nach erfolgreicher
  * Testläufe durch Millis() ersetzt.
  */
 
 #include "OneButton.h"
 #include <Wire.h>
 #include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // Datenleitungen an 27/ 28
const int buttonPin = 12;
const int ledPin2 = 2;
const int ledPin3 = 3;
const int ledPin4 = 4;
OneButton button(buttonPin, false);
 
int ledState1 = LOW;
int ledState2 = HIGH;

void setup()
{
 pinMode(ledPin2, OUTPUT);
 pinMode(ledPin3, OUTPUT);
 pinMode(ledPin4, OUTPUT);
 pinMode(buttonPin, INPUT);
 
 button.attachClick(clickedIt);
 lcd.init();
 lcd.backlight();
}

 void loop() {
 button.tick();
  delay(10);
}

void clickedIt()
{
 ledState1 = !ledState1;
 digitalWrite(ledPin2, ledState1);
 digitalWrite(ledPin4,ledState1);
 lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
 lcd.print("Erste Zeile 12345678");
 delay(1000);
 digitalWrite(ledPin2, LOW);
 ledState2 = !ledState2;
 digitalWrite(ledPin3, ledState2);
 delay(1000);
 digitalWrite(ledPin3, LOW);
 lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
 lcd.print("                    ");// Zeileninhalt löschen/ überschreiben
}

Tommy56

#1
Oct 12, 2018, 06:13 pm Last Edit: Oct 12, 2018, 06:15 pm by Tommy56
Wenn Du etwas abhängig von bestimmten Bedingungen erledigen / nicht erledigen willst, dann solltest Du diese Bedingungen abfragen. Was Du suchst ist if.

Edit: Nach über 70 Postings wird es wohl an der Zeit sein, mal mit dem Lernen der Grundlagen zu beginnen.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

Wenn du dein Problem für banal hältst, verstehe ich nicht, warum du es nicht selbst lösen kannst.
Auch kommt mir deine Äusserung delays statt millis einzusetzen unüberlegt vor.

Mit delay blockierst du deinen Sketch zusätzlich, sodass dieser während des delay keine Tastendrücke mehr annehmen kann.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

postmaster-ino

Hi

Wenn Du dem Arduino sagst
'Schreib was auf's Display, warte 10 Sekunden, mach das Licht an, warte 10 Sekunden, mach das Licht aus'
... warum wunderst Du Dich, daß Das genau so gemacht wird?

Ich wundere mich, warum Du diese Status nicht in loop() abarbeitest und jeweils nach der Wartezeit einen Status weiter springst.
Wäre dann nämlich eine State-Maschine - und der Arduino hätte noch massig Zeit, anderes Zeug zu tun.

MfG

Floetzinger

moin,
vielen Dank für die Anschubser.
Wenn man nicht die hellste Kerze am Baum ist, brauchst halt mal ein Denkanstoß.

Floetzinger

Hallo zusammen,
kurz mitgeteilt:
um zu verhindern, dass meine Servos für die zu stellenden Weichenstrassen beim "fahren" unterbrochen werden, muss ich im Sketch zwingend wohl Delays einsetzen.
Quasi als Bremse für übereilte Tastendrücken.

Oder gibt es eine elegantere Lösung?
 
Schönen Grillabend zusammen ( hier sind 27 Grad, kein Wind).

uwefed


Floetzinger

...meine Versuche sind fehlgeschlagen, also muss ich wohl weiter probieren.
Ziel ist, zu verhindern das während der Laufzeit der Servos ein weiterer Befehl/ Tastendruck abgearbeitet wird.


MicroBahner

um zu verhindern, dass meine Servos für die zu stellenden Weichenstrassen beim "fahren" unterbrochen werden, muss ich im Sketch zwingend wohl Delays einsetzen.
Nein, das brauchst Du nicht. Was meinst Du überhaupt mit 'unterbrochen werden' ? Ich denke es geht darum, dass die Weichen nicht umgestellt werden, wenn ein Zug darüber fährt?. Dann darfst Du während dieser Zeit die Tasten einfach nicht mehr abfragen. Dazu braucht es kein delay(). Du musst nur wissen, wenn ein Zug drüber fährt. Da braucht's aber ein paar mehr Informationen, wie das bei dir funktionieren soll. Allerdings ist mir nicht klar, was das mit deiner Frage hier in dem Sketch zu tun hat.


Gruß, Franz-Peter

Floetzinger

Hallo zusammen, wieder zurück v.d. Tournee (morgens Zirkus, abends Theater  :) )
ich habe dann mal einen neuen Versuch unternommen, mein millis Problem zu lösen.
Ohne erfolg.
eine Fingerübung, ob ich überhaupt das Prizip verstanden habe, habe ich aus einen Sketch von agmue und der Nachtwächterbeschreibung erstellt. Läuft, ist komisch aber läuft.
Das einfügen in meinen Sketch allerdings klappt nicht.
könntet ihr einmal drüberschauen und den richtigen Tipp geben?
geändert habe ich die Zeilen:
18, 19 69,70,71.
Aktuell schaltet Pin 2 nicht nach 3 sec. aus/low, sondern bleibt high.

Code: [Select]

/* Weichenstrasse stellen und auflösen durch Tastendruck (Flip/Flop)
  *
 */
 #include "OneButton.h"
 #include <Wire.h>
 #include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // Datenleitungen an 27/ 28
const int buttonPin = 12;// Taster ein/ aus
const int ledPin2 = 2;// Anzeige Tastendruck Weichenstrasse stellen
const int ledPin3 = 3;// Anzeige Tastendruck Weichenstrasse aufgelöst
const int ledPin4 = 4;// Anzeige Anlassung Relais
OneButton button(buttonPin, false);
 
int ledState1 = LOW;
int ledState2 = HIGH;
// ****
//byte ledPin2 = 2;
unsigned long aktuelleMillis = 0; // hier richtig eingefügt?
unsigned long Intervall = 3000;// hier richtig eingefügt?
//******
void setup()
{
 pinMode(ledPin2, OUTPUT);
 pinMode(ledPin3, OUTPUT);
 pinMode(ledPin4, OUTPUT);
 pinMode(buttonPin, INPUT);
  Serial.begin(9600);
 button.attachClick(clickedIt);
 lcd.init();
 lcd.backlight();
 
}
 void loop()
{
 button.tick();
  delay(10);
}

void clickedIt()
{

 ledState1 = !ledState1;
 digitalWrite(ledPin2, ledState1);
 digitalWrite(ledPin4,ledState1);
   if(ledState1 == LOW){
//   Serial.println("aufgelöst");// Testausgabe  Monitor
    lcd.setCursor (0,0);
    lcd.print("Weichenstrasse ");
    lcd.setCursor(0,1);
    lcd.print("Gleis 64 aufgeloest   ");
    lcd.setCursor(0,2);
    lcd.print ("Weichen 15,16,4 auf ");
    lcd.setCursor(0,3);
    lcd.print ("Geradefahrt gestellt");
   }   
    else if(ledState1 == HIGH)
    {
//    Serial.println("gestellt");// Testausgabe  Monitor
    lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
    lcd.print("Weichenstrasse ");
    lcd.setCursor(0,1);
    lcd.print("Gleis 64 gestellt  ");
    lcd.setCursor(0,2);
    lcd.print ("Weichen 15,16,4 auf");
    lcd.setCursor(0,3);
    lcd.print ("Abzweig gestellt    ");
    }
{
aktuelleMillis=millis();
if (millis() - aktuelleMillis == Intervall){
digitalWrite (5,LOW);
}

//delay(2000); deaktiviert, Test mit milliis()
 //digitalWrite(ledPin2, LOW);//deaktiviert , Test mit millis()
 ledState2 = !ledState2;
 digitalWrite(ledPin3, ledState2);
 
delay(2000);
digitalWrite(ledPin3, LOW);

}
}


Tommy56

Schau Dir mal diese beiden unsinnigen Zeilen aus Deinem Code an:
Code: [Select]

aktuelleMillis=millis();
if (millis() - aktuelleMillis == Intervall)

Das wird nie erfüllt. Wirf nochmal einen verstehenden Blick in BlinkWithoutDelay. So wird das dort nicht gemacht.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Floetzinger

#11
Oct 20, 2018, 03:03 pm Last Edit: Oct 20, 2018, 03:03 pm by Floetzinger
Hallo Tommy56,
mmh, in der Reihenfolge der Zeilen aus Blink without... die Zeilen in den Sketch getragen, nö, läuft nicht.
An welcher Stelle lieg ich falsch? ist es die Stelle im Sketch?
Vergesse ich was wichtiges?
Kein Wunder, das ich nicht den Kopierer im Büro benutzen soll, so vernagelt ich manchmal bin :smiley-mr-green:
Nähere ich mich denn überhaupt der Lösung oder renn ich weiter im Kreis durch den Wald der Dinge?
Danke schon mal fürs helfen...
wbr. Flötzinger

Code: [Select]

/* Weichenstrasse stellen und auflösen durch Tastendruck (Flip/Flop)
  *
 */
 #include "OneButton.h"
 #include <Wire.h>
 #include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // Datenleitungen an 27/ 28
const int buttonPin = 12;// Taster ein/ aus
const int ledPin2 = 2;// Anzeige Tastendruck Weichenstrasse stellen
const int ledPin3 = 3;// Anzeige Tastendruck Weichenstrasse aufgelöst
const int ledPin4 = 4;// Anzeige Anlassung Relais
OneButton button(buttonPin, false);
 
int ledState1 = LOW;
int ledState2 = HIGH;
//*** Test mit millis()
unsigned long previousMillis = 0;
const long Interval = 2000;
// ***
void setup()
{
 pinMode(ledPin2, OUTPUT);
 pinMode(ledPin3, OUTPUT);
 pinMode(ledPin4, OUTPUT);
 pinMode(buttonPin, INPUT);
  Serial.begin(9600);
 button.attachClick(clickedIt);
 lcd.init();
 lcd.backlight();
}
 void loop()
{
 button.tick();
  delay(10);
}

void clickedIt()
{

 ledState1 = !ledState1;
 digitalWrite(ledPin2, ledState1);
 digitalWrite(ledPin4,ledState1);
   if(ledState1 == LOW){
//   Serial.println("aufgelöst");// Testausgabe  Monitor
    lcd.setCursor (0,0);
    lcd.print("Weichenstrasse ");
    lcd.setCursor(0,1);
    lcd.print("Gleis 64 aufgeloest   ");
    lcd.setCursor(0,2);
    lcd.print ("Weichen 15,16,4 auf ");
    lcd.setCursor(0,3);
    lcd.print ("Geradefahrt gestellt");
   }   
    else if(ledState1 == HIGH)
    {
//    Serial.println("gestellt");// Testausgabe  Monitor
    lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
    lcd.print("Weichenstrasse ");
    lcd.setCursor(0,1);
    lcd.print("Gleis 64 gestellt  ");
    lcd.setCursor(0,2);
    lcd.print ("Weichen 15,16,4 auf");
    lcd.setCursor(0,3);
    lcd.print ("Abzweig gestellt    ");
    }
//*** Test mit millis()
unsigned long currentMillis = millis();
if (currentMillis -previousMillis >= Interval){
previousMillis = currentMillis; 
}
//***
//delay(2000);
 digitalWrite(ledPin2, LOW);
 ledState2 = !ledState2;
 digitalWrite(ledPin3, ledState2);
 
delay(2000);
digitalWrite(ledPin3, LOW);

}


Tommy56

Das mit dem Kopierer kann ich verstehen.

Code: [Select]

if (currentMillis -previousMillis >= Interval){
  previousMillis = currentMillis;
  // <------ Hier musst Du das tun, was Du nach Intervall tun willst
}

Und das Delay(2000) raus.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Floetzinger

....das Delay kommt raus, wenn ich den Kram vorher verstanden habe. Dank dir!
Versuch macht irgendwann auch kluch (fragt sich nur wen :-)  )

Floetzinger

Empfehlung von Tommy56 ausgeführt.
Ergebnis:
Pin ist sehr kurz high,Anzeige LED blitzt quasi nur kurz auf.
scheinbar bin ich aber auf denrichtigen Weg...
Ich werde das Gefühl nicht los, da ist noch ein weitere Fehler im Sketch (?)

Code: [Select]

/* Weichenstrasse stellen und auflösen durch Tastendruck (Flip/Flop)
  *
 */
 #include "OneButton.h"
 #include <Wire.h>
 #include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // Datenleitungen an 27/ 28
const int buttonPin = 12;// Taster ein/ aus
const int ledPin2 = 2;// Anzeige Tastendruck Weichenstrasse stellen
const int ledPin3 = 3;// Anzeige Tastendruck Weichenstrasse aufgelöst
const int ledPin4 = 4;// Anzeige Anlassung Relais
OneButton button(buttonPin, false);
 
int ledState1 = LOW;
int ledState2 = HIGH;
//*** Test mit millis()
unsigned long previousMillis = 0;
const long Interval = 3000;
// ***
void setup()
{
 pinMode(ledPin2, OUTPUT);
 pinMode(ledPin3, OUTPUT);
 pinMode(ledPin4, OUTPUT);
 pinMode(buttonPin, INPUT);
  Serial.begin(9600);
 button.attachClick(clickedIt);
 lcd.init();
 lcd.backlight();
}
 void loop()
{
 button.tick();
  delay(10);
}

void clickedIt()
{

 ledState1 = !ledState1;
 digitalWrite(ledPin2, ledState1);
 digitalWrite(ledPin4,ledState1);
   if(ledState1 == LOW){
//   Serial.println("aufgelöst");// Testausgabe  Monitor
    lcd.setCursor (0,0);
    lcd.print("Weichenstrasse ");
    lcd.setCursor(0,1);
    lcd.print("Gleis 64 aufgeloest   ");
    lcd.setCursor(0,2);
    lcd.print ("Weichen 15,16,4 auf ");
    lcd.setCursor(0,3);
    lcd.print ("Geradefahrt gestellt");
   }   
    else if(ledState1 == HIGH)
    {
//    Serial.println("gestellt");// Testausgabe  Monitor
    lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
    lcd.print("Weichenstrasse ");
    lcd.setCursor(0,1);
    lcd.print("Gleis 64 gestellt  ");
    lcd.setCursor(0,2);
    lcd.print ("Weichen 15,16,4 auf");
    lcd.setCursor(0,3);
    lcd.print ("Abzweig gestellt    ");
    }
//*** Test mit millis()
unsigned long currentMillis = millis();
if(currentMillis -previousMillis >= Interval){
previousMillis = currentMillis;
digitalWrite(ledPin2,LOW);
ledState2 = !ledState2;
digitalWrite(ledPin3, ledState2);
}
//***
//delay(2000);
 
 
delay(2000);
digitalWrite(ledPin3, LOW);

}


Go Up