Probleem met code

IDE gerelateerde berichten
Berichten: 1
Geregistreerd: 15 Sep 2023, 15:02

Probleem met code

Berichtdoor Arduinofast » 15 Sep 2023, 15:08

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.");
}
}

Advertisement

Gebruikers-avatar
Berichten: 118
Geregistreerd: 01 Okt 2015, 11:54
Woonplaats: Castricum

Re: Probleem met code

Berichtdoor FonzieBonzo » 15 Sep 2023, 18:43

Hi,

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

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

Re: Probleem met code

Berichtdoor shooter » 15 Sep 2023, 19:33

cpp code
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

Berichten: 80
Geregistreerd: 02 Nov 2022, 13:03

Re: Probleem met code

Berichtdoor ThHe » 15 Sep 2023, 23:47

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.

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

Re: Probleem met code

Berichtdoor shooter » 17 Sep 2023, 14:33

het lijkt een beginner prima natuurlijk maar zonder haakjes gaat het toch echt niet
paul deelen
shooter@home.nl

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 43 gasten