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
Neuer versuch eine Schaltung zu bauen.
16.09.2018, 17:33
Beitrag #1
Neuer versuch eine Schaltung zu bauen.
Ich habe eine Schaltung wo ich zwei LED´s mit der Fernbedienung 433MHz in Intervallen schalten kann.

Taste A auf der FB schaltet 20x LED an und aus

for (int c = 0; c < 20; c++){
digitalWrite(Relais, HIGH);
delay(250);
digitalWrite(Relais, LOW);
delay(250);



Taste B auf der FB schaltet 50x LED an und aus

for (int c = 0; c < 50; c++){
digitalWrite(LED_Test, HIGH);
delay(100);
digitalWrite(LED_Test, LOW);
delay(100);



Mein Problem ist jetzt.

Wenn ich Taste B gedrückt habe ist die Taste A solange blockiert bist die Zyklen (50x) abgearbeitet sind, ich würde jetzt gerne die Zyklen vorzeitig unterbrechen oder ganz Stoppen um eine andere Taste (A) zu betätigen.

Wie kann ich das jetzt realisieren?



Code:
//Empfänger-Code

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
int Funk = 0;
int Relais = 6;
int LED_Test = 13;

void setup()
{

  Serial.begin(9600);
  mySwitch.enableReceive(0);  //Empfänger ist an Interrupt-Pin "0" - Das ist der Pin2
  pinMode(Relais, OUTPUT);  //Der Pin mit der Relais (Pin6) ist jetzt ein Ausgang.
}

void RelaisStart()
{

  for (int c = 0; c < 20; c++){   //Wiederholungsanzahl
      digitalWrite(Relais, HIGH); //An dieser Stelle würde das Relais einsschalten
      delay(250);     //...xxx Sekunden warten - (1 sec.=1000 - 10 sec.=10000)
      digitalWrite(Relais, LOW);  //Und wieder ausschalten
      delay(250);     //...xxx Sekunden warten - (1 sec.=1000 - 10 sec.=10000)
  }
}

void ledtest()
{

  for (int c = 0; c < 30; c++){   //Wiederholungsanzahl
      digitalWrite(LED_Test, HIGH); //An dieser Stelle würde das Relais einsschalten
      delay(100);     //...xxx Sekunden warten - (1 sec.=1000 - 10 sec.=10000)
      digitalWrite(LED_Test, LOW);  //Und wieder ausschalten
      delay(100);     //...xxx Sekunden warten - (1 sec.=1000 - 10 sec.=10000)
  }
}

void loop()
{
    int value = mySwitch.getReceivedValue();


    if (value == 4436)                 //24 bit Code der Fernbedienung / Handsender Taste B
    {
      Serial.print("LED:  ");          //Ausgabe Serial Monitor (Strg + Umschalt + M)
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
      ledtest();
    }
    
    
    if (value == 4433)                  //24 bit Code der Fernbedienung / Handsender Taste A
     {
      Serial.print("Relais:  ");        //Ausgabe Serial Monitor (Strg + Umschalt + M)
      Serial.print( mySwitch.getReceivedValue() );
      Serial.print(" / ");
      Serial.print( mySwitch.getReceivedBitlength() );
      Serial.print("bit ");
      Serial.print("Protocol: ");
      Serial.println( mySwitch.getReceivedProtocol() );
      RelaisStart();
     }
    
     mySwitch.resetAvailable();          //Ende Empfängercode
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.09.2018, 17:38
Beitrag #2
RE: Neuer versuch eine Schaltung zu bauen.
Wozu jetzt ein neuer Thread ?
Immer noch die if-Abfragen ?
Die Blockkaden kommen durch die delays, die müssen weg.
Das geht mit entsprechenden Funktionen mit millis.
Sieh dir dazu "BlinkWithoutDelay" in der IDE an.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.09.2018, 21:27
Beitrag #3
RE: Neuer versuch eine Schaltung zu bauen.
Hallo,

noch schöner geht es, wenn man einen Timer nutzt, der zyklische einen Interrupt auslöst. Den Timer stellt man dann auf 100 ms bzw 250 ms ein und stoppt ihn nach 20 bzw. 50 Interrupts oder wenn eine neue (!) Taste gedrückt wurde.

Leider scheint es keine allgemeine Timerlib zu geben. Für ATmega328 (z.B. UNO) ist hier ein Beispiel mit der Library TimerOne.

https://playground.arduino.cc/Deutsch/Ha...merlibrary
(Der angegebene Nachteil des Speicherverbrauches ist übertrieben. Das angegeben Sketch braucht gerade 1 kB)

Ich selbst habe für meinen DUE die DueTimer Library genutzt.

Gruß
GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Switch erkennt eine Phase nicht DonSonora 27 1.432 30.01.2019 22:24
Letzter Beitrag: MicroBahner
  mcp2515 CAN BUS nur eine ID auslesen Golf_Cabrio 6 897 24.10.2018 20:51
Letzter Beitrag: Golf_Cabrio
  Per Tastendruck Stepper-Motor eine bestimmte Drehung machen lassen Chef_2 2 628 09.10.2018 21:59
Letzter Beitrag: Chef_2
  Arduino Schaltung 433 MHz Fernbedienung / Handsender AndreasOHZ 16 1.893 16.09.2018 15:43
Letzter Beitrag: hotsystems
Smile Punktestand von einem Arduino in eine Access Datenbank schreiben ThePhil 8 1.367 16.07.2018 22:24
Letzter Beitrag: Tommy56
  [Ein bisschen abseits]Kennt jemand eine Quelle für AT90 Programmierdaten ManniP 2 711 02.03.2018 12:31
Letzter Beitrag: Bitklopfer
  Schon wieder eine Zeitschaltung Eckardt 7 1.022 28.01.2018 10:26
Letzter Beitrag: Tommy56
  Eine Funktion verlassen Jan5663 8 2.512 18.12.2017 13:49
Letzter Beitrag: Chopp
  Eine void starten mit eine Android app Atwist 8 1.425 04.12.2017 19:18
Letzter Beitrag: MicroBahner
  Schlagwerk für eine Uhr ist1969 37 4.543 16.06.2017 18:54
Letzter Beitrag: Tommy56

Gehe zu:


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