Bonjour
Meilleurs voeux pour 2023 a tous
Je voudrais savoir si on peut mettre deux void setup() et deux void loop() car dans mo programme j’utilise 1void setup() et 1 void loop() pour mon module 8 relais et pour le même programme j’utilise 1void setup() et 1 void loop pour mon code.
Merci de votre réponse.
Cordialement
Non une seule fonction setup() et une seule fonction loop()
Sous réserve qu’il n’y ai pas de conflit sur les entrées/sorties, il est facile de concatener le code des deux setup() pour avoir un setup() unique.
Pour le loop(), ça dépend. Il faudrait me montrer les deux codes en fait et je vous arrange ça
@+
BONJOUR
Je voudrais savoir si vous avez bien reçu le fichier.
Merci de votre réponse.
Cordialement
Bardiaux Daniel
Je n’ai rien reçu. Vous l’avez envoyé par MP ?
// J'utilise un module de 8 relais Arduino, une carte Arduino Méga 2560 et un I2C 4 fils
//8 Channel Reley Module code Guide
int Relay1=6;//Defined Pin 6 as the variable
int Relay2=7;//Defined Pin 7 as the variable
int Relay3=8;//Defined Pin 8 as the variable
int Relay4=9;//Defined Pin 9 as the variable
int Relay5=10;//Defined Pin 10 as the variable
void setup()
{
pinMode(Relay1,OUTPUT);// Set Pin6 as output
pinMode(Relay2,OUTPUT);// set Pin7 as output
pinMode(Relay3,OUTPUT);// set Pin8 as output
pinMode(Relay4,OUTPUT);// set Pin9 as output
pinMode(Relay5,OUTPUT);// set Pin10 as output
}
void loop()
{
//Channel1
digitalWrite(Relay1,HIGH);//Turn off relay
delay(1000);
digitalWrite(Relay1,LOW);//Turn on relay
delay(1000);
//Channel2
digitalWrite(Relay2,HIGH);//Turn off relay
delay(2000);
digitalWrite(Relay2,LOW);//Turn on relay
delay(2000);
//Channel3
digitalWrite(Relay3,HIGH);//Turn off relay
delay(3000);
digitalWrite(Relay3,LOW);//Turn on relay
delay(3000);
//Channel4
digitalWrite(Relay4,HIGH);//Turn off relay
delay(4000);
digitalWrite(Relay4,LOW);//Turn on relay
delay(4000);
//Channel5
digitalWrite(Relay5,HIGH);//Turn off relay
delay(5000);
digitalWrite(Relay5,LOW);//Turn on relay
delay(5000);
}
// here's the SCETCH for you again:
#include <SPI.h>
#include <LiquidCrystal_I2C.h>// Include previously added LiquidCrystal_I2C library LiquidCrystal_I2C lcd(0x3F, 20, 4);
#include <Wire.h> // Include Wire library
#include <MFRC522.h>
#include <MFRC522Extended.h>
void setup()
{
pinMode(1,OUTPUT); // high
pinMode(2,OUTPUT);//down
pinMode(3,OUTPUT); //right
pinMode(4,OUTPUT); //Left
pinMode(5,OUTPUT); // Magnet
}
void loop()
{
digitalWrite(1, HIGH); //high
digitalWrite(2, HIGH); //down
digitalWrite(3, HIGH); //right
digitalWrite(4, HIGH); //Left
digitalWrite(5,HIGH); // Magnet
lcd.init(); //In the setup the LCD is started
lcd.backlight(); //backlight
lcd.setCursor(0, 0);//The position of the first character is set here. In this case (0,0) means the first character in the first line.
lcd.print(" Maerklin 7051");
lcd.setCursor(0, 1);
lcd.print(" with ARDUINO");
delay(2000);
delay(4000);//...wait 4 seconds
digitalWrite(1, LOW); //high
delay(4000); //...and wait a second.
digitalWrite(1, HIGH);
//...................................
delay(2000);
//................................................
digitalWrite(3, LOW); //right
delay(3500);//...wait a second
digitalWrite(3, HIGH); //And turn off again
//..........................................
delay(2000);
//................................................
digitalWrite(2, LOW); //down
delay(2900); //...and wait a second.
digitalWrite(2, HIGH);
//........................................
digitalWrite(5, LOW); //Magnet //
delay(4000);//...wait a second //
digitalWrite(5, HIGH); //And turn off again
delay(2000);
//..........................................
digitalWrite(1, LOW); //high
delay(4000); //...and wait a second.
digitalWrite(1, HIGH);
//........................................
digitalWrite(4, LOW); //Left
delay(7500);//...wait a second
digitalWrite(4, HIGH); //And turn off again
//................................................
delay(2000); //..........................................
digitalWrite(2, LOW); //down
delay(2900); //...and wait a second.
digitalWrite(2, HIGH);
//..........................................
digitalWrite(5, LOW); //Magnetoff
delay(2000);//...wait a second
digitalWrite(5, HIGH); //And turn off again
//................................................
digitalWrite(1, LOW); //high
delay(4000); //...and wait a second.
digitalWrite(1, HIGH);
//................................................
digitalWrite(3, LOW); //right
delay(3500);//...wait a second
digitalWrite(3, HIGH); //And turn off again
//.................................................
digitalWrite(2, LOW); //down
delay(4200); //...and wait a second.
digitalWrite(2, HIGH);
//................................................
lcd.clear();
lcd.setCursor(1, 0);
lcd.print(" Repeat "); l
cd.setCursor(0, 1);
lcd.print(" in 15 SEC. ");
delay(15000);
}
Comme je pensais, aucun problème pour fusionner les deux init() mais cela ne va pas marcher avec les loop() car ils utilisent des Delay() qui bloquent l’exécution du loop() jusqu’à l’échéance du delay …
En fait il faut installer un mécanisme de co-routine qui va permettre de lancer l’équivalent de deux loop() indépendante, chacune se rend la main dans le cadre des Delay(). Je ne sais pas si je suis claire.
Sur Arduino, la librairie à utiliser s’appelle AceRoutine.
En gros loop() { … } va se transformer en COROUTINE_LOOP() { … } et vos delay() en COROUTINE_DELAY().
Un exemple : AceRoutine/HelloCoroutine.ino at develop · bxparks/AceRoutine · GitHub
Pour en savoir plus sur cette librairie : GitHub - bxparks/AceRoutine: A low-memory, fast-switching, cooperative multitasking library using stackless coroutines on Arduino platforms.
Votre code ressemblerait à ça - ATTENTION pas compilé pas testé, je vous laisse grenouiller un peu hein
#include <Arduino.h>
#include <AceRoutine.h>
using namespace ace_routine;
int Relay1=6;//Defined Pin 6 as the variable
int Relay2=7;//Defined Pin 7 as the variable
int Relay3=8;//Defined Pin 8 as the variable
int Relay4=9;//Defined Pin 9 as the variable
int Relay5=10;//Defined Pin 10 as the variable
#include <SPI.h>
#include <LiquidCrystal_I2C.h>// Include previously added LiquidCrystal_I2C library LiquidCrystal_I2C lcd(0x3F, 20, 4);
#include <Wire.h> // Include Wire library
#include <MFRC522.h>
#include <MFRC522Extended.h>
COROUTINE(myRelay) {
COROUTINE_LOOP() {
//Channel1
digitalWrite(Relay1,HIGH);//Turn off relay
COROUTINE_DELAY(1000);
digitalWrite(Relay1,LOW);//Turn on relay
COROUTINE_DELAY(1000);
//Channel2
digitalWrite(Relay2,HIGH);//Turn off relay
COROUTINE_DELAY(2000);
digitalWrite(Relay2,LOW);//Turn on relay
COROUTINE_DELAY(2000);
//Channel3
digitalWrite(Relay3,HIGH);//Turn off relay
COROUTINE_DELAY(3000);
digitalWrite(Relay3,LOW);//Turn on relay
COROUTINE_DELAY(3000);
//Channel4
digitalWrite(Relay4,HIGH);//Turn off relay
COROUTINE_DELAY(4000);
digitalWrite(Relay4,LOW);//Turn on relay
COROUTINE_DELAY(4000);
//Channel5
digitalWrite(Relay5,HIGH);//Turn off relay
COROUTINE_DELAY(5000);
digitalWrite(Relay5,LOW);//Turn on relay
COROUTINE_DELAY(5000);
}
}
COROUTINE(myLcd) {
COROUTINE_LOOP() {
digitalWrite(1, HIGH); //high
digitalWrite(2, HIGH); //down
digitalWrite(3, HIGH); //right
digitalWrite(4, HIGH); //Left
digitalWrite(5,HIGH); // Magnet
lcd.init(); //In the setup the LCD is started
lcd.backlight(); //backlight
lcd.setCursor(0, 0);//The position of the first character is set here. In this case (0,0) means the first character in the first line.
lcd.print(" Maerklin 7051");
lcd.setCursor(0, 1);
lcd.print(" with ARDUINO");
COROUTINE_DELAY(2000);
COROUTINE_DELAY(4000);//…wait 4 seconds
digitalWrite(1, LOW); //high
COROUTINE_DELAY(4000); //…and wait a second.
digitalWrite(1, HIGH);
//…
COROUTINE_DELAY(2000);
//…
digitalWrite(3, LOW); //right
COROUTINE_DELAY(3500);//…wait a second
digitalWrite(3, HIGH); //And turn off again
//…
COROUTINE_DELAY(2000);
//…
digitalWrite(2, LOW); //down
COROUTINE_DELAY(2900); //…and wait a second.
digitalWrite(2, HIGH);
//…
digitalWrite(5, LOW); //Magnet //
COROUTINE_DELAY(4000);//…wait a second //
digitalWrite(5, HIGH); //And turn off again
COROUTINE_DELAY(2000);
//…
digitalWrite(1, LOW); //high
COROUTINE_DELAY(4000); //…and wait a second.
digitalWrite(1, HIGH);
//…
digitalWrite(4, LOW); //Left
COROUTINE_DELAY(7500);//…wait a second
digitalWrite(4, HIGH); //And turn off again
//…
COROUTINE_DELAY(2000); //…
digitalWrite(2, LOW); //down
COROUTINE_DELAY(2900); //…and wait a second.
digitalWrite(2, HIGH);
//…
digitalWrite(5, LOW); //Magnetoff
COROUTINE_DELAY(2000);//…wait a second
digitalWrite(5, HIGH); //And turn off again
//…
digitalWrite(1, LOW); //high
COROUTINE_DELAY(4000); //…and wait a second.
digitalWrite(1, HIGH);
//…
digitalWrite(3, LOW); //right
COROUTINE_DELAY(3500);//…wait a second
digitalWrite(3, HIGH); //And turn off again
//…
digitalWrite(2, LOW); //down
COROUTINE_DELAY(4200); //…and wait a second.
digitalWrite(2, HIGH);
//…
lcd.clear();
lcd.setCursor(1, 0);
lcd.print(" Repeat “);
lcd.setCursor(0, 1);
lcd.print(” in 15 SEC. ");
COROUTINE_DELAY(15000);
}
}
void setup() {
// setup relay
pinMode(Relay1,OUTPUT);// Set Pin6 as output
pinMode(Relay2,OUTPUT);// set Pin7 as output
pinMode(Relay3,OUTPUT);// set Pin8 as output
pinMode(Relay4,OUTPUT);// set Pin9 as output
pinMode(Relay5,OUTPUT);// set Pin10 as output
// setup lcd
pinMode(1,OUTPUT); // high
pinMode(2,OUTPUT);//down
pinMode(3,OUTPUT); //right
pinMode(4,OUTPUT); //Left
pinMode(5,OUTPUT); // Magnet
}
// Manually execute the coroutines.
void loop() {
myRelay.runCoroutine();
myLcd.runCoroutine();
}
Bonjour Julaye
Dans le code que vous m’avez envoyé, il y a une ligne qui ne marche pas:
c’est lcd.init();//In the setup the LCD is started .
Pourriez vous m’éclairer sur ce sujet.
Merci.
Bard
C’est quoi le code / message d’erreur renvoyé par l’éditeur quand vous lancez la compilation ?
Bonjour Julaye,
Ce principe du Aceroutine permettrait-il de suivre une horloge ( clock plus affichage digital) toutes les minutes, et en même temps avoir des actions simultanée via des loops sur des leds, des relais, …
peut-on par exemple
-afficher le temps, toutes les minutes,
-vérifier un niveau d’eau toutes les heures,
-faire tourner des leds et des relais sur d’autres fréquences
merci pour vos conseils
Pierre