Ampelsteuerung ROT GRÜN für Wasserrutsche

Hallo zusammen,

bin auf der suche nach einem kleinen Programm für eine einfache Ampel.
Hardware ist fertig verdrahtet aber leider bin kein Programmierer und kenn mich mit C basierenden Sprachen nicht aus. Kann mir da jemand weiterhelfen?
Ich habe nur 2 Ausgänge auf Pin 0 und 1 auf Pin 2 hab ich einen Start Taster.
Spannungsversorgung über Vin und GND.
Ich möchte das die Ampel startet wenn ich den Taster betätige. Sie soll 5 Sek. Grün sein und 25 Sek. Rot, immer in einem Loop bis ich den Taster noch einmal betätige.
Steuerung habe ich die Arduino UNO SMD Edition.

Danke schon mal für jede Hilfe

LG
Matt

Ich habe nur 2 Ausgänge auf Pin 0 und 1

Pin 0 und 1 solltest du nicht unbedingt verwenden, nehme lieber Pin 3 und 4. Den Taster schließt du an Pin 2 und GND an. Was hast du an den Ausgängen? Was soll geschehen wenn der Taster nicht gedrückt wird?

OO Ok erstmal danke für die Info wegen den Pins 1+2. Der Taster soll nur als Start und Stopp dienen.
Ich will damit die Ampel ein- ausschalten können. An den Ausgängen habe ich eine Relaiplatine die meine Birnen schaltet.
Ist das bei dieser Steuerung üblich einen Eingang mit GND zu beschalten?
LG
Matt

kollerrabe:
Ist das bei dieser Steuerung üblich einen Eingang mit GND zu beschalten?
LG
Matt

Die kurze Antwort ist ja.

Die lange Antwort ist folgende:
Beginnern scheint es logischer, ein + Signal auf die Eingänge zu schalten.
Das ist auch durchaus machbar. Die Eingänge von Microcontroller sind aber hochempfindlich
( im Sinne von empfindsam). Da reichen wenige elektromagnetische Wellen oder auch nur eine statische Aufladung und dein Eingang schaltet an.
Um dies zu vermeiden benötigst du einen pull down Widerstand. (4.7 - 10kOhm).
Wie gesagt, da ist nichts schlimmes bei.
Fortgeschrittene nutzen die Möglichkeiten des eingebauten Pull-Up Widerstandes.
Dieser ist im Prozessor bereits vorhanden und kann mit einem einzigen Befehl zugeschaltet werden.
Somit benötigt man lediglich einen Taster und diesen legt man auf GND.
Es funktioniert einfach genau umgekehrt.

Stefan

AAAAAA Ok das leuchtet ein.
Genau aus diesem Grund wende ich mich ja an euch. Ich bin Mechatroniker und mit Siemens Steuerungen und Industrietechnik vertraut aber Microcontroller waren bis jetzt nicht mein ding. Vielen Dank für die tolle Erklärung.

LG
Matt

Der Taster soll nur als Start und Stopp dienen.
Ich will damit die Ampel ein- ausschalten können. An den Ausgängen habe ich eine Relaiplatine die meine Birnen schaltet.

Ablauf? Taster drücken, 5 Sec. grün, dann 25 sec. rot, dann alles aus bis zum nächsten Taster drücken?
Sind die Relais High oder Low aktiv?
Was sind das für Birnen? DC/AC welche Spannung, welcher Strom?

Ablauf: Taste Start drücken----> 5 Sek. Grün ---> 25 Sek. Rot ---> Grün ---> Rot ---> (Immer im Loop) Taste Start das zweite mal betätigt ---> Ampel aus kein Relai angezogen.

Relai Karte: C. Control verbaute Relais: Songle SRD-12VDC-SL-C
Dieses Relai ist aktiv wenn der Ausgang des Controllers auf 1 ist.

Über diese Relai Karte wird dann ein Finder Relai geschalten mit 12VDC.
Die Finder Relais Schalten dann die Birnen ein und aus. 230 VAC

Wäre es dafür nicht geeigneter, den Controller über die Versorgungsspannung mittels Schalter zu starten (an- und auszuschalten)? Wenn es ein Taster sein muss, dann ginge dies mit einem Schaltfolgekonverter.

Was Dein Relais angeht: Du schreibst, dass die Lampen von einem Relais gesteuert werden, welches über ein Relais geschaltet wird? Hängt vor dem Relais noch ein Oktokoppler oder ein Transistor mit Schutzdiode?

Relai Karte: C. Control verbaute Relais: Songle SRD-12VDC-SL-C
Dieses Relai ist aktiv wenn der Ausgang des Controllers auf 1 ist.

Über diese Relai Karte wird dann ein Finder Relai geschalten mit 12VDC.
Die Finder Relais Schalten dann die Birnen ein und aus. 230 VAC

wäre es nicht sinnvoller die Birnen direkt mit einem SSR zu schalten?

ardubu:
wäre es nicht sinnvoller die Birnen direkt mit einem SSR zu schalten?

Da nicht jeder eine Wasserrutsche in der Größe zu Hause hat, vermute ich mal eine bereits vorhandene Installation.
Falls nicht stimme ich dir 100% zu.

Stefan

Die Hardware ist schon vorhanden und ich möchte nicht unbedingt was neues kaufen.
Zum Taster muss ich sagen das er nicht unbedingt genutzt werden muss. Ich habe ihn eingebaut da ich es gewohnt bin in einer logischen Schrittkette einen Startimpuls zu setzen um eine positive Flanke an einen Merker zu senden und das Programm zu starten. Die doppelte Relaiausführung habe ich wegen der zu hohen Spannung für die Platine gewählt. Steuerspannung habe ich ja alles in 12VDC ausgeführt und die Kontakte der Relais auf der Platine sind zu schwach für 230VAC

ich habe mal ein kleines Programm geschrieben, was hoffentlich das macht was du willst.

/*
 *© Ardubu July 2017
 *Ampelschaltung rot grün wird mit Taster gestartet und gestoppt
 *Taster wird zwischen GND und pin_x angeschlossen
 *interner Pullup Widerstand aktiviert
 *der counter wechselt mit jedem Tastendruck
*/

#define DEBUG //Nur zur Fehlersuche aktivieren
#define taste_pin 2 //Taster an D2 und GND
#define gruen_pin 3 //Ausgang gruen
#define rot_pin 4   //Ausgang rot
#define debounce_delay 15 //Entprellzeit für den Taster in ms
  bool counter, taster_State, taster_State_alt;// Variablendeklaration (global)
  uint32_t start;
void taster_einlesen()
{
  static uint32_t debounce_time;
 if (millis()-debounce_time>debounce_delay)taster_State = digitalRead(taste_pin); //einlesen des Tasters
 if(!taster_State) start=millis(); // wann wurde der Taster gedrückt
   
 if (taster_State != taster_State_alt) // bei Pegelwechsel 
    {
     debounce_time=millis();
     #ifdef DEBUG
               Serial.println(counter);
     #endif
     if(!taster_State)//wenn Taster gedrückt
       {
        counter = !counter;}
        taster_State_alt = taster_State; // state aktualisieren
        }
}     
void ampel_an()
{
    bool out = ((millis()-start)%(5000+25000)<5000);//wechselt 25s rot, 5s grün
    if (out) {digitalWrite (rot_pin,LOW);digitalWrite (gruen_pin,HIGH);} 
    if(!out) {digitalWrite (gruen_pin,LOW);digitalWrite (rot_pin,HIGH);}
}
void ampel_aus()
{
  digitalWrite (gruen_pin,LOW);
  digitalWrite (rot_pin,LOW);
}
void setup() 
{
  #ifdef DEBUG
  Serial.begin(115200);
  Serial.println("Setup");
  #endif
  pinMode(taste_pin, INPUT_PULLUP);
  pinMode(gruen_pin, OUTPUT);
  pinMode(rot_pin, OUTPUT);
 }

void loop() 
{ 
  taster_einlesen();
  if (!counter) ampel_aus();
  if (counter) ampel_an();
}//Ende loop

<Programm kopiert. Leider bringt mir der Controller einen Fehler

Es wird diese Zeile markiert: { static uint32_t debounce_time, start;

Error Text:

Arduino: 1.8.3 (Windows 7), Board: “Arduino/Genuino Uno”

C:\Users\Matthias\Documents\Arduino\sketch_jul14a\sketch_jul14a.ino: In function ‘void setup()’:

sketch_jul14a:20: error: a function-definition is not allowed here before ‘{’ token

{ static uint32_t debounce_time, start;

^

sketch_jul14a:70: error: expected ‘}’ at end of input

}

^

exit status 1
a function-definition is not allowed here before ‘{’ token

This report would have more information with
“Show verbose output during compilation”
option enabled in File → Preferences.

Dann hast Du einen Fehler beim Kopieren gemacht.
Bei mir kompiliert der Sketch problemlos.

Gruß Tommy

Ein Relais direkt am Mikrocontroller? Ich bezweifel, dass dies gut geht (so ganz ohne Schutzdiode, Transistor oder Optokoppler)... im schlimmsten Fall erzeugt die Spule des ersten Relais beim Öffnen genug Spannung, um den Arduino-Pin zu zerstören.

Hast Du einen Schaltplan zur Hand?

Programm kopiert. Leider bringt mir der Controller einen Fehler

wie hast du das Programm kopiert und eingefügt?
Ablauf: Im Forum Select anklicken, strg c, IDE öffnen, strg a, strg v

sooo. ich hab das ding jetzt noch mal kopiert und eingespielt. Funktioniert soweit. Ich habe jetzt nur noch das Problem das die Ampel nach einem Loop automatisch aufhört. Das Programm sollte laufen bis ich den Knopf noch mal drücke. Der andere Fehler war wirklich ein Fehler beim kopieren. Ansonsten mal vielen dank für das Programm und die tollen Tipps von euch allen.

Ich habe eine Relaiplatine mit vorgeschaltener Elektronik. Also der Controller wird nicht direkt mir der Spulenspannung belastet.

LG
Matt

ich habe das gerade mal mit 2 LED's und einem Taster aufgebaut, bei mir funktioniert's.
Wie hast du den Taster angeschlossen? Stelle nochmal das Programm das du auf den Uno geladen hast hier ein.

Komisch. ich habe auch noch getestet und es geht immer unterschiedlich lang. Einmal macht die Steuerung einen Loop und schaltet aus dann macht sie 3 Loop´s und schaltet aus. Gibt es bei diesem Controller die Möglichkeit wie bei ein er S7 online im Programm nachzusehen woran es scheitert? Den Taster habe ich als schließer Kontakt von GND auf Pin 3 gelegt. Möglicherweise gibt es auch die Möglichkeit das wir den Taster weg lassen und der Loop automatisch startet sobald der Controller Spannung hat?

LG
Matt

/*
*© Ardubu July 2017
*Ampelschaltung rot grün wird mit Taster gestartet und gestoppt
*Taster wird zwischen GND und pin_x angeschlossen
*interner Pullup Widerstand aktiviert
*der counter wechselt mit jedem Tastendruck
*/

#define DEBUG //Nur zur Fehlersuche aktivieren
#define taste_pin 2 //Taster an D2 und GND
#define gruen_pin 3 //Ausgang gruen
#define rot_pin 4 //Ausgang rot
#define debounce_delay 15 //Entprellzeit für den Taster in ms
bool counter, taster_State, taster_State_alt;// Variablendeklaration (global)
uint32_t start;
void taster_einlesen()
{
static uint32_t debounce_time;
if (millis()-debounce_time>debounce_delay)taster_State = digitalRead(taste_pin); //einlesen des Tasters
if(!taster_State) start=millis(); // wann wurde der Taster gedrückt

if (taster_State != taster_State_alt) // bei Pegelwechsel
{
debounce_time=millis();
#ifdef DEBUG
Serial.println(counter);
#endif
if(!taster_State)//wenn Taster gedrückt
{
counter = !counter;}
taster_State_alt = taster_State; // state aktualisieren
}
}
void ampel_an()
{
bool out = ((millis()-start)%(5000+25000)<5000);//wechselt 25s rot, 5s grün
if (out) {digitalWrite (rot_pin,LOW);digitalWrite (gruen_pin,HIGH);}
if(!out) {digitalWrite (gruen_pin,LOW);digitalWrite (rot_pin,HIGH);}
}
void ampel_aus()
{
digitalWrite (gruen_pin,LOW);
digitalWrite (rot_pin,LOW);
}
void setup()
{
#ifdef DEBUG
Serial.begin(115200);
Serial.println(“Setup”);
#endif
pinMode(taste_pin, INPUT_PULLUP);
pinMode(gruen_pin, OUTPUT);
pinMode(rot_pin, OUTPUT);
}

void loop()
{
taster_einlesen();
if (!counter) ampel_aus();
if (counter) ampel_an();
}//Ende loop

Hast du die möglichkeit an den Pin's 3 + 4 nur je 1 LED mit 330 Ohm Vorwiderstand zu legen und die Relais weglassen?
Ansonsten die loop gegen folgende austauschen und im Serial Monitor schauen ob sich das Tastersignal ändert.

void loop()
{
  taster_einlesen();
  if (!counter) ampel_aus();
  if (counter) ampel_an();
  Serial.println(digitalRead(2));
}//Ende loop