Go Down

Topic: Ein- und Ausschaltverzögerung mit dem Modulo-Trick (Read 258 times) previous topic - next topic

tapsi

Oct 27, 2020, 03:58 pm Last Edit: Oct 27, 2020, 04:24 pm by uwefed Reason: add CODE TAGs </>
Liebe Arduino-Gemeinde
Ich habe ein Problem mit einem eigentlich ganz einfachen Sketch, vielleich kann mir ja jemand weiterhelfen?
Ich möchte mit dem Modulo-Trick (https://starthardware.org/timer-mit-arduino-alternative-zu-delays/)
eine Ein-und Ausschaltverzögerung basteln.
Die Routine sollte nur einmal durchlaufen,dh. nur einmal verzögert einschalten und nach einer gewissen Zeit wieder ausschalten. Für diese Funktion habe ich eine bool-Variable ins Spiel gebracht. (Routine läuft nur bei LOW und wird nach einem Durchlauf auf HIGH gesetzt. Sobald ich aber den Variablenzustand im loop ändern möchte (im Sketch mit Pfeil markiert), läuft der Sketh nicht mehr! Vielleicht gibt es auch eine andere elegante + schlanke Lösung?
Was mache ich nur falsch? An welcher Position muss ich die Var. auf HIGH ändern? Vielen Dank für eure Hilfe
Mein Sketch:
Code: [Select]
----------------------------------------------------------------------------------------------------
/* Auslösung Alarmhorn mit dem Modulo-Trick nach:
  https://starthardware.org/timer-mit-arduino-alternative-zu-delays/
  Das akkustische Alarmhorn wird verzögert eingeschaltet (Zeitaus)
 und durch die Variable: (Zeitein) begrenzt.
 Dieser Vorgang darf nur 1x ausgeführt werden und wird durch Var:(einmal)
 beschränkt.
*/

int Buzzer = 2;             // Alarmhorn
bool einmal = LOW ;
int Zeitein = 5000;        // Ein-Zeit = (Zeit + Zeitaus)
int Zeitaus = 4000;        // Einschaltverzögerung (muss < Zeitein sein!)

void setup() {
 pinMode(Buzzer, OUTPUT);
}

void loop() {
 if ((millis() % Zeitein > Zeitaus) && einmal == LOW) {
   digitalWrite(Buzzer, HIGH);
   //=====> einmal = HIGH ;             //=====> funktionirt nicht!
 } else {
   //=====> einmal = HIGH ;             //=====> funktionirt nicht!
   digitalWrite(Buzzer, LOW);
   //=====> einmal = HIGH ;             //=====> funktionirt nicht!
 }
}
-------------------------------------------------------------------------------------------

my_xy_projekt

#1
Oct 27, 2020, 04:42 pm Last Edit: Oct 27, 2020, 04:44 pm by my_xy_projekt
Code: [Select]

 if ((millis() % Zeitein > Zeitaus) && einmal == LOW) {
-------------------------------------------------------------------------------------------

Wenn eine Bedngung nicht erfüllt ist, wird else ausgeführt.
Das heist, wenn die Bedingung des modulo nicht erreicht...


Code: [Select]

// Forumsketch https://forum.arduino.cc/index.php?topic=711055.msg4777256#msg4777256
// Zeitverzögert ein ,dann aus und nie wieder aufrufen.

int led = 13;
bool halt = LOW;

void setup() {
  pinMode(led, OUTPUT);
}

void loop()
{
  if ((millis() % 1000 > 500) && (!halt))
  {
    digitalWrite(led, HIGH);
  }
  else
  {
    if (digitalRead(led))
    {
      digitalWrite(led, LOW);
      halt = HIGH;
    }
  }
}

michael_x

Quote
Die Routine sollte nur einmal durchlaufen,dh. nur einmal verzögert einschalten und nach einer gewissen Zeit wieder ausschalten.
Und wofür brauchst du da den "modulo-Trick" ?

Code: [Select]
/*  Das akustische Alarmhorn wird verzögert eingeschaltet (Zeitaus)
 und durch (Zeitein) begrenzt.
 Dieser Vorgang darf nur 1x ausgeführt werden und wird durch (einmal)
 beschränkt.
*/

const int Buzzer = 2;             // Alarmhorn
bool einmal = LOW ;

const int Zeitaus = 4000;        // Einschaltverzögerung
const int Zeitein = 1000;        // Ein-Zeit nach dem verzögerten Einschalten

void setup() {
 pinMode(Buzzer, OUTPUT);
}

void loop() {
 if ((millis() > Zeitaus) && (einmal == LOW)) {
   digitalWrite(Buzzer, HIGH);
   einmal = HIGH;
 } 
 if (millis() > Zeitein+Zeitaus ) {
  digitalWrite(Buzzer, LOW);
 }
}

combie

Quote
Ich möchte mit dem Modulo-Trick (https://starthardware.org/timer-mit-arduino-alternative-zu-delays/)
eine Ein-und Ausschaltverzögerung basteln.
Ich habe mir den Artikel durchgelesen...
(und bin schwer enttäuscht)

Das Beispiel:
> if (millis() > myTimeout + myTimer) {
Zeigt schon, wie wenig Durchblick da vorherrscht.
Die Folgen des Verfahrens sind offensichtlich.

Zudem gibt es bei dem "Modulo Trick" beim Überlauf Jitter, wenn der Teiler keine glatte Zweierpotenz ist.
Auch ist die Division auf einem AVR eine sehr teuere Rechenoperation.

> Ich hoffe, du findest das genau so cool, wie ich. Viel Spaß damit :-)
Nein, ich nicht!
Sondern, ich finde den Artikel gründlich daneben.
Der Verstand, und die Fähigkeit ihn zu gebrauchen, sind zweierlei Fähigkeiten.

Rentner

Hallo,

ich denke der Trick besteht darin das sich der Autor damit selber aus-getrickst hat. Mach die Abfrage in der Weise die sich bewährt hat.

Code: [Select]


if(millis()-altzeit >= intervall)



Heinz

HotSystems

Genau wie im Nachbarforum hat der Troll es nicht nötig auf Anmerkungen zu reagieren.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)


Moko

Ich bin zwar nicht HotSystems, aber er meint das hier.


tapsi

Vielen Dank für die zahlreichen Lösungsvorschläge.
Ich habe bemerkt, dass der Modulo-Trick eher ungeeignet ist für mein Projekt.
Werde das eher auf herkömmliche Art mit millis (ohne Modulo) lösen.

HotSystems

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up