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
serielle Schnittstelle, nur bei Zustandswechsel senden
06.08.2014, 14:46
Beitrag #1
serielle Schnittstelle, nur bei Zustandswechsel senden
Hallo Leute,

ich habe ein Problem und zwar im "loop" wird zb. bei überschreiten der Temperatur
( > 30,00 Grad ) ein "T" über die serielle Schnittstelle gesendet allerdings immer solang es die Temperatur nicht wieder unterschreitet. Das selbe Problem habe ich beim
void regen() , mit einem "R".

Wie kann ich das lösen das es nur bei Zustandsänderung 1 mal geschickt wird?

Also zb. Es regnet nicht, dann regnet es nun soll einmal ein "R" über die serielle geschickt werden. Sobald es aufhört zu regnen zb. einmalig ein "S" (nur als Beispiel).

Hier mein Code:


Code:
// Homecontrol Basisstation 1        Version 1.7 Beta

// Programm für Basisstation 1 mit APC-220, I2C BUS, DS18B20 Temp Sensor, LDR Sensor, Regensensor.



//################################################################################​################################################################################​###########################################

int empfangen;                    // Speicher für die Speicherung im "loop" Ablauf der seriellen Daten.


//################################################################################​################################################################################​############################################
                                                                                                                              
const int lichtMin = 200;         // LDR Sensor minimum Wert.                                                                
const int lichtMax = 800;         // LDR Sensor maximum Wert.

//################################################################################​################################################################################​############################################

const int regenMin = 200;         // RegenSensor minimum Wert.
const int regenMax = 600;         // RegenSensor maximum Wert.



//################################################################################​################################################################################​############################################




#include <OneWire.h>              // Library einbinden.

#include <DallasTemperature.h>    // Library einbinden.

#define ONE_WIRE_BUS 10           // Digitalport Pin "10" für oneWire_Bus.

OneWire ourWire(ONE_WIRE_BUS);    // Inistalisiere oneWire.

DallasTemperature sensors(&ourWire); // Dallas Temperatur Library für Nutzung der oneWire Library vorbereiten.

//################################################################################​################################################

#include <RCSwitch.h>            // Library einbinden.

RCSwitch mySwitch = RCSwitch();  

// Pir 1 = ID : xxxxxxxxx        // ID des Bewegungsmelders 1 ( 433Mhz ID Code ).
// Pir 2 = ID : xxxxxxxxx        // ID des Bewegungsmelders 2 ( 433Mhz ID Code ).
// Pir 3 = ID : xxxxxxxxx        // ID des Bewegungsmelders 3 ( 433Mhz ID Code ).

//################################################################################​################################################

// #include <Wire.h>                // Library einbinden.               !!! WIRD MOMENTAN NICHT VERWENDET !!!
// #include "RTClib.h"              // Library einbinden.

// RTC_DS1307 RTC;      

// (now.year() , (now.month() , (now.day() , (now.hour() , (now.minute() , (now.second() .   // Mögliche Abfragen.

//################################################################################​################################################





//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


  void setup() {    
    
    
    sensors.begin();              // oneWire Sensoren einschalten ( bsp. Dallas Temperatur).

    
    
    pinMode(7, OUTPUT);           // Led Status (grün) 3mm. (Im Gehäuse).
    
  
    Serial.begin(9600);           // Serielle Schnittstelle instalisieren mit Baudrate 9600. (Wird von APC-220 genutzt falls kein PC angeschlossen (USB) ist.
    
   // Serial.println("System bereit");
    
    digitalWrite(7, HIGH);
    delay(500);
    digitalWrite(7, LOW);
    delay(500);
    digitalWrite(7, HIGH);
    delay(500);
    digitalWrite(7, LOW);
    

    mySwitch.enableReceive(0);    // Receiver an inerrupt Eingang 0 => (pin #2). ( FÜR RCSWITCH Empfänger) oder 433MhZ Sensoren zb. Pir Melder, 433 Mhz Fernbedinungen usw.

    // Wire.begin();              // I2C für RTC UHR einschalten. !!! MOMENTAN NICHT VERWENDET !!! ///////
  
    // RTC.begin();               // RTC starten. // !!! MOMENTAN NICHT VERWENDET !!! ///////
  
    }

  
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


void temperatur() {
  
   sensors.requestTemperatures();               // Temperatur abfragen.

   Serial.print(sensors.getTempCByIndex(0) );   // Temperatur des Sensors mit dem Index (ID) "0" über die Serielle Schnittstelle ausgeben.
    
   Serial.println(" Grad Celsius");             // Über die Serielle Schnittstelle "xxxxxxxxxxxxxx" ausgeben. Bsp: Grad Celsius.
  
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


void licht() {
  
  
   int sensorReading = analogRead(A0);    // Sensor am analog port 0 lesen
  
  
   int range = map(sensorReading, lichtMin, lichtMax, 0, 3); // umwandeln in 4 Bereiche

  
   switch (range) {                       // Bereich erkennen
    
    case 0:                               // Aktion 0
    
    Serial.println("0");
  
     delay(1000);
     break;
    
    
    case 1:                               // Aktion 1
    
        Serial.println("1");

  
     delay(1000);
     break;
    
    case 2:                               // Aktion 2
    
        Serial.println("2");

    
     delay(1000);
     break;
    
    
     case 3:                              // Aktion 3
    
         Serial.println("3");

    
     delay(1000);
     break;
    
     delay(1);                            // pause zur Stabilität
  
     }
   }
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  void regen() {
    
   int sensorReading = analogRead(A1);    // Regen-Sensor am analog port 1 lesen
  
  
   int regen = map(sensorReading, regenMin, regenMax, 0, 2); // umwandeln in 3 Bereiche

  
  switch (regen) {                         // Bereich erkennen
    
   case 0:                                 // Aktion 1
  
  
    delay(1000);
    break;
    
    
     case 1:                               // Aktion 2
    

  
     delay(1000);
      break;
      
      
     case 2:                               // Aktion 3
    
        Serial.println("R");               // Anweisungsinfo (R) = Es regnet!

  
     delay(1000);
      break;
    
    
    
   }
  }
  
  
  
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


  
  void rc_switch() {
    
     Serial.print("Received ");
    
     int value = mySwitch.getReceivedValue();

     if (mySwitch.getReceivedValue() == 16777055) {
      
          digitalWrite(7, HIGH);
          Serial.print( mySwitch.getReceivedValue() );
          delay(2500);
          digitalWrite(7, LOW);
          
          Serial.println("2");                                   // Code für Spark Core Event "xxxxxxx"
          
          delay(60000);                                          // Warte um keinen Fehler im Spark Core zu erzeugen wegen doppeltem Post.

      
    } else {
      
           Serial.print( mySwitch.getReceivedValue() );
    

    }

  
     delay(2500);
     mySwitch.resetAvailable();

      
    }  
    

  
  
  
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  
  
   void loop() {
    
      regen();
      
     //  licht();
    
    
      sensors.requestTemperatures();                 // Temperaturen abrufen. I2C Bus.
      
      sensors.getTempCByIndex(0);                    // Temperaturen in C abfragen.
      
    
      if (sensors.getTempCByIndex(0) > 30.00) {     // If Anweisung: ist die gemessene Temperatur größer als "Wert hinter > xx.xx dann Anweisung ansonsten Anweisung.
      
        Serial.println("T");                        // Anweisungsinfo (T) = Temperatur über 30,00 Grad !
      
  
        }  
        
  
   else {
        
    
        }
        
        
        if (mySwitch.available()) {
    
        int value = mySwitch.getReceivedValue();
    
        if (value == 0) {
      
                                                     // Frei für "aktion".
      
        } else {
      
        rc_switch();                                 // Auswertung des Ereignisses ( 433Mhz Sensoren + Fernbedinungen).
      

      }
    
    
    
    
    
      
      }
      
    
      }


    
// END PROGRAM ////////////////////////////// END PROGRAM ////////////////////////////// END PROGRAM ////////////////////////////// END PROGRAM ////////////////////////////// END PROGRAM //////////////////////////////


Gruß Marc Wink

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.08.2014, 15:44
Beitrag #2
RE: serielle Schnittstelle, nur bei Zustandswechsel senden
Hallo Marc,

ich habe in den Zeilen 10, (11), 265,267,274 was eingebaut.

Code:
// Homecontrol Basisstation 1        Version 1.7 Beta

// Programm für Basisstation 1 mit APC-220, I2C BUS, DS18B20 Temp Sensor, LDR Sensor, Regensensor.



//################################################################################​​###############################################################################​#​###########################################

int empfangen;                    // Speicher für die Speicherung im "loop" Ablauf der seriellen Daten.
boolean t_gesendet = false;       // Merker "T" gesendet
boolean r_gesendet = false;       // Merker "R" gesendet

//################################################################################​​###############################################################################​#​############################################
                                                                                                                              
const int lichtMin = 200;         // LDR Sensor minimum Wert.                                                                
const int lichtMax = 800;         // LDR Sensor maximum Wert.

//################################################################################​​###############################################################################​#​############################################

const int regenMin = 200;         // RegenSensor minimum Wert.
const int regenMax = 600;         // RegenSensor maximum Wert.



//################################################################################​​###############################################################################​#​############################################




#include <OneWire.h>              // Library einbinden.

#include <DallasTemperature.h>    // Library einbinden.

#define ONE_WIRE_BUS 10           // Digitalport Pin "10" für oneWire_Bus.

OneWire ourWire(ONE_WIRE_BUS);    // Inistalisiere oneWire.

DallasTemperature sensors(&ourWire); // Dallas Temperatur Library für Nutzung der oneWire Library vorbereiten.

//################################################################################​​################################################

#include <RCSwitch.h>            // Library einbinden.

RCSwitch mySwitch = RCSwitch();  

// Pir 1 = ID : xxxxxxxxx        // ID des Bewegungsmelders 1 ( 433Mhz ID Code ).
// Pir 2 = ID : xxxxxxxxx        // ID des Bewegungsmelders 2 ( 433Mhz ID Code ).
// Pir 3 = ID : xxxxxxxxx        // ID des Bewegungsmelders 3 ( 433Mhz ID Code ).

//################################################################################​​################################################

// #include <Wire.h>                // Library einbinden.               !!! WIRD MOMENTAN NICHT VERWENDET !!!
// #include "RTClib.h"              // Library einbinden.

// RTC_DS1307 RTC;      

// (now.year() , (now.month() , (now.day() , (now.hour() , (now.minute() , (now.second() .   // Mögliche Abfragen.

//################################################################################​​################################################





//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


  void setup() {    
    
    
    sensors.begin();              // oneWire Sensoren einschalten ( bsp. Dallas Temperatur).

    
    
    pinMode(7, OUTPUT);           // Led Status (grün) 3mm. (Im Gehäuse).
    
  
    Serial.begin(9600);           // Serielle Schnittstelle instalisieren mit Baudrate 9600. (Wird von APC-220 genutzt falls kein PC angeschlossen (USB) ist.
    
   // Serial.println("System bereit");
    
    digitalWrite(7, HIGH);
    delay(500);
    digitalWrite(7, LOW);
    delay(500);
    digitalWrite(7, HIGH);
    delay(500);
    digitalWrite(7, LOW);
    

    mySwitch.enableReceive(0);    // Receiver an inerrupt Eingang 0 => (pin #2). ( FÜR RCSWITCH Empfänger) oder 433MhZ Sensoren zb. Pir Melder, 433 Mhz Fernbedinungen usw.

    // Wire.begin();              // I2C für RTC UHR einschalten. !!! MOMENTAN NICHT VERWENDET !!! ///////
  
    // RTC.begin();               // RTC starten. // !!! MOMENTAN NICHT VERWENDET !!! ///////
  
    }

  
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


void temperatur() {
  
   sensors.requestTemperatures();               // Temperatur abfragen.

   Serial.print(sensors.getTempCByIndex(0) );   // Temperatur des Sensors mit dem Index (ID) "0" über die Serielle Schnittstelle ausgeben.
    
   Serial.println(" Grad Celsius");             // Über die Serielle Schnittstelle "xxxxxxxxxxxxxx" ausgeben. Bsp: Grad Celsius.
  
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


void licht() {
  
  
   int sensorReading = analogRead(A0);    // Sensor am analog port 0 lesen
  
  
   int range = map(sensorReading, lichtMin, lichtMax, 0, 3); // umwandeln in 4 Bereiche

  
   switch (range) {                       // Bereich erkennen
    
    case 0:                               // Aktion 0
    
    Serial.println("0");
  
     delay(1000);
     break;
    
    
    case 1:                               // Aktion 1
    
        Serial.println("1");

  
     delay(1000);
     break;
    
    case 2:                               // Aktion 2
    
        Serial.println("2");

    
     delay(1000);
     break;
    
    
     case 3:                              // Aktion 3
    
         Serial.println("3");

    
     delay(1000);
     break;
    
     delay(1);                            // pause zur Stabilität
  
     }
   }
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  void regen() {
    
   int sensorReading = analogRead(A1);    // Regen-Sensor am analog port 1 lesen
  
  
   int regen = map(sensorReading, regenMin, regenMax, 0, 2); // umwandeln in 3 Bereiche

  
  switch (regen) {                         // Bereich erkennen
    
   case 0:                                 // Aktion 1
  
  
    delay(1000);
    break;
    
    
     case 1:                               // Aktion 2
    

  
     delay(1000);
      break;
      
      
     case 2:                               // Aktion 3
    
        Serial.println("R");               // Anweisungsinfo (R) = Es regnet!

  
     delay(1000);
      break;
    
    
    
   }
  }
  
  
  
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


  
  void rc_switch() {
    
     Serial.print("Received ");
    
     int value = mySwitch.getReceivedValue();

     if (mySwitch.getReceivedValue() == 16777055) {
      
          digitalWrite(7, HIGH);
          Serial.print( mySwitch.getReceivedValue() );
          delay(2500);
          digitalWrite(7, LOW);
          
          Serial.println("2");                                   // Code für Spark Core Event "xxxxxxx"
          
          delay(60000);                                          // Warte um keinen Fehler im Spark Core zu erzeugen wegen doppeltem Post.

      
    } else {
      
           Serial.print( mySwitch.getReceivedValue() );
    

    }

  
     delay(2500);
     mySwitch.resetAvailable();

      
    }  
    

  
  
  
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  
  
   void loop() {
    
      regen();
      
     //  licht();
    
    
      sensors.requestTemperatures();                 // Temperaturen abrufen. I2C Bus.
      
      sensors.getTempCByIndex(0);                    // Temperaturen in C abfragen.
      
    
      if (sensors.getTempCByIndex(0) > 30.00) {     // If Anweisung: ist die gemessene Temperatur größer als "Wert hinter > xx.xx dann Anweisung ansonsten Anweisung.
      
        if (!t_gesendet) {
        Serial.println("T");                        // Anweisungsinfo (T) = Temperatur über 30,00 Grad !
        t_gesendet = true;
          }
        }  
        
  
   else {
        
        t_gesendet = false;
    
        }
        
        
        if (mySwitch.available()) {
    
        int value = mySwitch.getReceivedValue();
    
        if (value == 0) {
      
                                                     // Frei für "aktion".
      
        } else {
      
        rc_switch();                                 // Auswertung des Ereignisses ( 433Mhz Sensoren + Fernbedinungen).
      

      }
    
    
    
    
    
      
      }
      
    
      }


    
// END PROGRAM ////////////////////////////// END PROGRAM ////////////////////////////// END PROGRAM ////////////////////////////// END PROGRAM ////////////////////////////// END PROGRAM //////////////////////////////

Schau mal ob das für die Temperatur so funktioniert.
Wenn ja, kannst du das für den Regen genauso machen.

In "t_gesendet" merkt sich das Programm ob das "T" schon gesendet wurde.
Der Wert wird "true" wenn schon mal gesendet ist und "false" wenn die Temperatur wieder <30°C wird.

Gruß,
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.08.2014, 18:23
Beitrag #3
RE: serielle Schnittstelle, nur bei Zustandswechsel senden
Vielen Dank Wink

Hat super funktioniert!

Gruß Marc

Shy
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+ "Ping" senden, empfangen, bestätigen MeisterQ 8 379 23.08.2016 13:19
Letzter Beitrag: MeisterQ
  Problem mit ESP8266 und EMail senden torsten_156 1 597 13.06.2016 21:14
Letzter Beitrag: torsten_156
  Serielle Schnittstelle - Daten empfangen Datatom 8 778 22.05.2016 18:10
Letzter Beitrag: avoid
  wie Parameter der seriellen Schnittstelle anpassen? avoid 6 482 29.04.2016 16:44
Letzter Beitrag: avoid
  Sensordaten per I2C senden ElAleMaNo 2 687 30.03.2016 23:44
Letzter Beitrag: ElAleMaNo
  Daten per Ethernet Shield 2 senden Mark79 3 865 22.03.2016 19:29
Letzter Beitrag: Mark79
  "WORT" über die serielle Schnittstelle auslesen hannes77 1 527 08.03.2016 12:13
Letzter Beitrag: Binatone
  Datei von SD an anderen Arduino senden ProgrammierTier 1 541 02.02.2016 09:05
Letzter Beitrag: hotsystems
Bug Problem mit DMX senden Helyx 2 514 31.01.2016 23:20
Letzter Beitrag: Helyx
  array von Php --> Arduino zu senden (ethernet) Mourti 0 441 27.01.2016 22:11
Letzter Beitrag: Mourti

Gehe zu:


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