Pages: [1]   Go Down
Author Topic: Ich blicke nicht mehr durch  (Read 558 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 10
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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();
 }
}
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 10
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*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();
 }
}

Logged

Heilbronn
Offline Offline
Full Member
***
Karma: 4
Posts: 152
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

sollte eigentlich vorher ausgegeben werden....

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

Grüße,
Jürgen
« Last Edit: February 25, 2012, 11:12:55 am by JuergenR » Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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:
  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.
Logged

Offline Offline
Sr. Member
****
Karma: 10
Posts: 361
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: