INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Belichtungsgerät mit Timerfunktion (Countdown)
15.01.2020, 05:51
Beitrag #17
RE: Belichtungsgerät mit Timerfunktion (Countdown)
Wie schon Anfangs geschrieben ist die Schaltung und auch der Sketch ursprünglich nicht von mir. Nach der Beschreibung wird der Taster gedrückt gehalten, Die Zeit dann über das Poti eingestellt und beim loslassen des Tasters soll der Countdown gestartet werden. Ob das auch tatsächlich funktioniert wird sich zeigen, wenn ich alle Bauteile zusammen habe und es testweise aufbauen kann.Leider fehlt noch das Display, müsste aber diesen Monat noch kommen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.01.2020, 08:47
Beitrag #18
RE: Belichtungsgerät mit Timerfunktion (Countdown)
Das einstellen der Zeit mit einem Poti finde ich nicht so toll. Ich würde einen Rotary Encoder vorziehen.
Und weil mich das Thema interessiert und ich sowieso die Teile hier rumliegen habe, dachte ich mir, dass ich auch mal einen Timer programmiere.
Mein Aufbau sieht so aus:
   

Wie gesagt ist das mit einem Rotary Encoder: https://www.berrybase.de/bauelemente/pas...oard?c=164

Damit kann man die Minuten (0 bis 99) und die Sekunden (0 bis 59) einstellen. Zum wechseln zwischen den beiden benutzt man die Klickfunktion des Encoders.

Ich hatte erst den Start/Stop auch noch auf die Doppelklickfunktion gelegt, aber das lässt sich nicht so gut handhaben, weshalb ich einen zusätzlichen Taster ("S1" im Schaltplan) eingebaut habe.

Hier mal der Sketch (oder im ZIP-Archiv im Anhang):
Code:
#include <LiquidCrystal_I2C.h>   // https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
#include <ClickEncoder.h>        // https://github.com/0xPIT/encoder/tree/arduino
#include <TimerOne.h>            // https://github.com/PaulStoffregen/TimerOne

// Dreh-Enkoder mit Klickbutton:
// https://www.berrybase.de/bauelemente/passive-bauelemente/potentiometer/drehimpulsgeber/drehregler/rotary-encoder-mit-breakoutboard?c=164
const uint8_t ENC_SW = 2;        // Dreh-Enkoder "SW" an Pin D2 vom Nano
const uint8_t ENC_DT = 3;        // Dreh-Enkoder "DT" an Pin D3 vom Nano
const uint8_t ENC_CLK = 4;       // Dreh-Enkoder "CLK" an Pin D4 vom Nano
const uint8_t ENC_STEP = 4;      // Dreh-Enkoder (Werte pro Dreh-Schritt / je nach Dreh-Enkoder anpassen)

const uint8_t RELAIS_PIN = 5;    // Relaismodul Data-IN
const bool ACTIVE_LOW = true;    // Relaismodul Low-aktiv?
const uint8_t START_PIN = 6;     // Button (nach GND) zum starten/stoppen des Timers

// I2C-LCD (Addr. 0x27) mit 16 Zeichen pro Zeile und 2 Zeilen
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Dreh-Enkoder
ClickEncoder *encoder;

// Benutzerdefinierte Zeichen (rotierende Uhr)
uint8_t timeSign[4][8] = {
  {B00000, B01010, B11011, B11011, B11111, B01110, B00000, B00000},
  {B00000, B01110, B11111, B11000, B11111, B01110, B00000, B00000},
  {B00000, B01110, B11111, B11011, B11011, B01010, B00000, B00000},
  {B00000, B01110, B11111, B00011, B11111, B01110, B00000, B00000}
};

uint8_t timeCount = 0;
uint32_t timeMillis, nowMillis;
int16_t timerValue[2] = {0, 0}, oldValue[2] = {0, 0};
volatile uint16_t timerSeconds = 0, oldSeconds = 0;
volatile bool select = 0, timerRun = 0;
bool oldState = 0;
char buf[16];

// Interrupt-Funktion fuer den Dreh-Enkoder und zum runterzaehlen der Sekunden
// wird jede Millisekunde aufgerufen
void timerIsr() {
  static uint16_t ticks = 0;
  if (timerRun && timerSeconds) {
    if (++ticks >= 1000) {
      timerSeconds--;
      ticks = 0;
    }
  }
  encoder->service();
}

void setArrow(const uint8_t x, const uint8_t y) {
  static uint8_t ox = 14, oy = 0;
  lcd.setCursor(ox, oy);
  lcd.print(F("  "));
  lcd.setCursor(x, y);
  lcd.print(F("<="));
  ox = x;
  oy = y;
}

void setup() {
  digitalWrite(RELAIS_PIN, LOW ^ ACTIVE_LOW);
  pinMode(RELAIS_PIN, OUTPUT);
  pinMode(START_PIN, INPUT_PULLUP);
  lcd.begin();
  lcd.backlight();
  for (uint8_t i = 0; i < 4; i++) lcd.createChar(i, timeSign[i]);
  lcd.setCursor(0, 0);
  lcd.print(F("TIME"));
  sprintf(buf, "%02i:%02i", timerValue[0], timerValue[1]);
  lcd.setCursor(6, 0);
  lcd.print(select ? F("S ") : F("M "));
  lcd.print(buf);
  lcd.setCursor(0, 1);
  lcd.print(F("POWER "));
  lcd.write(timeCount);
  sprintf(buf, "%02i:%02i", timerSeconds / 60, timerSeconds % 60);
  lcd.setCursor(8, 1);
  lcd.print(buf);
  setArrow(14, 0);
  encoder = new ClickEncoder(ENC_CLK, ENC_DT, ENC_SW, ENC_STEP); // den Dreh-Enkoder initialisieren
  encoder->setAccelerationEnabled(true);
  Timer1.initialize(1000);                 // Timer-Interrupt (1000 us = 1 ms) fuer den Dreh-Enkoder
  Timer1.attachInterrupt(timerIsr);        // die Interrupt-Funktion
}

void loop() {
  nowMillis = millis();
  if (timerRun != oldState) {
    oldState = timerRun;
    digitalWrite(RELAIS_PIN, timerRun ^ ACTIVE_LOW);
  }
  if (timerRun) {
    if (nowMillis - timeMillis > 500) {
      timeMillis = nowMillis;
      timeCount++;
      if (timeCount > 3) timeCount = 0;
      lcd.setCursor(6, 1);
      lcd.write(timeCount);
    }
    if (oldSeconds != timerSeconds) {
      oldSeconds = timerSeconds;
      sprintf(buf, "%02i:%02i", timerSeconds / 60, timerSeconds % 60);
      lcd.setCursor(8, 1);
      lcd.print(buf);
      if (!oldSeconds) {
        timerRun = 0;
        setArrow(14, timerRun);
        lcd.setCursor(6, 0);
        lcd.print(timerRun ? F("  ") : select ? F("S ") : F("M "));
      }
    }
  } else {
    timerValue[select] += encoder->getValue();
    if (timerValue[0] < 0) timerValue[0] = 100 + timerValue[0];
    if (timerValue[0] > 99) timerValue[0] = timerValue[0] % 100;
    if (timerValue[1] < 0) timerValue[1] = 60 + timerValue[1];
    if (timerValue[1] > 59) timerValue[1] = timerValue[1] % 60;
    if (timerValue[select] != oldValue[select]) {
      oldValue[select] = timerValue[select];
      sprintf(buf, "%02i:%02i", timerValue[0], timerValue[1]);
      lcd.setCursor(6, 0);
      lcd.print(select ? F("S ") : F("M "));
      lcd.print(buf);
    }
  }
  if (!digitalRead(START_PIN) && nowMillis - timeMillis > 100) {
    timeMillis = nowMillis;
    timerSeconds = timerValue[0] * 60 + timerValue[1];
    if (timerSeconds) {
      timerRun ^= 1;
      setArrow(14, timerRun);
      lcd.setCursor(6, 0);
      lcd.print(timerRun ? F("  ") : select ? F("S ") : F("M "));
    }
    while(!digitalRead(START_PIN)) delay(10);
  }
  ClickEncoder::Button b = encoder->getButton();     // den Button-Status abfragen
  if (b != ClickEncoder::Open) {
    switch (b) {                                     // und entsprechend darauf reagieren
      case ClickEncoder::Clicked:                    // Button wurde einmal angeklickt
        select ^= 1;
        lcd.setCursor(6, 0);
        lcd.print(select ? F("S ") : F("M "));
        break;
      case ClickEncoder::DoubleClicked:              // Doppelklick auf den Button
        break;
      case ClickEncoder::Held:                       // Button gedrueckt halten
        break;
      case ClickEncoder::Released:                   // Button losgelassen (nach gedrueckt halten)
        break;
    }
  }
}


Angehängte Datei(en)
.zip  I2C_Countdown.zip (Größe: 2,05 KB / Downloads: 45)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2020, 21:04
Beitrag #19
RE: Belichtungsgerät mit Timerfunktion (Countdown)
Guten Abend in die Runde.

Da heute endlich u.a. mein Display angekommen ist, hab ich schnell mal die Schaltung auf ein Breadboard zusammen gesteckt und das ausprobiert.

Dabei ist mir ein Fehler (der auch schon angesprochen wurdeAngel) in der Schaltung aufgefallen. Der ergab sich dann aus dem Scetch.
Das Poti wird permanent bestromt und nicht erst über den Taster, beide laufen also unabhängig von einander.
Der Sketch funktionierte ohne Probleme. Das einzigste Manko ist, dass sich die Zeit über das Poti nur recht schlecht einstellen lässt. Ist also nicht besonders feinfühlig.
Nun hab ich im Sketch leider nichts gefunden, wo man das u.U. abändern kann. In der aktuellen Version lässt sich die Zeit von 0:00 bis 17:00 min. einstellen. Die Spanne werde ich nicht brauchen, 10:00 min. würden mir völlig reichen. In der Annahme, dass dadurch das Einstellen besser funktioniert.

Ich erstelle gleich noch das Schaltbild vom Versuchsaufbau und stelle ihn zusammen mit dem Sketch nochmal rein.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2020, 21:10
Beitrag #20
RE: Belichtungsgerät mit Timerfunktion (Countdown)
Ah, ich denke ich habs. Der Analogwert vom Poti wird direkt in Sec. umgesetzt. Dann müsste es doch reichen, wenn ich die 0-1023 auf 0-600 mappe?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2020, 21:18
Beitrag #21
RE: Belichtungsgerät mit Timerfunktion (Countdown)
(22.01.2020 21:10)Scouter schrieb:  Ah, ich denke ich habs. Der Analogwert vom Poti wird direkt in Sec. umgesetzt. Dann müsste es doch reichen, wenn ich die 0-1023 auf 0-600 mappe?
Das kannst Du am Besten beurteilen, denn Du sitzt an der Hardware.

Wenn Du es feinfühliger willst, dann wäre evtl. doch der Drehencoder die bessere Wahl.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2020, 21:44
Beitrag #22
RE: Belichtungsgerät mit Timerfunktion (Countdown)
(22.01.2020 21:18)Tommy56 schrieb:  ...
Wenn Du es feinfühliger willst, dann wäre evtl. doch der Drehencoder die bessere Wahl.
...

Man könnte natürlich auch das Zeitpoti gegen eine Zweite Taste ersetzen zum UP/DOWN auf den Zeitgeber einzugeben. Den Zeitwert speichert man dann im EEPROM das man den das nächste mal wieder hat als Integer. Hier kann man dann den Zeitbereich bei einem Integer-Zeit Wert auf 6400 Sekunden bei 1/10 Sek. Auflösung einstellen kann... oder bis 640 Sekunden mit 1/100 Sek. Auflösung.
Wenn man dann noch den Schalter für Ein/Zweiseitig einlesen tut dann kann man für diese Betriebsarten automatisch eine andere Zeit abspeichern.
So würde ich das machen... ist präziser als die Potimethode und einfacher als einen Drehencoder einzulesen.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2020, 21:45
Beitrag #23
RE: Belichtungsgerät mit Timerfunktion (Countdown)
Bin ich gerade dabei, will aber noch nicht so wie ich.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.01.2020, 22:24
Beitrag #24
RE: Belichtungsgerät mit Timerfunktion (Countdown)
So, nun hab ichs. Allerdings musste ich auf 5 min. runter um den Timer einigermaßen vernünftig einstellen zu können. Das ist mir aber auch wieder etwas zu wenig, 10 min. wären besser gewesen. Ich glaube, ich werde auf Gorathan's Vorschlag zurückgreifen.
Die Angaben bei den Dreh-Encodern (24/360°) beziehen sich vermutlich auf die Impulse pro Umdrehung?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Countdown timer cb_baer 9 9.734 04.03.2015 22:40
Letzter Beitrag: cb_baer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste