Probleem met code
5 berichten
• Pagina 1 van 1
- Arduinofast
- Berichten: 1
- Geregistreerd: 15 Sep 2023, 15:02
Probleem met code
Hallo allemaal,
Voor een opdracht vanuit school moet ik een code bouwen die de reactietijd kan testen van een mens. Hierbij moet ervoor gezorgd worden dat een persoon niet te vroeg klikt en dan de melding "Niet valsspelen" krijgt.
Alleen werkt dit niet in mijn code.
De opstelling betreft, een drukknop, 2 weerstandjes en twee ledjes (met drie kabels naar de arduino (5 inclusief + en -)).
Ik krijg graag te horen wat de fout kan zijn in de volgende code, alvast bedankt:
const int knopPoort = 2;
const int groenPoort = 4;
const int roodPoort = 3;
int toestand = 0;
unsigned long laatsteTransitie = 0;
unsigned long wachttijd = 0;
unsigned long reactietijd = 0;
bool knopIngedrukt = false;
bool knopStatus = digitalRead(knopPoort);
wachttijd = random(3000, 10000);
void setup() {
Serial.begin(9600);
pinMode(knopPoort, INPUT_PULLUP);
pinMode(groenPoort, OUTPUT);
pinMode(roodPoort, OUTPUT);
}
void loop() {
// Lees de invoer.
bool isKnopIngedrukt = !digitalRead(knopPoort);
unsigned long huidigetijd = millis();
unsigned long tijdNaTransitie = huidigetijd - laatsteTransitie;
if (toestand == 0 && isKnopIngedrukt && tijdNaTransitie >= 1000) {
wachttijd = random(3000, 10000);
digitalWrite(roodPoort, true);
digitalWrite(groenPoort, false);
toestand = 1;
laatsteTransitie = huidigetijd;
}
if (knopStatus == true && !knopIngedrukt) {
knopIngedrukt = true;
} else if (toestand == 1 && laatsteTransitie && knopIngedrukt <= wachttijd) {
digitalWrite(roodPoort, true);
digitalWrite(groenPoort, true);
Serial.println("Niet valsspelen!");
delay (4000);
toestand = 0;
laatsteTransitie = huidigetijd;
knopIngedrukt = false;
} else if (toestand == 1 && tijdNaTransitie >= wachttijd) {
digitalWrite(roodPoort, false);
digitalWrite(groenPoort, true);
toestand = 2;
laatsteTransitie = huidigetijd;
}
else if (toestand == 2 && isKnopIngedrukt) {
digitalWrite(groenPoort, false);
digitalWrite(roodPoort, false);
toestand = 0;
laatsteTransitie = huidigetijd;
reactietijd = tijdNaTransitie;
Serial.println("Je reactietijd was " + String(reactietijd) + " milliseconden.");
}
}
Voor een opdracht vanuit school moet ik een code bouwen die de reactietijd kan testen van een mens. Hierbij moet ervoor gezorgd worden dat een persoon niet te vroeg klikt en dan de melding "Niet valsspelen" krijgt.
Alleen werkt dit niet in mijn code.
De opstelling betreft, een drukknop, 2 weerstandjes en twee ledjes (met drie kabels naar de arduino (5 inclusief + en -)).
Ik krijg graag te horen wat de fout kan zijn in de volgende code, alvast bedankt:
const int knopPoort = 2;
const int groenPoort = 4;
const int roodPoort = 3;
int toestand = 0;
unsigned long laatsteTransitie = 0;
unsigned long wachttijd = 0;
unsigned long reactietijd = 0;
bool knopIngedrukt = false;
bool knopStatus = digitalRead(knopPoort);
wachttijd = random(3000, 10000);
void setup() {
Serial.begin(9600);
pinMode(knopPoort, INPUT_PULLUP);
pinMode(groenPoort, OUTPUT);
pinMode(roodPoort, OUTPUT);
}
void loop() {
// Lees de invoer.
bool isKnopIngedrukt = !digitalRead(knopPoort);
unsigned long huidigetijd = millis();
unsigned long tijdNaTransitie = huidigetijd - laatsteTransitie;
if (toestand == 0 && isKnopIngedrukt && tijdNaTransitie >= 1000) {
wachttijd = random(3000, 10000);
digitalWrite(roodPoort, true);
digitalWrite(groenPoort, false);
toestand = 1;
laatsteTransitie = huidigetijd;
}
if (knopStatus == true && !knopIngedrukt) {
knopIngedrukt = true;
} else if (toestand == 1 && laatsteTransitie && knopIngedrukt <= wachttijd) {
digitalWrite(roodPoort, true);
digitalWrite(groenPoort, true);
Serial.println("Niet valsspelen!");
delay (4000);
toestand = 0;
laatsteTransitie = huidigetijd;
knopIngedrukt = false;
} else if (toestand == 1 && tijdNaTransitie >= wachttijd) {
digitalWrite(roodPoort, false);
digitalWrite(groenPoort, true);
toestand = 2;
laatsteTransitie = huidigetijd;
}
else if (toestand == 2 && isKnopIngedrukt) {
digitalWrite(groenPoort, false);
digitalWrite(roodPoort, false);
toestand = 0;
laatsteTransitie = huidigetijd;
reactietijd = tijdNaTransitie;
Serial.println("Je reactietijd was " + String(reactietijd) + " milliseconden.");
}
}
Advertisement
- FonzieBonzo
-
- Berichten: 117
- Geregistreerd: 01 Okt 2015, 11:54
- Woonplaats: Castricum
Re: Probleem met code
Hi,
Ik denk dat je
cpp code
ipv
cpp code
Gr, Fonzie
Ik denk dat je
cpp code
if (toestand == 1 && laatsteTransitie + knopIngedrukt <= wachttijd) {
digitalWrite(roodPoort, true);
ipv
cpp code
if (toestand == 1 && laatsteTransitie && knopIngedrukt <= wachttijd) {
digitalWrite(roodPoort, true);
Gr, Fonzie
Re: Probleem met code
cpp code
en uitleggen wat het allemaal doet zoals de groene en rode led
probeer maar eens
const int knopPoort = 2; // dit mag maar lees eens wat define is
const int groenPoort = 4;
const int roodPoort = 3;
int toestand = 0;
unsigned long laatsteTransitie = 0;
unsigned long wachttijd = 0;
unsigned long reactietijd = 0;
bool knopIngedrukt = false;
bool knopStatus = digitalRead(knopPoort); // kan wel maar is niet slim doe dat in de loop
// wachttijd = random(3000, 10000); // hier wordt de tijd dus gezet tussen 3 en 10 sec.
void setup() {
Serial.begin(9600);
pinMode(knopPoort, INPUT_PULLUP);
pinMode(groenPoort, OUTPUT);
pinMode(roodPoort, OUTPUT);
}
void loop() {
// Lees de invoer.
bool isKnopIngedrukt = !digitalRead(knopPoort);
unsigned long huidigetijd = millis();
unsigned long tijdNaTransitie = huidigetijd - laatsteTransitie;
if (toestand == 0 && isKnopIngedrukt && tijdNaTransitie >= 1000) {// hier moeten een hoop haakjes omheen zoals (toestand==0) en (tijdnatransitie>=1000)
wachttijd = random(3000, 10000);
digitalWrite(roodPoort, true);// wordt de led aan of uit gezet hier
digitalWrite(groenPoort, false);
toestand = 1;
laatsteTransitie = huidigetijd;
}
if (knopStatus == true && !knopIngedrukt) {// commentaar schrijven om uit te leggen wat er gebeurt
knopIngedrukt = true;
//gebruik van else is niet duidelijk liever een paar if gebruiken want anders wordt de logica ingewikkeld en krijg je een raar schema (wat handig is een stroomschema
} else if (toestand == 1 && laatsteTransitie && knopIngedrukt <= wachttijd) {// ook hier weer haakjes
digitalWrite(roodPoort, true);
digitalWrite(groenPoort, true);
Serial.println("Niet valsspelen!");
delay (4000);// voor nu prima maar veel slimmer is om een timer te gebruiken
toestand = 0;
laatsteTransitie = huidigetijd;
knopIngedrukt = false;
} else if (toestand == 1 && tijdNaTransitie >= wachttijd) {
digitalWrite(roodPoort, false);
digitalWrite(groenPoort, true);
toestand = 2;
laatsteTransitie = huidigetijd;
}
else if (toestand == 2 && isKnopIngedrukt) {
digitalWrite(groenPoort, false);
digitalWrite(roodPoort, false);
toestand = 0;
laatsteTransitie = huidigetijd;
reactietijd = tijdNaTransitie;
Serial.println("Je reactietijd was " + String(reactietijd) + " milliseconden.");
}
}
en uitleggen wat het allemaal doet zoals de groene en rode led
probeer maar eens
paul deelen
shooter@home.nl
shooter@home.nl
Re: Probleem met code
Inderdaad het statement:
} else if (toestand == 1 && laatsteTransitie && knopIngedrukt <= wachttijd) {
is niet correct laatsteTransitie is long en knopIngedrukt is boolean.
gewoon laatsteTransitie en laatsteTransitie verwisselen.
} else if (toestand == 1 && knopIngedrukt && laatsteTransitie <= wachttijd) {
Succes met je project.
} else if (toestand == 1 && laatsteTransitie && knopIngedrukt <= wachttijd) {
is niet correct laatsteTransitie is long en knopIngedrukt is boolean.
gewoon laatsteTransitie en laatsteTransitie verwisselen.
} else if (toestand == 1 && knopIngedrukt && laatsteTransitie <= wachttijd) {
Succes met je project.
Re: Probleem met code
het lijkt een beginner prima natuurlijk maar zonder haakjes gaat het toch echt niet
paul deelen
shooter@home.nl
shooter@home.nl
5 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten