Projet Bac STI2D

Bonjour, Je suis actuellement en terminale STI2D et je dois réaliser un programme arduino pour mon projet de bac. Dans ce programme je dois activer des leds avec un relay shield v3.0, il faut que chaque relais active une couleur de leds, relais n°1: leds blanche ; relais n°2: leds rouge ; relais n°3: leds jaune ; relais n°4: leds verte. Sachant que le relais n°1 doit être constamment activé les 3 autres doivent êtres activés à l'aide d'un potentiomètre. Et c'est donc là que je bloque je n'arrive pas à attribuer 3 valeurs différentes du potentiomètre à chaque relais pour pouvoir les activer.

J'attends vos réponses avec impatience , Merci :slight_smile:

Bonjour, Nous on attend avec impatience ;) le code que tu as déjà fait.

int relay1inShield2 = 7;    // Digital Arduino Pin 7 is used to control relay 1 in Relay Shield #2
int relay2inShield2 = 6;    // Digital Arduino Pin 6 is used to control relay 2 in Relay Shield #2
int relay3inShield2 = 5;    // Digital Arduino Pin 5 is used to control relay 3 in Relay Shield #2
int relay4inShield2 = 4;    // Digital Arduino Pin 4 is used to control relay 4 in Relay Shield #2
int pinrelay2inShield2=3;
int pinrelay3inShield2=4;
int pinrelay4inShield2=4;
int potPin = A0;   // déclare le potentiomètre sur la broche / PIN analogique A0
int ledPin = 2;  // déclare la LED, crée donc une constante appelé ledPin branchée sur la broche numérique 2
int potValue =0;    // crée une constante indiquant la valeur de base du potentiomètre, ici 0
int ledValue =0;    // crée une constante indiquant la valeur de base de la LED, ici 0 donc éteinte.
int ledPin2 = 3;
int ledValue2 =0;
int potValue2 =0;

// the setup routine runs once when you press reset:
void setup()  {
  // declare pin to be an output:
  Serial.begin(9600); //Initialisation de la communication avec la console
  pinMode(potPin,INPUT);
  pinMode(relay1inShield2,OUTPUT);
  pinMode(relay2inShield2,OUTPUT);
  pinMode(relay3inShield2,OUTPUT);
  pinMode(relay4inShield2,OUTPUT);
  pinMode(pinrelay2inShield2,OUTPUT);
  pinMode(pinrelay3inShield2,OUTPUT);
  pinMode(pinrelay4inShield2,OUTPUT); 
  pinMode (potPin, INPUT);    // on indique que le potentiomètre est une entrée
  pinMode (ledPin, OUTPUT); // on indique que la LED est une sortie
  pinMode(ledPin2, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop()  {

  digitalWrite(relay1inShield2,HIGH); // relay is energized (NO is connected to COM)
  digitalWrite(relay4inShield2,HIGH); // relay is energized (NO is connected to COM)
  digitalWrite(relay3inShield2,HIGH); // relay is energized (NO is connected to COM)
  digitalWrite(relay2inShield2,HIGH); // relay is energized (NO is connected to COM)
  potValue = analogRead (potPin); // indique que la valeur du potentiomètre (potValue) sera ce que l’arduino lira (analogRead) sur sa broche analogique potPin (A0)
  potValue2 = analogRead (potPin);
  ledValue = map (potValue, 700, 1023, 160, 255);  // permet d’étalonner une valeur de 10 bits (0-1023) pour le potentiomètre sur du 8 bits (0-255) puisque l’Arduino est en 8 bits 
  ledValue2 = map (potValue2, 0, 400, 0, 255);  // permet d’étalonner une valeur de 10 bits (0-1023) pour le potentiomètre sur du 8 bits (0-255) puisque l’Arduino est en 8 bits 
  analogWrite (ledPin, ledValue) ;  // envoie en PWM l’information de l’état (valeur) du potentiomètre 
  analogWrite (ledPin2, ledValue2) ;  // envoie en PWM l’information de l’état (valeur) du potentiomètre  
}

Tu sais un cycle horloge sur une carte arduino de base, tiens tu ne nous as dit laquelle tu utilises, Uno ou Mega dure 62,5 milliardième de seconde.

Un digitalWrite() utilise 60 cycles soit environ 4 micro seconde.

Si tu enchaînes les instructions sans mettre de temporisation cela m'étonnerais que les relais suivent ainsi que ton œil. Peut-être qu'un petit delay(xxx) à la fin la fonction loop() calmerait un peu la chose et rendrait la mise au point plus aisée. Tu peux aussi utiliser les Serial.print(" xxxx"); pour afficher l'état ou la valeur des paramètres que tu juges essentiels pour ton programme et vérifier s'ils sont conformes à ce que tu attend. Cela s'appelle du débogage. Dans la version définitive ces lignes Serial.print pourront être supprimées.

Tu verra partout Serial.begin(9600) , passe directement à 115200, nous ne somme plus au siècle dernier avec des micro très lents.

Re, Pas terrible :grin: Quelques remarques pour orienter ta mise au point. - Ta carte arduino n'est pas sourde : pas besion de lui dire 2x

pinMode(potPin,INPUT);
  • Ton pseudo cahier des charges dit allumer/éteindre des leds alors pourquoi utilises-tu le PWM?
  • Pourquoi tu n'allumes pas la led blanche dans le setup() (elle est toujours allumée)?
  • Après lecture de ton potentiomètre, il faut que tu prennes une décision en fonction de la valeur lue du genre
if(...){...

J'utilise une carte arduino Uno. J'ai pas trop compris à quoi sert le Serial.print et ou je dois le placer dans le programme. Merci de votre aide mais ducoup je ne sais pas ce qui cloche dans mon programme je ne suis pas très bon en programmation je l'avoue j'essaie de faire de mon mieux merci.

Re, Cela tombe bien, tu as tout ce qu'il faut ici : http://eskimon.fr/category/arduino

Je n'ai pas beaucoup avancé merci quand même

Re, En venant sur le forum Arduino, il ne faut pas s'attendre à voir une solution toute faite. C'est toi qui passe l'examen. Les membres du forum t'aideront si tu nous montres un minimum de travail. Avec les indices du post #4, tu aurais déjà pu allumer la led blanche. Il faut que tu te secoues la fin approche.

J'ai déjà réussi à allumer la les blanche depuis longtemps je bloque sur le potentiomètre qui permet de piloter les 3 autres relais

Bonjour,
Tu vois, tu es capable de le faire.
Pour la suite, je continue le jeu de piste.
Lorsque tu lits la valeur du potentiomètre, tu as une valeur comprise entre 0 et 1023.
Avec un autre indice du #4.
Exemple parfaitement arbitaire

Si valeurPotentiomètre comprise entre valeur 50 et 100 alors
  allume led rouge et éventuellement éteind leds.....
ou si valeurPotentiomètre comprise entre valeur 101 et 500 alors
  allume led verte et éventuellement éteind leds.....
...........
...........

voir structure if

  potValue = analogRead (potPin); // indique que la valeur du potentiomètre (potValue) sera ce que l’arduino lira (analogRead) sur sa broche analogique potPin (A0)
  potValue2 = analogRead (potPin);
  ledValue = map (potValue, 700, 1023, 160, 255);  // permet d’étalonner une valeur de 10 bits (0-1023) pour le potentiomètre sur du 8 bits (0-255) puisque l’Arduino est en 8 bits 
  ledValue2 = map (potValue2, 0, 400, 0, 255);  // permet d’étalonner une valeur de 10 bits (0-1023) pour le potentiomètre sur du 8 bits (0-255) puisque l’Arduino est en 8 bits 
  if(700< ledValue <1023)
  (relay2inShield2,HIGH);
  if(0< ledValue2 <400)
  (relay3inShield2,HIGH);
  delay(1000);
}

Bonjour

if(700< ledValue <1023)

(relay2inShield2,HIGH);

Voir structure if comme indiqué précedement par icare

al1fch:
if(700< ledValue <1023)
(relay2inShield2,HIGH);

et aussi digitalWrite, pendant que tu y es.

int relay1inShield2 = 7;    // Digital Arduino Pin 7 is used to control relay 1 in Relay Shield #2
int relay2inShield2 = 6;    // Digital Arduino Pin 6 is used to control relay 2 in Relay Shield #2
int relay3inShield2 = 5;    // Digital Arduino Pin 5 is used to control relay 3 in Relay Shield #2
int relay4inShield2 = 4;    // Digital Arduino Pin 4 is used to control relay 4 in Relay Shield #2
int potPin = A0;   // déclare le potentiomètre sur la broche / PIN analogique A0
int ledPin = 2;  // déclare la LED, crée donc une constante appelé ledPin branchée sur la broche numérique 2
int potValue =0;    // crée une constante indiquant la valeur de base du potentiomètre, ici 0
int ledValue =0;    // crée une constante indiquant la valeur de base de la LED, ici 0 donc éteinte.
int ledPin2 = 3;
int ledValue2 =0;
int potValue2 =0;
int ShieldValue = 0;

// the setup routine runs once when you press reset:
void setup()  {
  // declare pin to be an output:
  Serial.begin(115200); //Initialisation de la communication avec la console
  pinMode(relay1inShield2,OUTPUT);
  pinMode(relay2inShield2,OUTPUT);
  pinMode(relay3inShield2,OUTPUT);
  pinMode(relay4inShield2,OUTPUT);
  pinMode (potPin, INPUT);    // on indique que le potentiomètre est une entrée
  digitalWrite(relay1inShield2,HIGH); // relay is energized (NO is connected to COM)
}

// the loop routine runs over and over again forever:
void loop()  {

  
  potValue = analogRead (potPin); // indique que la valeur du potentiomètre (potValue) sera ce que l’arduino lira (analogRead) sur sa broche analogique potPin (A0)
  ShieldValue = map (potValue, 0, 1023, 100, 255);  // permet d’étalonner une valeur de 10 bits (0-1023) pour le potentiomètre sur du 8 bits (0-255) puisque l’Arduino est en 8 bits 
  analogWrite (relay4inShield2, ShieldValue) ;  // envoie en PWM l’information de l’état (valeur) du potentiomètre  

}

Enfaite j'ai réussi a trouver tout seul :smiling_imp: :wink: :kissing: 8) :art: