Hallo, ich bin neu hier und habe dazu noch nichts brauchbares gefunden. Folgendes Problem: Ich möchte mit meinem Arduino gerne 2 Ausgänge steuern. Der erste Ausgang soll für 1500ms schalten. Wenn der „Master“ ein Signal abgibt.
Der „Master“ bleibt jedoch eine länger Zeit aktiv. Erst wenn der Master wieder Ausgeht soll der zweite Ausgang Aktiv werden für 1500ms. Dies funktioniert im Moment relativ Semi-Optimal. Bei Ausgänge schalten ab und zu.
Ich stell euch mal meinen Code zur Verfügung. Vllt kann mir ja jemand neue Denkansätze liefern.
int Master = 5;
int Auf = 9;
int Zu = 8;
int merker = 0;
void setup(){
pinMode(Master, INPUT);
pinMode(Auf, OUTPUT);
pinMode(Zu, OUTPUT);
}
void loop(){
if(digitalRead(Master)==1 && merker==0){
merker++;
digitalWrite(Auf, 1);
delay(1500);
digitalWrite(Auf, 0);
}else if(digitalRead(Master)==0 && merker==1){
merker—;
digitalWrite(Zu, 1);
delay(1500);
digitalWrite(Zu, 0);
}
Das hängt davon ab, was im nicht beschriebenen Fall passieren soll:
Wenn das Master-Signal vor Ablauf der 1,5 s seinen Zustand wechselt.
Angenommen, es soll nichts passieren, die geschaltete LED bleibt auf jeden Fall an.
Wenn erst nach Ablauf der LED-Zeit wieder das Master-Signal überwacht wird, passiert dann entweder erstmal nichts, oder die andere LED startet sofort ihre 1,5 s Phase.
In diesem Fall braucht man gar keine Timer, sondern kann mit delay und einem Merker arbeiten.
Und hat auch keine Sorgen mit prellendem Taster.
Mit den richtigen Datentypen ist diese Aufgabenstellung sehr einfach:
const byte Master = 5; // Eingangssignal-Pin
const byte Auf = 9; // Led an, wenn Master 0->1
const byte Zu = 8; // Led an, wenn Master 1->0
bool merker = false; // gemerkter Zustand von Master
void setup() {
pinMode(Master, INPUT);
pinMode(Auf, OUTPUT);
pinMode(Zu, OUTPUT);
}
void loop() {
if(digitalRead(Master) != merker) { // Änderung
if ( ! merker) {
// 0 -> 1
merker=true;
digitalWrite(Auf, 1);
delay(1500);
digitalWrite(Auf, 0);
} else {
// 1 -> 0
merker=false;
digitalWrite(Zu, 1);
delay(1500);
digitalWrite(Zu, 0);
}
} // End if Änderung
} // End loop
Auch angenommen, vor dem Start wird von Master == 0 ausgegangen.
Nach Ablauf der 1,5 s wird sofort auf einen eventuellen Wechsel des Eingangssignals reagiert.
Der compiliert nicht.
Und nein es liegt nicht an der fehlenden Klammer am Ende.
Wozu?
Der Sketch braucht nur eine StateMachine.
Das Ding ist wohl ein Aktor. Der soll für genau 1500ms arbeiten - so zumindest habe ich das rausgelesen. Egal wie lange das "Startsignal" anliegt. Und wenn das Signal weg ist, soll nach frühestens 1500ms der andere Pin auslösen.
Eine schöne Schrittkette.
Ungetestet - und nur so reingeschrieben. kompiliert aber.
const unsigned int Master = 5;
const unsigned int Auf = 9;
const unsigned int Zu = 8;
unsigned int schritt = 0;
unsigned long lastmillis = 0;
bool merker=false;
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
pinMode(Master, INPUT);
pinMode(Auf, OUTPUT);
pinMode(Zu, OUTPUT);
}
void loop()
{
switch (schritt)
{
case 0:
if (digitalRead(Master))
{
Serial.println(F("Mache auf!"));
merker = true;
lastmillis = millis();
digitalWrite(Auf, true);
schritt++;
}
break;
case 1:
if (millis() - lastmillis > 1500)
{
Serial.println(F("Zeit abgelaufen - mache zu!"));
digitalWrite(Auf, 0);
schritt++;
}
break;
case 2:
if (!merker)
{
Serial.println(F("Mache zu!"));
lastmillis = millis();
digitalWrite(Zu, 1);
schritt++;
}
break;
case 3:
if (millis() - lastmillis > 1500)
{
Serial.println(F("Ende Zu machen - Ende Statemachine"));
digitalWrite(Zu, 0);
schritt = 0;
}
break;
}
if (merker && !digitalRead(Master))
{
Serial.println(F("Master ist abgeschaltet"));
merker = false;
}
}
Hallo
Ich füge dem Zoo von Lösungen auch die Lösung mit drei Timern hinzu. So kann der Fragesteller sich die beste und passende Lösung für sein Projekt aussuchen.
//BLOCK COMMENT
// https://forum.arduino.cc/t/ausgang-schalten-nach-signal/899726
#define ProjectName "Ausgang Schalten nach Signal"
// CONSTANT DEFINITION
// you may need to change these constants to your hardware
const byte Input_[] {A0};
const byte Output_[] {2, 3};
// VARIABLE DECLARATION
enum {Master};
enum {Auf,Zu};
struct MASTER {
byte pin;
bool state;
} master {Input_[Master], 0};
struct AUSGANG {
byte pin;
} ausgang[] {
{Output_[Auf]},
{Output_[Zu]},
};
struct TIMER {
unsigned long stamp;
unsigned long duration;
};
TIMER scan {0, 20};
TIMER auf {0, 1500};
TIMER zu {0, 1500};
// FUNCTIONS
void setup() {
Serial.begin(9600);
Serial.println(F("."));
Serial.print(F("File : ")), Serial.println(__FILE__);
Serial.print(F("Date : ")), Serial.println(__DATE__);
Serial.print(F("Project: ")), Serial.println(ProjectName);
pinMode (LED_BUILTIN, OUTPUT);
for (auto Input : Input_) pinMode(Input, INPUT_PULLUP);
for (auto Output : Output_) pinMode(Output, OUTPUT);
// check outputs
for (auto Output : Output_) digitalWrite(Output, HIGH);
delay(1000);
for (auto Output : Output_) digitalWrite(Output, LOW);
}
void loop () {
unsigned long currentTime = millis();
digitalWrite(LED_BUILTIN, (currentTime / 500) % 2);
if (currentTime - scan.stamp >= scan.duration) {
scan.stamp = currentTime;
bool stateNew = !digitalRead(master.pin);
if (master.state != stateNew) {
master.state = stateNew;
switch (stateNew) {
case Auf:
auf.stamp = currentTime;
digitalWrite(ausgang[Auf].pin, HIGH);
break;
case Zu:
zu.stamp = currentTime;
digitalWrite(ausgang[Zu].pin, HIGH);
break;
}
}
}
if (currentTime - auf.stamp >= auf.duration && digitalRead(ausgang[Auf].pin)) digitalWrite(ausgang[Auf].pin, LOW);
if (currentTime - zu.stamp >= zu.duration && digitalRead(ausgang[Zu].pin)) digitalWrite(ausgang[Zu].pin, LOW);
}
Ich wünsche einen geschmeidigen Abend und viel Spass beim Programmieren.