Hallo zusammen,
kann mir jemand helfen bei folgendem Vorhaben: Wenn der Arduino Spannung bekommt (sprich startet), soll 45s später eine LED an einem digitalen Output PIN geschalten werden (bspw. an Pin 3). Die LED soll dann bis ins unendliche leuchten. Wenn der Arduino abgeschalten wird und erneut gestartet wird, soll es wieder die gleiche Prozedur sein. Quasi in einem Loop.
Da der Arduino noch andere Aufgaben verarbeiten soll, müsste man über "millis" arbeiten, denn "delay" kommt hier nicht in Frage... Wäre super...
Gar nicht schlimm, eigentlich völlig egal.
Wenn die Aufgabenstellung sich ändert, könnte man nochmal drüber nachdenken.
Generell gibt es auch Sachen, die (zu einem Zeitpunkt oder bei einem Ereignis) genau einmal gemacht werden sollen.
Das kriegst du auch "irgendwie" hin. (Tip: eine Variable als Merker, dass es schon gemacht wurde)
Viel Spaß
Naja, so ein digitalWrite und auch digitalRead kostet irgendwas unter 100 Takte.
Ein paar Takte könnte man einsparen, wenn man einen kleinen endlichen Automaten baut.
Aber auch der kostet, in Hauptsache Speicherplatz. (den man teilweise wieder einsparen kann, wenn man ganz auf die Arduino digitalWrite Welt verzichtet)
Beispiel:
#include <CombiePin.h>
using Led = Combie::Pin::OutputPin<13>;
#include <CombieTypeMangling.h>
using namespace Combie::Millis;
#include <CombieTimer.h>
Combie::Timer::RisingEdgeTimer ton {45_Sekunden}; // steigende Flanke wird verzoegert
void setup()
{
Led{}.init();
Led{} = ton = 0; // Kette initialisieren
}
void loop()
{
Led{} = ton = 1;
}
Ich blick das irgendwie noch nicht mit den geschweiften Klammern bei void setup und void loop... Ich möchte die Sache in einen bestehenden Sketch mit rein packen. Beim Kompilieren meckert er zwar nicht und hochgeladen wird der Sketch auch, allerdings wird die Funktion dann nicht ausgeführt...
ich habe folgendes in meiner void setup() und void loop() bisher drin:
void setup()
{
Serial.begin(115200);
for(int i=0; i<numRelays; i++)
{
pinMode(relays[i].pin, OUTPUT);
setRelayOff(relays[i]);
}
pinMode(pirPin, PIR_PIN_MODE);
pinMode(tiltPin, TILT_PIN_MODE);
pinMode (LED_orange, OUTPUT);
digitalWrite ( LED_orange, LOW);
pirWarmupDelay();
#ifdef DISPLAY_DEBUG_INFO
Serial.println(F("Status: idle"));
#endif
progStatus = PS_IDLE;
}
void loop()
{
switch(progStatus)
{
case PS_IDLE:
doIdle();
return;
case PS_DETECTED:
doDetected();
return;
}
{
if (digitalRead(LED_orange) == LOW && (millis() > 8000 )) digitalWrite(LED_orange, HIGH);
}
}
ich habe im Sketch selbst noch ein delay für eine WARM_UP Zeit für einen PIR-Sensor... Möglich, dass dies mir einen Strich durch die Rechnung macht - keine Ahnung.