Arduino wissel systeem code werkt niet

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 2
Geregistreerd: 29 Feb 2020, 17:36

Arduino wissel systeem code werkt niet

Berichtdoor Rickbugs » 29 Feb 2020, 17:45

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.
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

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Arduino wissel systeem code werkt niet

Berichtdoor Koepel » 01 Mrt 2020, 11:21

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.

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

Re: Arduino wissel systeem code werkt niet

Berichtdoor shooter » 03 Mrt 2020, 11:28

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

Berichten: 2
Geregistreerd: 29 Feb 2020, 17:36

Re: Arduino wissel systeem code werkt niet

Berichtdoor Rickbugs » 03 Mrt 2020, 11:52

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.


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
      }
    }
  }
 
 
 
}

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

Re: Arduino wissel systeem code werkt niet

Berichtdoor shooter » 03 Mrt 2020, 21:11

en nu dus kijken wat er staat als commentaar en dan ook jem programma dusdanig wijzigen.
paul deelen
shooter@home.nl

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten