Go Down

Topic: Neuling sucht zeitverzögerte Schaltung (Read 622 times) previous topic - next topic

Greifi55

Hallo zusammen,

Habe mir das Arduino Uno zugelegt.
Für Euch sicher ein Klacks, aber ich bin Hobbyfotograf und Elekroniker (aber kein Programmierer) und suche für eine bestimmte Foto-Anwendung folgende Programmierung:

Nach drücken des Start-Schalters (Hardware funktioniert schon alles) gehen 5 LED´s separat zeitverzögert (einstellbar über msec im Programm) an und gehen nach einer separat einstellbaren Zeit wieder aus. Bis der Taster wieder neu gedrückt wird.

Eigendlich simpel, bin mich auch schon den ganzen Tag in die Programmiersprache am reinlesen. Ich werde auf mich selbst gestellt sicher laaaange brauchen. Wenn überhaupt. Anstelle der LED´s kommen dann später Foto, Blitz usw.

Vielleicht kann mir einer unter die Arme greifen. Danke im Vorraus
Gruß Greifi



Klaus_ww

Ich geb Dir Stichworte
- millis()
- variable für Dein Intervall
- digitalout

Schau Dir die blinkende LED aus den Beispielen und dann Blink without delay an. Dann bist Du so gut wie durch.

Greifi55

das ist schon mal ein guter Ratschlag. Danke
Wie bekomme ich programmiertechnisch den Schalter/Taster da mit rein.
Solo hab ich das schon gesehen. Aber die Verknüpfung als Start für die LED ist mir noch ein Rätsel.

Klaus_ww

Schalter ist eine Abfrage digitalread. Der wird in der Loop abgefragt und wenn Du drückst geht's los.

Greifi55

Ich komme nicht klar. Morgen kommt mein Sohn der kann das.

uwefed

Fang mal mit einem Buch oder Tutorial über Arduino an. wenn Du mal drinnen bist dann ist es ganz einfach.
Grüße Uwe

jurs


Ich komme nicht klar. Morgen kommt mein Sohn der kann das.


Wenn Du nur ganz einfach sequentiell nacheinander mit delay schalten möchtest, kannst Du es einfach mit beiliegendem Code machen. In der loop wird ein Button abgefragt (und dabei entprellt), wenn der Button gedrückt wird, startet das Schaltprogramm.

Code: [Select]

// Pin definieren, an dem der Tastschalter angeschlossen wird
#define BUTTONPIN 2
#define DEBOUNCETIME 10

// Pins definieren, an die die LEDs angeschlossen werden
byte ledPins[]={3,5,9,12,13};

void LEDsSchalten()
{
  // Einschalten der 5 LEDs mit verschiedenen Pausen dazwischen
  digitalWrite(ledPins[0], HIGH); // Erste LED ein
  delay(1000);
  digitalWrite(ledPins[1], HIGH); // Zweite LED ein
  delay(1500);
  digitalWrite(ledPins[2], HIGH); // Dritte LED ein
  delay(2000);
  digitalWrite(ledPins[3], HIGH); // Vierte LED ein
  delay(3000);
  digitalWrite(ledPins[4], HIGH); // Fünfte LED ein
  delay(15000); // 15 Sekunden alles an lassen
  // Ausschalten der 5 LEDs mit verschiedenen Pausen dazwischen
  digitalWrite(ledPins[4], LOW); // Fünfte LED aus
  delay(3000);
  digitalWrite(ledPins[3], LOW); // Vierte LED aus
  delay(2000);
  digitalWrite(ledPins[2], LOW); // Dritte LED aus
  delay(1500);
  digitalWrite(ledPins[1], LOW); // Zweite LED aus
  delay(1000);
  digitalWrite(ledPins[0], LOW); // Erste LED ein
  // Schaltsequenz beendet, wieder zurück zur loop-Funktion
}


boolean buttonPressed()
{
  // einen "high active" geschalteten Button an BUTTONPIN abfragen
  // liefert "true" nach Statusänderung von nicht gerdrückt zu gedrückt
  // liefert false sonst
  static boolean buttonFired;
  static long buttonDownSince;
  boolean State=digitalRead(BUTTONPIN);
  if (State==LOW) 
  { // this button is not pressed at this time
    buttonFired=false;
    buttonDownSince=0;
  }
  else if (State==HIGH && buttonDownSince==0)
  { // button is pressed but DEBOUNCETIME did not yet started counting
    buttonFired=false;
    buttonDownSince=millis();
  }
  if (State==HIGH && millis()-buttonDownSince>=DEBOUNCETIME && buttonFired==false)
  { // button is pressed and DEBOUNCETIME passed, so fire the button
    buttonFired=true;
    return(true); // return pin number of button
  } 
  return(false); // no button fired this time, return invalid pin number
}



void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  // Button auf INPUT setzen
  pinMode(BUTTONPIN, INPUT);
  // LED Ausgänge auf OUTPUT setzen
  for (int i=0;i<sizeof(ledPins);i++)
    pinMode(ledPins[i],OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (buttonPressed()) LEDsSchalten();
}


ABER: Der Controller kann innerhalb der Schaltsquenz nichts anderes machen! Also insbesondere kann die Schaltsequenz nicht abgebrochen werden (außer durch Ziehen des Steckers oder Reset).

Wenn die Schaltsequenz abbrechbar sein soll ("Not-Aus"), benötigst Du ein komplett anderes und wesentlich komplexeres Design für die Programmschrittsteuerung, so wie sie in Waschmaschinen und Geschirrspüler eingebaut ist. Da kannst Du jederzeit die Aus-Taste drücken und das Gerät geht aus, oder beim Geschirrspüler im laufenden Programm die Tür aufreißen und es findet sofort eine Notfall-Unterbrechung des Spülprogramms statt. Das ist dann nicht so einfach zu realisieren.

BTW: Wenn Du später mal statt der LEDs Relais anschließen möchtest, bitte beachten, dass Relais oft eine vertauschte Logik haben, also "active LOW" sind (Relais schaltet auf LOW).

Greifi55

Das sieht gut aus - hätte ich (noch) nicht hinbekommen - Vielen Dank !!!   8)

Das mit dem Abschalten ist absolut kein Problem, da, nachdem die LED´s durchgelaufen sind, sowieso die Schaltung in Ruhestellung ist, bis zum nächsten Start.
Dann kommt dazu, dass ich durch die Fotoexperimente sowieso laufend die Zeitwerte umstellen muss und kann :)
Das mit den Relais ist eine meiner kleinsten Übungen. Habe früher im Hydraulikbereich Messgeräte gebaut.
Aber Danke für den Tip - Wofür gibts Messgeräte und Transistoren.

Übrigens wußte ich nicht, als ich das Arduino vor 2 Wochen bestellt habe was für ein tolles Gerät es ist. Digitale und analoge Ein/Ausgänge. Sogesehn ein Analog Digitalwandler. Mit Anschluss von Sensoren usw.

Nochmals Danke
Gruß Greifi


Go Up