INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Relaisrückkontakt zeitlich auswerten
01.05.2016, 17:37
Beitrag #1
Relaisrückkontakt zeitlich auswerten
Hallo zusammen,

ich gebe dem Mega2560 einen Schaltbefehl, so dass ein Relais eingeschaltet wird. Dieses Relais hat einen Hilfskontakt und meldet im Regelfall eine Spannung zurück, so dass ich sehen kann, dass dieses Relais mechanisch geschaltet hat.

Im Fehlerfall, also wenn keine Rückspannung kommt, möchte ich nach einer Zeit von einigen Sekunden definiert abschalten und eine Meldung ausgeben.
Kommt diese Rückmeldung innerhalb dieses Zeitfensters, so liegt ein normaler Betrieb vor, alles ok.

Einen Ausgang schalten und einen Taster oder Schalter abfragen ist schon klar. Wo ich Probleme habe, ist die Zeitüberwachung, in der das Rückmeldesignal zu erwarten ist.
Ich habe schon mit millis() usw. gespielt, komme aber nicht auf eine Lösung.
Für div. Blinkanzeigen usw. möchte ich die Timer-Library verwenden, weil das für mich zunächst einfacher zu durchblicken ist. Mit den Millis() habe ich schon meine Probleme.

Gibt es eine einfache Lösung oder es reicht mir auch ein Lösungsansatz, damit ich hier wieder Land sehe. Vielleicht kann mir hier jemand helfen, vielen Dank

Gruß Franz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.05.2016, 17:57
Beitrag #2
RE: Relaisrückkontakt zeitlich auswerten
Beispiel:

Hilfskontaktes standardmäßig HIGH.
Die Abfrage des Hilfskontaktes auf LOW (mit Pullup-Widerstand) setzen.
Wenn das Relais ziehen soll, dann "Timer" mit Millis starten und den Startwert in eine Variable geben.
Wenn Hilfskontakt (LOW) zieht, dann millis abfragen und von Variable abziehen.
Ergebnis ist Verzögerungszeit.

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.05.2016, 19:53
Beitrag #3
RE: Relaisrückkontakt zeitlich auswerten
Wenn du weiterhin mit dem Arduino arbeiten willst, würde ich dir empfehlen arbeiten mit "millis()" zu üben und es zu verstehen. Im Prinzip ist der Ablauf logisch:
Du hast ein Startsignal (Relais an).
Mit diesem Start setzt du einen Timer.
Dann wartest du eine Zeit auf ein weiteres Signal (Input auf HIGH).
Falls in dieser Zeit dieses Signal nicht kommt, Abbruch des Timers und Meldesignal.

Nun hast du mal eine Angabe und wandelst es Schritt für Schritt in einen Code um.
Fangen wir an:
Teil 1:
Code:
// das Startsignal (durch was es ausgelöst wird, hängt vom Programm ab):
    digitalWrite(relais, HIGH);
    // gleichzeitig einen timer von der jetzting Zeit setzten:
    timerStart = millis();
Teil 2:
Code:
// dann wartest du auf ein HIGH Rückgabesignal in einer bestimmten Zeit
    // d.h. ein Vergleich wie viel Zeit vom Start schon verstrichen ist:
    // wenn jetzige Zeit (z.b. 5s) minus Startzeit (z.b. 4,5s) kleiner als 1s ist
    if ((millis() - timerStart) < 1000) {
        // jetzt überprüfst du auf das Signal
        if (digitalRead(rückgabesignal) == HIGH) {
            relaisOK = true;
        }
        else; // ansonsten machst du nix
    }
    // ist die verstrichene Zeit jedoch länger als 1s kommst du hier rein, und eine Warnung kommt
    else {
        relaisOK = false;
    }
Teil 3:
Ausschalten

Erstmal logisch oder?
Nun wollen wir es zusammen fügen. Da es eigentlich drei Schritte sind brauchst du flags. Ist ein Schritt getan, kommst du zum nächsten. Zusammengefügt könnte es so ausschauen:
Code:
if ((flag == 0) && (relaisEinschalten == true)) {
        digitalWrite(relais, HIGH);
        timeStart = millis();
        flag = 1; // nächster Schritt
    }
    else if (flag == 1) {
        if ((millis() - timerStart) < 1000) {
            if (digitalRead(rückgabeSignal) == HIGH) {
                relaisOK = true;
                flag = 2;
            }
        }
        else {
            relaisOK = false;
            flag = 2;
        }
    }
    else if ((flag == 2) && (relaisAusschalten == true)) {
        digitalWrite(relais, LOW);
        flag = 0;
    }

Variablendeklarationen müssen natürlich davor stattfinden.

lg Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.05.2016, 10:36
Beitrag #4
RE: Relaisrückkontakt zeitlich auswerten
Hallo,

vielen Dank für den Ansatz. Selbst hatte ich schon fast den selben Weg eingeschlagen, hatte aber die Sache mit flag usw. noch nicht ausgearbeitet.

Nun habe ich das Beispiel mal in einen lauffähigen Code gesetzt, habe aber das Problem, dass ich zwar "flag=1" bekomme, aber die nächste Stufe mit "else if (flag == 1) {...." und den Kontrollanzeigen mit "millis()" nicht erreiche. Irgendwas ist noch nicht ok, komme aber nicht drauf. Wenn ich "flag" abfrage, so kommt die Meldung mit "1" zurück.
Zum Simulieren habe ich zwei Schalter und drei LED's lt.
Den Teil ab der Mitte kann ich so nicht testen. Hat hier jemand eine Erklärung, warum ich nicht in die nächste Programmgruppe einsteigen kann?

Code
Code:
// constants won't change. They're used here to
// set pin numbers:
const int btnPin_Start = 6;     // Schalter Nr. 1...Startknopf fuer 'Schuetz ein'
const int btnPin_Quit = 9;      // Schalter Nr. 4... Rueckmeldesignal, wenn Schuetz ein

const int ledPin_Output = 2;    // the number of the LED pin
const int ledPin_Quit = 3;     // the number of the LED pin
const int ledPin_Alarm = 4;     // the number of the LED pin

//unsigned long previousMillis = 0;
unsigned long timeStart = 0;
int relaisOK = 0;

// Startbedingungen vorgeben:
int relaisEinschalten = 0;        // variable for reading the pushbutton status
int rueckgabeSignal = 0;          // variable for reading the pushbutton status
int flag = 0;

//---------------------------------------------
void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin_Output, OUTPUT);       //LED als Ausgang definieren
  pinMode(ledPin_Quit, OUTPUT);
  pinMode(ledPin_Alarm, OUTPUT);

  digitalWrite(ledPin_Output, HIGH);    //LED beim Programmstart ausschalten
  digitalWrite(ledPin_Quit, HIGH);
  digitalWrite(ledPin_Alarm, HIGH);
  
  // initialize the pushbutton pin as an input:
  pinMode(relaisEinschalten, INPUT);    //Schalter als Eingang definieren
  pinMode(rueckgabeSignal, INPUT);
  Serial.begin(9600);
}

//---------------------------------------------

void loop() {
  // put your main code here, to run repeatedly:

//Relais_Start-Schuetz einschalten

relaisEinschalten = digitalRead(btnPin_Start);    //Schalter abfragen
if (relaisEinschalten == HIGH) {    
      digitalWrite(ledPin_Output, LOW);            //Ausgang, LED als Ersatz fuer Relais
      Serial.print("Relais ein");
      flag = 0;

if ((flag == 0) && (relaisEinschalten == HIGH)) {
        //digitalWrite(ledPin_Output, LOW);
        //Serial.println(flag);
        timeStart = millis();
        Serial.print("     ...flag =  ");
        flag = 1; // nächster Schritt
         Serial.println(flag);
    }
    else if (flag == 1) {
      Serial.println("     else if ");          //Kontrollanzeige
        if ((millis() - timeStart) < 5000)
        {
            rueckgabeSignal = digitalRead(btnPin_Quit);
            if (rueckgabeSignal == HIGH) {
               Serial.print(" millis()=  ");
               Serial.print(millis());
               Serial.print(" timeStart =  ");
               Serial.print(timeStart);
               Serial.print("    ");
               relaisOK = true;
               Serial.println(" RelaisOK=true    flag = 2 ");
                flag = 2;
            }
        }
        else {
            relaisOK = false;
            flag = 2;
        }
        }
    }
    else if ((flag == 2) && (relaisEinschalten == LOW)) {
        digitalWrite(ledPin_Output, HIGH);
        digitalWrite(ledPin_Alarm, LOW);
         Serial.println(" RelaisOK=false    flag = 0 Relais ausgeschaltet");
        flag = 0;
    }
    delay(500);
    }
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.05.2016, 18:17
Beitrag #5
RE: Relaisrückkontakt zeitlich auswerten
Ist dein relaisEinschalten wirlich ein Schalter oder nur ein Taster? Wenn es ein Taster ist, kommt der dann nähmlich nicht mehr zu flag == 1 hinein, da bei dir die allererste IF-Abfrage auf HIGH ist, und somit den Rest ausfällen, lässt wenn er LOW ist (im Falle eines Tasters).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2016, 08:46
Beitrag #6
RE: Relaisrückkontakt zeitlich auswerten
Hallo,

natürlich ist es ein Schalter. Aber den Fehler habe ich schon gefunden.
Das Flag ist ja nur ein Schrittgeber, damit ich in den nächsten Part steuern kann.
Ich hatte einen Schreibfehler, es muss lauten: flag = 1 und nicht flag == 1. Das Flag hat ja einen Wert und ist nicht logisch HIGH oder LOW.
Aber das Konstrukt hat mir soweit weitergeholfen und den Rest muss ich noch austesten, danke.

Franz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  NRF24L01,Empfangene Daten auswerten Marc2014 9 510 30.07.2016 19:34
Letzter Beitrag: rkuehle
  String - Buchstabenposition auswerten scritch 5 658 01.04.2016 16:25
Letzter Beitrag: rkuehle
  Ankommende Daten(Webserver) am MEGA2560 für eine Aktion auswerten ? arduinofan 0 478 11.12.2015 09:06
Letzter Beitrag: arduinofan
  Hilfe bei RC-Empfänger Signale auswerten und verarbeiten Pat12-6 7 1.673 19.03.2015 20:17
Letzter Beitrag: Eichner
  RC-Empfänger-Signal auswerten DerFranke 6 3.412 18.09.2014 21:06
Letzter Beitrag: scritch
  Mit Processing Binär Daten vom Arduino auswerten. Hilfe bitte! Rene S. 1 2.012 11.11.2013 19:38
Letzter Beitrag: Rene S.
  String auswerten Johngun 3 2.323 23.06.2013 22:44
Letzter Beitrag: Johngun

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste