Go Down

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

Tommy56

Du hast 2 LED. Um welche geht es denn?

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

postmaster-ino

#16
Oct 20, 2018, 06:00 pm Last Edit: Oct 21, 2018, 05:44 pm by postmaster-ino
Hi

clickit ist ein INTERRUPT - darin hat weder delay() noch irgendwelche länger dauernden Arbeiten was drin verloren (LCD voll schrieben ect.pp. - und wohl auch nicht die millis()-ABfrage, da Du hier nUR rein kommst, wenn Du GERADE JETZT den Button drückst - danach erst wieder, wenn DU ERNEUT drückst.

Was hindert Dich daran, in Deiner loop() die millis-Abfrage einzubauen und dort eben darauf zu reagieren, daß die Zeit um ist?
In der ISR wird 'sich nur gemerkt, daß ein Knopf gedrückt wurde' - ob man dafür eine ISR braucht, sei auch Mal dahin gestellt.

Ein Interrupt ist wirklich nur für zeitkritische Dinge nötig (oder, wenn man wieder wach werden will - dann vom Wachhund oder PinChange).

Dein 'Ist Knopf gedrückt, dann mache A ... B ... C ... D ... E ... warte 10 Sekunden ... F ... fertig' machst Du in loop() mit einer State-Maschine.
Pro 'Knopf' eine eigene State-Maschine, schreibe Dir die Aufgaben in der zeitlichen Reihenfolge auf - kann ja auch sein, daß eine Aufgabe erst beendet ist, wenn ein Pin den Zustand ändert (Endtaster), oder eben, wenn eine gewisse Zeit um ist - dann 'machst Du halt Nichts', bis diese Bedingung(en) erfüllt sind und Du zum nächsten Status wechselst.

MfG

Edit
Habe mich von dem attach blenden lassen, der Rest zum Interrupt ist aber trotzdem so.

Floetzinger

Schönen Sonntag,
bis bischen in Zeitnot, werde mich immer mal Häppchenweise an euren Empfehlungen halten, zus. noch einen kleinen Abriß schreiben, wie das Ganze entstanden ist und was das Ziel sein soll.
kurz noch gefragt:
wo hätte ich lesen/ erkenn können, dass ClickIt eine Interupt Nummer ist? wo ist mir was entgangen?
Danke und schönen Abend noch zusammen



Serenifly

#18
Oct 21, 2018, 03:48 pm Last Edit: Oct 21, 2018, 03:54 pm by Serenifly
wo hätte ich lesen/ erkenn können, dass ClickIt eine Interupt Nummer ist? wo ist mir was entgangen?
Code: [Select]

button.attachClick(clickedIt);

Dieses Entwurfsmuster wo man mit einer attach-Methode eine Callback-Funktion übergibt die dann von der Library automatisch aufgerufen wird

Nachtrag:
das deutet oft auf Interrupts hin, aber in diesem Fall ist es keiner. Das sieht man wenn man sich den Quelltext der Library anschaut. Die Callbacks dienen nur dazu dass man der Library mitteilt was sie in bestimmten Fällen machen soll.
Delays hebeln da aber trotzdem die Funktionalität der Library aus wenn man mehrere Knöpfe hat

Floetzinger

Hallo zusammen,
bevor ich jetzt (oder genauer in den nächsten Tagen) anfange den Sketch neu zu schtreiben, hätte ich ein paar grundsätzliche Dinge erfragt.
Die Buchstaben in den Klammern wären meine Reihenfolge im Aufbau.
der Sketch besteht aus einer Sektion(A) mit:
#Include...
const int...
int led...
usw.
Nächste Sektion(B) Void Setup() mit:
pinMode...
buton.attach...
usw.
die dritte Sektion(C) ist Void Loo(), gefolgt von ClickIt().
Frage:
kann diese Reihenfolge so bleiben, und kann ich dann eine weitere Voidxxx(D) mit der
LCD Anzeige, den symbolischen LEDs (später ja dann als Ausgang zum Eingang ULN28xxTrieber)
einfach so dran hägen?
Oder laufe ich in Gefahr, dann keine Tasterabfrage und kein Pin Wechsel von High/ Low
mehr zu bekommen?
Es wäre für mich zum Verständnis einfacher, wenn ich die logische Abfolge kennen würde.
Die Zeit, an denen ich mehr Zeit habe kommt erst in 92 wochen, 4 Tage und ein paar Stunden...

Danke euch.
Flötzinger

postmaster-ino

Hi
Die Zeit, an denen ich mehr Zeit habe kommt erst in 92 Wochen, 4 Tage und ein paar Stunden...
Und DAS ohne Count-Down-Uhr?? :o
... ich könnte Dir ein Forum empfehlen ... :)
(Einen Renten-Countdown wurde schon Mal vor Jahren in einem Forum angefragt - wollte ich eigentlich auch schon gebaut haben ... aber ich habe ja noch (wesentlich) mehr Zeit dafür ... man muß halt auch Mal Glück haben können!)

