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
  Arduino Schaltung 433 MHz Fernbedienung / Handsender AndreasOHZ 16 379 16.09.2018 15:43
Letzter Beitrag: hotsystems
Smile Punktestand von einem Arduino in eine Access Datenbank schreiben ThePhil 8 707 16.07.2018 22:24
Letzter Beitrag: Tommy56
  [Ein bisschen abseits]Kennt jemand eine Quelle für AT90 Programmierdaten ManniP 2 425 02.03.2018 12:31
Letzter Beitrag: Bitklopfer
  Schon wieder eine Zeitschaltung Eckardt 7 672 28.01.2018 10:26
Letzter Beitrag: Tommy56
  Eine Funktion verlassen Jan5663 8 1.443 18.12.2017 13:49
Letzter Beitrag: Chopp
  Eine void starten mit eine Android app Atwist 8 1.018 04.12.2017 19:18
Letzter Beitrag: MicroBahner
  Schlagwerk für eine Uhr ist1969 37 3.501 16.06.2017 18:54
Letzter Beitrag: Tommy56
  H-Schaltung mit Hochleistungsservo auf Paddelshifting umbauen Tiger7 16 2.112 15.06.2017 19:29
Letzter Beitrag: Tiger7
  eine einfache Xor Bitte ? himbeersirup 1 633 08.06.2017 09:15
Letzter Beitrag: MicroBahner
  Telefon-Nummer erkennen - Schaltung auslösen harryba 4 1.755 13.10.2016 10:12
Letzter Beitrag: hotsystems

Gehe zu:


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