Go Down

Topic: Ich blicke nicht mehr durch (Read 586 times) previous topic - next topic

maverick1509

Hallo ich habe hier ein Stück geschrieben, wo ich nicht mehr verstehe was passiert:
Vielleicht hab ich im Moment auch ein Brett vor dem Kopf.
Hat was mit ner Treppenlichsteuerung zu tun aber darum gehts nicht.
Wer kann mir erklären, wieso die Prozudur down_off() ausgeführt wird (erkennbar durch ein Serial.print in der Prozedur)
ohne das das "Jetzt" ausgegeben wird.
Das kann doch gar nicht sein oder???????????????????


Code: [Select]

void loop(){
last_unten = status_unten;
last_oben = status_oben;
if (analogRead(IRunten) > grenzw_unten) status_unten = 1; else status_unten = 0;
if (analogRead(IRoben) > grenzw_oben) status_oben = 1; else status_oben = 0;

if(last_unten == 0 && status_unten == 1 ){ // IR unten regisitriert jemanden

Serial.println("Jetzt");

merker = true; // wird benötigt wenn Zeit abgelaufen ist, dann von oben nach unten oder unten nach oben
if (flag_up == 0){
   startzeit = millis();
   up_on();
}
   else
    down_off();
}
}

mkl0815

Hmm, kann man so erstmal nicht erkennen. Poste mal das ganze Programm.

maverick1509

Hier das ganze Programm ist noch nicht fertig, da ich verzweifelt den Fehler suche.
Alle Prints sind zum Fehler eingrenzen, komme aber nicht weiter weil das Programm
was völlig unnormales macht.


Code: [Select]
/*Treppen Beleuchtung*/
#define IRunten A0 // IR-Melder unten
#define IRoben A1 // IR-Melder oben

int LED_Pins[] = {22,24,26,28,30,32,34,36,23,25,27,29,31,33,35,37}; //Beleuchtung der einzelnen Stufen am Mega
long startzeit;
int flag_up,flag_down, merker;
int status_unten, status_oben, last_unten, last_oben;
int grenzw_unten = 200, grenzw_oben = 220; //Grenzwerte der IR-Dioden
int laufzeit=500;
int LED_Anzahl = sizeof(LED_Pins)/sizeof(int); // Anzahl der LEDs
void setup(){

  Serial.begin(9600);

pinMode(IRoben, INPUT);
pinMode(IRunten, INPUT);
for (int i = 0; i < LED_Anzahl; i++){
  pinMode(LED_Pins[i],OUTPUT);
}
}
void up_on(){// LEDs an von unten nach oben------------------------------------------------------------
flag_up = 1; flag_down = 0;

Serial.println("up_on");


for (int i = 0; i < LED_Anzahl; i++){
  digitalWrite(LED_Pins[i],HIGH); delay(laufzeit);}
}
void up_off(){// LEDs aus von unten nach oben------------------------------------------------------------
flag_up = 0; flag_down = 0;

Serial.println("....................................................");

for (int i = 0; i < LED_Anzahl; i++){
  digitalWrite(LED_Pins[i],LOW); delay(laufzeit);}
}
void down_on(){// LEDs an von oben nach unten------------------------------------------------------------
flag_down = 1; flag_up = 0;
for (int i = LED_Anzahl-1; i >= 0; i--){
  digitalWrite(LED_Pins[i],HIGH); delay(laufzeit);}
}
void down_off(){// LEDs aus von oben nach unten------------------------------------------------------------
flag_down = 0; flag_up = 0;

Serial.println("down_off");

for (int i = LED_Anzahl-1; i >= 0; i--){
   digitalWrite(LED_Pins[i],LOW); delay(laufzeit);}
}

void loop(){
last_unten = status_unten;
last_oben = status_oben;
if (analogRead(IRunten) > grenzw_unten) status_unten = 1; else status_unten = 0;
if (analogRead(IRoben) > grenzw_oben) status_oben = 1; else status_oben = 0;


Serial.print(analogRead(IRunten));
Serial.print("-----");
Serial.print(last_unten);
Serial.print("-----");

Serial.print(status_unten);
Serial.print("-----");
Serial.println(analogRead(IRoben));

if(last_unten == 0 && status_unten == 1 ){ // IR unten regisitriert jemanden


Serial.println("Jetzt");


merker = true; // wird benötigt wenn Zeit abgelaufen ist, dann von oben nach unten oder unten nach oben
if (flag_up == 0){
   startzeit = millis();
   up_on();
}
 
   else
    down_off();
}

/*
if(!last_oben && status_oben){ // IR oben registriert jemanden
startzeit = millis(); merker = false;
if (!flag_down) down_on(); else up_off();
}
*/

if (millis() - startzeit > 20000){// nach 20 sec wird ausgeschaltet
// merker zeigt letzte PIR- Auslösung an, unten true, oben false
if(merker) down_off(); else up_off();
}
}


JuergenR

#3
Feb 25, 2012, 05:10 pm Last Edit: Feb 25, 2012, 05:12 pm by JuergenR Reason: 1
Hallo,

sollte eigentlich vorher ausgegeben werden....

Mach mal in jeden Zweig der "If" noch eine Ausgabe.

Grüße,
Jürgen

mkl0815

Code: [Select]

if (millis() - startzeit >20000){// nach 20 sec wird ausgeschaltet
   // merker zeigt letzte PIR- Auslösung an, unten true, oben false
   if(merker) down_off(); else up_off();
}

Da ist der Aufruf von "down_off()" bei dem vorher kein "Jetzt" kommt.
Dein Automat (http://de.wikipedia.org/wiki/Endlicher_Automat), hat den Zustand "last_unten == 1" oder  "status_unten == 0", daher ist die Bedingung
Code: [Select]

  if(last_unten == 0 && status_unten == 1 ){ // IR unten regisitriert jemanden
    Serial.println("Jetzt");
    ...

nicht erfüllt und das "Jetzt" wird nicht ausgegeben. Das passiert in Deiner loop immer wieder. Irgendwann sind dann die 20 Sekunden rum, und der Code für die Zeitregelung greift. Da aber vorher irgendwann "merker=true" gesetzt wurde, wird halt "down_off()" aufgerufen. Das sollte dann genau der beobachtete Effekt sein.

maverick1509

danke dir, werde ich gleich mal überprüfen und ändern.

Go Up