• Die Forumsregeln und Nutzungsbedingungen findet ihr in der Navbar unter Impressum !
    Bitte unbedingt beachten!
    Wie überall im Leben gibt es Spielregeln, so auch hier!
    Die Datenschutzerklärung zum DSGVO findet ihr ebenfalls in der Navbar unter Datenschutzerklärung !
    Hinweis nach DSGVO :
    Es ist hier keinerlei Angabe erforderlich. Alle Angaben in diesem Bereich sind öffentlich sichtbar und werden freiwillig gemacht. Mit einem Eintrag in diesem Bereich erkenne ich dieses an, und bestätige die Datenschutzerklärung zur DSGVO für das Forum gelesen zu haben.

    Danke
  • Hallo Gast, beschränke dich hier bitte auf den Bereich der Elektronik. Die Fahrzeuge oder Gebäude, wo diese Elektronik eingebaut wird bitte in dem passenden Fachbereiich behandeln. Auch wenn Teile des Projektes dadurch im Forum doppelt vorhanden sind! Danke.

Arduino 4-fach RC-Schalter mit Arduino

Registriert
16.02.2010
Beiträge
386
Hallo Bert,

danke für Deine Hilfe. Ich habe den Code noch ein wenig umgeschrieben und alle ungenutzten Variablen entfernt.
Was soll ich sagen? Es funktioniert jetzt alles so wie es soll. Vielen lieben Dank für Deine Unterstützung.

Der Vollständigkeit halber - falls noch jemand mal nen 4-fach RC-Schalter sucht - hier der Code:

Code:
// Eingangs-PIN (Empfängersignal)
const byte PIN_RC = 2;                                                                        // das ist INT 1 aber Pin 2 an dem das Empfängersignal eingelesen wird

// Ausgangs-PINs
const byte Ausgang1 = 10;                                                                     // PIN 10 - Knüppel links lang
const byte Ausgang2 = 11;                                                                     // PIN 8 - Knüppel links  kurz
const byte Ausgang3 = 9;                                                                      // PIN 9 - Knüppel rechts lang
const byte Ausgang4 = 8;                                                                      // PIN 7 - Knüppel rechts kurz

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXunsigned long Dauer_rechts =0;                                                                // Dauer wie lange Knüppel rechts war
unsigned long Dauer_rechts = 0;                                                               // Dauer wie lange Knüppel rechts war
unsigned long Dauer_links = 0;                                                                // Dauer wie lange Knüppel links war
unsigned long Zeit_rechts = 0;                                                                // Positionszeit rechts
unsigned long Zeit_links =0;                                                                  // Positionszeit links
bool Umschaltsperre_rechts = false;                                                           // Knüppelposition wird abgefragt
bool Umschaltsperre_links = false;                                                            // Knüppelposition wird abgefragt
bool Ausgang1_an = false;
bool Ausgang2_an = false;       
bool Ausgang3_an = false;
bool Ausgang4_an = false;       
bool Ausgang1_Sperre = false;                                                                 //Einschaltsperre Ausgang 1
bool Ausgang2_Sperre = false;                                                                 //Einschaltsperre Ausgang 2
bool Ausgang3_Sperre = false;                                                                 //Einschaltsperre Ausgang 3
bool Ausgang4_Sperre = false;                                                                 //Einschaltsperre Ausgang 4
unsigned long Zeit = 0;                                                                       // Systemzeit
volatile int ReceivedSpeedValues3[8] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500};      // Array mit 8 Werten für die gemessenen Werte
volatile int Summe = 12000;                                                                   // Summe aus dem Array 8x1500, als Anfangswert
volatile int Mittelwert = 1500;  
volatile int Zeiger = 0;
volatile long LastSpeedChange = 0;
volatile long nMicros = 0;
volatile long nDifference =0;

void setup() 
{ 
  pinMode (PIN_RC, INPUT);                                                                    // Eingang für Empfängersignal
  pinMode (Ausgang1, OUTPUT);
  pinMode (Ausgang2, OUTPUT);
  pinMode (Ausgang3, OUTPUT);
  pinMode (Ausgang4, OUTPUT);
  attachInterrupt( 0, SpeedPositionInterrupt, CHANGE); // 0=Interrupt 0,also Pin2 / NAME der Interruptroutine / springe zum Interrupt wenn der Wert an Pin 2 sich ändert
} 


void SpeedPositionInterrupt()                                                                   // Interrupt fragt Empfängersignal-PIN ab
{
  nMicros = micros();                                                                           // die aktuelle Prozessorzeit wird in der variablen nMicros abgespeichert, dann geht der Zugriff schneller
  nDifference  = (nMicros - LastSpeedChange);                                                   // hier wird geprüft wie lange der letzte Pegelwechsel her ist
  if ( (nDifference > 900 ) && ( nDifference < 2100))                                           // liegt die Zeitdifferenz zwischen 0,9 und 2,1 ms, so ist es ein HIGH Pegal
  { 
    Summe -= ReceivedSpeedValues3[Zeiger];                                                      // Summe = Summe - ReceivedSpeedValues[Zeiger];// substrahiere letzte Messung aus dem Array
    ReceivedSpeedValues3[Zeiger] = nDifference;                                               // Array mit 8 Werten für die gemessenen Wert 
    Summe += nDifference;                                                                   // Summe = Summe + ReceivedSpeedValues[Zeiger]; // addiere Wert zur Summe  
    Zeiger   = ( ( Zeiger + 1 ) & 0x07 );                                                     //  Index erhoehen und ggf. von 8 auf 0 springen
    Mittelwert = ( Summe >> 3 );                                                                // der Befehl >>3 ist bit shift left um drei bit, das ist wie durch 8 teilen
  }
  LastSpeedChange = nMicros;
}

