Count time na if statement

algemene C code
Berichten: 5
Geregistreerd: 11 Mei 2016, 14:16

Count time na if statement

Berichtdoor stijn98765 » 11 Mei 2016, 14:21

Hoi,

Ik ben al een tijdje bezig om een soort van stopwatch achtige functie te maken maar kom er niet helemaal uit.
De bedoeling is dat op het moment dat een bepaalde if statement wordt uitgevoerd dat dan de stopwatch aan gaat. Dus hij moet bij houden wanneer de if statement voor het laatst is uitgevoerd. Op het moment dat de if statement opnieuw wordt uitgevoerd dient de stopwatch weer opnieuw bij 0 te beginnen.

Ik hoop dat ik mijn probleem duidelijk heb gemaakt en hopelijk kunnen jullie mij helpen!

Groetjes,
Stijn

Advertisement

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

Re: Count time na if statement

Berichtdoor nicoverduin » 11 Mei 2016, 15:39

De kern van jouw probleem zit in het programma "Blink without delay". Daarnaast is het handig om eens jouw vraagstelling uit te werken. Dus niet gelijk tikken maar eerst na denken. Flowcharting is in dit wereldje weer helemaal "in" geloof ik dus een handige manier om het probleem eerst uit te werken en dan pas te gaan coderen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Count time na if statement

Berichtdoor shooter » 11 Mei 2016, 20:37

in de arduino zit een soort timer genaamd millis()
als je in de if vraagt waar de millis() op staan en die in een variabele zet bijv. begintijd=millis();
dan kun je met millis()-begintijd precies zien hoe lang het geleden is dat de begintijd is gepakt.
en uiteraard heeft nico bijna altijd gelijk.
paul deelen
shooter@home.nl

Berichten: 5
Geregistreerd: 11 Mei 2016, 14:16

Re: Count time na if statement

Berichtdoor stijn98765 » 17 Mei 2016, 16:11

Bedankt voor jullie reacties. Ik ben een stuk verder gekomen. Dit is mijn code:

Code: Alles selecteren
//Constants
const int airPump = 13;   
const int hygrometer = A0;
int led = A1;

//Variables
int value;
int begintijd;
unsigned long duur = 0;


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

  pinMode(airPump, OUTPUT);
  pinMode(led, OUTPUT);
}

void loop()
{

  value = analogRead(hygrometer);   //Read analog value
  value = constrain(value, 400, 1023); //Keep the ranges!
  value = map(value, 400, 1023, 100, 0); //Map value : 400 will be 100 and 1023 will be 0

  //Start the watering if humidity decrease down of 20%
  if (value < 40) {
    digitalWrite(airPump, HIGH);
    delay(5000);
    begintijd = millis();
  }

   else {
    digitalWrite(airPump, LOW);
    digitalWrite(led, HIGH);
  }

duur = millis() - begintijd;




  delay(1000);
  Serial.print("Vochtigheid: ");
  Serial.print(value);
  Serial.print("%   Duur:  ");
  Serial.println(duur);
 
 
}




Het enige probleem waar ik nu nog tegen aan loop is dat ik de duur niet mooi krijg geformat in HH:MM:SS
Hopelijk hebben jullie hier een oplossing voor!

Alvast bedankt!

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

Re: Count time na if statement

Berichtdoor shooter » 17 Mei 2016, 19:33

zoek op time format.
paul deelen
shooter@home.nl

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

Re: Count time na if statement

Berichtdoor nicoverduin » 17 Mei 2016, 20:24

Als je met millis() werkt moet je altijd met unit32_t of unsigned long (32 bits) variabelen werken. Time is een mogelijkheid of je moet zelf de uren, minuten en seconden berekenen.
Om het in een string te stoppen kun je of gebruik van time functies of sprintf() maken.

voor sprintf:
cpp code
char tijdString[9];
uint8_t minuten, uren, seconden;

sprintf(tijdString, "%02d:%02d:%02d", uren, minuten, seconden);

In tijdString staat nu de tekst: uu:mm:dd\0; en die kun je direct naar Serial of bijv een lcd printen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 5
Geregistreerd: 11 Mei 2016, 14:16

Re: Count time na if statement

Berichtdoor stijn98765 » 17 Mei 2016, 23:46

Bedankt voor de reacties. Ik heb het in de code gezet en het lijkt iets te doen. Alleen blijft de tijd nu de gehele tijd op 00:00:00 staan wat helaas niet de bedoeling is.

Ik heb het op deze manier in de code verwerkt:

cpp code
//Constants
const int airPump = 13;
const int hygrometer = A0;
int led = A1;

//Variables
int value;
int begintijd;
unsigned long tijdString = 0;

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

pinMode(airPump, OUTPUT);
pinMode(led, OUTPUT);
}

void loop() {

value = analogRead(hygrometer); //Read analog value
value = constrain(value, 400, 1023); //Keep the ranges!
value = map(value, 400, 1023, 100, 0); //Map value : 400 will be 100 and 1023 will be 0

//Start the watering if humidity decrease down of 20%
if (value < 40) {
digitalWrite(airPump, HIGH);
delay(5000);
begintijd = millis();
}

else {
digitalWrite(airPump, LOW);
digitalWrite(led, HIGH);
}

tijdString = millis() - begintijd;

char tijdString[9];
uint8_t minuten, uren, seconden;

sprintf(tijdString, "%02d:%02d:%02d", uren, minuten, seconden);

delay(1000);
Serial.print("Vochtigheid: ");
Serial.print(value);
Serial.print("% Duur: ");
Serial.println(tijdString);

}


Hopelijk kunnen jullie mij helpen :)

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

Re: Count time na if statement

Berichtdoor nicoverduin » 18 Mei 2016, 07:35

Je zult toch eerst de uren, minuten en seconden uit moeten rekenen. Daarnaast heb je nu een dubbele variabele naam. Een als global en een als local. Global is een long en local is een char array. Dat is de goden verzoeken.
Als je die global nu hernoemd naar gewoon Tijd oid and is dat opgelost.
Tijd is nu een getal in milliseconden. Deel hem door 1000 en je hebt het totaal aan seconden.
Nu moet je daar nog uren, minuten en seconden van maken.
bijv:
cpp code
Tijd 		= Tijd / 1000;                	// milliseconden omzetten in seconden
uren = Tijd / 3600; // aantal verstreken uren
Tijd = Tijd - (uren * 3600); // en haal de uren * seconden van Tijd af. houd je minuten & seconden over
minuten = Tijd / 60; // aantal verstreken minuten
seconden = Tijd - (minuten * 60); // en haal deze minuten * seconden van Tijd af. Houd je de seconden over
sprintf(tijdString, "%02d:%02d:%02d", uren, minuten, seconden);

Ik zou toch wel wat meer energie steken in de basis. Want dit had je zelf ook kunnen bepalen. En ik zou nog eens goed mijn vorige post lezen hoe je variabelen moet declareren als je met millis() werkt...
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 5
Geregistreerd: 11 Mei 2016, 14:16

Re: Count time na if statement

Berichtdoor stijn98765 » 18 Mei 2016, 15:21

Hey het is me gelukt! Bedankt voor de reacties!

Dit is de code. Wel is waar met een omweg maar goed het werkt!

cpp code
//Constants
const int airPump = 13;
const int hygrometer = A0;
int led = A1;




//Variables
int value;
unsigned long begintijd = 0;
unsigned long Tijd = 0;
unsigned long uren = 0;
unsigned long minuten = 0;
unsigned long seconden = 0;
void setup()
{
Serial.begin(9600);

pinMode(airPump, OUTPUT);
pinMode(led, OUTPUT);
}

void padPrint( int value, int width)
{
// pads values with leading zeros to make the given width
char valueStr[6]; // large enough to hold an int
itoa (value, valueStr, 10);
int len = strlen(valueStr);
if(len < width){
len = width-len;
while(len--)
Serial.print('0');
}
Serial.print(valueStr);
}

void loop()
{

value = analogRead(hygrometer); //Read analog value
value = constrain(value, 400, 1023); //Keep the ranges!
value = map(value, 400, 1023, 100, 0); //Map value : 400 will be 100 and 1023 will be 0

//Start the watering if humidity decrease down of 20%
if (value < 40) {
digitalWrite(airPump, HIGH);
delay(5000);
begintijd = millis();
digitalWrite(airPump,LOW);

}

else {
digitalWrite(airPump, LOW);
digitalWrite(led, HIGH);
}

Tijd = millis() - begintijd;


Tijd = Tijd / 1000; // milliseconden omzetten in seconden
uren = Tijd / 3600; // aantal verstreken uren
Tijd = Tijd - (uren * 3600); // en haal de uren * seconden van Tijd af. houd je minuten & seconden over
minuten = Tijd / 60; // aantal verstreken minuten
seconden = Tijd - (minuten * 60); // en haal deze minuten * seconden van Tijd af. Houd je de seconden over


delay(1000);
Serial.print("Vochtig: ");
Serial.print(value);
Serial.print("% Duur: ");
padPrint(uren,2);
Serial.print(":");
padPrint(minuten,2);
Serial.print(":");
padPrint(seconden,2);
Serial.println("");


}

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

Re: Count time na if statement

Berichtdoor nicoverduin » 18 Mei 2016, 16:06

Wel een omweg en zeker niet de meest handige oplossing. daarnaast moet je een keer CTRL-T in de IDE intikken. Dan wordt de code weer een beetje geformatteerd.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 18 gasten