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:
#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:
//***** 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