//Ein Relais soll in zufälligen Zeitabständen ein- bzw. ausgeschaltet werden
int RELAIS=2; //Am Ausgang d2 wird die Relaisplatine angeschlossen
void setup() {
pinMode(RELAIS,OUTPUT); //RELAIS ist als Ausgang definiert
}
void loop() {
if (random(1000) < 500) //Es wird eine Zufallszahl zwischen 0 und 1000 ermittelt, falls //diese Zufallszahl < 500 ist, dann digitalWrite(RELAIS, HIGH); //soll RELAIS eingeschaltet werden, else //ist die Zufallszahl >500, dann digitalWrite(RELAIS, LOW); //schalte RELAIS aus delay(15000); //Warte 15 Sekunden bis zur Ermittlung einer neuen Zufallszahl
}
Das funktioniert schon ganz gut, vielleicht kann man das noch optimieren. Die Diskussion sei hiermit eröffnet
vG Uwe
„Es ist nicht der Unternehmer, der die Löhne zahlt — er übergibt nur das Geld. Es ist das Produkt, das die Löhne zahlt.“ Henry Ford, ein außergewöhnlicher Manager, Geschäftsmann und Erfinder, 1863 - 1947
Ich probiere gerade auch mein Glück mit nem Arduino, ich hätte mal eine Frage wie du ihn mit Strom versorgst, über ein eigenes Netzteil oder übers Gleis?
Hallo Paul, über ein 5V-Steckernetzteil von einem ausgemusterten Smartphone. Die Spannung am Gleis abzunehmen hatte ich auch überlegt, aber da werden sich - je nach Anzahl der Verbraucher - die Lasten schnell aufsummieren. Und Digital-Spannung ist ja kostbar
vG Uwe
„Es ist nicht der Unternehmer, der die Löhne zahlt — er übergibt nur das Geld. Es ist das Produkt, das die Löhne zahlt.“ Henry Ford, ein außergewöhnlicher Manager, Geschäftsmann und Erfinder, 1863 - 1947
DELAY hat den großen Nachteil, das der ARDUINO in der Zeit wirklich nichts anderes macht, als zu warten. Dabei könnte er durchaus weitere Aufgaben übernehmen.
int RELAIS=2; //Am Ausgang d2 wird die Relaisplatine angeschlossen const long interval = 15000; unsigned long previousMillis = 0;
void setup() {
pinMode(RELAIS,OUTPUT); //RELAIS ist als Ausgang definiert
}
void loop() {
unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (random(1000) < 500) //Es wird eine Zufallszahl zwischen 0 und 1000 ermittelt, falls //diese Zufallszahl < 500 ist, dann digitalWrite(RELAIS, HIGH); //soll RELAIS eingeschaltet werden, else //ist die Zufallszahl >500, dann digitalWrite(RELAIS, LOW); //schalte RELAIS aus } //hier könnten weitere Befehle stehen }
Im Code ist eine Zeitmessung hinzugefügt. Es wird also nicht 15 Sekunden gewartet, sondern bei jedem LOOP-Durchlauf wird geprüft, ob schon 15 Sekunden (Konstante "interval") vorbei sind. Das ist die weitaus flexiblere Lösung.
Hallo zusammen, eine weitere Möglichkeit wäre, den Infrarotsensor dafür zu verwenden. Man könnte den Sensor an versteckter Stelle neben dem Gleis einbauen. Wenn dann ein Zug vorbeifährt, löst dies das Einschalten des Relais für eine definierte Zeit aus.
vG Uwe
„Es ist nicht der Unternehmer, der die Löhne zahlt — er übergibt nur das Geld. Es ist das Produkt, das die Löhne zahlt.“ Henry Ford, ein außergewöhnlicher Manager, Geschäftsmann und Erfinder, 1863 - 1947
Hallo zusammen, die Zufallsteuerung überzeugt in der Praxis nicht wirklich. Ich zucke jedes mal zusammen, wenn plötzlich das Wasserrad (mit entsprechender Geräuschentwicklung) anfängt zu laufen...
Ich will meinen Sketch so modifizieren, dass das Wasserrad auf diese Arten geschaltet werden kann: - Taster schaltet das Wasserrad ein, es läuft 1 Minuten und schaltet sich dann ab, und - wird der Taster innerhalb der 1 Minute erneut gedrückt, dann schaltet es sich vorzeitig ab.
Für eine Schaltung Ein/ Aus mit einem Taster habe ich folgendes gefunden (hier die Quelle):
#define PIN_LED 11 // Pin, an dem die LED angeschlossen ist. #define PIN_BUTTON 12 // Pin, an dem der Taster angeschlossen ist.
boolean aLedEnabled = false; // True, wenn die LED leuchtet, sonst false. boolean aButtonPressed = false; // True, wenn der Taster gedrückt wird, sonst false.
void setup() { pinMode(PIN_LED, OUTPUT); // Pin, an dem die LED angeschlossen ist, als Ausgang festlegen. pinMode(PIN_BUTTON, INPUT_PULLUP); // Pin, an dem der Taster angeschlossen ist, als Eingang mit aktiviertem Pull-Up-Widerstand festlegen. }
void loop() { if (digitalRead(PIN_BUTTON) == LOW) { // Wenn der Taster aktuell gedrückt wird, ... aButtonPressed = true; // merke dir, dass der Taster gedrückt wurde, ... delay(10); // und warte 10 Millisekunden bis die Kontakte des Tasters vollständig geschlossen sind. }
if (digitalRead(PIN_BUTTON) == HIGH && aButtonPressed == true) { // Wenn der Taster nicht gedrückt wird, aber zuvor gedrückt wurde ... aButtonPressed = false; // vergesse, dass der Taster gedrückt wude.
if (aLedEnabled == true) { // Wenn die LED gerade leuchtet ... digitalWrite(PIN_LED, LOW); // schalte die LED aus ... aLedEnabled = false; // und merke dir, dass die LED gerade nicht leuchtet, } else { // sonst ... digitalWrite(PIN_LED, HIGH); // schalte die LED ein ... aLedEnabled = true; // und merke dir, dass die LED gerade leuchtet. } } }
Wie kann ich das in meinen Sketch einbauen, sodass beide Funktionen möglich werden?
vG Uwe
„Es ist nicht der Unternehmer, der die Löhne zahlt — er übergibt nur das Geld. Es ist das Produkt, das die Löhne zahlt.“ Henry Ford, ein außergewöhnlicher Manager, Geschäftsmann und Erfinder, 1863 - 1947
int RELAIS=2; //Am Ausgang d2 wird die Relaisplatine angeschlossen [color=#FF0000]int TASTER=3[/color] const long interval = 15000; unsigned long previousMillis = 0;
void setup() {
[color=#FF0000]pinMODE(TASTER, INPUT_PULLUP); //TASTER ist als Eingang definiert[/color] pinMode(RELAIS,OUTPUT); //RELAIS ist als Ausgang definiert
unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (random(1000) < 500) //Es wird eine Zufallszahl zwischen 0 und 1000 ermittelt, falls //diese Zufallszahl < 500 ist, dann digitalWrite(RELAIS, HIGH); //soll RELAIS eingeschaltet werden, else //ist die Zufallszahl >500, dann digitalWrite(RELAIS, LOW); //schalte RELAIS aus }
}
„Es ist nicht der Unternehmer, der die Löhne zahlt — er übergibt nur das Geld. Es ist das Produkt, das die Löhne zahlt.“ Henry Ford, ein außergewöhnlicher Manager, Geschäftsmann und Erfinder, 1863 - 1947
die Aufgabenstellung: Mittels eines Taster soll ein Ausgang des Arduino für 60 Sekunden (Timer) eingeschaltet werden. Der Ausgang soll abgeschaltet werden, wenn - entweder die 60 Sekunden abgelaufen sind, oder - wenn vorher der Taster ein zweites Mal betätigt wird (Abbruch des Timers)
Das Problem ist gelöst (danke an 'agmue' aus dem Arduino-Forum). Der Wert der Konstanten 'ausgangIntervall' gibt die Zeit in Millisekunden an, wann der Ausgang abgeschaltet werden soll.
void loop() { aktMillis = millis(); // Tastenaktualisierung mit Entprellen altTaster = aktTaster; if (aktMillis - prellMillis >= prellIntervall) { prellMillis = aktMillis; aktTaster = digitalRead(pinEingang); } // Tasteraktion if (altTaster && !aktTaster) // Flankenerkennung Taster gedrückt, LOW aktiv { if (ausgangStatus) { ausgangStatus = LOW; digitalWrite(pinAusgang, LOW); // Ausgang AUS durch Tastendruck } else { ausgangMillis = aktMillis; ausgangStatus = HIGH; digitalWrite(pinAusgang, HIGH); // Ausgang EIN durch Tastendruck } } // Ausgang schalten if (ausgangStatus && (aktMillis - ausgangMillis >= ausgangIntervall)) { digitalWrite(pinAusgang, LOW); // Ausgang AUS durch Zeit ausgangStatus = LOW; } }
vG Uwe
„Es ist nicht der Unternehmer, der die Löhne zahlt — er übergibt nur das Geld. Es ist das Produkt, das die Löhne zahlt.“ Henry Ford, ein außergewöhnlicher Manager, Geschäftsmann und Erfinder, 1863 - 1947
Hallo zusammen, ja der Sketch funktioniert soweit auch wenn die angestrebte Zeit nicht ganz 60sek/1min. schaltet! Für viele Miteisenbahner ist das auch wieder ein gelungener Sketch mit dem sich sehr viel anstellen lässt. Denn für meine kleine Dorfkirche brauche ich auch noch so eine Steuerung für das Geläut!
Macht weiter so damit die Ideen niemals ausgehen und es noch sehr lange weiter geht mit der Moba-Eigenbausteuerung und das schalten von Zusatzfuntionen!
Gruß Karsten
Für Klugscheißerei und Neid nehme ich mir KEINE Zeit! www.rafeba.de.tl nicht jeder PC mag das .de.tl !!! Das Maß ist VOLL und ich brauche eine neue Homepage! www.rafeba02.de.tl