void loop() 
{ 
  Zeit = millis ();                                                                             // aktuelle Systemzeit in Variable "Zeit" schreiben

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Ansteuerung Knüppel RECHTS
      
  if ((Mittelwert >= 1800) && (Umschaltsperre_rechts == false))                                 // Knüppelposition erreicht und Umschaltsperre ist frei 
  {
      Zeit_rechts = millis ();                                                                  // aktueller Zeitwert wird geschrieben -> Auswertung der Verweildauer Knüppel 
      Umschaltsperre_rechts = true;                                                             // Umschaltsperre einschalten, Knüppel muss erst mal wieder nach Null
  } 
    
  if (Umschaltsperre_rechts == true)                                                            // Umschaltsperre ausschalten wenn der Knüppel in Null ist
  {                           
    Dauer_rechts = (millis () - Zeit_rechts);                                                   // hier wird die Verweildauer rechts ausgewertet
    if ((Dauer_rechts <= 800) && (Mittelwert <= 1650) && (Ausgang4_Sperre == false))            // Verweildauer kleiner 800 UND Knüppel wieder in Null -> Ausgang 4 schalten
    {
      Ausgang4_an = true;
      Dauer_rechts = 0;
    }
  
    if ((Dauer_rechts <= 800) && (Mittelwert <= 1650) && (Ausgang4_Sperre == true))             // Verweildauer kleiner 800 UND Knüppel wieder in Null -> Ausgang 4 aus
    {
      Ausgang4_an = false;
      Dauer_rechts = 0;
    }    
  
    if ((Dauer_rechts >= 1001)&& (Ausgang3_Sperre == false))                                    // Verweildauer größer 1001 UND Knüppel wieder in Null -> Ausgang 3 schalten
    {                      
      Ausgang3_an = true;
      Dauer_rechts = 0;                                                                         // Verweildauer löschen
    }
  
    if ((Dauer_rechts >= 1001)&& (Ausgang3_Sperre == true))                                     // Verweildauer größer 1001 UND Ausgang war an -> Ausgang ausschalten
    {
      Ausgang3_an = false;
      Dauer_rechts = 0;                                                                         // Verweildauer löschen
    }  
  }


  if (Mittelwert <= 1650)                                                                       // Knüppel in der Mitte -> Umschaltsperre löschen
  {
    Umschaltsperre_rechts = false;  
  }

  if ((Mittelwert <= 1650) && (Ausgang4_an == true))                                            // Knüppel in der Mitte + Ausgang 4 AN -> Sperre Ausgang 4 einschalten
  {
    Ausgang4_Sperre = true;  
  }
          
  if ((Mittelwert <= 1650) && (Ausgang4_an == false))                                           // Knüppel in der Mitte + Ausgang 4 AUS -> Sperre Ausgang 4 löschen
  {
    Ausgang4_Sperre = false;  
  }

  if ((Mittelwert <= 1650) && (Ausgang3_an == true))                                            // Knüppel in der Mitte + Ausgang 3 AN -> Sperre Ausgang 3einschalten
  {
    Ausgang3_Sperre = true;  
  }
          
  if ((Mittelwert <= 1650) && (Ausgang3_an == false))                                           //Knüppel in der Mitte + Ausgang 3 AUS -> Sperre Ausgang 3 löschen
  {
    Ausgang3_Sperre = false;  
  }


      
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// Ansteuerung Knüppel LINKS

  if ((Mittelwert <= 1150) && (Umschaltsperre_links == false))                                  // Knüppelposition erreicht und Umschaltsperre ist frei 
  { 
    Zeit_links = millis ();                                                                     // aktueller Zeitwert wird geschrieben -> Auswertung der Verweildauer Knüppel 
    Umschaltsperre_links = true;                                                                // Umschaltsperre einschalten, Knüppel muss erst mal wieder nach Null
  } 
    
  if (Umschaltsperre_links == true)
  {                           
    Dauer_links = (millis () - Zeit_links);                                                     // hier wird die Verweildauer rechts ausgewertet
    if ((Dauer_links <= 800) && (Mittelwert >= 1350) && (Ausgang2_Sperre == false))             // Verweildauer kleiner 800 UND Knüppel wieder in der Mitte -> Blinker ein
    {
      Ausgang2_an = true;                                                                       // Ausgang 2 EIN
      Dauer_links = 0;
    }
  
    if ((Dauer_links <=800) && (Mittelwert <= 1350) && (Ausgang2_Sperre == true))               // Verweildauer kleiner 800 UND Knüppel wieder in Null -> Ausgang 2 aus
    {
      Ausgang2_an = false;
      Dauer_links = 0;
    }

    if ((Dauer_links >= 1001)&& (Ausgang1_Sperre == false))                                     // Verweildauer größer 1011 -> Ausgang 1 ein
    {
      Ausgang1_an = true;
      Dauer_links = 0;                                                                          // Verweildauer löschen
    }
  
    if ((Dauer_links >= 1001)&& (Ausgang1_Sperre == true))                                      // Verweildauer größer 1001 UND Licht war an -> Ausgang 1 aus
    {
      Ausgang1_an = false;
      Dauer_links = 0;                                                                          // Verweildauer löschen
    }  
  }

  if (Mittelwert >= 1350)                                                                       // Knüppel in der Mitte -> Umschaltsperre löschen
  {
    Umschaltsperre_links = false;  
  }
      
  if ((Mittelwert >= 1350) && (Ausgang2_an == true))                                            // Knüppel in der Mitte + Ausgang 2 AN -> Sperre Ausgang 2 einschalten
  {
    Ausgang2_Sperre = true;  
  }
          
  if ((Mittelwert >= 1350) && (Ausgang2_an == false))                                           // Knüppel in der Mitte + Blink AUS -> Blinksperre löschen
  {
    Ausgang2_Sperre = false;  
  }

  if ((Mittelwert >= 1350) && (Ausgang1_an == true))                                            // Knüppel in der Mitte + Ausgang 1 AN -> Sperre Ausgang 1 einschalten
  {
    Ausgang1_Sperre = true;  
  }
          
  if ((Mittelwert >= 1350) && (Ausgang1_an == false))                                           // Knüppel in der Mitte + Licht AUS -> Lichtsperre löschen
  {
    Ausgang1_Sperre = false;  
  }

  digitalWrite (Ausgang1,Ausgang1_an); // Licht links 
  digitalWrite (Ausgang2,Ausgang2_an); // Blinker links 
  digitalWrite (Ausgang3,Ausgang3_an); // Licht rechts
  digitalWrite (Ausgang4,Ausgang4_an); // Blinker rechts
}

Vorhergehende Abhandlung des Themas ist hier zu finden: :maus
 

Servonaut
Zurück
Oben Unten