Arduino Stopwatch HULP NODIG

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 2
Geregistreerd: 21 Apr 2021, 00:02

Arduino Stopwatch HULP NODIG

Berichtdoor quinten » 21 Apr 2021, 00:14

Hallo allemaal,
ik wil graag een stopwatch maken met een arduino nano, maar (helaas) loop ik vast en weet ik niet meer hoe ik verder moet gaan. Ik gebruik een LCD-scherm, rode en groene knop. Kunnen jullie mij hierbij helpen? De code ziet u hieronder


Alvast bedankt!




// bibliotheek toevoegen
#include <Wire.h>
#include "rgb_lcd.h"

rgb_lcd lcd;

// algemeen //
bool stopwatchStatus = false; // status van de stopwatch (AAN/UIT)
bool redrawLCD = false; // bijwerken van het scherm (JA/NEE)

// knoppen //
const int groenePin = 12; // pin van de groene knop
int groenePinStatus = LOW; // status van de groene pin (INGEDRUKT/UITGEDRUKT)
int groenePinVorigeStatus = LOW; // vorige status van de groene pin (INGEDRUKT/UITGEDRUKT)

const int rodePin = 10; // pin van de rode knop
int rodePinStatus = LOW; // status van de rode pin (INGEDRUKT/UITGEDRUKT)
int rodePinVorigeStatus = LOW; // vorige status van de rode pin (INGEDRUKT/UITGEDRUKT)

// stopwatch //
bool stopwatchActief = false; // activiteit van de stopwatch
unsigned long stopwatchMillis = 0; // huidige tijd van de stopwatch
unsigned long stopwatchMillisVerlopen = 0; // vorige tijd van de stopwatch

// tijd //
unsigned long huidigeMillis = 0; // huidige tijd van de arduino
unsigned long vorigeMillis = 0; // vorige tijd van de arduino
const int intervalTijd = 100; // verschil van huidige tijd en vorige tijd
unsigned long millisecondes = (stopwatchMillisVerlopen % 1000);
unsigned long seconden = (stopwatchMillisVerlopen / 1000) % 60;
unsigned long minuten = (stopwatchMillisVerlopen / (60000)) % 60;
unsigned long uren = (stopwatchMillisVerlopen / (3600000));

/*
// stopwatch starten //
void stopwatchStart() {
stopwatchMillis = huidigeMillis;
stopwatchActief = true;
redrawLCD = true;
}

// stopwatch stoppen //
void stopwatchStop() {
stopwatchVerlopen = huidigeMillis - stopwatchMillis;
stopwatchActief = false;
redrawLCD = true;
}


// stopwatch resetten //
void stopwatchReset() {
stopwatchActief = false;
stopwatchMillis = 0;
stopwatchVerlopen = 0;
groenePinStatus = LOW;
groenePinVorigeStatus = LOW;
rodePinStatus = LOW;
rodePinVorigeStatus = LOW;
redrawLCD = true;
}
*/


void setup() {
lcd.begin(16,2); // formaat opstellen van het scherm
lcd.clear(); // verwijder de resterende gegevens op het scherm
Serial.begin(9600); // seriele monitor toevoegen
}


void loop() {

if (huidigeMillis - vorigeMillis > intervalTijd) { // Huidige tijd moet hoger zijn dan de intervaltijd
groenePinStatus = digitalRead(groenePin); // pin lezen van de groene knop (INGEDRUKT/UITGEDRUKT)
rodePinStatus = digitalRead(rodePin); // pin lezen van de rode knop (INGEDRUKT/UITGEDRUKT)

if (groenePinStatus == HIGH && groenePinVorigeStatus == LOW) { // Als de groene knop voor het eerst ingedrukt wordt, dan start stopwatch, anders stop stopwatch

if (!stopwatchActief) {
stopwatchMillis = huidigeMillis;
stopwatchActief = true;
redrawLCD = true;
}
else {
stopwatchMillisVerlopen = huidigeMillis - stopwatchMillis;
stopwatchActief = false;
redrawLCD = true;
}

groenePinVorigeStatus = HIGH; // maak groene pin vorige status AAN

}
}

if (groenePinStatus == LOW && groenePinVorigeStatus == HIGH && stopwatchActief) { // Als de start knop wordt losgelaten en de stopwatch loopt
groenePinVorigeStatus = LOW;
}

if (rodePinStatus == HIGH) { // Als rode pin is ingedrukt, dan reset stopwatch
stopwatchActief = false;
stopwatchMillis = 0;
stopwatchMillisVerlopen = 0;
groenePinStatus = LOW;
groenePinVorigeStatus = LOW;
rodePinStatus = LOW;
rodePinVorigeStatus = LOW;
redrawLCD = true;
}

vorigeMillis = huidigeMillis; // huidige tijd is hetzelfde als de vorige tijd



// LCD-scherm //
if (redrawLCD || stopwatchActief) {

lcd.clear();

// Als de stopwacth niet loopt en de verstreken tijd is 0
if (!stopwatchActief && stopwatchMillisVerlopen == 0) {
lcd.setCursor(0, 0); // zet de cursor op positie 1, regel 1
lcd.print("DRUK OP DE STARTKNOP");
lcd.setCursor(0, 2); // zet de cursor op positie 1, regel 3
lcd.print(" OM TIJD TE STARTEN");
}

// Als de stopwatch loopt
if (stopwatchActief) {



lcd.setCursor(0,0);
lcd.print(" "); // schrijf een spatie
lcd.print(formattedTime); // schrijf de verstreken tijd
lcd.print("ms"); // schrijf ms
}

// Als de stopwatch is stop gezet
if (!stopwatchActief && stopwatchMillisVerlopen > 0) {

lcd.setCursor(0,0);


lcd.print(stopwatchMillisVerlopen); // schrijf de opgemaakte verstreken tijd
lcd.setCursor(0,0);
lcd.print("Druk op de rode knop");
}

redrawLCD = false;

}

// sla het huidige tijdstip op in previousMillisLCD
vorigeMillis = huidigeMillis;




}

Advertisement

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

Re: Arduino Stopwatch HULP NODIG

Berichtdoor shooter » 21 Apr 2021, 08:41

ha mooi dat je vastloopt, zet bovenaan in je loop eens hidigemillis=millis() want ergens moet hij dat bijhouden natuurlijk, en verder zorg dat je commentaar in je programma zet en dan vooral wat jij wilt met een bepaalde opdracht. En vastlopen is een ruim begrip dus uitleg is handig.
paul deelen
shooter@home.nl

Berichten: 2
Geregistreerd: 21 Apr 2021, 00:02

Re: Arduino Stopwatch HULP NODIG

Berichtdoor quinten » 21 Apr 2021, 09:39

Goedemorgen, ik heb iets nieuws geprobeerd maar het doet niet wat ik wil... Mijn stopwatch bestaat uit een groene knop, een rode knop en een LCD-scherm. Als je de groene knop indrukt, dan start de stopwatch. Als je de groene knop nog een keer indrukt, dan stopt de stopwatch en laat je de gemeten tijd zien. Met de rode knop reset je de stopwatch naar standby (het beginscherm) tijdens het lopen van de tijd. Ook gaat de gemeten tijd naar standby als je op de rode knop drukt. Ik weet niet of dit duidelijk genoeg is, maar alvast bedankt voor de moeite.

// bibliotheek toevoegen
#include <Wire.h>
#include "rgb_lcd.h"

rgb_lcd lcd;

// algemeen //
bool stopwatchStatus = false; // status van de stopwatch (AAN/UIT)
bool redrawLCD = false; // bijwerken van het scherm (JA/NEE)

// knoppen //
const int groenePin = 12; // pin van de groene knop
int groenePinStatus = LOW; // status van de groene pin (INGEDRUKT/UITGEDRUKT)
int groenePinVorigeStatus = LOW; // vorige status van de groene pin (INGEDRUKT/UITGEDRUKT)

const int rodePin = 10; // pin van de rode knop
int rodePinStatus = LOW; // status van de rode pin (INGEDRUKT/UITGEDRUKT)
int rodePinVorigeStatus = LOW; // vorige status van de rode pin (INGEDRUKT/UITGEDRUKT)

// stopwatch //
bool stopwatchActief = false; // activiteit van de stopwatch
unsigned long stopwatchMillis = 0; // huidige tijd van de stopwatch
unsigned long stopwatchMillisVerlopen = 0; // vorige tijd van de stopwatch

// tijd //
unsigned long huidigeMillis = 0; // huidige tijd van de arduino
unsigned long vorigeMillis = 0; // vorige tijd van de arduino
const int intervalTijd = 100; // verschil van huidige tijd en vorige tijd
unsigned long millisecondes = (stopwatchMillisVerlopen % 1000);
unsigned long seconden = (stopwatchMillisVerlopen / 1000) % 60;
unsigned long minuten = (stopwatchMillisVerlopen / (60000)) % 60;
unsigned long uren = (stopwatchMillisVerlopen / (3600000));

void standby() {
huidigeMillis = millis();
lcd.setCursor(0,0);
lcd.print("Press green"); // print "press green"
lcd.setCursor(0,2);
lcd.print("to start"); // print "to start"
}

void setup() {
lcd.begin(16,2); // formaat opstellen van het scherm
lcd.clear(); // verwijder de resterende gegevens op het scherm
Serial.begin(9600); // seriele monitor toevoegen
lcd.clear(); // verwijder alles op het scherm
}


void loop() {
standby();
groenePinStatus = digitalRead(groenePin); // pin lezen van de groene knop (INGEDRUKT/UITGEDRUKT)
rodePinStatus = digitalRead(rodePin); // pin lezen van de rode knop (INGEDRUKT/UITGEDRUKT)

if(groenePinStatus == HIGH && groenePinVorigeStatus == LOW) { // Als de groene knop wordt ingedrukt, dan gaat de tijd tellen
stopwatchMillisVerlopen = huidigeMillis - vorigeMillis;
lcd.setCursor(0,0);
lcd.print(uren);
lcd.print(":");
lcd.print(minuten);
lcd.print(":");
lcd.print(seconden);
lcd.print(":");
lcd.print(millisecondes);
groenePinVorigeStatus = HIGH; // de vorige status van de groene knop wordt HIGH
}

if(groenePinStatus == HIGH && groenePinVorigeStatus == HIGH) { // Als de groene knop nog eens wordt gedrukt, laat dan de gemeten tijd zien
lcd.setCursor(0,0);
lcd.print("stopwatchMillisVerlopen"); // gemeten tijd laten zien
groenePinVorigeStatus = HIGH;
}

if(rodePinStatus == HIGH && groenePinVorigeStatus == HIGH) { // Als de rode knop wordt ingedrukt en de vorige status van de groene knop HIGH is, ga dan terug naar stand-by
standby();
groenePinVorigeStatus = LOW;
}





}

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

Re: Arduino Stopwatch HULP NODIG

Berichtdoor shooter » 21 Apr 2021, 17:09

ja dat begint al ergens op te lijken natuurlijk, maak er maar een flowdiagram van
Als je de groene knop indrukt (dat mag je met een define doen dan kun je bepalen of het een LOW of een HIGH is, dan verandert de vorige status zoals het hoort, en dan vraag je de groene knop op en de voruge stutus, en die zijn beiden hoog (de arduino gaat zo snel dat je dat niet ziet als een dubbele druk .je moet dat debouncen of kijken dat de knop weer uit is.
dus dan heb je 4 staie van een knop de puls van drukken en de puls van nog steeds aan en zo ook weer van de uit status en vervolgens heb je dus ook nog een rode knop.
paul deelen
shooter@home.nl

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: Arduino Stopwatch HULP NODIG

Berichtdoor ctunes » 30 Mei 2021, 22:25

cpp code
void loop() {
standby();


cpp code
void standby() {
huidigeMillis = millis();
lcd.setCursor(0,0);
lcd.print("Press green"); // print "press green"
lcd.setCursor(0,2);
lcd.print("to start"); // print "to start"
}


Ik vermoed dat je hier ooit een vertraging in had voorzien? "huidigeMillis = millis();"
Maar toen dat niet werkte andere oplossingen bent gaan zoeken,
daar ook niet meer uitkwam en toen hier terecht bent gekomen ...

Is het echt de bedoeling dat je elke paar milliseconden op het lcd weergeeft wat er moet gebeuren?
Het ding weet al wat er staat immers, en hoeft dat niet elke keer verteld te worden.
Een display spreek je over het algemeen alleen aan als je iets wijzigen wilt....

Bijvoorbeeld als je op een knop drukt.

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: Arduino Stopwatch HULP NODIG

Berichtdoor ctunes » 30 Mei 2021, 22:32

Ik denk dat als je dit hebt opgelost de rest van je code opeens lijkt te werken.

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: Arduino Stopwatch HULP NODIG

Berichtdoor ctunes » 30 Mei 2021, 23:01

Hier is een stukje meta-code, compileren zal het nooit, maar het het geeft je tenminste de richting aan.

as3 code
startknop = 2 // van D2 naar GND is ingedrukt.
stopknop = 3 // van D3 naar GND is ingedrukt.

setup() (

attachinterrupt(startknop, start, LOW)
attachinterrupt(stopknop, stop, LOW )

lcd.begin()
lcd.clear()

}

void start () {

lcd.write("startmessage)

start = true;

}

void stop() {

lcd.write (stopmessage)
stop = true


)

void loop ()

if (start & !stop){
startcounter()
start = false
reflectdisplay()
} else {
resetdisplay()
}
if (stop ) {

start =false
stop = false


reflectdisplay()

}

If (time == someseconds) reflectdisplay(seconds)

}
Laatst gewijzigd door ctunes op 30 Mei 2021, 23:19, in totaal 5 keer gewijzigd.

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: Arduino Stopwatch HULP NODIG

Berichtdoor ctunes » 30 Mei 2021, 23:05

Er zitten ook voldoende bugs in, die je nog een leuke avond kunnen opleveren als je de code op de letter naleeft.

Hoofdzaak is: de methode werkt, en je leert ervan.

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: Arduino Stopwatch HULP NODIG

Berichtdoor ctunes » 30 Mei 2021, 23:21

ctunes schreef:Hier is een stukje meta-code, compileren zal het nooit, maar het het geeft je tenminste de richting aan.

as3 code
startknop = 2 // van D2 naar GND is ingedrukt.
stopknop = 3 // van D3 naar GND is ingedrukt.

setup() (

attachinterrupt(startknop, start, LOW)
attachinterrupt(stopknop, stop, LOW )

lcd.begin()
lcd.clear()

}

void start () {

lcd.write("startmessage)

start = true;

}

void stop() {

lcd.write (stopmessage)
stop = true


)

void reflectdislay() {

lcd.print(stuff)
lcd.println
}

void loop ()

if (start & !stop){
startcounter()
start = false
reflectdisplay()
} else {
resetdisplay()
}
if (stop ) {

start =false
stop = false


reflectdisplay()

}

If (time == someseconds) reflectdisplay(seconds)

}

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: Arduino Stopwatch HULP NODIG

Berichtdoor ctunes » 30 Mei 2021, 23:24

Het kan zijn dat ik het nog onduidelijker heb gemaakt, maar gelieve dan aan te geven op welke punten de onduidelijkheid toepassing heeft.

(Dat maakt het voor mij wellicht duidelijker)

:geek:

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten