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
  Fragen :serielle eingabe und Externe Interrupts Treeshort 5 100 Gestern 17:03
Letzter Beitrag: MicroBahner
  433mHz Funkmodule senden/empfangen nicht metzgefa 2 300 06.05.2017 13:30
Letzter Beitrag: metzgefa
  2 Arduinos Serielle Übertragung mit SPI RFID Kit OE5AMP 18 449 05.05.2017 20:46
Letzter Beitrag: OE5AMP
  Firmata (Daten senden an den Arduino und empfangen vom Arduino) comfan 6 577 29.04.2017 14:29
Letzter Beitrag: hotsystems
  Daten auf der I2C Schnittstelle Franz54 2 209 15.03.2017 21:57
Letzter Beitrag: Franz54
  Seriell Daten senden / empfangen mi ProMini Maxel 4 742 13.02.2017 12:29
Letzter Beitrag: Tommy56
  Temperatur via SMS senden Obermuda 6 607 07.02.2017 12:27
Letzter Beitrag: Tommy56
  Problem mit Sketch senden an Uno feuerwehr 5 578 31.01.2017 20:41
Letzter Beitrag: Tommy56
  Arduino Serielle Schnittstelle auslesen mit Visual Basic Obermuda 1 343 29.01.2017 17:02
Letzter Beitrag: hotsystems
  Schnittstelle bergfrei 3 242 22.01.2017 22:17
Letzter Beitrag: Tommy56

Gehe zu:


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