Hoi Arendt!
Ik zie dat posten in het forum gelukt is
.
Voor wat betreft jouw project: Wat voor motor gebruik je?
Stappenmotor of servo had misschien een eenvoudigere oplossing geweest - dan zou je namelijk de relays achterwege kunnen laten.
Maar .. ik heb zelf maar bar weinig met motors gedaan ... dus als het zo werkt - prima!
Ik zie dat je de motor 3 seconden aanzet om omhoog te gaan, 6 seconden wachten en dan weer 3 seconden de motor aan.
Het probleem zit 'm dus in de delays die je gebruikt.
Eigenlijk zou je de tijd library moeten gebruiken en een status moeten zetten voor de slagboom (openen, open, sluiten, gesloten). De time library kun je vanuit de Arduino IDE installeren. Sketch -> Include Library -> Manage Libraries -> scroll naar "Time, by Michael Margolis" en click op "Install".
Ik kan de code hier niet testen (m'n kleine neefje is er met de Arduino vandoor), maar zoiets als:
#include <Time.h>
#define gesloten 0
#define openen 1
#define geopend 2
#define sluiten 3
int SlagboomStatus = 0; // begin gesloten
time_t StatusStart = 0; // gebruiken we om te timen
int ledPin1 = 13; //in1 en in2 of 4 channel relay sets polarity - +
int ledPin2 = 12; //in3 en in4 of 4 channel relay change polarit + -
int inputPin = 2; // PIR input
int val = 0;
void setup() {
pinMode(ledPin1, OUTPUT); //in1 en in2 open gate
pinMode(ledPin2, OUTPUT); //in3 en in4 close gate
pinMode(inputPin, INPUT);
}
void loop() {
val = digitalRead(inputPin);
if(val==HIGH) { // Iemand staat voor de PIR, slagboom moet dus open
SlagboomStatus = openen;
StatusStart = now();
digitalWrite(ledPin1, LOW);
} else if ((SlagboomStatus!=openen)&&(SlagboomStatus!=sluiten)) {
digitalWrite(ledPin1, HIGH); // motors uit als we met iets bezig zijn
digitalWrite(ledPin2, HIGH);
}
// Lopende processen aflopen
if(SlagboomStatus==openen) { // -> slagboom is bezig met openen
if(now()-StatusStart>=3000) { // Stop motor na 3 seconden
digitalWrite(ledPin1, HIGH);
SlagboomStatus = geopend;
StatusStart = now();
}
}
else if(SlagboomStatus==geopend) { // -> slagboom is open
if(now()-StatusStart>=6000) { // Laat de slagboom tot 6 sec openstaan
digitalWrite(ledPin2, LOW); // en na 6 seconden weer sluiten
SlagboomStatus = sluiten;
StatusStart = now();
}
}
else if(SlagboomStatus==sluiten) { // -> slagboom is aan het sluiten
if(now()-StatusStart>=3000) { // Laat de motor tot 3 seconden lopen
digitalWrite(ledPin2, HIGH);
SlagboomStatus = gesloten;
StatusStart = now();
}
}
}
Dus we blijven de loop() herhalen terwijl de slagboom omhoog of omlaag gaat, zodat we kunnen opvangen dat er weer iemand voor de slagboom staat.
Kan zijn dat je de code een beetje moet tweaken ...