LCD Menu met timer, krijg aktie niet aan de gang

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 28
Geregistreerd: 16 Jun 2016, 21:23

LCD Menu met timer, krijg aktie niet aan de gang

Berichtdoor john33 » 28 Mrt 2020, 21:32

Beste forummers,

ik heb uit de LCDML library een voorbeeld sketch gebruikt om zelf een menu te gaan maken voor een project.
De code is verdeeld in 4 tabbladen in IDE, in het laatste blad wordt de "output" beschreven.

In de voorbeeld sketch is een timer gemaakt die 20 seconden aftelt, daarna stopt deze en keert de sketch naar het hoofdmenu.

Ik moet zometeen minimaal 15 minuten aftellen, de timer in de sketch krijg ik niet naar 15 minuten, dus heb ik een simpele countdown timer er in gezet.
Deze werkt, telt keurig af.... maar begint dan weer overnieuw.
Ik heb van alles geprobeert, maar de if aan het einde regel lijkt niets te doen.
Code: Alles selecteren
// *********************************************************************

    int S = 10; // count seconds
    int M = 00; // count minutes
    int H = 00; // count hours
    int klepbak = 13;
void mFunc_timer_info(uint8_t param)
// *********************************************************************
{
  if(LCDML.FUNC_setup())          // ****** SETUP ********* dit is de 15 minuten aftelt
  {
    lcd.print(F("sproeien 15 min")); // print some content on first row
    LCDML.FUNC_setLoopInterval(100);  // starts a trigger event for the loop function every 100 milliseconds   
  }

  if(LCDML.FUNC_loop())           // ****** LOOP *********
  {
 digitalWrite(klepbak, HIGH);
 lcd.setCursor(6,1);
 lcd.print(":");
 lcd.setCursor(9,1);
 lcd.print(":");
 
 S--;
 delay(1000);
 
 if(S<0)
 {
   M--;
   S=59;
 }
 if(M<0)
 {
   H--;
   M=59;
 }
 if(H<0) { H=00; M=00; S=10; } if(M>9)  //10 seconden aftellen
 {
   lcd.setCursor(7,1);
   lcd.print(M);
 }
 else
 {
   lcd.setCursor(7,1);
   lcd.print("0");
   lcd.setCursor(8,1);
   lcd.print(M);
   lcd.setCursor(9,1);
   lcd.print(":");
 }
 
 if(S>9)
 {
   lcd.setCursor(10,1);
   lcd.print(S);
 }
 else
 {
   lcd.setCursor(10,1);
   lcd.print("0");
   lcd.setCursor(11,1);
   lcd.print(S);
   lcd.setCursor(12,1);
   lcd.print(" ");
 }
 
 if(H>9)
 {
   lcd.setCursor(4,1);
   lcd.print (H);
 }
 else
 {
   lcd.setCursor(4,1);
   lcd.print("0");
   lcd.setCursor(5,1);
   lcd.print(H);
   lcd.setCursor(6,1);
   lcd.print(":");
 
 }
  if(H=0) { H=00; M=00; S=00; } if(M>0)
  {
   digitalWrite(klepbak, LOW);
   LCDML.FUNC_goBackToMenu();      // leave this function   
  }
  }
  if(LCDML.FUNC_close())      // ****** STABLE END *********
 
  { 
    // you can here reset some global vars or do nothing
  }
}


Waar ga ik fout ?

Advertisement

Berichten: 3236
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: LCD Menu met timer, krijg aktie niet aan de gang

Berichtdoor shooter » 29 Mrt 2020, 15:56

gebruik een CTRL T dan staan de regels netjes onder elkaar met indent etc.
die delay 1000 betekent dat alles stopt ook waar je naar wilt zoeken etc.
gebruik maar millis() en dan als je detecteert dat er 1000 omzijn (zie dus blink without delay) dan doe je iets.
15 minuten is niet zoveel dat kan in een keer met 15*60*1000.
in de tussentijd kun je nog heel veel andere dingen doen zoals een ledje laten knipperen.
als H 0 is wat moet er dan gebeuren.
je mag and gebruiken zodat de klepbak open gaat als H=0 en M=0 etc.
if H=0 && M=0 etc.
paul deelen
shooter@home.nl

Berichten: 28
Geregistreerd: 16 Jun 2016, 21:23

Re: LCD Menu met timer, krijg aktie niet aan de gang

Berichtdoor john33 » 30 Mrt 2020, 22:13

Ik heb nu een andere timer er in gezet,

global variables
int hours, minutes, seconds, dispsec = 61;
long counter, mytime, interval = 120000; //2 minuten

Code: Alles selecteren
    void mFunc_timer_info(uint8_t param)
// *********************************************************************
{
  if(LCDML.FUNC_setup())          // ****** SETUP ********* dit is de 15 minuten aftelt
  {
    lcd.print(F("sproeien 15 min")); // print some content on first row
    mytime = millis() + interval;
    LCDML.FUNC_setLoopInterval(100);  // starts a trigger event for the loop function every 100 milliseconds   
  }
  if(LCDML.FUNC_loop())           // ****** LOOP *********
  {
 
   digitalWrite(klepbak, HIGH);
    // set the cursor to column 0, line 1
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  if (millis() > mytime)
    mytime = millis() + interval;
  counter = (mytime - millis()) / 1000;
  hours = counter / 3600;
  counter -= (hours * 3600);
  minutes = counter / 60;
  counter -= (minutes * 60);
  seconds = counter;
  if (seconds != dispsec)
  {
    //Serial.print(hours);
    //Serial.print(":");
    lcd.print(hours);
    lcd.print(":");
    if (minutes < 10) {
      //Serial.print("0");
      //Serial.print(minutes);
      lcd.print("0");
      lcd.print(minutes);
    }
    else
      //Serial.print(minutes);
      lcd.print(minutes);
    //Serial.print(":");
    lcd.print(":");
    if (seconds < 10) {
      //Serial.print("0");
      //Serial.print(seconds);
      lcd.print("0");
      lcd.print(seconds);
    }
    else
      //Serial.print(seconds);
      lcd.print(seconds);
      //Serial.println();
    dispsec = seconds;
  }
  if ((mytime == 00)&&(counter == 00))
  {
   digitalWrite(klepbak, LOW);


Maar alleen als ik in de code zet: if (counter ==00)
dan stopt het aftellen en wordt "klepbak" laag.
Alleen telt de timer slechts de seconden af, niet de minuten en of uren.
Ik heb al zitten spelen met de interval: if ((interval == 00) && (counter ==00)) maar dat helpt niets, dan start de timer telkens overnieuw op na 0

Ik heb weinig ervaring met het programmeren, aldoende leert men maar nu loop ik toch weer vast.
Het LCD menu doet het inmiddels wel, alleen de uitvoer... daar loopt het nog niet lekker.

Gebruikers-avatar
Berichten: 2650
Geregistreerd: 06 Aug 2016, 01:03

Re: LCD Menu met timer, krijg aktie niet aan de gang

Berichtdoor Koepel » 31 Mrt 2020, 11:32

Dit menu ? https://github.com/Jomelo/LCDMenuLib2.
Daar heb ik niet mee gewerkt en ik begrijp het niet :(
Dus helaas begrijp ik ook jouw stukje code niet. Wordt die mFunc_timer_info() steeds opnieuw aangeroepen ? Waarom wordt dan de LCDML.FUNC_setup() steeds opnieuw aangeroepen ?

Om zo iets op te lossen kun je het beste de twee dingen apart werkend maken.
Je kunt bijvoorbeeld een test-sketch maken die alleen de countdown timer doet, en dan gewoon de seriële monitor gebruiken zonder het menu.

Dit stukje gaat niet goed:
Code: Alles selecteren
if (millis() > mytime)
  mytime = millis() + interval;
counter = (mytime - millis()) / 1000;
hours = counter / 3600;
counter -= (hours * 3600);
minutes = counter / 60;
counter -= (minutes * 60);
seconds = counter;


Mogelijkheid 1:
De uren, minuten en seconden zetten, en die iedere seconde gaan aftellen. Dit is eenvoudig en duidelijk.

Mogelijkheid 2:
Een waarde in milliseconden zetten en die aftellen.
Alleen op het moment dat je de tijd wilt laten zien, dan reken je het om naar uren, minuten en seconden.
Voor de code is dit mooier en gemakkelijker uit te breiden.

Als voorbeeld kun je deze eens bekijken en proberen:
https://github.com/Koepel/Fun_with_mill ... t_down.ino
https://github.com/Koepel/Fun_with_mill ... _clock.ino

BasOnTech over stopwatch: https://www.youtube.com/watch?v=14LkftL5K1I
Met de sketch: https://github.com/BasOnTech/Arduino-Projects-NL/blob/master/stopwatch/stopwatch-deel-3.ino
(Die sketch is gebaseerd op millis() en de uren, minuten en seconden wordt berekend)

Stel dat dit werkt, dan kun het menu gaan proberen met bijvoorbeeld een teller van 100 naar 0. Als dat ook werkt, dan pas ga je het samenvoegen.

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten