Delay() werkt niet altijd

algemene C code
Berichten: 5
Geregistreerd: 05 Sep 2013, 10:05

Delay() werkt niet altijd

Berichtdoor Christina » 05 Sep 2013, 10:15

Hallo,

Ik ben hier nieuw en had graag een test gemaakt met tijd en een ledje.
Bedoeling is dat ik een delay time opgeef en een led zolang blijft branden als de delay time.
Alles werkt perfect zolang mijn input onder de 32.8 blijft, bij 32.8 of hoger blijft de led steeds branden...
Weet iemand hoe ik dit kan oplossen?
Alvast dank om dit te lezen!

Code:
Code: Alles selecteren
#include <Wire.h>               
#include <LiquidCrystal_I2C.h>   
#include <Bounce.h>


int button1 = 5;               
int button2 = 7;               
int button3 = 4;           
int led = 2;               

int val1;                     
int val2;                     
int val3;                     
     
int delayTime = 100;                       // little delay after pressedbutton
int runTime = 0;             

Bounce bouncer1 = Bounce(button1, 15);     // deblounce (button, milliseconds)
Bounce bouncer2 = Bounce(button2, 15);
Bounce bouncer4 = Bounce(button3, 15);

LiquidCrystal_I2C lcd(0x20,20,4);          // set the LCD address to 0x20 or 0x27

void setup() {                   
  lcd.init();                       
  lcd.backlight();                 

  pinMode(button1, INPUT);         
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(led, OUTPUT);         
}

void loop() {                     
  bouncer1.update();             
  bouncer2.update();
  bouncer4.update();
  val1 = bouncer1.read();       
  val2 = bouncer2.read();       
  val3 = bouncer4.read();
  runningTime(val1, val2);
 
  if(val3 == HIGH){
    ledOn();
  }
 
}


void runningTime(int num1, int num2) {
  int decimal1;
  decimal1 = runTime%10;
  lcd.setCursor(0,0);
  lcd.print("Delay time:");
  if(num1 == HIGH) {
    runTime = runTime + 1;
    delay(delayTime);
  }
  if(num2 == HIGH) {
    runTime = runTime - 1;
    delay(delayTime);
  }
  lcd.setCursor(0,1);
  lcd.print(runTime/10);
  if(runTime < 10) {
    lcd.setCursor(1, 1);
    lcd.print(".");
    lcd.setCursor(2,1);
    lcd.print(decimal1);
    lcd.setCursor(3,1);
    lcd.print(" s    ");
  }
  if(runTime >= 10 && runTime < 100) {
    lcd.setCursor(1, 1);
    lcd.print(".");
    lcd.setCursor(2,1);
    lcd.print(decimal1);
    lcd.setCursor(3,1);
    lcd.print(" s    ");
  }
  if(runTime > 99) {
    lcd.setCursor(2, 1);
    lcd.print(".");
    lcd.setCursor(3,1);
    lcd.print(decimal1);
    lcd.setCursor(4,1);
    lcd.print(" s    ");
  }
  if(runTime > 999) {
    runTime = 0;
  }
  if(runTime < 0) {
    runTime = 999;
  }
}

void ledOn () {
 
  digitalWrite(led, HIGH);
 
  lcd.setCursor(10,3);             
  lcd.print("Led ON");
  delay(runTime*100);         // Work fine if less than 32.8
  digitalWrite(led, LOW);
  lcd.setCursor(10,3);             
  lcd.print("Led OFF");
 
}

Advertisement

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: Delay() werkt niet altijd

Berichtdoor Rudi » 05 Sep 2013, 21:19

Dat komt omdat de variabele runTime een (signed) integer is. Deze kan een waarde bevatten van -32768 tot +32767. Begint er een belletje te rinkelen?
Je zou deze als een long kunnen declareren ( -2.147.483.648 tot 2.147.483.647) ofwel de integer constante "100" forceren tot een long door er een L achter te plaatsen.

Wijzig
Code: Alles selecteren
delay(runTime*100);         // Work fine if less than 32.8

naar
Code: Alles selecteren
delay(runTime*100L);         // should work fine above 32.8 as well :-)
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Berichten: 5
Geregistreerd: 05 Sep 2013, 10:05

Re: Delay() werkt niet altijd

Berichtdoor Christina » 05 Sep 2013, 22:19

OMG, dat is mooi opgelost Rudi, werkt nu perfect!
Na drie dagen zoeken zag ik het niet meer zitten...

Kan je mij ook duwtje geven hoe ik mijn input (getallen) kan laten aftellen na indrukken van button3 zodat deze werkt zoals een chronometer of is dat niet mogelijk?

Grote dank voor eerste belletje :-)

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Delay() werkt niet altijd

Berichtdoor nicoverduin » 06 Sep 2013, 13:52

Christina
Het is een beetje de vraag hoe exact je het wilt hebben. Als je exact op de seconde of kleiner wilt laten lopen dan zul je gebruik moeten maken van een timer. flexitimer2 is een mooie timer die voorkomt dat je allerlei registers moet programmeren.
Een alternatief is gebruik maken van de millis() functie. Millis() is een teller die begint bij 0 en elke milliseconde een ophoogt. Na ruim 49 dagen gaat hij weer naar 0 en begint opnieuw. Wat heb je eraan? Millis() kun je zien als een tijdlijn. Als je nu wilt dat er iets gebeurt over 500mS dan zet je een veld op millis() + 500L (ook hier werk je alleen met unsigned long) waardoor je ahw in de toekomst een marker zet. In de loop() hoef je nu alleen ff te controleren of millis() > als de waarden in veld. Dat betekent dat je voorbij de marker bent en kun je specifieke acties ondernemen. Zo niet doe je niets en ga je verder met andere dingen.

Nu maak je bijvoorbeeld veel gebruik van delay(). Delay is een functie die jou Arduino ahw in de "hold" zet totdat de tijd voorbij is en gaat dan verder. Soms wil je andere dingen daar parallel aan doen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 270
Geregistreerd: 30 Dec 2012, 11:42

Re: Delay() werkt niet altijd

Berichtdoor Rudi » 06 Sep 2013, 19:19

Christina schreef:Na drie dagen zoeken zag ik het niet meer zitten...

Ik ken dat gevoel :roll:

Maar het maakt deel uit van de leercurve. Ik ben ook maar een amateur wat programmeren betreft (Basic en Z-80 assembler 30 jaar geleden buiten beschouwing gelaten) en een oplossing zoeken is nu eenmaal onoverkomelijk bij programmeren. Enkele dagen laten rusten levert soms automatisch een nieuwe invalshoek. Zo werkt het voor mij toch.
Dit forum heeft me al veel wijzer gemaakt en heel soms kan ik zelfs een oplossing bedenken, al is meestal iemand anders me voor. Met een betere code :D
Arduinows!
Why do computer programmers confuse Halloween with Christmas? Because Oct 31 = Dec 25
I got 01100011 problems but a bit ain't 00000001

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Delay() werkt niet altijd

Berichtdoor nicoverduin » 06 Sep 2013, 20:13

Rudi schreef:
Christina schreef:Na drie dagen zoeken zag ik het niet meer zitten...

Ik ken dat gevoel :roll:

Maar het maakt deel uit van de leercurve. Ik ben ook maar een amateur wat programmeren betreft (Basic en Z-80 assembler 30 jaar geleden buiten beschouwing gelaten)
in de 70'er jaren met 6502/8080/z80 en 8086 assembler gewerkt en net een boek zitten doorlezen over de Atmel assembly..... Ik zou de Z80 assembly niet vergeten :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 5
Geregistreerd: 05 Sep 2013, 10:05

Re: Delay() werkt niet altijd

Berichtdoor Christina » 08 Sep 2013, 18:01

Rudi & Nico,

Dank voor jullie hulp!
Denk dat ik nu lekker verder kan

Mvg,

Christina

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten