PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Relais-Zeitsteuerung mit Digispark



mexico67
27.01.2016, 10:00
Hallo Leute
da ich bis jetzt noch nicht so viel vom Programmieren verstehe, wende ich mich vertrauensvoll an Euch, mit der Bitte bei einem kleinen Sketch zu helfen.
Habe hier einen Digispark mit aufgestecktem Relais.
Der Sketch sieht volgendermaßen aus:
void setup()
{
// Initialize the relay pin as output
pinMode(5, OUTPUT);
}

void loop()
{
digitalWrite(5, HIGH); // Turn the relay on
delay(2000); // Wait for a second
digitalWrite(5, LOW); // Turn the relay off
delay(3000); // Wait for a second
}
Das Relais schaltet bei angelegter 5V Spannung ein und nach der hinterlegten Zeit ( delay ) wieder aus und wieder ein.
Nun möchte ich aber, dass das Relais nach angelegter Spannung ein schaltet und nach der hinterlegten zeit wieder ausschaltet und aus bleibt.
Es liegt sicherlich an der Schleife ( loop ), aber ich finde keinen Befehl, das das Relais aus bleibt.
Ich hoffe, daß mir jemand da weiter helfen kann.
Viele Grüße
Mexico67

021aet04
27.01.2016, 18:43
Die Loop ist vermutlich eine schleife. Diese wird immer durchlaufen, also nach delay(3000) kommt wieder der erste Befehl. Das ist sicher nicht das gesamte Programm. Normalerweise hast du ein main, das ist das Hauptprogramm. Poste einmal das gesamte Programm, aber bitte mit den Code Tags (<code> Programm</code>). Statt den <> Zeichen musst du [] nehmen. Dann sieht es so aus

Programm

MfG Hannes

mexico67
28.01.2016, 09:04
Hallo Hannes,

Herzlichen Dank für Deine Antwort.

Leider habe ich für den Digispark keinen anderen Sketch

Habe den Sketch für das Relais hier http://digistump.com/wiki/digispark/tutorials/relay herunterkopiert und mit dem Programm Digispark-Arduino 1.0.4 kompeiliert und dann in den Digispark geladen.Danach schaltet das Relais nach Spannungsanlegung wie beschrieben.

Laut Arduino-Befehlsliste ist Loop eine Schleife, aber wenn ich die Loop entferne, bringt mit das Programm eine Fehlermeldung.

void setup() {
// Initialize the relay pin as output
pinMode(5, OUTPUT);
}

{
digitalWrite(5, HIGH); // Turn the relay on
delay(1000); // Wait for a second
digitalWrite(5, LOW); // Turn the relay off
delay(1000); // Wait for a second
}


Fehlermeldung:
expected unqualified-id before`{`token
sketch_ian28a:6: error: expected unqualified-id before`{`token

MFG Mexico67 (Richard)

021aet04
28.01.2016, 17:12
Mit der Software kenne ich mich leider nicht aus. Ich arbeite nur mit AVR-Studio.

Was du machen kannst (nicht die eleganteste Variante) ist das du eine variable nimmst. Die Ausgänge schaltest du nur wenn die Variable 0 ist. Nach dem ersten Durchlauf änderst du die Variable auf 1, somit werden die Ausgänge nicht mehr geschalten.

MfG Hannes

mexico67
28.01.2016, 18:07
Hallo Hannes,

vielen Dank für Deine Antwort und Hilfe.
Habe jetzt die Schleife (Loop) mal gelassen und Delay Low geändert. Ist zwar nicht das was ich wollte, aber eventuell ist noch jemand da, der mir weiter helfen kann. Hier nochmal der sketch.

void setup()
{
pinMode(5, OUTPUT); // Initialize the relay pin as output
}

void loop()
{
digitalWrite(5, HIGH); // Relais an Pin 5 einschalten
delay(5000); // schalte Relais nach 5 Sekunden aus
digitalWrite(5, LOW); // Relais am Pin 5 ausschalten
delay(86400000); // schalte Relais nach 24 Stunden wieder ein
}

somit schaltet das Relais bei Spannungsanlegung ein und nach 5 Sekunden wieder aus und alle 24 Stunden das gleiche.

Viele Grüße
Mexico67 (Richard)

redround
29.01.2016, 12:41
Du solltest Dich dringend mit den Grundlagen der Arduino-Programmierung vertraut machen. Grundsätzlich sollte man delay() eigentlich immer versuchen zu vermeiden ... also auch das delay(5000) - zumindest wenn Du vorhast, die Software noch zu erweitern. Wenn sie wirklich nichts anderes machen soll:


boolean ReRun = false;

void setup()
{
pinMode(5, OUTPUT); // Initialize the relay pin as output
}

void loop()
{
if (ReRun == false) {
digitalWrite(5, HIGH); // Relais an Pin 5 einschalten
delay(5000); // schalte Relais nach 5 Sekunden aus
digitalWrite(5, LOW); // Relais am Pin 5 ausschalten

ReRun = true;
}
}

mexico67
29.01.2016, 18:03
Hallo redround,

Du solltest Dich dringend mit den Grundlagen der Arduino-Programmierung vertraut machen.

Entschuldigung!! Wie ich bereits am Anfang geschrieben habe, bin ich noch Anfänger der Programmierung, deswegen weiß ich über die Befehle noch nicht Bescheid.
Die Software möchte ich nicht erweitern, da sie jetzt den Zweck erfüllt, übrigens auch ohne den Sketch groß umzustellen, sondern nur mit dem Befehl (while(1) )
Das Reset erfolgt ja mit der Spannungsunterbrechung.

Das Relais soll mir nur bei Spannungsanlegung kurzzeitig einen Taster an einem Gerät ( TV-Box) ersetzten.
Des weiteren ist auf dem AT-Tiny 85 nur ca. 6KB Platz also für kein größeres Programm.
Auch der Code ist von der Hersteller-Fa. des Digispark für das Relais angegeben worden und ich denke daß es dann mit dem delay auch passen muß.
Trotzdem vielen Dank für Ihre Hilfe.
Ihr angegebener Code funktioniert auch.

MFG
Mexico67

PS: Wenn Sie mich schon kritisieren, wo bleibt dann der alternative Sketch ohne delay von ihrer seite??

021aet04
29.01.2016, 21:17
Delay sollte man wenn möglich vermeiden. Für einfache Dinge reicht es aber. Besser wäre es mit Interrupts zu arbeiten.

MfG Hannes

mexico67
30.01.2016, 11:16
Hallo Hannes,

vielen Dank nochmal für Deine Nachricht.

Delay sollte man wenn möglich vermeiden.

Warum wird dann sehr oft Delay verwendet???

Also ich habe jetzt einige Sketche im Netz angeschaut und fast in jeden wird der Befehl Delay verwendet, wenn es um Zeitvariablen geht. Da sind auch sehr lange Programme bei. Z.B. wenn es um Windgeschwindigkeiten geht.

Selbst im Arduino-Buch "Grundlagen zur Programmierung" von U.S findest du fast keinen Sketch ohne Delay. z.B. Taster entprellen; Ein-und Ausschaltverzögerung usw.


Viele Grüße
Mexico 67

redround
30.01.2016, 11:24
Das mit den Grundlagen war keineswegs als Angriff sondern vollkommen ernst gemeint. Wer sich in der Zukunft nur halbwegs intentsiv mit Digisparks / Arduinos beschäftigen will, kommt da einfach nicht drum rum. Und das Anlegen von Variablen oder die Verwendung von If/Then Entscheidungen gehört zur absoluten Grundlage jeder Programmiersprache.

Delay sollte man deshalb nicht verwenden, weil es die Ausführung des gesamten Programm-Codes blockiert. So kann man zum Beispiel nicht mehr auf Tasten-Eingaben oder andere Signale reagieren. In den Beispielen wird es deshalb immer verwendet, weil es einfach ist und man in der Regel ja gerade etwas anderes demonstrieren will. In einem Beispiel einen sog. endlichen Zustandautomaten zu zeigen nur um zu veranschaulichen, wie man einen Pin umschaltet ist nicht besonders lehrreich!

Ein Sketch, wie man eine LED ohne Verwendung von Delay zum Blinken bringt, ist übrigens sogar in den Beispielen der IDE enthalten (BlinkyWithoutDelay) ... deshalb muss hier keiner zeigen, wie es geht! Wie gesagt: wenn die Software nie was anderes machen soll als beschrieben und klar ist, dass sie nie erweitert wird, dann kann man das auch so machen. Meist "wächst" Software aber mit der Zeit ... und dann macht es Sinn, es gleich von Anfang an "richtig" zu machen.

021aet04
30.01.2016, 11:34
Delay ist einfach zu verwenden. Der Nachteil von Delay ist, das nur dieser Befehl abgearbeitet wird (außer Interrupts). Ein weiterer Nachteil ist das es relativ ungenau ist, da die verschiedenen Interrupts das Delay unterbrechen. Wenn genaue Zeiten benötigt werden (als Beispiel Geschwindigkeit messen) muss man, damit es genau wird, Interrupts verwenden.
Ein weiterer Vorteil von Interrupts ist das man den uC "schlafen legen" kann (Sleepmodes), das geht bei Delay nicht.

Ich verwende auch delays wenn es ein einfaches Testprogramm ist oder bei Initialisierungen,....

Die delay Funktion ist ein einfacher Zähler.

MfG Hannes

mexico67
30.01.2016, 19:57
redround
Ich will keine LED zum Blinken bringen, denn dann hätte ich auch den angegebenen Sketch für das Relais nehmen können und eine LED daran anschließen.Die hätte dann auch geblinkt.
Man sollte halt den Text richtig durchlesen um zu wissen um was es geht.

- - - Aktualisiert - - -

Hallo Hannes,

Ich verwende auch delays wenn es ein einfaches Testprogramm ist

genau, das sollte ein Testprogramm sein.

1. ob der Digispark und das Relais überhaupt funktionieren.
2. ob ich mein Projekt (TV-Box automatisch einschalten) überhaupt mit dem Digispark durchführen kann.

Und wenn man dann als blutiger Anfänger ( wie mehrmals geschrieben) auf solche Leute (redrount) trifft, die dann nur tadeln können aber keinen Sketch zusammen bringen (oder nicht helfen wollen) wie es richtig und einfacher funktioniert. Dann möchte man sich nicht mehr mit dem Programmieren auseinandersetzen.

Aber gottseidank gibt es noch andere Foren die einem Anfänger gerne helfen wollen.

Hannes ich bedanke mich für Deine Hilfe und schließ hiermit das Thema.

Freundliche Grüße
mexico67

021aet04
30.01.2016, 20:57
Du darfst dich nur nicht entmutigen lassen. Jeder hat einmal damit anfangen müssen, es ist noch kein Meister vom Himmel gefallen.

Und das man delays vermeiden sollte war nur ein Hinweis.

MfG Hannes

redround
30.01.2016, 21:36
Wenn ich mich nicht irre, habe ich auch den Code für die Lösung Deines Problems gepostet. Mir also vorzuwerfen, ich würde nur tadeln ist also echt daneben! Auch habe ich erklärt, warum man delay() in vielen Beispielen findet und warum man es trotzdem vermeiden sollte. Auch das hat in meinen Augen nichts mit tadeln zu tun. Und ich habe auch gesagt, wo Du ein erstes Beispiel dafür findest. Auch da sehe ich keinen Tadel!