Go Down

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

Floetzinger

Guten Tag an alle, die heute nicht werkeln müssen. Alle anderen auch einen schönen Tage heute.
ich habe nun erstmal den sketch umgrstellt,den anregungen folgen nicht im ClickIt() hängen zubleiben.
Nun komm ich nicht in die Switch Case Abfrage.
Bevor ich das nicht klar habee, werde ich keine millis Nummer einfügen (Probleme nicht anhäufen Modus).
Habe ich da immer noch was falsch verstanden?
Muss ich die Switch Case Abfragen anders einfügen oder eigenständig machen?
Meine Versuche mit
void Weichenstellung();
Switch Case Gedöns einfügen und im Void Loop dann Weichensteuerung() aufrufen hat auch nicht geklappt.

hier der aktuelle Fehlschlag Sketch:

Code: [Select]

#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 = 0;
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);
 switch (a) {
      case 1:
     digitalWrite(ledPin2,HIGH);
     Serial.println ("komisch1");
     Serial.println(ledState1);   
       ledState2 =!ledState2;
     break;     
     case 0:   
     Serial.println("Case 0");
     Serial.println (a);
     digitalWrite(ledPin3, HIGH);
     digitalWrite (ledPin2,LOW);
     break;   
}
}
 void clickedIt(){
 ledState1 = !ledState1;
 a= ledState1;
 Serial.println(ledState1);
}





Danke undschönen Tag!

Flötzinger

Floetzinger

#31
Nov 02, 2018, 05:11 pm Last Edit: Nov 02, 2018, 05:12 pm by Floetzinger
Guten Abend zusammen,
gefühlt viel Zeit verplempert, ohne Erfoge zu erzielen.
Um die MillisNummere zumindest für mich nachvollziehbar zu machen, habe ich ein Sketch mit 2 Taster zur Zustandsänderung gemacht. Die Dauer der HIGH Phase ist auf 2 sec. eingestellt. Wird nach Tastendruck erfülllt, also bei den Tastern.
Sketch zur freundlichen Ansicht:

Code: [Select]





#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // Datenleitungen an 27/ 28
const int Taster1 = 11;
const int Taster2 = 12;
const int Taster3 = 10;
const int Taster4 = 9;
const int ledPin2 = 2;
const int ledPin3 = 3;
const int ledPin4 = 4;
const int ledPin5 = 5;
unsigned long Startzeit1 =0;
unsigned long Startzeit2 =0;

void setup(){
 pinMode(ledPin2, OUTPUT);
 pinMode(ledPin3, OUTPUT);
 pinMode(ledPin4, OUTPUT);
 pinMode(ledPin5, OUTPUT);
 pinMode(Taster1,INPUT);
 pinMode(Taster2,INPUT);
  pinMode(Taster3,INPUT);
 pinMode(Taster4,INPUT);
 lcd.init();
 lcd.backlight();
}

void loop(){
if (digitalRead(Taster1)==HIGH){
    digitalWrite(ledPin2,HIGH);
      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    "); 
      Startzeit1=millis();

else if (millis()-Startzeit1>=2000){
       digitalWrite(ledPin2,LOW);
}
     
if (digitalRead(Taster2)==HIGH){
    digitalWrite(ledPin3,HIGH);
      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 ("Geradefahrt gestellt"); 
      Startzeit1=millis();
}
else if (millis()-Startzeit1>=2000){
       digitalWrite(ledPin3,LOW);
}
if (digitalRead(Taster3)==HIGH){
    digitalWrite(ledPin4,HIGH);
      lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
      lcd.print("Weichenstrasse ");
      lcd.setCursor(0,1);
      lcd.print("Gleis xx gestellt  ");
      lcd.setCursor(0,2);
      lcd.print ("Weichen 15,16,4 auf");
      lcd.setCursor(0,3);
      lcd.print ("Abzweig gestellt    "); 
      Startzeit1=millis();

else if (millis()-Startzeit1>=2000){
       digitalWrite(ledPin4,LOW);
}       
if (digitalRead(Taster4)==HIGH){
    digitalWrite(ledPin5,HIGH);
      lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
      lcd.print("Weichenstrasse ");
      lcd.setCursor(0,1);
      lcd.print("Gleis xx gestellt  ");
      lcd.setCursor(0,2);
      lcd.print ("Weichen 15,16,4 auf");
      lcd.setCursor(0,3);
      lcd.print ("Geradefahrt gestellt"); 
      Startzeit1=millis();

else if (millis()-Startzeit1>=2000){
       digitalWrite(ledPin5,LOW);
}
 

}



In der abgespeckten Version mit OneButton funktioniert wider meiner Erwartung die millis() Geschichte nicht.
Und ums Verrecken ich kann ers mir nicht erklären, warum. Alle möglichen Varianten (die mir so einfielen)
ausprobiert.
Weiß jemand eine Rat/ Tipp?
Sketch:

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 = 11;
const int ledPin2 = 2;
const int ledPin3 = 3;
const int ledPin4 = 4;
unsigned long Startzeit1 =0;

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);
if (digitalRead(ledState1)==HIGH){
    digitalWrite(ledPin2,HIGH);
    Startzeit1=millis();
}   
 else if (millis()-Startzeit1>=1000){
          digitalWrite(ledPin2,LOW);
          Serial.println(ledState1);
}
}

void clickedIt(){
 ledState1 = !ledState1;
 a=ledState1;
 
Serial.println("A");
Serial.println(ledState1);
Serial.println("E");
}
 
 



Danke.
lieben Gruß Flötzinger

postmaster-ino

Hi
Code: [Select]
if (digitalRead(ledState1)==HIGH){
Das soll so?
Damit fragst Du die Pins 0 und 1 ab - Die werden allerdings für die USB-Kommunikation benutzt - denke, Du machst hier einen Fehler.
Wenn die Abfrage wieder auf einen Taster-Pin umgebogen ist, sehe ich nicht, wieso millis() hier den Dienst verweigern sollte.

MfG

Floetzinger

öh, eigentlich ist doch ledState1 mein Merker für den Zustand.
Wäre also entweder eine Namensänderung richtig oder Pin? Der Pin kommt allerdings über OneButton als ledState1 ins Spiel.

"Damit fragst Du die Pins 0 und 1 ab" noch ein öhh, wo lern/ les ich das denn wieder?

Floetzinger

@postmaster-ino:
in den Zeilen 49,50 und 51 lasse ich mir den Statuswechsel im Monitor anzeigen.
Jeder Tastendruck ändert den Zustand von ledState1 von 1 zu 0 resp. von 0 zu 1.

*ist verwirrt*

postmaster-ino

#35
Nov 02, 2018, 06:44 pm Last Edit: Nov 02, 2018, 07:48 pm by postmaster-ino
Hi

Ja, status ist boolean und kann somit nur true (!=0) oder false (0) annehmen.
Da Du digitalRead aber den Status als Pinnummer mitgibst, fragst Du bei false den Status von Pin 0, bei true den Status von Pin 1 ab.
 Aaaahh - jetzt dämmert's mir:
Du willst je nach state die LED an/ausschalten - in der Abfrage möchtest Du also NUR
Code: [Select]
if (state==high) {
  //mache was, wenn state high ist
}else{
  //mache was, wenn state false ist
}

state abfragen und nicht das Level eines Pin mit der Nummer, Die status vorgibt.

MfG
*Edit*
true/false korrigiert - klar ist's, wie Tommy56 in #36 schreibt ... da habe ich mich irgendwie verhaspelt.
Quote from: Arduino-Referenz
false: bedeutet immer 0 (Null)
true: bedeutet 1, ABER: auch jeder andere Wert außer Null ist true.
Der Download zur Arduino-Referenz (in Deutsch) ist nur einen Klick entfernt.

Tommy56

somit nur true (==1) oder false (alles Andere, hier aber 0) annehmen.
Das ist falsch formuliert. Es gibt in C/C++ eine klare Festlegung: 0 (oder NULL bei Pointern) ist FALSE, alles andere ist TRUE.

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

Floetzinger

Hallo zusammen,
jetzt habe ich das Ganze noch mal von Vorn angefangen.
Dabei habe ich mich auf das Video https://www.vimore.org/watch/B5AbaAGCbQ8/arduino-tutorial-kapitel-3-2-2-die-onebutton-library// gestützt und Step by Step abgearbeitet.
Dann mein Versuch die angesteuerte LED nach 2 Sec. wieder auf LOW zusetzen.
Erwartungsgemäß klappt es nicht. Kurz bei meinen andrern, lauffähigen Versuch nachgeschaut, sieht gleich aus.
Um wenigstens nach zuvollziehen, wann was passiert,, habe ich Serial.print eingesetzt.
Scheint so, als wenn die Abfrage nach der vergangenen Zeit nicht erreicht wird bzw. überschritten wird.

Was funktioniert:
1. Tastendruck Pin High
2.Tastendruck Pin low
Anzeige im LCD Display einwandfrei
 für spätere Zwecke ist noch ein zweiter Taster vorgesehen. Das Erkennen klappt übrigens auch.

Könntet ihr mir ein Stück weit weiterhelfen?

Code: [Select]

// OneButton Lib lernen
// millis() zum Abschalten ledPin xx nach 2 sec.


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // Datenleitungen an 27/ 28
#include <OneButton.h>
const int ledPin2 = 2;
const int ledPin3 = 3;
//const int ledPin4 = 4; Reserve
int ButtonPin1 = 11;
int ButtonPin2 = 12;
int m;
unsigned long Startzeit1 = 0;
OneButton Button1 = OneButton(ButtonPin1,false); //Taster > externer Widerstand
OneButton Button2 = OneButton(ButtonPin2,false);

void setup(){
  Serial.begin(9600);
  while(!Serial); // Programm Start nach Öffnen des Monitors
  Serial.println(" Programmstart");
  lcd.init();
lcd.backlight();
    Button1.attachClick(ein_Click1); 
    Button2.attachClick(ein_Click2); 
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);
}
void loop(){
Button1.tick();
Button2.tick();
delay(10);
}
void ein_Click1(){
Serial.println(" ein Klick 1.Taster");
Serial.println(m);
static int m = LOW; // mit 0 starten
Serial.println(m);  // welchen Wert hat m?
if((m)==HIGH){
  digitalWrite(ledPin2,HIGH);
  lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
  lcd.print("Weichenstrasse ");
  lcd.setCursor(0,1);
  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    ");   
  Startzeit1=millis();
}   
 else if (millis()-Startzeit1>=2000){
  Serial.println(Startzeit1);
         digitalWrite(ledPin2,LOW); // Pin nach 2 sec. auf low; klappt nicht.Fehler liegt wo?
}
m = !m; // umkehren

}
//**** Vorbereitung für 2. Taster
void ein_Click2(){
  Serial.println(" ein Klick 2.Taster");
}
 

Floetzinger

guten Abend zusammen,
mich beschleicht ja so langsam das Gefühl, dass OneButton und millis() nicht so wirklich zusammen passen resp. zusammen arbeiten wollen.
Wer hat denn ähnliches erlebt und eine Lösung gefunden?

Vielen für eure Mühen...

noiasca

OneButton arbeitet perfekt mit millis() zusammen - wenn es das nicht macht - machst du etwas falsch.

Ohne jetzt 3 Seiten durchzulesen:
Was soll dein Minisketch genau machen. Beschreibe exakt welche Aktion welche Wirkung erzielen soll bzw was per Zeit geschehen soll.
So dass es ein Entchen versteht.
Oder zeichne einen Programmablaufplan. Kariertes Papier ist super für solche Sachen ;-)
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Hausknecht

#40
Nov 08, 2018, 07:20 pm Last Edit: Nov 08, 2018, 07:24 pm by Hausknecht
guten Abend zusammen,
mich beschleicht ja so langsam das Gefühl, dass OneButton und millis() nicht so wirklich zusammen passen resp. zusammen arbeiten wollen.
Wer hat denn ähnliches erlebt und eine Lösung gefunden?

Vielen für eure Mühen...
Du setzt den Zeitzähler immer wieder zurück, so dass nie die 2 Sekunden nach Rücksetzen erreicht wird.
Setze mal den Zeitzähler erst zurück, wenn eine Zeitüberschreitung erkannt wird.

Code: [Select]
if((m)==HIGH){
  Serial.println(" in der ja Schleife");
  digitalWrite(ledPin2,HIGH);
  lcd.setCursor(0,0); // Cursorpos 0, Zeile 1
  lcd.print("Weichenstrasse ");
  lcd.setCursor(0,1);
  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    ");   
 
}   
 else if (millis()-Startzeit1>=2000){
  Startzeit1=millis();
  Serial.println(Startzeit1);
         digitalWrite(ledPin2,LOW); // Pin nach 2 sec. auf low; klappt nicht.Fehler liegt wo?
}
m = !m; // umkehren
___________________________________________________
Grüße Hans

Floetzinger

#41
Nov 09, 2018, 03:26 pm Last Edit: Nov 09, 2018, 03:54 pm by Floetzinger
Hallo Noiasca,

OneButton arbeitet perfekt mit millis() zusammen - wenn es das nicht macht - machst du etwas falsch.

Ohne jetzt 3 Seiten durchzulesen:
Was soll dein Minisketch genau machen. Beschreibe exakt welche Aktion welche Wirkung erzielen soll bzw was per Zeit geschehen soll.
So dass es ein Entchen versteht.
Oder zeichne einen Programmablaufplan. Kariertes Papier ist super für solche Sachen ;-)
...versuch ich mal deine Fragen zu beantworten.
Der angefügte Sketch ist jetzt soweit runtergekürzt, läiuft aber noch bis eben auf meinen Fehler.
Funktion:
OneButton Funktion als ein/ aus Schalter einer aus mehreren Relais bestehen Servosteuerung (Bestand, analog).
Der sketch soll einige analoge Taster ersetzten, so dass mit einen Tastendruck eine Vielzahl von Relais angesteuet werden.
Die Ansteuerung brauch nur 2 sec. HIGH sein, beim zweiten Tastendruck eine Rücknahme der ausgelösten Funktionen.
Passiert im Moment durch eben 2 analoge Taster manuell.
als symbolisaches Relais ist die LED eingesetzt.
(der Pin geht auf ein UDN 2981 als Verstärker (ja die Bestandsaanlage ist Plus geschaltet))

meine Versuche über die millis() eine Einschaltzeit von 2 Sek. nach Tasterdruck zu realisieren schlagen leider fehl.

Danke für deine Mühen.
Flötzinger

edith war da: auf einfachen Wunsch eines vielfachen Herrn das analog gestrichen.

Code: [Select]

#include <OneButton.h>
const int ledPin2 = 2;
const int ledPin3 = 3;
//const int ledPin4 = 4; Reserve
int ButtonPin1 = 11;
int ButtonPin2 = 12;
int m;
unsigned long Startzeit1 = 0;// Startzeit 0 Sec.
OneButton Button1 = OneButton(ButtonPin1,false); //Taster > externer Widerstand
OneButton Button2 = OneButton(ButtonPin2,false);

void setup(){
Serial.begin(9600);
 while(!Serial); // Programm Start nach Öffnen des Monitors
  Serial.println(" Programmstart");

    Button1.attachClick(ein_Click1);
    Button2.attachClick(ein_Click2); // Vorbereitet für 2.Taster
    pinMode(ledPin2, OUTPUT);
    pinMode(ledPin3, OUTPUT);
}
void loop(){
Button1.tick();
Button2.tick();// 2.Taster
delay(10);
}
void ein_Click1(){
Serial.println(" ein Klick 1.Taster"); // Taster Druck wurde erkannt
static int m = LOW; // mit 0 starten
Serial.println(m);  // welchen Wert hat m?
if((m)==HIGH){
  digitalWrite(ledPin2,HIGH);
   Startzeit1=millis();
}  
 else if (millis()-Startzeit1>=2000){
    Startzeit1=millis();
     digitalWrite(ledPin2,LOW); // Pin nach 2 sec. auf low
}
m = !m; // umkehren

}
//**** Vorbereitung für 2. Taster
void ein_Click2(){
  Serial.println(" ein Klick 2.Taster");
}
 


Tommy56

Was soll denn ein "analoger Taster" sein?

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

Floetzinger

Was soll denn ein "analoger Taster" sein?

Gruß Tommy
Was soll denn ein "analoger Taster" sein?

Gruß Tommy
echt jetzt?
was magst du denn lesen?
manuell betätige Schalteinrichtung?

noiasca

#44
Nov 09, 2018, 04:30 pm Last Edit: Nov 09, 2018, 04:34 pm by noiasca
Quote
Die Ansteuerung brauch nur 2 sec. HIGH sein, beim zweiten Tastendruck eine Rücknahme der ausgelösten Funktionen.
erkläre:

Nachdem 2sec High angelegt war, soll der Ausgang wieder auf LOW gehen?
Was bedeutet "beim zweiten Tastendruck eine Rücknahme der ausgelösten Funktion"? - welche Funktion wurde beim ersten Tastendruck ausgelöst?
Wurde diese Aktion nicht schon nach 2 sec beendet?

Noch mal:

Beschreibe deinen Programmablauf in kurzen Sätze.
Kurze Sätze weil du deine Programmzeilen auch "in kurzen Sätzen" hinschreiben wirst.

Wie soll es ein kleiner Mikrokontroller sonst verstehen, wenn du es ihm nicht ganz einfach erklären kannst?
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Go Up