Hulp bij timer code

Goedenavond,

Mijn naam is Mike, en ben nog een echte noob wat betreft coderen. Nu ben ik bezig met een timer via een arduino, maar krijg niet voor elkaar wat ik zou willen.

Voor mijn projectje heb ik een code gebruikt waarbij een timer terug telt en een relais schakelt. Alles werkt naar behoren, maar zou nog een simpele aanpassing willen maken. Ik heb geprobeerd de huidige code aan te passen, maar dat lukt voor geen meter.

De werking zou alsvolgt moeten zijn:

Action: Push button

//Timer countdown 6 minutes (LCD: “Timer” and “06:00”)
//Relais On
//Disable pushbutton

//Remaining 2 minutes “beep”

//Remaining 1 minute “beep”

//End time “beep beep”
//Relais Off
//Timer countdown 3 minutes (LCD: “Locked” and “03:00”)

//End time: LCD “Welcome and “Current time"
//Enable pushbutton

Wie O Wie kan mij helpen met dit stukje code?

Alvast bedankt :slight_smile: Groeten, Mike.

Hoi Mike, welkom !

Om jou te kunnen helpen, hebben we eigenlijk meer informatie nodig.
Want geen idee wat je precies geprobeerd hebt en al helemaal geen idee wat er dan dus fout gaat.
"Het lukt voor geen meter", geeft vooral jouw frustratie aan maar niet wat er dan niet lukt, dus dat helpt niet om jou weer te helpen.

Daarom graag de code die je tot nog toe hebt hier laten zien.
Het maakt niet uit hoe 'slecht' die code is; je hoeft je niet te schamen dat je iets probeert te doen en daar hulp bij nodig hebt want daar is iedereen hier ooit tegenaan gelopen.
Let er op dat wanneer je code plaatst, je dat op de juiste manier doet.
Je kunt in de gebruiksaanwijzing van dit forum lezen hoe je dat doet.

Wat wel duidelijk is, is dat jij al in grove lijnen hebt weergegeven wat je wil dat er gebeurt.
Iedere regel die je hierboven toont, is om te bouwen naar een stukje echte code, waarschijnlijk wel meer regels dan er nu staan.
Lees je eigen stukje nog eens een paar keer door zou ik eigenlijk zeggen.
Je kunt dan al lezende gaan bedenken wat er nog meer nodig is om dit tot een code uit te werken.
Ik zeg dus een paar keer omdat aan het einde wat dingen staan die je aan het begin van je code al moet weten.

Ik heb nog niet verder gekeken, maar het feit dat je die pseudocode in de Engelse taal hebt gezet, doet mij vermoeden dat je de vraag ook op een ander deel van dit forum hebt gezet (of op een andere plaats).
Twee keer hetzelfde onderwerp is niet heel efficiënt, en voor mensen die je willen helpen frustrerend want die weten niet wat iemand anders al met jou bespreekt en in hoeverre die je al op het goede pad heeft (of juist niet).
Die helper steekt dan energie in een poging jou te helpen terwijl dat helemaal niet meer nodig zou kunnen blijken.
Dus in geval je dat zou overwegen:
Dergelijke dubbele posts zijn ongewenst en zelfs niet toegestaan op dit forum (en op forums in het algemeen)

Niet op het forum :wink:

Beste Mas3,

Ik ben in den beginne misschien wat optimistisch geweest door een bestaande code te gebruiken en die te willen aanpassen. Ik heb een bestaand project van prateeks.in gebouwd. En hoopte eigenlijk dat het aanpassen van de code makkelijker zou zijn.

Het projectje is bedoeld als douche timer. Gezien de gasprijs willen wij op onze scoutinggroep de tijd van het douchen reguleren. (ook omdat wij verhuren).

Een relais stuurt een klep aan waarbij het warm water aan en uitgeschakeld kan worden. Men kan 6 minuten douchen, waarna er een wachttijd van 3 minuten is, voordat de knop weer kan worden ingedrukt om weer opnieuw 6 minuten kunnen douchen.

Ik heb het "stappenplan" in mijn vorige post inderdaad in het Engels gemaakt. Simpelweg omdat de code ook in het Engels is. Mijn vraag heb ik enkel hier gepost. :innocent:

Ik ben op YouTube inmiddels een starterscursus gaan volgen. Mede omdat wij tijdens de Jota (groot evenement van Scouting waarin techniek en communicatie centraal staat) ook een projectje willen doen met Arduino's, maar voor nu is dit mijn eerste keer, en heb ik nog een hoop te leren!

Hierbij de code die ik heb gebruikt:

#include <LiquidCrystal.h>
#include "Countimer.h"
Countimer tdown;
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
#include <EEPROM.h>

#define bt_set    A0
#define bt_up     A3
#define bt_down   A1
#define bt_start  A2

int time_s = 0;
int time_m = 0;
int time_h = 0;

int set = 0;
int flag1 = 0, flag2 = 0;

int relay = 5;
int buzzer = 6;

void setup() {
  Serial.begin (9600);

  pinMode(bt_set,   INPUT_PULLUP);
  pinMode(bt_up,    INPUT_PULLUP);
  pinMode(bt_down,  INPUT_PULLUP);
  pinMode(bt_start, INPUT_PULLUP);

  pinMode(relay, OUTPUT);
  pinMode(buzzer, OUTPUT);

  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("      Welcome   ");
  lcd.setCursor(0, 1);
  lcd.print("  Arduino Nano  ");
  tdown.setInterval(print_time, 999);
  eeprom_read();
  delay(5000);
  lcd.clear();
}

void print_time() {
  time_s = time_s - 1;
  if (time_s < 0) {
    time_s = 59;
    time_m = time_m - 1;
  }
  if (time_m < 0) {
    time_m = 59;
    time_h = time_h - 1;
  }
}

void tdownComplete() {
  Serial.print("ok");
}

//tdown.stop();


void loop() {
  tdown.run();

  if (digitalRead (bt_set) == 0) {
    if (flag1 == 0 && flag2 == 0) {
      flag1 = 1;
      set = set + 1;
      if (set > 3) {
        set = 0;
      }
      delay(100);
    }
  } else {
    flag1 = 0;
  }

  if (digitalRead (bt_up) == 0) {
    if (set == 0) {
      tdown.start();
      flag2 = 1;
    }
    if (set == 1) {
      time_s++;
    }
    if (set == 2) {
      time_m++;
    }
    if (set == 3) {
      time_h++;
    }
    if (time_s > 59) {
      time_s = 0;
    }
    if (time_m > 59) {
      time_m = 0;
    }
    if (time_h > 99) {
      time_h = 0;
    }
    if (set > 0) {
      eeprom_write();
    }
    delay(200);
  }

  if (digitalRead (bt_down) == 0) {
    if (set == 0) {
      tdown.stop();
      flag2 = 0;
    }
    if (set == 1) {
      time_s--;
    }
    if (set == 2) {
      time_m--;
    }
    if (set == 3) {
      time_h--;
    }
    if (time_s < 0) {
      time_s = 59;
    }
    if (time_m < 0) {
      time_m = 59;
    }
    if (time_h < 0) {
      time_h = 99;
    }
    if (set > 0) {
      eeprom_write();
    }
    delay(200);
  }

  if (digitalRead (bt_start) == 0) {
    flag2 = 1;
    eeprom_read();
    digitalWrite(relay, HIGH);
    tdown.restart();
    tdown.start();
  }

  lcd.setCursor(0, 0);
  if (set == 0) {
    lcd.print(     "Timer"      );
  }
  if (set == 1) {
    lcd.print("  Set Timer SS  ");
  }
  if (set == 2) {
    lcd.print("  Set Timer MM  ");
  }
  if (set == 3) {
    lcd.print("  Set Timer HH  ");
  }

  lcd.setCursor(4, 1);
  if (time_h <= 9) {
    lcd.print("0");
  }
  lcd.print(time_h);
  lcd.print(":");
  if (time_m <= 9) {
    lcd.print("0");
  }
  lcd.print(time_m);
  lcd.print(":");
  if (time_s <= 9) {
    lcd.print("0");
  }
  lcd.print(time_s);
  lcd.print("   ");

  if (time_s == 0 && time_m == 0 && time_h == 0 && flag2 == 1) {
    flag2 = 0;
    tdown.stop();
    digitalWrite(relay, LOW);
    digitalWrite(buzzer, HIGH);
    delay(300);
    digitalWrite(buzzer, LOW);
    delay(200);
    digitalWrite(buzzer, HIGH);
    delay(300);
    digitalWrite(buzzer, LOW);
    delay(200);
    digitalWrite(buzzer, HIGH);
    delay(300);
    digitalWrite(buzzer, LOW);
  }

  if (flag2 == 1) {
    digitalWrite(relay, HIGH);
  }
  else {
    digitalWrite(relay, LOW);
  }

  delay(1);
}

void eeprom_write() {
  EEPROM.write(1, time_s);
  EEPROM.write(2, time_m);
  EEPROM.write(3, time_h);
}

void eeprom_read() {
  time_s =  EEPROM.read(1);
  time_m =  EEPROM.read(2);
  time_h =  EEPROM.read(3);

Groet, Mike

aan het begin heb je een drukknop staan. dan sla je even de starttijd op als long starttijd=millis()
dan kijk je heel vaak naar de looptijd=millis()-starttijd
als je looptijd > minuut (60000) doe dan iets zoals een led aanzetten (pin13,HIGH)
dan kun je simpel minuut veranderen naar 2minuut en ook daar naar kijken etc.
en niks doen met eeprom want dat heeft geen zin in zoiets (alleen als ze de nano uitzetten) en al die tijden kun je ook vergeten blijf in millis denken want dan kun je sowieso al 4 dagen douchen.

Een aantal bedenkingen. De knoppen set up en down mogen niet bereikbaar zijn voor de gebruiker. Denk niet in uren, minuten en seconden. Denk in milliseconden of seconden als je unixtime gebruikt. Voor zoiets eenvoudig hoeft de Counttimer librarie niet.

De code is ook niet mooi geschreven. Ligt uiteraard niet aan u.

if (set == 0) {
      tdown.start();
      flag2 = 1;
    }
    if (set == 1) {
      time_s++;
    }
    if (set == 2) {
      time_m++;
    }
    if (set == 3) {
      time_h++;
    

Dit hoort normaal een switch/case te zijn.

switch(set) {
    case 0:
      tdown.start();
      flag2 = 1;
      break;
    case 1:
      time_s++;
      break;
    case 2:
      time_m++;
      break;
    case 3:
      time_h++;
      break;// facultatief, niet dwingend nodig
}
    

Good practice is je gebruikte functies en methodes bovenaan al te beschrijven. Het zou anders zomaar kunnen dat de compiler gaat klagen dat hij bepaalde functies niet kan vinden.

void eeprom_write() ;

Voor void setup();

Een EEPROM ga je ook alleen gebruiken als je de tijden wil variabel maken zonder dat je de code hoeft te wijzigen. Je gaat dan ook alleen schrijven als het echt nodig is. In deze waarschijnlijk minder belangrijk maar een EEPROM kan niet eindeloos beschreven worden. Hou dat altijd goed voor ogen. Lezen is geen probleem. Kan je eindeloos.

Je hebt voor de gebruiker alleen een start knop. Geen stop. Of er nu iemand onder de douche staat of niet, je gaat altijd de ingestelde tijd water verbruiken. Denk eens na over een PIR sensor.

Welk type afsluiter gebruik je? Een klep die in no time van volledig open naar volledig dicht gaat, gaat altijd hinderlijke kloppen geven in je buizen.

Is er WiFi in de buurt? Overweeg dan een ESP32 te gebruiken. Je hebt dan veel meer mogelijkheden. Die je daarom niet allemaal tegelijk dient te implementeren.

Gebruik millis(). Dit zeg hoeveel milliseconden sinds the Arduino was aangekomen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.