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
Unterprogramme, aktiv / inaktiv per Serielle, 3 von 4
16.08.2014, 12:04
Beitrag #1
Unterprogramme, aktiv / inaktiv per Serielle, 3 von 4
Hey Leute,

Ich habe hier mein Programm das einige Unterprogramme beinhaltet diese werden
über Serielle Befehle Aktiv / Inaktiv geschaltet.

Alles funktioniert 1A bis auf das einschalten des Unterprogramm "licht" ?!

Hat jemand eine Idee wo mein Fehler ist oder was ich übersehen habe?

Hier der code:

Code:
// Homecontrol Basisstation 1        Version 2.0 Beta

// Programm für Basisstation 1 mit APC-220, I2C BUS, DS18B20 Temp Sensor, LDR Sensor, Regensensor, 433mhz Sensoren, Alarmanlage.
// Die Meldungen für Regen und Temperaturüberschreitung wird nur bei Zustandsänderung übertragen.
// Regenerkennung nach Zustandsänderung.
// Erkennung der 4 Fernbedienungen der Alarmanlage. ( Out arm, Disarm, Home arm, Alarm).
// Merkt sich die Befehle die an die Alarmanlage gesendet wurden.
// Merkt sich welches Unterprogramm gewünscht wird und schaltet es dementsprechend aktiv / inaktiv. *

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

char buffer1;                       // Eingabe Zeichenpuffer  ( Buchstaben oder Wörter oder Zahlen ).
String command = "";                // GesamtString von SerialRead

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

boolean unterprogrammalarmanlage = false; // Merker Unterprogramm "alarmanlage" aktiv / deaktiv.    

boolean outarm   = false;          // Merker Status "outarm"
boolean disarm   = false;          // Merker Status "disarm"
boolean homearm  = false;          // Merker Status "homearm"
boolean alarm    = false;          // Merker Status "alarm"

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

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.

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

boolean unterprogrammlicht = false; // Merker Unterprogramm "licht" aktiv / deaktiv.    
                                                                                                                              
const int lichtMin = 200;           // LDR Sensor minimum Wert.                                                                
const int lichtMax = 800;           // LDR Sensor maximum Wert.

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

boolean unterprogrammregen = false; // Merker Unterprogramm "regen" aktiv / deaktiv.    

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



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

boolean unterprogrammtemperatur = false;

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



#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();  

// Fernbedienung (01)             = ID :              //  2086336 Out arm,  2086156 disarm,  2086147 Home arm,  2086192 Alarm.
// Fernbedienung (02)             = ID :              // 15826368 Out arm, 15826188 disarm, 15826179 Home arm, 15826224 Alarm.
// Fernbedienung (03)             = ID :              //  1377728 Out arm,  1377548 disarm,  1377539 Home arm,  1377584 Alarm.
// Fernbedienung (04)             = ID :              // 13043648 Out arm, 13043468 disarm, 13043459 Home arm, 13043504 Alarm.



// Pir 1 (Zone01)             = ID : 16773461         // ID des Bewegungsmelders 1  Wohnzimmer Oma       ( 433Mhz ID Code ).
// Pir 2 (Zone02)             = ID : 16774485         // ID des Bewegungsmelders 2  Oma Flur             ( 433Mhz ID Code ).
// Pir 3 (Zone04)             = ID : xxxxxxxxx        // ID des Bewegungsmelders 3                       ( 433Mhz ID Code ).
// Pir 4 (Zone05)             = ID : xxxxxxxxx        // ID des Bewegungsmelders 4                       ( 433Mhz ID Code ).