MfG

Tommy56

Kann ein 8-bitter Deine riesige Restzeit verarbeiten? ;)

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

Obi_wan79

#22
Oct 22, 2018, 08:39 pm Last Edit: Oct 22, 2018, 08:44 pm by Obi_wan79
Ich bin selber Anfänger aber wenn ich die Richtig verstanden habe willst du mit dem ersten Buttondruck den Text ausgeben und mit dem zweiten den Text löschen. Die anderen Prozesse sollen davon unberührt bleiben? Warum arbeitets du denn nicht mit Markern. IMeine Lösung sehe ungefähr so aus:

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;
int Flag==1;                            //EDIT: Setzten der Flag Variabel auf 1
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);
 if (Flag==1){                                                    //Wenn Flagge =1 dann diese Schleife
  lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
 
 lcd.print("Erste Zeile 12345678");
 Flag+=1;
delay (500);                                                          //Jetzt wird der Flaggenwert um 1 erhöht
 }
 if (Flag==2){                                                     //Jetzt läuft diese Schleife da Flag =2                   
  clear.lcd(); // oder lcd.print("                    ");
 Flag-=1;
delay(500);                                                          //Flag wird um eins reduziert und das Spiel fängt
 }                                                                     //wieder von vorne an mit der ersten Schleife
 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
}

postmaster-ino

Hi
Kann ein 8-bitter Deine riesige Restzeit verarbeiten? ;)

Gruß Tommy
Zur Not in Software in 64 Bit - Das sollte reichen

So, genug OT  :o

Tommy56

Hast mit dem OT ja recht. Aber Du bringst manches Mal so schöne Steilvorlagen, da muss man reagieren ;)

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

michael_x

Quote
Es wäre für mich zum Verständnis einfacher, wenn ich die logische Abfolge kennen würde.
Die logische Abfolge ist: Man kann nur verwenden, was bekannt ist. ( Von oben nach unten )

Dabei hilft die Arduino IDE, indem sie  das für Funktionsdefinitionen aushebelt und Funktions-Deklarationen vor den eigentlichen Code stellt: Funktionen (das was du fälschlich Void nennst) können in beliebiger Reihenfolge definiert werden.

Außerdem steuert die IDE einen Rahmen bei, der setup() und danach immer wieder loop() aufruft.

Globale Variable und Konstanten, die in diesen Funktionen verwendet werden, müssen schon bekannt sein, also oberhalb stehen.

Floetzinger

Off Topic:
Postmaster-ino schrieb:
„Und DAS ohne Count-Down-Uhr?? 
... ich könnte Dir ein Forum empfehlen ... 
(Einen Renten-Countdown wurde schon Mal vor Jahren in einem Forum angefragt - wollte ich eigentlich auch schon gebaut haben ... aber ich habe ja noch (wesentlich) mehr Zeit dafür ... man muß halt auch Mal Glück haben können!)"
Und Tommy56 meinete:
„Kann ein 8-bitter Deine riesige Restzeit verarbeiten?  "
Daraufhin meinte Postmaster-ino:
„Zur Not in Software in 64 Bit - Das sollte reichen"

So, um das Ganze kurz aufzulösen, meine herzallerliebsten Kolleginnen und Kollegen
haben keine Mühen gescheut und ein unter zu Hilfenahme von Wissenschafter von der UUAP (1)
(Unseen University of Ankh-Morpork) ein deutsches Äquivalenz zum sehr, sehr großen Deep Thought(2)
zu schaffen.
Unter Berücksichtigung der Umlaufbahn von Merkur und Saturn, der Lohnzahlungen an die Mütter von Clarence Ashley und Gwen Foster(3) wurden Algorithmen entwickelt, die , beeinflusst von Murphy und Schrödiger Gesetzen,  zu einen beeindruckenden Ergebnis führten:
Der ResttageausrechnerbiszurRente Kalender.

1: Terry Pratchetts Scheibenwelt
2: Douglas Adams Hitchhikers Guide to the Galaxy
3: eigentlich bekannter durch The Animals „ House of the Rising Sun"
https://de.wikipedia.org/wiki/The_House_of_the_Rising_Sun

Floetzinger

hi there,
kurzer Zwischenbericht, bevor mich die Arbeit einholt.Dank eurer Hinweise und Anregungen, habe ich zum Switch Case Szenario gewechselt. Und tatsächlich, ich kann eindeutig erkennen und was grad passiert und steuern.
Nachdem ich also diese Hürde geschafft habe, werde ich nun die Millis() in den Sketch einbauen (zumindest versuch ich das mal).
Verstehensfrage:
wann merk ich mir die zeit zum "laufgehen"? direkt am Sketchanfang oder wenn der Nachtwächter losgeht?
und dann:
der Vergleich auf Ablauf der Zeit vor der "Aktion, wie High/ low der Pins?

bis später.
und denkt dran, manche haben diese Woche Do frei  :smiley-mr-green:

Floetzinger

...egal, ob ich die Zeile previuosMillis = millis(); in Zeile 47 oder Zeile 55 einfüge,
der Pin wechselt nicht von High auf Low.
*Kopf >Tisch*
Könnte mir jemand mal den Kopf richten?

find den flaschen Vähler nicht.
Code: [Select]



//***** was man alles braucht****
#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;
const int Stellzeit = 2000;
unsigned long previuosMillis ;
unsigned long interval = 2000;
OneButton button(buttonPin, false);

int ledState1 = LOW;
int ledState2 = HIGH;
enum Zustand {Abzweig, Geradeaus};
//byte Zustand = ledState1;
int a ;
// ******                       
void setup()
{
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(buttonPin, INPUT);
button.attachClick(clickedIt);
lcd.init();
lcd.backlight();
}
void loop()
{
Serial.begin(9600);

button.tick();
delay(10);
}
void clickedIt()
{
ledState1 = !ledState1;
a= ledState1;
switch (a)
{
  case 1:
 previuosMillis = millis();
  digitalWrite(ledPin2,HIGH);
 //Platzhalter:  hier weitere Pins aktivieren
  digitalWrite(ledPin3,LOW);
  Serial.println ("Case 1");
  Serial.println(ledState1);   
     if (millis()-previuosMillis>= 2000) {
     digitalWrite (ledPin2, LOW);

  break;
    case 0:   
    Serial.println("Case 0");
    Serial.println (a);
    digitalWrite(ledPin3, HIGH);
    digitalWrite(ledPin2,LOW);
    break;   
//default:
}
}
}




postmaster-ino

Hi

Auch an Dich der Tip(p):
MALE Dir auf, was wann passieren soll.
Mit Pfeilen dazwischen, von welchem Zustand zu Welchem gewechselt werden soll.
An die Pfeile schreibst Du die Bedingung, bei Der 'dieser Pfeil gegangen wird'.

In Deinem aktuellen Sketch prüfst Du immer noch in clickit(), ob die Zeit abgelaufen ist.
WIE willst Du nach dem Klick wieder nach clickit() kommen??
Selbst wenn, merkst Du Dir dort am Anfang die aktuelle Zeit - womit die Endprüfung nicht erfüllt ist (da die Laufzeit noch nicht vorbei ist).

Durch das Klicken merkst Du Dir NUR, daß Da Wer geklickt hat - nicht mehr, nicht weniger.
In loop() prüfst Du JEDES MAL, ob da 'Wer geklickt hat' - wenn JA, merkst Du Dir die Zeit und fängst an, den Nachtwächter los zu schicken.
Hier wird jetzt in JEDEM loop()-Durchlauf geprüft, ob für den aktuellen Status die Weiter-Schalt-Bedingung erfüllt ist - wenn JA, gehst Du zum nächsten Status - so lange, bis Du fertig bist.
Dann läuft loop() zwar immer noch mit rasender Geschwindigkeit im Kreis, hat aber gerade Nichts zu tun - erst beim nächsten Klick ist wieder die Bedingung erfüllt, daß der erste Status angesprungen wird.
Der typische Nachtwächter, wie Er leibt und im KReis rennt.

MfG

Go Up