Probleme bei Ansteuerung von Zeitschaltung mit Countdown und Endstop

Hallo zusammen,

ich habe mit für meine 3D-Drucke eine UV-Trockenbox gebaut und die wird mit einem Drehknopf und Display (für die Zeitanzeige und Einstellung) über den Arduino gesteuert.
Die LEDs starte ich nach der Zeiteinstellung über den Tastendruck und dann schalten die LEDs an und nach Ablauf der Zeit schaltet alles wieder ab.
Die LEDs steuere ich zusätzlich mit 12V über ein Relais.
Soweit so gut. Funktionierte auch bislang super.
Nun habe ich in die Türe der Box einen kleinen Endschalter eingebaut, damit, wenn die Türe offen ist,
die LEDs ausgehen.
Die Zeit läuft aber weiter.
Der Endschalter trennt eine Leitung der Stromzufur vom Relais zu den LEDs.
Sobald er wieder gedrückt wird, sprich die Türe zu ist geht das Licht in der Box wieder an.

Und hier liegt mein Problem.
Sobald der Endschalter einmal ausgelöst wurde schaltet der Timer nicht mehr ab und zählt in den Minusbereich und läuft endlos weiter.
Lasse ich den Endschalter unberührt, also beim Start des Countdown offen oder geschlossen, schaltet der Timer brav ab.

Ich habe schon alle mir erdenklichen Optionen probiert. Auch das Relais getausch, Kabel umgesteckt etc.
Leider komme ich nicht dahinter und verzweifle mittlerweile.

Hier mal der Code:

#include <Timer.h>
#include <Arduino.h>
#include <U8g2lib.h>
#include <ClickEncoder.h>
#include <TimerOne.h>

void startExposure();
void stopExposure();
void countDown();
void displayTimer(int val);

#define ENCODER_MAX 1800
#define ENCODER_MIN 0
#define ENCODER_START 10

#define TIMER_MIN 0
#define TIMER_MAX 1800

#define ENCODER_PIN_A PIN6
#define ENCODER_PIN_B PIN7
#define BUTTON_PIN PIN2
#define SWITCH_PIN PIN3

U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0);

int timerValue = 0;
Timer t;
bool underExposure = false;
int countEvent, exposureEvent;
char buffer[6];
int counter;
static int encoderPos = ENCODER_START;
ClickEncoder encoder(ENCODER_PIN_A, ENCODER_PIN_B, BUTTON_PIN);


void timerIsr() {
  encoder.service();
}

void setup() {
  Serial.begin(115200);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(ENCODER_PIN_A, INPUT);
  pinMode(ENCODER_PIN_B, INPUT);
  pinMode(SWITCH_PIN, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), startExposure, FALLING);

  u8g2.begin();
  u8g2.setPowerSave(0);
  u8g2.setFont(u8g2_font_profont22_tn);

  Timer1.initialize(1000);
  Timer1.attachInterrupt(timerIsr);

  encoder.setAccelerationEnabled(true);
}

void loop() {
  t.update();

  if (!underExposure) {
    encoderPos += (encoder.getValue() * 10);

    timerValue = map(encoderPos, ENCODER_MIN, ENCODER_MAX, TIMER_MIN, TIMER_MAX);
    timerValue = constrain(timerValue, TIMER_MIN, TIMER_MAX);

    displayTimer(timerValue);
   
  }
}

void displayTimer(int val) {
  int minutes = val / 60;
  int seconds = val - (minutes * 60);
  int barSize = map(val, TIMER_MIN, TIMER_MAX, 1, 126);


  sprintf(buffer, "%02d:%02d", minutes, seconds);
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB10_tr);
    u8g2.drawStr(6, 13,"Exposure Time");
    u8g2.setFont(u8g2_font_profont22_tn);
   // u8g2.setCursor(10, 10);
    u8g2.drawFrame(0, 20, 128, 22);
    u8g2.drawBox(2, 22, barSize, 20);
    u8g2.setCursor(36, 64);
    u8g2.print(buffer);
  } while ( u8g2.nextPage());
}

void startExposure() {
  detachInterrupt(digitalPinToInterrupt(BUTTON_PIN));
  digitalWrite(SWITCH_PIN, HIGH);
  underExposure = true;
  exposureEvent = t.after(timerValue * 1000L, stopExposure);
  countEvent = t.every(1000L, countDown);

}

void stopExposure() {
  digitalWrite(SWITCH_PIN, LOW);
  underExposure = false;
  attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), startExposure, FALLING);
  t.stop(countEvent);
  t.stop(exposureEvent);
}

void countDown() {
  timerValue--;
  displayTimer(timerValue);
}

Woran kann es nur liegen?
Vielen Dank im Vorraus!
Chris

PS: Wenn ich einen Schaltplan noch schicken soll, bitte Bescheid geben, dann zeichne ich noch eins.

Hi,

poste bitte noch welche Hardware du verwendest, z.B. Arduino Mega, ESP8266, möglichst mit Herstellerangabe, Typ und Pinbelegung. Verlinke bitte auch noch deine verwendeten Libs.

Gruß
wapjoe

PS: Ein paar Kommentare könnte dein Sketch schon vertragen. :wink:

Hat Dein Relais eine Freilaufdiode?

Gruß Tommy

Ich habe folgende Bauteile verwendet:

Arduino Uno R3 ATmega 328P
1 Kanal 5V Relais Modul
I2C Display
Drehregler (Bauart wie dieser, nur aus einem Startetset übrig gehabt)
und halt einen kleinen Endschalter (baugleich) aus meinem Fundus.

Kommentare kommen noch…
Libs im Anhang (Alle die ich installiert habe, leider nicht mehr zuordenbar ewlche ich jetzt hier direkt genutzt habe)

Tommy56:
Hat Dein Relais eine Freilaufdiode?

Gruß Tommy
Ja laut Verkäufer schon.
Hatte auch noch zwei andere Relais probiert, die aber auch eine haben, aber ohne Erfolg.

dhchris:
Libs im Anhang (Alle die ich installiert habe, leider nicht mehr zuordenbar ewlche ich jetzt hier direkt genutzt habe)

Wenn du keinen Überblick über deine verwendeten Libs hast, wie soll sich dann ein Außenstehender einen Überblick verschaffen? :wink:

Über diese von dir verwendeten Libs solltest du dir und uns Informationen zusammensuchen:

#include <Timer.h>
#include <U8g2lib.h>
#include <ClickEncoder.h>
#include <TimerOne.h>

Suchen kannst du z.B. in dem du im Bibliotheksverwalter nach den Dateinamen (xxx.h) suchst und dir die Infos jeweils über den Link More info anschaust.

BTW: #include <Arduino.h> ist über die Arduino IDE unnötig, aber m.E. keine Fehlerquelle.

Geht klar, suche ich gleich raus...