Vraag


  • dummy22
  • Registratie: Oktober 2019
  • Laatst online: 01-04 13:28
Mijn vraag
...

Beste forumleden.

In onderstaande sketch zou ik graag een pauze toevoegen tussen de verschillende ontstekingen (relais) van enkele minuten.

Het lukt mij niet.Omdat ik een beginner ben met arduino ben ik al uren bezig geweest.Kan u mij helpen?
Dank u.


void setup()
{
   pinMode(relais1,OUTPUT);
   pinMode(relais2,OUTPUT);
   pinMode(relais3,OUTPUT);
}


void loop()
{
   switch(random(3))
   {  case 0:
      {  digitalWrite(relais1,HIGH);
         digitalWrite(relais2,LOW);
         digitalWrite(relais3,LOW);
         delay(1500);
         break;
         
      }
      case 1:
      {  digitalWrite(relais1,LOW);
         digitalWrite(relais2,LOW);
         digitalWrite(relais3,HIGH);
         delay(1500);
         break;
      }
      case 2:
      {  digitalWrite(relais1,LOW);
         digitalWrite(relais2,HIGH);
         digitalWrite(relais3,LOW);
         delay(1500);
         break;
      }
   }
}
...

Alle reacties


  • dfijma
  • Registratie: Juni 2009
  • Laatst online: 12:47
Wel, je hebt zo te zien al een poging gewaagd, met die "delay(1500)". Wat was het verwachte cq. het waargenomen gedrag daarvan, en wat gaat er mis?

  • Exception
  • Registratie: Augustus 2006
  • Laatst online: 08:39
De delay functie verwacht milliseconden. 1500 is dus 1,5 seconden. Om daar minuten van te maken zul je dit dus moeten ophogen:

code:
1
delay(300000); // Lange pauze van 5 minuten (300.000 milliseconden)

[ Voor 3% gewijzigd door Exception op 19-09-2024 09:48 ]


  • dummy22
  • Registratie: Oktober 2019
  • Laatst online: 01-04 13:28
De delay in de sketch bepaalt de brandduur van elke ( case ) waarna hij onmiddellijk naar de volgende case springt en dit in een loop. Het is de bedoeling dat na elke case een wachttijd kan ingesteld worden.
De ingestelde tijden kan ik al aanpassen naar uren dit is dus geen probleem, maar ik kan geen regel samenstellen en de plaats bepalen waarin deze moet komen.om een wachttijd in te stellen.
In de sketch staat alles nog in milis omdat ik dan makkelijker kan testen in arduino IDE.
Dank u.

  • dfijma
  • Registratie: Juni 2009
  • Laatst online: 12:47
Ik snap 't het niet helemaal. Je bedoelt een wachttijd waarbij gedurende die tijd ALLE relais uitstaan? Dus zoiets als:

1) gedurende x minuten patroon cf. case 0
2) y minuten "niks"
3) gedurende x minuten patroon cf. case 1
4) y minuten "niks"
5) gedurende x minuten patroon cf. case 2
6) y minuten "niks"

en dat dan eeuwig in een loop?

Begrijp ik het zo goed?

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 12:53

DexterDee

I doubt, therefore I might be

De code kan nog wel een stukje compacter :)

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void setup() {
   pinMode(relais1, OUTPUT);
   pinMode(relais2, OUTPUT);
   pinMode(relais3, OUTPUT);
}

void loop() {
   // zet alle relais in een array zodat we er makkelijke doorheen kunnen lopen
   int relays[3] = {relais1, relais2, relais3};
   int activeRelay = random(3);
   
   // zet de active relay aan en de rest uit
   for (int i = 0; i < 3; i++) {
      digitalWrite(relays[i], (i == activeRelay) ? HIGH : LOW);
   }
   
   // wachttijd van deze "case"
   delay(1500);

   // zet alle relays uit
   for (int i = 0; i < 3; i++) {
      digitalWrite(relays[i], LOW);
   }
   
   // wachttijd van de pauze tussen de "cases"
   delay(1500);
}

Is dit wat je bedoelt met "case" tijd en wachttijd tussen "cases"?

Klik hier om mij een DM te sturen • 3245 WP op ZW


  • dfijma
  • Registratie: Juni 2009
  • Laatst online: 12:47
DexterDee schreef op donderdag 19 september 2024 @ 15:48:
De code kan nog wel een stukje compacter :)
Als dit idd cf. requirements van de TS is, dan kan het NOG compacter. Hint: tijdens de tweede for-loop zet je relais uit die al uit staan :-)

  • dfijma
  • Registratie: Juni 2009
  • Laatst online: 12:47
Of, je een fase-draaiïng van 180 graden geen probleem vindt, kun je schrijven (scheelt weer een conditionele expressie):

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void setup() {
   pinMode(relais1, OUTPUT);
   pinMode(relais2, OUTPUT);
   pinMode(relais3, OUTPUT);
}

void loop() {
   // zet alle relais in een array zodat we er makkelijke doorheen kunnen lopen
   int relays[3] = {relais1, relais2, relais3};
   int activeRelay = random(3);
   
   // zet alle relays uit
   for (int i = 0; i < 3; i++) {
      digitalWrite(relays[i], LOW);
   }
   
   delay(1500);

   // zet actieve relay aan
   digitalWrite(relays[activeRelay], HIGH);
   
   delay(1500);
}

  • dummy22
  • Registratie: Oktober 2019
  • Laatst online: 01-04 13:28
Bedankt voor jullie snelle reactie.
Maar ls ik de voorgestelde sketch laat lopen krijg ik deze foutmelding.
Ik ben een beginner in arduino, dus bedankt voor jullie geduld.

C:\Users\franc\AppData\Local\Temp\.arduinoIDE-unsaved2024819-6116-18c73ka.g5t2\sketch_sep19a\sketch_sep19a.ino: In function 'void setup()':
C:\Users\franc\AppData\Local\Temp\.arduinoIDE-unsaved2024819-6116-18c73ka.g5t2\sketch_sep19a\sketch_sep19a.ino:2:12: error: 'relais1' was not declared in this scope
pinMode(relais1, OUTPUT);
^~~~~~~
C:\Users\franc\AppData\Local\Temp\.arduinoIDE-unsaved2024819-6116-18c73ka.g5t2\sketch_sep19a\sketch_sep19a.ino:3:12: error: 'relais2' was not declared in this scope
pinMode(relais2, OUTPUT);
^~~~~~~
C:\Users\franc\AppData\Local\Temp\.arduinoIDE-unsaved2024819-6116-18c73ka.g5t2\sketch_sep19a\sketch_sep19a.ino:4:12: error: 'relais3' was not declared in this scope
pinMode(relais3, OUTPUT);
^~~~~~~
C:\Users\franc\AppData\Local\Temp\.arduinoIDE-unsaved2024819-6116-18c73ka.g5t2\sketch_sep19a\sketch_sep19a.ino: In function 'void loop()':
C:\Users\franc\AppData\Local\Temp\.arduinoIDE-unsaved2024819-6116-18c73ka.g5t2\sketch_sep19a\sketch_sep19a.ino:9:21: error: 'relais1' was not declared in this scope
int relays[3] = {relais1, relais2, relais3};
^~~~~~~
C:\Users\franc\AppData\Local\Temp\.arduinoIDE-unsaved2024819-6116-18c73ka.g5t2\sketch_sep19a\sketch_sep19a.ino:9:21: note: suggested alternative: 'relays'
int relays[3] = {relais1, relais2, relais3};
^~~~~~~
relays
C:\Users\franc\AppData\Local\Temp\.arduinoIDE-unsaved2024819-6116-18c73ka.g5t2\sketch_sep19a\sketch_sep19a.ino:9:30: error: 'relais2' was not declared in this scope
int relays[3] = {relais1, relais2, relais3};
^~~~~~~
C:\Users\franc\AppData\Local\Temp\.arduinoIDE-unsaved2024819-6116-18c73ka.g5t2\sketch_sep19a\sketch_sep19a.ino:9:30: note: suggested alternative: 'relays'
int relays[3] = {relais1, relais2, relais3};
^~~~~~~
relays
C:\Users\franc\AppData\Local\Temp\.arduinoIDE-unsaved2024819-6116-18c73ka.g5t2\sketch_sep19a\sketch_sep19a.ino:9:39: error: 'relais3' was not declared in this scope
int relays[3] = {relais1, relais2, relais3};
^~~~~~~
C:\Users\franc\AppData\Local\Temp\.arduinoIDE-unsaved2024819-6116-18c73ka.g5t2\sketch_sep19a\sketch_sep19a.ino:9:39: note: suggested alternative: 'relays'
int relays[3] = {relais1, relais2, relais3};
^~~~~~~
relays

exit status 1

Compilation error: 'relais1' was not declared in this scope

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 12:53

DexterDee

I doubt, therefore I might be

Het kan altijd nog netter inderdaad. Dit is een van de meest geoptimaliseerde oplossingen:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Pin declaraties voor de relais
const int relais1 = 2;
const int relais2 = 3; 
const int relais3 = 4; 

const int relays[] = {relais1, relais2, relais3}; 
const int numRelays = sizeof(relays) / sizeof(relays[0]);

void setup() {
   pinMode(relais1, OUTPUT);
   pinMode(relais2, OUTPUT);
   pinMode(relais3, OUTPUT);
}

void loop() {
   int activeRelay = random(numRelays);

   // Zet de geselecteerde relais aan
   digitalWrite(relays[activeRelay], HIGH);

   delay(1500);

   // Zet de geselecteerde relais weer uit
   digitalWrite(relays[activeRelay], LOW);
   
   // wacht tot de volgende ronde
   delay(1500);
}

Maar dat zijn meer programmeerlessen dan het probleem van TS oplossen :*)

[ Voor 45% gewijzigd door DexterDee op 19-09-2024 16:39 ]

Klik hier om mij een DM te sturen • 3245 WP op ZW


  • DexterDee
  • Registratie: November 2004
  • Laatst online: 12:53

DexterDee

I doubt, therefore I might be

dummy22 schreef op donderdag 19 september 2024 @ 16:03:
Bedankt voor jullie snelle reactie.
Maar ls ik de voorgestelde sketch laat lopen krijg ik deze foutmelding.
Ik ben een beginner in arduino, dus bedankt voor jullie geduld.

[...]

Compilation error: 'relais1' was not declared in this scope
Je oorspronkelijke sketch zou ook niet werken als je die variabelen niet eerst declareert.

Boven je setup functie moet je dit zetten:
C++:
1
2
3
const int relais1 = 2;  // pin 2
const int relais2 = 3;  // pin 3
const int relais3 = 4;  // pin 4

Dit moet corresponderen met de pinnen waar je de relais op hebt aangesloten, dus aanpassen wanneer nodig.

Klik hier om mij een DM te sturen • 3245 WP op ZW

Pagina: 1