Aktion nur einmal ausführen



  • Ich stehe grade vor eine großem Problem, ich hab nächste Woche Meisterorüfung und krieg die Programmierung für eine Art Alarmübertrager nicht hin.

    Ich checke mit dem Programm einen Eingang an meinem Raspberry. Wenn dieser aktiv ist soll er EINMAL 2 Befehle ausführen und eine LED aktivieren. Erst wenn der Eingang wieder inaktiv ist soll er die LED zurücksetzten und wieder warten bis der Eingang wieder aktiv ist.

    ich hab schonmal einen Code geschrieben. Leider führt er diesen aber sekündlich aus solange der Eingang aktiv ist..... BITTE HELFEN!!! 😕 😕 😕 😕

    #include <wiringPi.h>
    #include <sys/types.h>                        
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    
    #define AlarmLed 6
    #define AlarmEingang 4
    #define ScharfEingang 3
    #define Stoerungsrelais 1
    
    int main(void) {
    
    	pinMode(Stoerungsrelais, OUTPUT);
    
    	if(wiringPiSetup() == -1){ //Wenn inizialisierung fehlgeschlagen:
    		printf("Stoerung!");
    		digitalWrite(Stoerungsrelais, HIGH);
    		delay (1000);
    		return 1;
    	                         }
    
    	pinMode(AlarmLed, OUTPUT);
    	pinMode(AlarmEingang, INPUT);
    	pinMode(ScharfEingang, INPUT);
    
    	//Stabiles Level für GPIO
    	pullUpDnControl(AlarmEingang, PUD_UP); 
    	pullUpDnControl(ScharfEingang, PUD_UP);
    
    while(1){
    		int state;
    		state=0;
    		digitalWrite(AlarmLed, LOW);
    		if((digitalRead(AlarmEingang) == 1) && (digitalRead(ScharfEingang) == 0))
    		{ //Prüfen ob beide Eingänge Alarm ausgelöst und Eingang scharf aktiv ist
    		digitalWrite(AlarmLed, HIGH); delay (1000);//AlarmLed aktiv
    		system("/usr/bin/python /home/pi/AlarmMail.py");
    		system("/usr/bin/python /home/pi/AlarmSMS.py");
    		state=1; 
            }
    		if((digitalRead(AlarmEingang) == 0)&&(state = 1))
    		{ //Feststellen ob Eingang ausgelöst
    		digitalWrite(AlarmLed, LOW);//SaboLed aus
            state=0; 
    		}
    		delay(500); 
    }
    
    	return 0;
                     }
    

  • Mod

    Du musst dir das Ergebnis der vorherigen Messung merken.



  • ich denke Problem ist Zeile 39 und 40

    "int state;
    state=0;"

    ich würde das gerne nur einmal festlegen am anfang des Codes vor der While schleife aber das nimmt er leider nicht...

    so setzt er meinen status jedesmal wieder auf 0 zurück somit ist meine festlegung state=1 in der ersten IF Abfrage sinnlos....


  • Mod

    patrickloibl schrieb:

    ich würde das gerne nur einmal festlegen am anfang des Codes vor der While schleife aber das nimmt er leider nicht...

    Dann ist ja genau klar, was für eine Art von Fehler gemeint ist.



  • Verstehe ich leider nicht...



  • patrickloibl schrieb:

    Verstehe ich leider nicht...

    Das war Ironie.
    Negiere die Aussage von SeppJ.

    Und das bezieht sich auf deinen Teilsatz

    patrickloibl schrieb:

    aber das nimmt er leider nicht...

    Du musst an deinem Einrückungsstil arbeiten: https://de.wikipedia.org/wiki/Einrückungsstil
    Such dir einen aus und bleibe bei dem.



  • Verschiebe Zeile 39 nach Zeile 17, also "int state;" ausserhab der main anlegen.



  • Andromeda schrieb:

    Verschiebe Zeile 39 nach Zeile 17, also "int state;" ausserhab der main anlegen.

    Das ist Quatsch.

    Es bringt kein anderes Verhalten und es gibt eine (böse) globale Variable.

    Eine zusätzliche Variable old_state könnte hlifreich sein.



  • Wieso nicht einfach

    int main(void) {
    
        int state = 0;
    .
    .
    .
    .
    . 
    
        while(1){
    .
    .
    .
    

    PS. in C müssen Variablendeklarationen in jedem Block VOR allem anderem stehen. In C++ kanns auch mitten drinnen sein.

    Gruß
    Franz



  • DirkB schrieb:

    Eine zusätzliche Variable old_state könnte hlifreich sein.

    Eher eine switch-Anweisung.
    "state" weisst darauf hin, dass er ein State-Machine bauen will.

    int state = 0;
    
    while(1)
    {
       switch (state)
       {
          case 0:
          if (eingang_aktiv())
          {
             mach_was();
             state = 1;
          }
          break;
    
          case 1:
          if (eingang_inaktiv())
          {
             mach_nochwas();
             state = 0;
          }
          break;
       }
    }
    


  • Depp. Klappe halten, wenn man keine Ahnung hat.



  • sd582 schrieb:

    PS. in C müssen Variablendeklarationen in jedem Block VOR allem anderem stehen.

    Seit C99, immerhin auch schon 17 Jahre alt, muss das nicht mehr sein.



  • DirkB schrieb:

    sd582 schrieb:

    PS. in C müssen Variablendeklarationen in jedem Block VOR allem anderem stehen.

    Seit C99, immerhin auch schon 17 Jahre alt, muss das nicht mehr sein.

    Sind noch viele alten Compiler in Gebrauch.
    Ich glaube, noch nicht einmal der C-Compiler von Mickrigweichs "Visual Studio" versteht C99.



  • Depp. Klappe halten, wenn man keine Ahnung hat.



  • Wutz schrieb:

    Depp. Klappe halten, wenn man keine Ahnung hat.

    Was ist denn mit dir los?



  • Lass deine Anfängervermutungen stecken.
    Halt die Klappe, weil du sonst nur Unsinn verbreitest, die andere Leute mit Ahnung nur wieder geradebiegen müssen.



  • Andromeda schrieb:

    Sind noch viele alten Compiler in Gebrauch.
    Ich glaube, noch nicht einmal der C-Compiler von Mickrigweichs "Visual Studio" versteht C99.

    Seit VS-2013 ist es besser geworden. Mit VS-2015 nochmal.

    Auf einem Raspberry wird wohl gcc zum Einsatz kommen. Und der kann C99.
    Da das Programm auch nicht so unter Windows laufen wird, braucht auch keine Rücksicht auf den Mangel von VS genommen werden.



  • Wutz schrieb:

    Lass deine Anfängervermutungen stecken.
    Halt die Klappe, weil du sonst nur Unsinn verbreitest, die andere Leute mit Ahnung nur wieder geradebiegen müssen.

    So entspann dich wieder, lieber Freund.

    In einem Diskussionsforum soll üblicherweise diskutiert werden. Berichtige mich, wenn ich etwas Falsches sage. Aber Pöbeln hilft keinem.



  • Für allen anderen, die deinen "Vermutungen" glauben würden, korrigiere ich deinen Anfängerunsinn entsprechend dem Qualitätsgrad deiner Äußerungen.



  • DirkB schrieb:

    Auf einem Raspberry wird wohl gcc zum Einsatz kommen. Und der kann C99.

    Hat der Threadstarter nicht gesagt, dass er die State-Variable nicht direkt über dem while-block anlegen kann?



  • Wutz schrieb:

    Für allen anderen, die deinen "Vermutungen" glauben würden, korrigiere ich deinen Anfängerunsinn entsprechend dem Qualitätsgrad deiner Äußerungen.

    Dann ist doch alles gut. 🙂


Anmelden zum Antworten