// Fensterkontakt 1 (Zone03)  = ID : 16776533         // ID des Fensterkontakt's 1 Fensterkontakt Oma SZ ( 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.
    
    digitalWrite(7, HIGH);                      // System Bereit Led "ON".
    

    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() {
  
  
     Serial.println("Temperaturprogrammaktiv");    // DEBUG INFO
  
            
  
  
  
   sensors.requestTemperatures();                  // Temperatur abfragen.

   // Serial.print(sensors.getTempCByIndex(0) );   // (für DEBUG) Temperatur des Sensors mit dem Index (ID) "0" über die Serielle Schnittstelle ausgeben.
    
   // Serial.println(" Grad Celsius");             // (für DEBUG) Über die Serielle Schnittstelle "xxxxxxxxxxxxxx" ausgeben. Bsp: Grad Celsius.
  
     if (sensors.getTempCByIndex(0) > 32.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;
    
        }
  
}

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


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");                                       // DEBUG Ausgabe
      
     delay(1000);
     break;
    
    
    case 1:                                                      // Aktion 1
    
      Serial.println("1");                                       // DEBUG Ausgabe

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

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

     delay(1000);
     break;
    
    
     delay(1);                                                   // pause zur Stabilität
  
     }
   }
  
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  void regen() {
    
   int sensorReading = analogRead(A1);                           // Regen-Sensor am Analog Port "1" lesen.
  
   // Serial.println(analogRead(A1));                            // (für DEBUG) Zur Kontrolle des Analogwertes für "regen" . (einfach auskommentieren).
  
  
   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
    
   if  (!r_gesendet) {
        Serial.println("R");                                     // Anweisungsinfo (R) = Es hat angefangen zu regnen !
        r_gesendet = true;
          }
          
  
      else {
        
        r_gesendet = false;
    
        }
    

     delay(1000);
      break;
    
   }
  }
  

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


  
  void rc_switch() {                                   // Alarm
    
       if (mySwitch.available()) {                     // Wurde ein Signal empfangen dann...
      
       int value = mySwitch.getReceivedValue();
    
    

           if (mySwitch.getReceivedValue() == 2086336 || mySwitch.getReceivedValue() == 15826368 || mySwitch.getReceivedValue() == 1377728 || mySwitch.getReceivedValue() == 13043648) {      // Out Arm
      
      
      // Serial.print( mySwitch.getReceivedValue() );   // (für DEBUG) Ausgabe des Empfangenen Wertes.
        
          // Serial.print("");
          
          if  (!outarm) {                              // ! = nicht
        Serial.println("outarm on");                      
        outarm = true;                                
          }
          
     else {
                Serial.println("outarm off");                        
        outarm = false;                                
    
     }

          
          
      
    } else if (mySwitch.getReceivedValue() == 2086156 || mySwitch.getReceivedValue() == 15826188 || mySwitch.getReceivedValue() == 1377548 || mySwitch.getReceivedValue() == 13043468) {      // Disarm
      
     // Serial.print( mySwitch.getReceivedValue() );
          
           Serial.print("");
          
           if  (!disarm) {                             // ! = nicht
               Serial.println("disarm on");                      
               disarm = true;                                
               }
          
           else {
                Serial.println("disarm off");                      
                disarm = false;                                
    
               }
    
    
    
    } else if (mySwitch.getReceivedValue() == 2086147 || mySwitch.getReceivedValue() == 15826179 || mySwitch.getReceivedValue() == 1377539 || mySwitch.getReceivedValue() == 13043459) {      // Home Arm
      
      // Serial.print( mySwitch.getReceivedValue() );
          
           Serial.print("");
          
           if  (!homearm) {                            // ! = nicht
               Serial.println("homearm on");                    
               homearm = true;                                
               }
          
           else {
               Serial.println("homearm off");                      
               homearm = false;                              
    
               }
    
    }
    
      else if (mySwitch.getReceivedValue() == 2086192 || mySwitch.getReceivedValue() == 15826224 || mySwitch.getReceivedValue() == 1377584 || mySwitch.getReceivedValue() == 13043504) {      // Alarm
      
       // Serial.print( mySwitch.getReceivedValue() );
          
           Serial.print("");
          
           if  (!alarm) {                              // ! = nicht
               Serial.println("alarm on");                      
               alarm = true;                                  
               }
          
           else {
               Serial.println("alarm off");                        
               alarm = false;                                
    
               }
    
     }
    
      else if (mySwitch.getReceivedValue() == 16773461) {     // In Zone 01 hat der Pir-Sensor ausgelöst!
      
               Serial.print("Zone01");
    
               }
    
      else if (mySwitch.getReceivedValue() == 16774485) {     // In Zone 02 hat der Pir-Sensor ausgelöst!
      
               Serial.print("Zone02");
    
               }
    
      else if (mySwitch.getReceivedValue() == 16776533) {     // In Zone 03 hat der Fenster-Sensor ausgelöst!
      
               Serial.print("Zone03");
    
               }
    
      else if (mySwitch.getReceivedValue() == 16777055) {     // In Zone 04 hat der Pir-Sensor ausgelöst!
      
               Serial.print("Zone04");
    
               }
    
      else if (mySwitch.getReceivedValue() == 16777055) {     // In Zone 05 hat der Pir-Sensor ausgelöst!
      
               Serial.print("Zone05");
    
               }
    
  
               delay(50);
    
               mySwitch.resetAvailable();                     // rcswitch "reset" der ankommenden Daten, um bereit für neue Daten zu sein.
    

    }
  }
  
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  
  
   void loop() {
    
        
    
               if (unterprogrammtemperatur) {
        
                  temperatur();
        
                  }
                  
                  
               if (unterprogrammlicht) {
        
                  licht();
        
                  }
                  
                  
               if (unterprogrammregen) {
        
                  regen();
        
                  }
                  
                  
               if (unterprogrammalarmanlage) {
        
                  rc_switch();
                  
                  }
    
  
    
  
               command = "";

        while (Serial.available() > 0) {
      
              buffer1 = Serial.read();
    
              delay(10);                                         // Ohne das Delay werden nur einzelne Zeichen gelesen.
    
              // Serial.print(buffer1);                          // Nur als Hilfe, wenn benötigt auskommentieren. ( Zeigt die Daten im "buffer1" an. ( werden über die Serielle Schnittstelle ausgegeben).
    
              command.concat(buffer1);
    
    }
  
  
  
  
                if (command == "Temperatur") {
                
                if  (!unterprogrammtemperatur) {                 // ! = nicht
                Serial.println("Temperatur_on");                    
                unterprogrammtemperatur = true;                  
              
                 }
          
                 else {
                 Serial.println("Temperatur_off");                            
                 unterprogrammtemperatur = false;                
    
                 }
    

                }  
          
  


                if (command == "Regen") {
                
                if  (!unterprogrammregen) {                       // ! = nicht
                Serial.println("Regen_on");            
                unterprogrammregen = true;                
              
                 }
          
                 else {
                 Serial.println("Regen_off");              
                 unterprogrammregen = false;                
    
                 }
    

                }  
    
              if (command == "Alarm") {
                
                if  (!unterprogrammalarmanlage) {                  // ! = nicht
                Serial.println("Alarmanlage_on");            
                unterprogrammalarmanlage = true;                
                
                }
          
                else {
                Serial.println("Alarmanlage_off");              
                unterprogrammalarmanlage = false;                
    
                }
                
                if (command == "Licht") {
                
                if  (!unterprogrammlicht) {                       // ! = nicht
                Serial.println("Licht_on");            
                unterprogrammlicht = true;                
              
                 }
          
                 else {
                 Serial.println("Licht_off");              
                 unterprogrammlicht = false;                
    
                 }
                
              
                
                
    

         }    
       }
     }
    
  

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

Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.08.2014, 14:34
Beitrag #2
RE: Unterprogramme, aktiv / inaktiv per Serielle, 3 von 4
Hallo Marc,

anbei mal der Programmablauf nach dem Serial.read() . Da sieht man einen Unterschied zu den if - Abfragen vor command = Alarm.
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.08.2014, 19:49
Beitrag #3
RE: Unterprogramme, aktiv / inaktiv per Serielle, 3 von 4
Hallo Ricardo Wink

Ich finde es leider nicht, ich komme einfach nicht darauf was ich falsch gemacht habe.

Ps. Wie hast du diese Grafik erstellt? Manuell oder irgendwie mit einem Programm?

Gruß Marc Smile

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.08.2014, 02:30 (Dieser Beitrag wurde zuletzt bearbeitet: 17.08.2014 09:16 von rkuehle.)
Beitrag #4
RE: Unterprogramme, aktiv / inaktiv per Serielle, 3 von 4
Hallo Marc,

es gibt Programme wie "Code Visual Flowchart" und "AutoFlowChart" für Windows.
Zwar wollen die irgendwann nach der Testphase Geld haben, die Grundfunktionen, eben das erstellen der Charts, laufen aber weiter. Naja, dann ein Screenshot und in IrfanView den Abschnitt freigestellt, fertig. Die Programme sind ua. für C und C++ geschrieben. Da die IDE für Arduino sehr ähnliche Sprachelemente hat funktionieren halt auch die .ino - Files.

In deinem Programm fragst du den Serial.read() auf "Alarm" ab. Wenn ja, werden die entspr. Anteile abgearbeitet und dann erfolgt der Vergleich mit "Licht", der nie stimmt, da ja "Alarm" eingegeben wurde.. Wenn "command!= Alarm" , dann springst du hinter die Abfrage auf "Licht" Ergo wird die Abfrage auf "Licht" nie ausgeführt.
Anders gesagt, der else Zweig von "if command == Alarm" landet hinter den Programmanteilen für "if command == Licht"
Hier noch der korrgierte Code der Loop():
Code:
void loop() {
  if (unterprogrammtemperatur) temperatur();
  if (unterprogrammlicht) licht();
  if (unterprogrammregen) regen();
  if (unterprogrammalarmanlage) rc_switch();
  command = "";

  while (Serial.available() > 0)
  {
    buffer1 = Serial.read();
    delay(10);
    command.concat(buffer1);
  }

  if (command == "Temperatur") {

    if  (!unterprogrammtemperatur) {
      Serial.println("Temperatur_on");
      unterprogrammtemperatur = true;

    }
    else {
      Serial.println("Temperatur_off");
      unterprogrammtemperatur = false;
    }
  }

  if (command == "Regen") {
    if  (!unterprogrammregen) {
      Serial.println("Regen_on");
      unterprogrammregen = true;
    }
    else {
      Serial.println("Regen_off");
      unterprogrammregen = false;
    }
  }

  if (command == "Alarm") {
    if  (!unterprogrammalarmanlage) {
      Serial.println("Alarmanlage_on");
      unterprogrammalarmanlage = true;
    }
    else {
      Serial.println("Alarmanlage_off");
      unterprogrammalarmanlage = false;
    } // Diese Klammer befand sich am Ende der Loop()
  }

  if (command == "Licht") {
    if  (!unterprogrammlicht) {
      Serial.println("Licht_on");
      unterprogrammlicht = true;
    }
    else {
      Serial.println("Licht_off");
      unterprogrammlicht = false;
    }
  }
}
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.08.2014, 21:07
Beitrag #5
RE: Unterprogramme, aktiv / inaktiv per Serielle, 3 von 4
Hi,
kurz gesagt: Da ist ein "}" verrutscht...
(Ich hätte das auch nicht gesehen ohne Ricardo.)
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Serielle Schnittstelle - Daten empfangen Datatom 8 774 22.05.2016 18:10
Letzter Beitrag: avoid
  "WORT" über die serielle Schnittstelle auslesen hannes77 1 523 08.03.2016 12:13
Letzter Beitrag: Binatone
  Serielle Ausgabe, Reset ? Mathias 1 596 12.11.2015 18:12
Letzter Beitrag: hotsystems
  Serielle Kommunikation arduino147147 1 666 15.10.2015 08:22
Letzter Beitrag: Binatone
  Serielle Kommunikation zw. zwei Arduino UNOs Marduino_UNO 2 1.109 20.08.2015 07:13
Letzter Beitrag: Marduino_UNO
  mit #ifdef Taster high-aktiv / low-aktiv ?? DL1AKP 11 1.347 24.06.2015 12:50
Letzter Beitrag: HaWe
  Serielle Schnittstelle tourbiker 7 1.622 20.04.2015 15:26
Letzter Beitrag: tourbiker
  Serielle Asugabe probleme samedtopal 3 774 27.03.2015 10:48
Letzter Beitrag: Thorsten Pferdekämper
  Anzahl der Schritte per Serielle Schnittstelle an Arduino übergeben raspido 0 444 21.03.2015 11:27
Letzter Beitrag: raspido
  Serielle Kommunikation neben Programmablauf "parallel" ausführen bits10 1 801 16.03.2015 22:32
Letzter Beitrag: Bitklopfer

Gehe zu:


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