Count time na if statement
12 berichten
• Pagina 1 van 2 • 1, 2
- stijn98765
- Berichten: 5
- Geregistreerd: 11 Mei 2016, 14:16
Count time na if statement
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
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Count time na if statement
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.
Re: Count time na if statement
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.
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
shooter@home.nl
- stijn98765
- Berichten: 5
- Geregistreerd: 11 Mei 2016, 14:16
Re: Count time na if statement
Bedankt voor jullie reacties. Ik ben een stuk verder gekomen. Dit is mijn code:
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!
- 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!
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Count time na if statement
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
In tijdString staat nu de tekst: uu:mm:dd\0; en die kun je direct naar Serial of bijv een lcd printen.
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.
- stijn98765
- Berichten: 5
- Geregistreerd: 11 Mei 2016, 14:16
Re: Count time na if statement
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
Hopelijk kunnen jullie mij helpen
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Count time na if statement
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
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...
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...
- stijn98765
- Berichten: 5
- Geregistreerd: 11 Mei 2016, 14:16
Re: Count time na if statement
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
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("");
}
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Count time na if statement
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.
12 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten