timer probleempje

Daar mijn starterkit nog onderweg is, ben ik begonnen met “droogprogrammeren” van mijn eerste projectje.

Ik wil een timer maken die dmv 1 input , 4 tijden opslaat en deze vervolgens aftrekt van de eerste tijd.
Daarna moeten deze 4 tijden worden getoond.
Onderstaand staat het programmatje.
Ik heb behoorlijk door het forum heengefiets om de nodige info te verzamelen.

Mijn vragen :

  1. kunnen jullie er es naar kijken en op- en aanmerkingen maken.

  2. is float lap1a; // is "float goed om van milli seconde te delen door 1000 ?

  3. if ((X=1) && (val==HIGH)) {X=2; digitalWrite(ledpin,LOW); delay(500)};
    worden {X=2; digitalWrite(ledpin,LOW); delay(500)} alle 3 uitgevoerd?

  4. if ((X=8) && (val==HIGH)) {(X=1)}; // geeft foutmelding bij compileren expected ‘:’ before '}'token :wat is er fout?

  5. kan ik ergens op het forum wat uitgebreidere voorbeelden vinden van de vergelijkingen?

// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int inputPin = 7;
int ledpin=13;
int val=0;
int X=1;

void setup() {
  // put your setup code here, to run once:
int start=0;
int lap1=0;
int lap2=0;
int lap3=0;
int einde=0;
float lap1a;  // is  "float goed om van milli seconde te delen door 1000 ?
float lap2a;
float lap3a;
float eindea;

pinMode (ledpin,OUTPUT); 
pinMode(inputPin, INPUT);

lcd.begin(16,2);
lcd.print("program smitty");
lcd.noCursor();
delay (3000);
}

void loop() {
  // put your main code here, to run repeatedly:
lcd.clear();
digitalWrite(ledpin, HIGH);
lcd.setCursor(0,0);
lcd.print("wacht tot begin");
val = digitalRead(inputPin); // leest of input hoog is.
if ((X=1) && (val==HIGH)) {X=2; digitalWrite(ledpin,LOW); delay(500)};//            is dit wel goed? worden deze 3 statements zo afgehandeld?
if ((X=2) && (val==HIGH)) {X=3; start=millis(); delay(500)};//                      slaat begin tijd op.
if ((X=3) && (val==HIGH)) {X=4; lap1=millis(); delay(500)}; //                      slaat 2e tijd op
if ((X=4) && (val==HIGH)) {X=5; lap2=millis(); delay(500)}; //                      slaat 3e tijd op 
if ((X=5) && (val==HIGH)) {X=6; lap3=millis(); delay(500)}; //                      slaat 4e tijd op
if ((X=6) && (val==HIGH)) {X=7; einde=millis(); delay(1000)};//                     slaat 5e tijd op
if (X=7){X=8; lap1a=(lap1-start)/1000; lap2a=(lap2-start)/1000; lap3a=(lap3-start)/1000; eindea=(einde-start)/1000}; // berekend 4 tijden
delay(1500);
lcd.print(lap1a; lap2a); //                                                         laat 2 tijden zien op eerste regel lcd
lcd.setCursor(0,1);
lcd.print (lap3a; eindea);//                                                        laat 2 tijden zien op 2e regel lcd
if ((X=8) && (val==HIGH)) {(X=1)}; //                                               geeft foutmelding expected ':' before '}'token  :wat is er fout?
delay(1500);
}

weer bedankt voor de reacties.

Dit gaat niet werken. Als jij een variabele maakt in de setup() dan is deze onbekend in o.a. loop().
zie: https://www.arduino.cc/en/Reference/Scope

dat stuk is duidelijk.
(Ik moet dus die variabelen naar boven de setup verplaatsen).

Heb je ook antwoord op mijn andere vragen?

Voor de eerste keer zonder fouten gecompileerd.
Opmerking van Nico aangepast.
Ook hoe het op scherm komt is denk ik nu wel goed.
Ik ben nog wel benieuwd naar de antwoorden op mijn andere vragen…

// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int inputPin = 7;
int ledpin=13;
int val=0;
int X=1;
int start=0;
int lap1=0;
int lap2=0;
int lap3=0;
int einde=0;
float lap1a;  // is  "float goed om van milli seconde te delen door 1000 ?
float lap2a;
float lap3a;
float eindea;

void setup() {
  // put your setup code here, to run once:
pinMode (ledpin,OUTPUT); 
pinMode(inputPin, INPUT);
lcd.begin(16,2);
lcd.print("program smitty");
lcd.noCursor();
delay (3000);
}

void loop() {
// put your main code here, to run repeatedly:
lcd.clear();
digitalWrite(ledpin, HIGH);
lcd.setCursor(0,0);
lcd.print("wacht tot begin");
val = digitalRead(inputPin); // leest of input hoog is.
if ((X=1) && (val==HIGH)) {X=2; digitalWrite(ledpin,LOW); delay(500);}//            is dit wel goed? worden deze 3 statements zo afgehandeld?
if ((X=2) && (val==HIGH)) {X=3; start=millis(); delay(500);}//                      slaat begin tijd op.
if ((X=3) && (val==HIGH)) {X=4; lap1=millis(); delay(500);} //                      slaat 2e tijd op
if ((X=4) && (val==HIGH)) {X=5; lap2=millis(); delay(500);} //                      slaat 3e tijd op 
if ((X=5) && (val==HIGH)) {X=6; lap3=millis(); delay(500);} //                      slaat 4e tijd op
if ((X=6) && (val==HIGH)) {X=7; einde=millis(); delay(1000);}//                     slaat 5e tijd op
if (X=7){X=8; lap1a=(lap1-start)/1000; lap2a=(lap2-start)/1000; lap3a=(lap3-start)/1000; eindea=(einde-start)/1000;} // berekend 4 tijden
delay(1500);
//het op het scherm zetten van de 4 berekende tijden, 2 aan 2
lcd.setCursor(0,0);
lcd.print(lap1a);
lcd.setCursor(0,8);
lcd.print(lap2a); //                                                         
lcd.setCursor(1,0);
lcd.print(lap3a);
lcd.setCursor(1,8);
lcd.print (eindea);     //                                                        
//  wachten zodat de tijden opgeschreven kunnen worden op papier.
if ((X=8) && (val==HIGH)) {(X=1);}                                            
delay(1500);
}

Samenvattend:
Een statement per regel
If (x=3. Is geen test of x 3 is.
En kijk eens naar switch case

Hallo Nico,

ik ben al aan het graven met "switch case"

Ik snap dan alleen niet het IF statement.

Het is toch een conditie en als die klopt wordt wat er wat er achterstaat uitgevoerd?

Hallo Smitty
Don't confuse the assignment operator [ = ] (single equal sign) with the comparison operator [ == ] (double equal signs), which evaluates whether two expressions are equal.

Hello Gij,

Are we switching to English? :wink: (no problem for me).

is this then the correct code?

if ((X==1) && (val==HIGH)) {X=2; digitalWrite(ledpin,LOW); delay(500)};

de laatste ; moet voor het } staan, verder lijkt deze regel goed.
zoals jouw vraag 4 staat precies wat er fout is.

Sorry was waarschijnlijk net daarvoor bezig op een anderstalig forum en van geen kwaad bewust.
Doe mij ook maar gewoon nederlands of vlaams.
Belangrijkste is dat je het snapt en dat het werkt.

Omdat de materialen nog niet binnen zijn, borrelt het (en dit zonder alcohol) verder. Ik zou graag in mijn timerproject, de laatst geklokt tijd via een speaker willen horen.

Nu heb ik al gezocht op "text to speech" en daar kwam meteen en dure module te voorschijn ( 59 dollar).

Ik zag ook iets via WAV langskomen.
Nu is het zo dat de eindtijden altijd tussen de 12 en 25 sec zijn met 1 decimaal achter de komma.

Wat ik graag zou willen is, "Bose kwaliteit" geluid maar dan low budget.
Is dit mogelijk en hebben jullie een link hiervoor.
Ik ben hier waarschijnlijk technisch nog niet aan toe maar gezien de levertijd zou ik vast de spullen kunnen bestellen.

"Bose kwaliteit" is een contradictio in terminis als je het mij vraagt.
Want wat dat merk doet, is een bewerking die een bepaald effect toevoegt aan het geluid, dat niet in de opname aanwezig is.
Dus dat spul komt bij mij het huis niet in.
Maar goed ik kan wel een voorstelling maken van wat je bedoelt.

Het is niet zo heel moeilijk hoor.
Zoek maar eens naar MP3 spelertjes voor Arduino.
Die zijn er (ruim voldoende), en niet erg duur.
Meestal gebruik je die met een SD kaartje (al dan niet in de micro uitvoering)
Nou hoor ik je al denken (ik ga ff door met het Bose effect), "MP3 is niet bepaald hoogste kwaliteit".
Maar de meeste van die dingen kunnen dus ook gewone *.wav bestanden afspelen.
En dat komt toch wel een heel eind in de buurt.
Nou moet je mij vooral niet op mijn woord geloven.
Dus moet je voor je er verder mee gaat eerst controleren of de oplossingen die je vindt, ook werkelijk in staat zijn om dat te doen.

Uiteraard ga je tegen dingen aanlopen.
Als je een navigatie systeem hebt zou je dat al eens tegengekomen kunnen zijn.
Zoals dat je dingen per woord gaat opslaan, maar losse woorden iets anders zijn als een zin die uitgesproken moet worden.
Bijvoorbeeld door intonatie.
En dat de losse woorden eerst even opgezocht moeten worden.
Dus dan krijg je mogelijk wat onnatuurlijke pauzes in de uit te spreken zinnen.
Maar het is natuurlijk wel een leuk ding om mee aan de slag te gaan.

En een serie *.wav bestanden gebruiken als zinnen, ga je die zelf inspreken ?
Dat je lekker de hele dag naar jezelf kunt luisteren ?
Ik zou het wel heel snel zat worden, maar dat ligt natuurlijk aan mijn eigen stem.
Je kunt ook aan iemand met een naar jouw smaak prettige stem vragen om de zaken in te spreken.
Maar dan moet je dat wel regisseren, vanwege de boven genoemde overwegingen.

Als je niet denkt (of niemand weet met de gewenste stem) aan een werkelijke stem, maar aan een synthetische, dan zal het een heel stevige uitdaging zijn om in de buurt te komen van de gewenste kwaliteit.

Aangezien het "Bose geluid" lastig wordt begrijp ik, gaan we voor het wat mindere Denon :wink:
Mijn doel is dat als bv de stopwatch 20.1 sec aangeeft op het display, dit dan ook gesproken wordt.

Kan ik dan de wav laten samen stellen door de 20 apart als wav, de . als wav en de 1 als wav te maken of moet ik voor elke mogelijk 1 wav maken?

Kun je een richting aangeven waar ik moet zoeken wat betreft speler?
(dit icm arduino uno) Ik zie van allerlei zaken langskomen..

Met deze zou je ook kunnen experimenteren.
http://www.picaxe.com/docs/usb030.pdf

Smitty12:
Kan ik dan de wav laten samen stellen door de 20 apart als wav, de . als wav en de 1 als wav te maken of moet ik voor elke mogelijk 1 wav maken?

Dat is dus wat ik probeerde duidelijk te maken.
Als je het uit verschillende delen opbouwt, dan krijg je dus:

Twintig
Punt
Een

Als je het als een geheel gaat samenstellen, dan moet je dus een keuze maken uit (25-12)*10 = 130 bestanden.

Aangezien je een Uno hebt gekozen, heb je het gemak van de ‘form factor’.
Dat is de unieke bouwvorm waar men voor gekozen heeft.
Daardoor kun je modules op je Uno prikken (maar ook op veel van diens broertjes).
Zulke modules worden shield genoemd.
Dus als je dan gaat zoeken naar “MP3 shield”, dan vind je geheid een hoop Arduino compatibele producten.
De bekendste merken zijn wel zo’n beetje Sparkfun en Adafruit, en dat komt omdat die niet alleen het product aanbieden, maar ook ondersteuning.
Wat dat betreft staat Adafruit toch wel aan de top.

Weer bedankt voor de reacties. Hier ga ik verder mee borrelen.
Ook daar zal ik wel weer de nodig vragen hebben maar ik weet een mooie plaats om ze te stellen. :wink:

Dit type zou "probleemloos" en eenvoudig moeten werken op een uno board?

mp3 shield

PS en als het niet werkt, is er niets "overboard" :wink: maar dan weet ik dat wel een kans van slagen heb.

Bij mij wel...Eenvoudig is een relatief begrip.....

Nico, als het jou gelukt is dan neem ik het risico :wink:
bedankt voor de reply.

Na de mp3 speler besteld te hebben probeer ik te bedenken hoe ik het juiste geluid kan produceren.
Stel dat na het uitrekenen een tijd van 23.15 sec op het display staat, hoe krijg ik dit dan uit de luidspreker.
De laatste decimaal mag weg dus als er uit de luidspreker 23.1 sec komt is het prima.
De tijd is altijd tussen de 20 en 30 sec.

Het idee is een aantal wav files te maken nl :

  1. van 20,21,22 ...30 erop
  2. 1 wave file met "punt"
  3. 10 wave files voor de getallen achter de komma.
    Om deze dan samen te stellen en te laten spreken.

Mijn eerste vraag is dit de juiste weg?

Als dit het geval is dan wordt de volgende uitdaging, hoe krijg ik 23.15 gesplitst in 23 en 1.
ik heb al lopen zoeken maar ik kan de juiste functie niet vinden in de reference.
(volgens mij heb ik ook een uitdaging met INT versus FLOAT?)
Kunnen jullie mij de juiste richting aangeven?