ich bin ein Neuling in Sachen Arduino, hab aber schon Programmiererfahrung.
Ich stehe aktuell vor dem Problem einer Fotowiderstand - gesteuerten LED mit einer Einschaltverzögerung.
Bis zum letzten Schritt wo ich eine int Function mit millis benutze um noch einmal zu checken das nach 5000ms die lichtverhältnisse gleich geblieben sind, funktioniert die Schaltung nun garnichtmehr wirklich, allerdings weiß ich gerade nicht wirklich weiter..
Ich finde nicht den Fehler wo das Programm sich "aufhängt" und nicht mehr richtig funktioniert.
int sensorPin = A0; // select the input pin for the potentiometer
int sensor2Pin = A1;
int ledPin = 6; // select the pin for the LED
int sensorValue = 0; // variable to store the value coming from the sensor
int sensor2Value = 0;
int sensor3Value = 0;
int ledState = 0;
int start;
void setup() {
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// sensorValue = analogRead(sensorPin);
sensor2Value = analogRead(sensor2Pin);
Serial.println(sensor2Value);
if(sensor2Value<110 && ledState==0) {
ledState = 1;
start = changeState();
}
else if(sensor2Value>150 && ledState==1) {
ledState = 0;
start = changeState();
}
}
int changeState() {
static unsigned long previousMillis2;
sensor3Value = analogRead(sensor2Pin);
if(millis() - previousMillis2 > 5000)
{
if(ledState==1) {
if(sensor3Value<110) {
digitalWrite(ledPin,HIGH);
}
else { ledState = 0; }
}
else if(ledState==0) {
if(sensor3Value>150) {
digitalWrite(ledPin,LOW);
}
else { ledState = 1; }
}
previousMillis2 = millis();
}
}
Sinn des ganzen ist eine Fotowiderstand-gesteuerte LED die einfach an und aus schaltet bei gewisser Helligkeit und ich habe mich eben an dieser Hysterese versucht..
Funktioniert ein bool bei Arduino nicht mit true/false?
Ist das nicht Sinn der Hysterese dass diese in diesem Bereich (110-150) weder an noch ausgeschaltet wird um Schwellenwerte zu vermeiden?
Tomsen96:
Ist das nicht Sinn der Hysterese dass diese in diesem Bereich (110-150) weder an noch ausgeschaltet wird um Schwellenwerte zu vermeiden?
Vollkommen richtig, nur wird dann die 5 Sekunden Zeit auch nicht abgefragt.
Tomsen96:
Funktioniert ein bool bei Arduino nicht mit true/false?
Der Compiler ist sehr tolerant, true=HIGH=1 (oder größer Null) und false=LOW=0. Die Verwendung von bool ist also weniger für den Computer sondern mehr für den Typen davor und zeigt, daß es sich um eine logische Variable handelt.
Ich lade Deinen Sketch dann mal auf meinen UNO, mal sehen, ob der versteht, was Du eigentlich willst, ich leider noch nicht so wirklich ...
Hmmm, nach meinem Verständnis ist die Hysterese lediglich ein "Trigger" dafür, DASS irgend etwas ausgelöst werden soll. Im vorliegenden Fall müsste also eine Änderung von ledState erst DANN stattfinden, wenn ein bestimmter Wert über- oder unterschritten wird?!
RudiDL5:
Hmmm, nach meinem Verständnis ist die Hysterese lediglich ein "Trigger" dafür, DASS irgend etwas ausgelöst werden soll.
Die analogen Meßwerte schwanken immer ein wenig, da kann man ohne Hysterese dann leicht ein Blinklicht bekommen. Um dies zu verhindern, wird ein toter Bereich definiert, wo keine Umschaltung stattfindet. So weit stimmt der Sketch schon. Die Idee ist also richtig, nur sollte dann dennoch die 5 Sekunden Zeit abgefragt werden. Denke ich zumindest, weiß ja auch nicht alles
Da ich die Aufgabenstellung des TO noch nicht verstanden habe, hier die meinige: Bei einem Wert kleiner 110 wird nach 5 Sekunden nachgeschaut. Bleibt der Wert unter 110, wird die LED eingeschaltet. Bei einem Wert größer 150 wird nach 5 Sekunden nachgeschaut. Bleibt der Wert größer 150, wird die LED ausgeschaltet.
const byte sensor2Pin = A1;
const byte ledPin = 13; // select the pin for the LED
unsigned int sensor2Value = 0;
unsigned int sensor3Value = 0;
unsigned long previousMillis2;
bool ledState = 0;
void setup() {
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
delay(200);
sensor2Value = analogRead(sensor2Pin);
Serial.print(sensor2Value);
Serial.print(" ledState: ");
Serial.println(ledState);
if (sensor2Value < 110 && ledState == 0) {
ledState = 1;
previousMillis2 = millis();
}
else if (sensor2Value > 150 && ledState == 1) {
ledState = 0;
previousMillis2 = millis();
}
changeState();
}
void changeState() {
sensor3Value = analogRead(sensor2Pin);
if (millis() - previousMillis2 > 5000)
{
if (ledState == 1) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
}
Tom, willst Du das so?
Hast gerade geantwortet, möglicherweise enthält mein Sketch ja noch eine weitere Anregung
Ja vom Prinzipher ist das korrekt. Ich werde deinen Sketch mal ausprobieren.
Eine Frage. Das Delay im loop(), ist das einfach um zu viele abfrage zu verhindern?
Ich stehe gerade mehr vor einem Rechenproblem.
Ich habe jetzt noch einen Potenziometer von 0 - 1024 Wert wo man die empfindlichkeit wann der Fotowiderstand reagiert selber einstellen kann.
Absolute dunkelheit beim Fotowiderstand ist ebenfalls null aber der ermittelte Höchstwert bei Taschenlampeneinstrahlung (imitierte Sonneneinstahlung) beträgt nur 600. Also muss ich die 1024 ja ins verhältnis setzen zu den 600 was in beiden Fällen 100% wären. Denn wenn ich die Daten 1:1 für den Fotowiderstand einsetze dann haut das nicht hin weil man den Poti bis 1024 hochdrehen kann aber bei 600 schon die hellste einstahlung erreicht ist, also verschwendet man ja quasi fast die Hälfte des Drehradius.
Hat das jmd. einen Lösungsansatz?
Hallo agmue,
stümmt, das mit dem Blinklicht bei analogen Messwerten ist mir sehr bewußt. Ich kenne diese Sorgen aus der Digital-Elektronik, wo durch Schmidt-Trigger für eine steile Flanke gesorgt wird, das ist m.E. vergleichbar.
Gruß, Rudi