Hallo allemaal, ik ben nieuw hier op dit forum en ook redelijk nieuw met Arduino, elektronica is geen probleem.
Voor mijn modelbaan heb ik twee stukken rails voorzien van 'n Hallsensor. Trein activeert Hallsensor, relais komt op, onderbreekt spanning en trein stopt 'n aantal seconden. n tweede relais stuurt 'n wissel om en er gaat ook nog 'n led branden. Op alle twee de railstukken werkt het prima. Echter nu het probleem, als één Hallsensor actief is en de volgende trein zou de andere Hallsensor moeten activeren gebeurt er niets!!!! Ongetwijfeld een beginnersfout maar ik kom er niet uit!!
typ of plak hier code
int sensor2=A1; //sensorH12 spoor 3 schaduwstation
int relay1=9; //spanning op spoor 3
int relay2=7; //spanning op spoor 2
int relay3=3;// wissel om naar spoor 2
int relay4=4;//wissel om naar spoor 3
int ledrood1=5;//indicatie stoppen spoor 2
int ledrood2=6;//indicatie stoppen spoor 3
void setup(){
Serial.begin(9600);//seriele monitor
pinMode(relay1,OUTPUT);// spoor 3
pinMode(relay2,OUTPUT);// spoor 2
pinMode(relay3,OUTPUT);//wissel naar spoor 2
pinMode(relay4,OUTPUT);//wissel naar spoor 3
pinMode(ledrood1,OUTPUT);//indicatie stoppen spoor 2
pinMode(ledrood2,OUTPUT);//indicatie stoppen spoor 3
}
void loop(){
int valA1 = analogRead(sensor2);
int valA0 = analogRead(sensor1);
Serial.println(valA1);
Serial.println(valA0);
{}
if (valA0<500){
digitalWrite(relay1,LOW);// verbreekt spanning spoor 2
digitalWrite(relay4,LOW);// zet wissel om naar spoor 3
digitalWrite(ledrood1,HIGH); //stopindicator gaat aan
delay(4000);//
digitalWrite(relay4,HIGH); // wissel in rust
delay(30000);//stoptijd 30 seconden
digitalWrite(relay1,HIGH);//trein gaat weer rijden
digitalWrite(ledrood1,LOW); //indicator gaat uit
delay(500);//pauzetijd sensor
}
if (valA1<500){
digitalWrite(relay2,LOW);// verbreekt spanning spoor 3
digitalWrite(relay3,LOW); // zet wissel om naar spoor 2
digitalWrite(ledrood2,HIGH);// stopindicator gaat aan
delay(4000);//
digitalWrite(relay3,HIGH);// wissel in rust
delay(30000);//stoptijd 30 seconden
digitalWrite(relay2,HIGH);//trein gaat weer rijden
digitalWrite(ledrood2,LOW);// indicator gaat weer uit
delay(500);//pauzetijd sensor
}
if (valA0>500){
digitalWrite(relay1,HIGH);//
digitalWrite(relay3,HIGH);
digitalWrite(relay4,HIGH);
digitalWrite(relay2,HIGH);
}
if (valA1>500){
digitalWrite(relay2,HIGH);
digitalWrite(relay4,HIGH);
digitalWrite(relay3,HIGH);
digitalWrite(relay1,HIGH);
}
}
Het probleem is dat de code in zijn huidige vorm de bewerkingen sequentieel uitvoert en stopt bij "delay()"-momenten. Gedurende die tijd kan de code niets anders doen. Als u wilt dat de code meer dan één ding tegelijk doet, moet u de functie "loop()" laten draaien of de functie "millis()" gebruiken om de benodigde bewerkingen uit te voeren of te wachten. Ook voor systemen van dit type zul je waarschijnlijk het concept van "finite state machine" (of "FSM" in het Engels, "Finite State Machine") moeten introduceren. Er zijn online veel tutorials te vinden waarin wordt uitgelegd wat het betekent en hoe je ze met Arduino kunt implementeren.
Ten slotte heb je in je code niet alleen een aantal nutteloze lege regels, maar ook nutteloze accolades en ontbrekende inspringing (druk op Ctrl-T in Arduino IDE, dan wordt de code automatisch opnieuw geformatteerd).
PS: Sorry voor eventuele fouten, maar Nederlands is niet mijn taal.
Bekijk dit onderwerp (klik !) eens.
Dat geeft wat meer informatie over wat @docdoc beschrijft, het tijdelijk stoppen van de uitvoering van je code.
Houd er wel rekening mee dat dat onderwerp al even geleden gemaakt is en dat bijvoorbeeld de afbeelding daarin mogelijk niet helemaal meer kan kloppen met de huidige IDE.
Verder helpt de IDE je met de accolades, wanneer je naast een accolade gaat staan, markeert de IDE de bijbehorende accolade door er een blauw blokje omheen te zetten.
Jij kunt dan controleren of dat de juiste bijbehorende accolade is en wanneer niet gaan opsporen waar je wat moet weghalen of toevoegen om dat weer goed te krijgen.
Lege regels zijn OK, het kan jezelf wat meer overzicht geven.
Maar meerdere achter elkaar helpen niet echt, dus dat kun je dan beter weghalen.
Dat ontstaat vaak zonder dat je het doorhebt tijdens het typen en aanpassen van je code.
Maar af en toe de code even een beetje opschonen is een erg goed idee voor het overzicht.
Als gevolg daarvan wordt het stuk na ``` gezien als een instructie voor de code tag.
Je kunt bv ```cpp gebruiken voor c++ files (niet nodig omdat het forum dat automatisch doet), ```json voor json files en ```txt voor tekst (bv uitvoer van de seriële monitor).
Je kunt je bericht bewerken en de ``` op zijn eigen regel zetten, anders kan ik het voor je doen.