gregorss:
Was Du schreibst klingt, als hättest Du noch keinen Arduino.
Falls das der Fall ist, kommt hier mein Senf zur Sache: Leg’ Dir erstmal so ein Ding zu und lerne es kennen. Wenn Du ein bisschen Basiswissen hast, ist der Rest keine sooo wilde Angelegenheit.
Gruß
Gregor
nope... ich hab n board hier, hab aber bisher noch nicht so viel gemacht.
jurs:
Der Sketch hier ist für so etwas ähnliches und für ein Text-Display als Anzeigehardware geschrieben.
Drei Buttons (Plus, Minus, Start) werden verwendet, für eine Zeiteinstellung bis max. 10 Minuten (in Sprüngen von 10 Sekunden) und einem zusätzlichen Relais-Schaltausgang, das war wohl für eine Blichtungssteuerung zur Belichtung von Fotoplatinen. Anzeige der Einstellzeit und des Countdowns auf einem Text-LCD.
Die loop()-Funktion brauchst Du dabei glaube ich nicht verändern, auch wenn Dein Programm etwas anders laufen soll:
#include <LiquidCrystal.h>
// LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
LiquidCrystal lcd(8,9,4,5,6,7);
struct button_t{byte pin; byte val; boolean pressed;};
const byte NUMBUTTONS=3;
button_t buttons[NUMBUTTONS]={
{2}, // Pin-Nummer für Minus-Button
{A3}, // Pin-Nummer für Plus-Button
{3}, // Pin-Nummer für Start-Button
};
const long defaultZeit=30000L;
long zeit=defaultZeit; // in Millisekunden
enum {EINSTELLEN, COUNTDOWN};
byte mode=EINSTELLEN;
void eingabe()
{
static unsigned long lastTime;
long now=millis();
for (int i=0;i<NUMBUTTONS;i++) buttons[i].pressed=false;
if (now-lastTime<5) return;
lastTime=now;
byte val;
for (int i=0;i<NUMBUTTONS;i++)
{
val=!digitalRead(buttons[i].pin);
if (val==HIGH && buttons[i].val==LOW) buttons[i].pressed=true;
buttons[i].val=val;
}
}
void verarbeitungEinstellen()
{
if (buttons[0].pressed)
{
zeit-=10000L; // 10 Sekunden abziehen
if (zeit<0) zeit=0;
}
if (buttons[1].pressed)
{
zeit+=10000L; // 10 Sekunden draufschlagen
if (zeit>600000L) zeit=600000L;
}
}
unsigned long countDownStart;
void verarbeitungCountDown()
{
long diff=millis()-countDownStart;
if (diff==0) return;
countDownStart+=diff;
zeit-=diff;
if (zeit>0) return;
zeit=defaultZeit;
mode=EINSTELLEN;
}
void verarbeitung()
{
if (buttons[2].pressed) // Start-Button gedrückt: Wechsel zwischen EINSTELLEN und COUNTDOWN
{
if (mode==EINSTELLEN)
{
countDownStart=millis();
mode=COUNTDOWN;
}
else mode=EINSTELLEN;
}
else if (mode==EINSTELLEN) verarbeitungEinstellen();
else if (mode==COUNTDOWN) verarbeitungCountDown();
}
void ausgabe()
{
int seconds=zeit/1000;
int minutes=seconds/60;
seconds=seconds%60;
char buf[17];
snprintf(buf,sizeof(buf),"%02d:%02d",minutes,seconds);
lcd.setCursor(0,0);
lcd.print(buf);
lcd.setCursor(0,1);
if (mode==EINSTELLEN) lcd.print("Einstellen");
else if (mode==COUNTDOWN) lcd.print("Countdown ");
}
void setup()
{
lcd.begin(16, 2);
lcd.clear();
lcd.print(" Zeitsteuerung");
lcd.setCursor(0, 1);
lcd.print(" Belichtung");
delay(3000);
lcd.clear();
for (int i=0;i<NUMBUTTONS;i++)
{
pinMode(buttons[i].pin,INPUT_PULLUP);
}
eingabe();
}
void loop()
{
eingabe();
verarbeitung();
ausgabe();
}
Und der Code is soweit modular gehalten, dass Du beispielsweise nur die Funktion "ausgabe()" umschreiben brauchst, wenn Du anstelle eines Text-LCD irgendwas anderes als Einstell- und Countdown-Anzeige verwenden möchtest.
danke, soll aber kein lcd sondern n 4x7segment buastein am ende sein