Arduino wissel systeem code werkt niet
5 berichten
• Pagina 1 van 1
Arduino wissel systeem code werkt niet
Goede dag,
ik zal me als eerste even voorstellen. Ik ben Rick van Gerven en ben bezig met het opzetten van een eigen modelspoorbaan, nu vind ik het erg leuk om zelf de aansturingen te maken maar kom er even niet uit.
wat ik wil is dat als ik op de knop druk er een wissel omgezet gaat worden in verschillende stappen:
stap1: de status led voor waar de wissel staat gaat uit.
stap 2: het relais slaat om.
stap 3: het relais gaat weer uit
stap 4: de status led gaat aan.
Er komen 4 wissels op 1 bord.
Dit is de code die ik alvast gemaakt heb (nog voor 1 wissel) maar deze schakelt niet als ik op de knop druk.
ik zal me als eerste even voorstellen. Ik ben Rick van Gerven en ben bezig met het opzetten van een eigen modelspoorbaan, nu vind ik het erg leuk om zelf de aansturingen te maken maar kom er even niet uit.
wat ik wil is dat als ik op de knop druk er een wissel omgezet gaat worden in verschillende stappen:
stap1: de status led voor waar de wissel staat gaat uit.
stap 2: het relais slaat om.
stap 3: het relais gaat weer uit
stap 4: de status led gaat aan.
Er komen 4 wissels op 1 bord.
Dit is de code die ik alvast gemaakt heb (nog voor 1 wissel) maar deze schakelt niet als ik op de knop druk.
- Code: Alles selecteren
#define button1 A0
#define w1s A4
#define w1t A5
#define ledw1s 0
#define ledw1t 1
const long switchDelay = 50;
const long ledoffDelay = 1500;
const long ledonDelay = 1500;
unsigned long previous1Time = 0;
unsigned long button1Time = 0;
unsigned long ledoff1Time = 0;
unsigned long switch1Time = 0;
unsigned long currentTime = 0;
/*
Het programmablok void setup wordt eenmaal beschreven
*/
void setup() {
Serial.begin(9600);
pinMode(button1, INPUT);
pinMode(w1s, OUTPUT);
pinMode(w1t, OUTPUT);
pinMode(ledw1s, OUTPUT);
pinMode(ledw1t, OUTPUT);
digitalWrite(w1s, HIGH);
delay(500);
digitalWrite(w1s, LOW);
delay(1500);
digitalWrite(ledw1s, HIGH);
};
void loop() {
currentTime = millis();
// wissel 1 recht:
digitalRead(button1);
delay(50);
if (digitalRead(button1) == 1 && digitalRead(ledw1t) == HIGH)
{
digitalWrite(ledw1t, LOW);
button1Time = currentTime;
if ((currentTime - button1Time) > ledoffDelay)
{
digitalWrite(w1s, HIGH);
ledoff1Time = currentTime;
if ((currentTime - ledoff1Time) > switchDelay)
{
digitalWrite(w1s, LOW);
switch1Time = currentTime;
if ((currentTime - switch1Time) > ledonDelay)
{
digitalWrite(ledw1s, HIGH);
}
}
}
// wissel 1 turn:
else if (digitalRead(button1) == 1 && digitalRead(ledw1s) == HIGH)
{
digitalWrite(ledw1s, LOW);
button1Time = currentTime;
if ((currentTime - button1Time) > ledoffDelay)
{
digitalWrite(w1t, HIGH);
ledoff1Time = currentTime;
if ((currentTime - ledoff1Time) > switchDelay)
{
digitalWrite(w1t, LOW);
switch1Time = currentTime;
if ((currentTime - switch1Time) > ledonDelay)
{
digitalWrite(ledw1t, HIGH);
}
}
}
}
}
}
Advertisement
Re: Arduino wissel systeem code werkt niet
Hallo, welkom op dit forum.
Je kunt twee dingen doen:
mogelijkheid één:
Je kunt delay() gebruiken. Tijdens een delay kun je niets doen, dus niet kijken of er een knop is ingedrukt. Je kunt ook niet twee dingen onafhankelijk van elkaar doen.
mogelijkheid twee:
Je kunt millis() gebruiken. Dan is het belangrijk dat de loop() zo vaak mogelijk en zo snel mogelijk wordt uitgevoerd.
Als je dat goed doet, dan kun je tientallen dingen tegelijk doen.
De sketch wordt dan heel anders dan wanneer je delay() gebruikt.
Dus de loop() wordt misschien wel duizenden keren per seconde uitgevoerd. Dan kun je millis() gebruiken om te zien of er iets gedaan moet worden.
Je hebt nu verschillende gebeurtenissen achter elkaar (een 'sequence'), die je binnen elkaars if-statement hebt gezet. Op die manier werkt het niet. Het is alsof je in gedachten dat als een delay() ziet. Het gaat er om dat de loop() steeds opnieuw wordt uitgevoerd.
Om verschillende dingen achter elkaar te doen, kun je die als commando's in een tabel zetten.
Als je wat meer ervaring hebt in programmeren kunt je ook een "Finite State Machine" maken. Dat is een ingewikkelde naam voor iets dat er logisch uit ziet: https://majenko.co.uk/blog/finite-state-machine.
Wil je die sequence altijd uitvoeren zonder extra condities ? Dan kun je een array gebruiken. Bijvoorbeeld in combinatie met een struct, zodat je de pinnummer, de wachttijd, en HIGH of LOW in dat array kunt zetten.
Wil je die sequence uitvoeren met allerlei extra mogelijkheden bij iedere stap ? Dan is een Finite State Machine het beste.
Je sketch gaat sowieso een heel stuk groter worden.
Ik heb een paar voorbeelden: https://github.com/Koepel/Fun_with_millis (de beschrijving staat halverwege die pagina).
De "millis_rhythm.ino" leest dingen uit een array.
De "millis_timestamp_events.ino" gebruikt een array en een struct om dingen in op te slaan en even later weer uit te lezen.
De "millis_and_finite_state_machine.ino" is een Finite State Machine.
Je kunt twee dingen doen:
mogelijkheid één:
Je kunt delay() gebruiken. Tijdens een delay kun je niets doen, dus niet kijken of er een knop is ingedrukt. Je kunt ook niet twee dingen onafhankelijk van elkaar doen.
mogelijkheid twee:
Je kunt millis() gebruiken. Dan is het belangrijk dat de loop() zo vaak mogelijk en zo snel mogelijk wordt uitgevoerd.
Als je dat goed doet, dan kun je tientallen dingen tegelijk doen.
De sketch wordt dan heel anders dan wanneer je delay() gebruikt.
Dus de loop() wordt misschien wel duizenden keren per seconde uitgevoerd. Dan kun je millis() gebruiken om te zien of er iets gedaan moet worden.
Je hebt nu verschillende gebeurtenissen achter elkaar (een 'sequence'), die je binnen elkaars if-statement hebt gezet. Op die manier werkt het niet. Het is alsof je in gedachten dat als een delay() ziet. Het gaat er om dat de loop() steeds opnieuw wordt uitgevoerd.
Om verschillende dingen achter elkaar te doen, kun je die als commando's in een tabel zetten.
Als je wat meer ervaring hebt in programmeren kunt je ook een "Finite State Machine" maken. Dat is een ingewikkelde naam voor iets dat er logisch uit ziet: https://majenko.co.uk/blog/finite-state-machine.
Wil je die sequence altijd uitvoeren zonder extra condities ? Dan kun je een array gebruiken. Bijvoorbeeld in combinatie met een struct, zodat je de pinnummer, de wachttijd, en HIGH of LOW in dat array kunt zetten.
Wil je die sequence uitvoeren met allerlei extra mogelijkheden bij iedere stap ? Dan is een Finite State Machine het beste.
Je sketch gaat sowieso een heel stuk groter worden.
Ik heb een paar voorbeelden: https://github.com/Koepel/Fun_with_millis (de beschrijving staat halverwege die pagina).
De "millis_rhythm.ino" leest dingen uit een array.
De "millis_timestamp_events.ino" gebruikt een array en een struct om dingen in op te slaan en even later weer uit te lezen.
De "millis_and_finite_state_machine.ino" is een Finite State Machine.
Re: Arduino wissel systeem code werkt niet
cpp code
Volgende actie zou zijn het gebruik van een array je maar een keer hoeft te schrijven voor meerdere wissels.
Je bent overigens erg goed bezig hoor.
hoe zit het elektrisch aan elkaar want door de wissels gaat erg veel stroom lopen (en dat kan een arduino niet aan.
kijk eens naar fritzing voor een schema teken ding.
of naar tinkercad (voor een simulatie)
#define button1 A0 //noem het pinbutton
#define w1s A4 // dat mogen dus ook cijfers zijn A0 is 14
#define w1t A5 // wat is s en wat is t beter is recht en krom
#define ledw1s 0 // pin 0 en 1 zijn voor communicatie dus vanaf 2 is een beter begin
#define ledw1t 1
const long switchDelay = 50; //ook dit mogen unsigned zijn hoor
const long ledoffDelay = 1500;
const long ledonDelay = 1500;
unsigned long previous1Time = 0;
unsigned long button1Time = 0;
unsigned long ledoff1Time = 0;
unsigned long switch1Time = 0;
unsigned long currentTime = 0;
/*
Het programmablok void setup wordt eenmaal beschreven
*/
void setup() {
Serial.begin(9600); // dat zijn dus pinnen 0 en 1
pinMode(button1, INPUT);
pinMode(w1s, OUTPUT);
pinMode(w1t, OUTPUT);
pinMode(ledw1s, OUTPUT);
pinMode(ledw1t, OUTPUT);
digitalWrite(w1s, HIGH);
delay(500);
digitalWrite(w1s, LOW);
delay(1500);
digitalWrite(ledw1s, HIGH);
// betekent dus dat alle wissels recht staan ?
};
void loop() {
currentTime = millis();
// wissel 1 recht:
digitalRead(button1);
delay(50);
if (digitalRead(button1) == 1 && digitalRead(ledw1t) == HIGH) // wat is verschil tussen HIGH en 1
{
digitalWrite(ledw1t, LOW); // hier zet je dus de led uit
button1Time = currentTime;// hier zet je dus de button1Time op current
if ((currentTime - button1Time) > ledoffDelay) // en hier kijk je of de delay al verstreken is maar die heb je hierboven net op current gezet
{
digitalWrite(w1s, HIGH);
ledoff1Time = currentTime;
if ((currentTime - ledoff1Time) > switchDelay) // hier komt het programma nooit want er staat een voorwaarde boven beter is om al die timers allemaal onafhankelijk van elkaar wat te laten doen
// eventueel met een vlag
{
digitalWrite(w1s, LOW);
switch1Time = currentTime;
if ((currentTime - switch1Time) > ledonDelay)
{
digitalWrite(ledw1s, HIGH);
}
}
}
// wissel 1 turn:
else if (digitalRead(button1) == 1 && digitalRead(ledw1s) == HIGH)
{
digitalWrite(ledw1s, LOW);
button1Time = currentTime;
if ((currentTime - button1Time) > ledoffDelay)
{
digitalWrite(w1t, HIGH);
ledoff1Time = currentTime;
if ((currentTime - ledoff1Time) > switchDelay)
{
digitalWrite(w1t, LOW);
switch1Time = currentTime;
if ((currentTime - switch1Time) > ledonDelay)
{
digitalWrite(ledw1t, HIGH);
}
}// zoals jezelf ook wel ziet staan hier alle afsluitingen bij elkaar wat het erg moeilijk maakt om om de voorwaarden te controleren
// heb ik ook niet gedaan door de eerste fout
}
}
}
}
Volgende actie zou zijn het gebruik van een array je maar een keer hoeft te schrijven voor meerdere wissels.
Je bent overigens erg goed bezig hoor.
hoe zit het elektrisch aan elkaar want door de wissels gaat erg veel stroom lopen (en dat kan een arduino niet aan.
kijk eens naar fritzing voor een schema teken ding.
of naar tinkercad (voor een simulatie)
paul deelen
shooter@home.nl
shooter@home.nl
Re: Arduino wissel systeem code werkt niet
Bedankt voor de reactie.
hoe het technisch in elkaar zit is dat de stroom voor de wissels gaat via een relais.
dit is nog maar een simpele versie van de code voor 1 wissel zodat ik deze later kan uitbreiden naar 4 wissels.
ik heb de reacties er maar even achter gezet.
hoe het technisch in elkaar zit is dat de stroom voor de wissels gaat via een relais.
dit is nog maar een simpele versie van de code voor 1 wissel zodat ik deze later kan uitbreiden naar 4 wissels.
ik heb de reacties er maar even achter gezet.
- Code: Alles selecteren
#define button1 A0 //noem het pinbutton
#define w1s A4 // dat mogen dus ook cijfers zijn A0 is 14
#define w1t A5 // wat is s en wat is t beter is recht en krom s= Straigt en t= Turn
#define ledw1s 0 // pin 0 en 1 zijn voor communicatie dus vanaf 2 is een beter begin ik kan dus pin 0 en 1 niet gebruiken? aangezien ik alle pins nodig heb voor mijn programma
#define ledw1t 1
const long switchDelay = 50; //ook dit mogen unsigned zijn hoor
const long ledoffDelay = 1500;
const long ledonDelay = 1500;
unsigned long previous1Time = 0;
unsigned long button1Time = 0;
unsigned long ledoff1Time = 0;
unsigned long switch1Time = 0;
unsigned long currentTime = 0;
/*
Het programmablok void setup wordt eenmaal beschreven
*/
void setup() {
Serial.begin(9600); // dat zijn dus pinnen 0 en 1
pinMode(button1, INPUT);
pinMode(w1s, OUTPUT);
pinMode(w1t, OUTPUT);
pinMode(ledw1s, OUTPUT);
pinMode(ledw1t, OUTPUT);
digitalWrite(w1s, HIGH);
delay(500);
digitalWrite(w1s, LOW);
delay(1500);
digitalWrite(ledw1s, HIGH);
// betekent dus dat alle wissels recht staan ? ja dat klopt
};
void loop() {
currentTime = millis();
// wissel 1 recht:
digitalRead(button1);
delay(50);
if (digitalRead(button1) == 1 && digitalRead(ledw1t) == HIGH) // wat is verschil tussen HIGH en 1
{
digitalWrite(ledw1t, LOW); // hier zet je dus de led uit
button1Time = currentTime;// hier zet je dus de button1Time op current
if ((currentTime - button1Time) > ledoffDelay) // en hier kijk je of de delay al verstreken is maar die heb je hierboven net op current gezet
{
digitalWrite(w1s, HIGH);
ledoff1Time = currentTime;
if ((currentTime - ledoff1Time) > switchDelay) // hier komt het programma nooit want er staat een voorwaarde boven beter is om al die timers allemaal onafhankelijk van elkaar wat te laten doen
// eventueel met een vlag
{
digitalWrite(w1s, LOW);
switch1Time = currentTime;
if ((currentTime - switch1Time) > ledonDelay)
{
digitalWrite(ledw1s, HIGH);
}
}
}
// wissel 1 turn:
else if (digitalRead(button1) == 1 && digitalRead(ledw1s) == HIGH)
{
digitalWrite(ledw1s, LOW);
button1Time = currentTime;
if ((currentTime - button1Time) > ledoffDelay)
{
digitalWrite(w1t, HIGH);
ledoff1Time = currentTime;
if ((currentTime - ledoff1Time) > switchDelay)
{
digitalWrite(w1t, LOW);
switch1Time = currentTime;
if ((currentTime - switch1Time) > ledonDelay)
{
digitalWrite(ledw1t, HIGH);
}
}// zoals jezelf ook wel ziet staan hier alle afsluitingen bij elkaar wat het erg moeilijk maakt om om de voorwaarden te controleren
// heb ik ook niet gedaan door de eerste fout
}
}
}
}
Re: Arduino wissel systeem code werkt niet
en nu dus kijken wat er staat als commentaar en dan ook jem programma dusdanig wijzigen.
paul deelen
shooter@home.nl
shooter@home.nl
5 berichten
• Pagina 1 van 1
Terug naar Gezamenlijke projecten
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten