Ik snap niks van Millis

Ik zou graag in deze schema millis willen gebruiken maar kom er totaal niet uit.
Hoop dat iemand me kan helpen.

Ik heb een relay balk van 8. nu kan ik ze wel om en om aanzetten maar niet tegelijkertijd. Het project is voor een spookhuis. Als het karretje langskomt moet er wat gebeuren, er zijn 4 karretjes dus soms gebeuren er twee dingen tegelijkertijd. Kan dat??

#define RELAY_ON 0
#define RELAY_OFF 1

#define Relay_1 2
#define Relay_2 3
#define Relay_3 4
#define Relay_4 5

const int switch_1 = 11;
const int switch_2 = 10;
const int switch_3 = 9;
const int switch_4 = 8;

void setup()
{

pinMode(Relay_1, OUTPUT);
pinMode(Relay_2, OUTPUT);
pinMode(Relay_3, OUTPUT);
pinMode(Relay_4, OUTPUT);
pinMode(switch_1, INPUT);
pinMode(switch_2, INPUT);
pinMode(switch_3, INPUT);
pinMode(switch_4, INPUT);

digitalWrite(Relay_1, RELAY_OFF);
digitalWrite(Relay_2, RELAY_OFF);
digitalWrite(Relay_3, RELAY_OFF);
digitalWrite(Relay_4, RELAY_OFF);

}

void loop() {

int switchStatepos1 = digitalRead (switch_1);
int switchStatepos2 = digitalRead (switch_2);
int switchStatepos3 = digitalRead (switch_3);
int switchStatepos4 = digitalRead (switch_4);

if(switchStatepos1 == HIGH){
digitalWrite(Relay_1, RELAY_ON);}
else {digitalWrite(Relay_1,RELAY_OFF);}

if(switchStatepos2 == HIGH){
digitalWrite(Relay_2, RELAY_ON);}
else {digitalWrite(Relay_2,RELAY_OFF);}

if(switchStatepos3 == HIGH){
digitalWrite(Relay_3, RELAY_ON);}
else {digitalWrite(Relay_3,RELAY_OFF);}

if(switchStatepos4 == HIGH){
digitalWrite(Relay_4, RELAY_ON);}
else {digitalWrite(Relay_4,RELAY_OFF);}
}

Ik vermoed dat je huidige code in de loop > 10.000x wordt doorgelopen.... Maar de kern van het verhaal.... Je begrijpt millis() niet... Wat begrijp je dan niet....
Verder zou ik eerst met een enkele kar beginnen en hier je code laten zien. Dan fluiten wij je wel terug als je te lang blijft hangen in een actie. Maar 4 processen "pseudo" parallel laten draaien kan geen probleem zijn.
Helaas is er ook nog zoiets als RTOS maar ik denk dat dat nu zeker nog een brug te ver is.

Bij een enkele kar kan ik gewoon delay gebruiken. Alleen 10 seconden later komt de volgende kar en 10 seconden later de volgende dat betekend dat de relais tegelijkertijd aan moeten gaan. Nu weet ik dat het met millis moet kunnen alleen ik weet niet hoe ik die in moet stellen.

Zo zou het er uit zien met delay, maar hoe vervang ik delay met millis?

#define RELAY_ON 0
#define RELAY_OFF 1

#define Relay_1 2
#define Relay_2 3
#define Relay_3 4
#define Relay_4 5

const int switch_1 = 11;
const int switch_2 = 10;
const int switch_3 = 9;
const int switch_4 = 8;

void setup()
{

pinMode(Relay_1, OUTPUT);
pinMode(Relay_2, OUTPUT);
pinMode(Relay_3, OUTPUT);
pinMode(Relay_4, OUTPUT);
pinMode(switch_1, INPUT);
pinMode(switch_2, INPUT);
pinMode(switch_3, INPUT);
pinMode(switch_4, INPUT);

digitalWrite(Relay_1, RELAY_OFF);
digitalWrite(Relay_2, RELAY_OFF);
digitalWrite(Relay_3, RELAY_OFF);
digitalWrite(Relay_4, RELAY_OFF);

}

void loop() {

unsigned long huidigeTijd = millis();
int switchStatepos1 = digitalRead (switch_1);
int switchStatepos2 = digitalRead (switch_2);
int switchStatepos3 = digitalRead (switch_3);
int switchStatepos4 = digitalRead (switch_4);

if(switchStatepos1 == HIGH){
digitalWrite(Relay_1, RELAY_ON);
delay (10000);}
else {digitalWrite(Relay_1,RELAY_OFF);}

if(switchStatepos2 == HIGH){
digitalWrite(Relay_2, RELAY_ON);
delay (10000);}
else {digitalWrite(Relay_2,RELAY_OFF);}

if(switchStatepos3 == HIGH){
digitalWrite(Relay_3, RELAY_ON);
delay (10000);}
else {digitalWrite(Relay_3,RELAY_OFF);}

if(switchStatepos4 == HIGH){
digitalWrite(Relay_4, RELAY_ON);
delay (10000);}
else {digitalWrite(Relay_4,RELAY_OFF);}
}

En heb je de sketch waarin dit word voorgedaan al bestudeerd ?

Bewerk alsjeblieft je twee posts.

Type
** **[code]** **
voor de code
Type
** **[/code]** **
na de code

Zodat het in een vensterje in je post komt en het gemakkelijker is om te lezen and kopieren (het voorkomt ook problemen met de forum software die bv [i] vertaalt naar cursief.

je code hier

Het idee van millis() is simpel als je het eenmaal begrijpt.

Je kookt een eitje en kijkt op de klok en onthoudt de tijd dat je het eitje in het water hebt gedaan
Je bliift op de klok kijken totdat de juiste tijd is verstreken.

void setup()
{
  delay(1);  // voorkomt dat huidige tijd (en dus start tijden) nul kunnen zijn
}

void loop()
{
  unsigned long huidigeTijd = millis();
  static unsigned long eitjeStarttijd = 0;

  if(eitje in het water gedaan)
  {
    eitjeStarttijd = huidige tijd;
  }
  else if (eitjeStarttijd != 0 && (huidigeTijd - eitjeStarttijd >= 240000UL))
  {
    haal eitje uit het water

    eitjeStarttijd = 0;
  }

}

Nu maak je ook nog toast op hetzelfde moment

void setup()
{
  delay(1);  // voorkomt dat huidige tijd (en dus start tijden) nul kunnen zijn
}

void loop()
{
  unsigned long huidigeTijd = millis();
  static unsigned long eitjeStarttijd = 0;
  static unsigned long toastStarttijd = 0;

  if(eitje in het water gedaan)
  {
    eitjeStarttijd = huidige tijd;
  }
  else if (eitjeStarttijd != 0 && (huidigeTijd - eitjeStarttijd >= 240000UL))
  {
    haal eitje uit het water

    eitjeStarttijd = 0;
  }

  if(toast in het toaster gedaan)
  {
    toastStarttijd = huidige tijd;
  }
  else if (toastStarttijd != 0 && (huidigeTijd - toastStarttijd >= 120000UL))
  {
    haal toast uit toaster

    toastStarttijd = 0;
  }
}

Het gaat min of meer zoals bovenstaand; er kan een bugje in zitten, niet getest :wink:

Zie bv Robin2's Demonstration code for several things at the same time voor een werkend voorbeeld.

millis() is niets anders dan een teller die elke milliseconden 1 bijtelt.
je kunt dus in een variabele bijhouden wanneer iets gebeurt is,
als je blink without delay een keer bekijkt, en uitbreidt, dan komt het goed.
in de setup bijv starttijd=millis()
wachttijd=12000;
als je in de loop bijvoorbeeld schrijft
if ((millis()-starttijd) > wachttijd){
// hier komt dan wat er moet gebeuren, en starttijd=millis()}
dan
dan gebeurt er elke 12 seconden die if.

in jouw geval:
if switch1 high dan relais1 aan en start1=millis()
...
in de loop
ook nog uitzetten:
if millis()-start1 > wacht1){ relais1 uit}
..
en dat een paar keer herhalen.
je zult eventueel wel moeten kijken of de schakelaar aan moet blijven, of dat het relais weer uit gaat als de schakelaar uit is.
maak een schema wat er moet gebeuren en ik geef je wel een voorzetje.

Verder zorg dat de relais hun eigen voeding hebben, want dat kan de arduino niet leveren.