Timer Funktion

Hallo,

ich möchte das ein Ausgang einmalig für 5 Sekunden ein oder aus geschaltet wird, jedoch das ganze ohne delay() und mils() lösen. Das ganze soll nicht ins Setup weil das später ein einen größeren Sketch eingebaut wird, wo dann erst noch ein Schalter abgefragt werden soll.

Das zu hab ich mir die Timer Lib: Arduino Playground - Timer Library

angesehen und folgendens gebastelt (für den Mega2560):

#include "Timer.h"

Timer t;
int pin = 13;
int alarmstatus=0;



void setup()
{
  pinMode(pin, OUTPUT);
  digitalWrite(pin,LOW);
  Serial.begin(9600);
}

void loop()
{  
  t.update();
  alarmfunktion();
}


void alarmfunktion()
{

    if(alarmstatus==0)
    {
    t.pulse(pin, 5 * 1000, HIGH); // 5 second
    }
    alarmstatus=1;
}

Die LED geht für 5 Sek an und dann kurz aus und dann dauerhaft an.... bin etwas am verzweifeln. Gibt es da evtl. eine besser Lösung oder seh ich den Fehler einfach nicht?

Hallo,

    t.pulse(pin, 5 * 1000, HIGH); // 5 second

bedeutet nach dieser Erklärung auf der Timer Projektseite:

int pulse(int pin, long period, int startingValue)
Toggle the state of the digital output 'pin' just once after 'period' milliseconds. The pin's starting value is specified in 'startingValue', which should be HIGH or LOW.

Offensichtlich wird aber nach weiteren 5s nochmals getoggled und dein Pin geht dauerhaft auf HIGH (startingValue).

Gibt es da evtl. eine besser Lösung

Ja, millis() - aber das hast du ja ausgeschlossen.

int pin = 13;
int alarmstatus=0;
unsigned long lastalarm;

void setup()
{
  pinMode(pin, OUTPUT);
  digitalWrite(pin,LOW);
  Serial.begin(9600);
  Serial.println("Prog started");
}

void loop()
{  
  if (alarmstatus!=2) alarmfunktion();  // bevor ein neuer Alarm ausgelöst werden soll, muss alarmstatus auf "0" gesezt werden
}

void alarmfunktion() {
  if (alarmstatus==0) {
    digitalWrite(pin, HIGH);
    lastalarm=millis();
    alarmstatus=1;  // während alarm
  }
  if (millis()-lastalarm >= 5000) {
    digitalWrite(pin,LOW);
    alarmstatus=2;  // nach Alarm
  }  
}

Hallo,

danke für die Idee, habe mich schon vor deiner Antwort für millis() entschieden.

Danke trotzdem!

millis() ist eine gute Entscheidung.
Grüße Uwe

geht doch auch mit Counter?
counter=5
if counter 0, dann.....

geht doch auch mit Counter?

Und wie triggerst Du den Counter?
Grüße Uwe

mit der Time Lib.

Fals millis() dasselbe ist, sorry :disappointed_relieved:

#include <Time.h>
#define TIMERSEKUNDEN 900

void setup() {
  Serial.begin(9600);
}

long alteViertelstunde=-1;
void loop() {
 if (now()/TIMERSEKUNDEN != alteViertelstunde)
 {
   alteViertelstunde=now()/TIMERSEKUNDEN;
   Serial.print("Anfang neue Viertelstunde ");
   Serial.println(alteViertelstunde);
 }  
}

Den hat mal jurs hier gepostet

Da ist millis() einfacher und spart Speicherplatz.
Grüße Uwe

uwefed:
Da ist millis() einfacher und spart Speicherplatz.
Grüße Uwe

Stimmt. Es war aber sein wunsch ohne millis().

Arduinoianer:
habe mich schon vor deiner Antwort für millis() entschieden.

Hat sich ja jetzt geklärt