Regrouper 2 programme en un

Bonjour,

J'ai un petit souci, j'ai fais un montage avec capteur photorésistance sur un arduino qui déclenche un relais lorsque la luminosité est suffisante. ce relais déclenché alimente un autre arduino qui enchaîne son programme pour déclencher 8 relais avec délai entre chaque.
Je l'ai fais avec deux arduino car je n'ai pas réussis à le faire à la suite du déclenchement du capteur photo..
Serais t'il possible de tout regrouper ?
Je vous transmet les codes.
Merci

code photosensor:

static int relayPin = 5;

static int photoSensorPin = 0;


void setup() {
  // put your setup code here, to run once:
  pinMode(relayPin, OUTPUT);
  
  pinMode(photoSensorPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(analogRead(photoSensorPin));

  if (analogRead(photoSensorPin) < 500)


  digitalWrite(relayPin, HIGH);


  else


    digitalWrite(relayPin, LOW);

  
}

code relais :

int led =4;
int led2 =5;
int led3 =6;
int led4 =7;
int led5 =8;
int led6 =9;
int led7 =10;
int led8 =11;


void setup() {
pinMode(led , OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5 , OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);

}

void loop() {


digitalWrite(led ,HIGH);

digitalWrite(led2 ,HIGH); 

digitalWrite(led3 ,HIGH);

digitalWrite(led4 ,HIGH);

digitalWrite(led5 ,HIGH);

digitalWrite(led6 ,HIGH);

digitalWrite(led7 ,HIGH);

digitalWrite(led8 ,HIGH);

delay (2000);
digitalWrite(led ,LOW);
delay (3000);
digitalWrite(led2 ,LOW);
delay (4000);
digitalWrite(led3 ,LOW); 
delay (5000);
digitalWrite(led4 ,LOW);
delay (42000);
digitalWrite(led5 ,LOW);
delay (15000);
digitalWrite(led6 ,LOW);
delay (19000);
digitalWrite(led7 ,LOW);
delay (13000);
digitalWrite(led8 ,LOW);
delay (10000000);





delay(60000000);

}

Bonjour escaper13;

Ton projet peut très facilement être réalisé sur un seul ARDUINO.
Tu as déjà la réponse dans ton programme !!!

Tu y active déjà un relais ... cherche bien!!

Salutations.

j'ai essayé mais lorsque j'ajoute un delay après la détection du photo sensor cela ne fonctionne pas et lorsque j'ajoute les autres relais non plus.
Je vais essayer de faire le code comme je le vois et je vous le transmet pour voir les erreurs.

Bonjour escaper13

Tu fais, déjà

  digitalWrite(relayPin, HIGH);

Mettre, à la place, le séquence des 8 relais dans loop() de code relais?
Ne pas oublier tout ce qui est de l'initialisation des relais de code relais, à copier dans code photosensor.

A quoi ça sert?

Quand il y a beaucoups de ports utilisés ert qui s'initialisent la même chose, il est préférable de les mettre en tableaux, un peu d'informations, ici.

PS: Pour éviter la confusion:

static int photoSensorPin = A0;
// Est mieux que
static int photoSensorPin = 0;

Cordialement
jpbbricole

Merci je vais essayer, pour le tableau je m'y pencherais par la suite car j'ai regardé un peu et je vais me mélanger lol
Pour le delay (60000000) c'est pour qu'a la fin les relais restent allumés et que le programme ne reparte pas en boucle.

int led =4;
int led2 =5;
int led3 =6;
int led4 =7;
int led5 =8;
int led6 =9;
int led7 =10;
int led8 =11;

static int photoSensorPin = A0;


void setup() {
  // put your setup code here, to run once:
 pinMode(led , OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 pinMode(led4, OUTPUT);
 pinMode(led5, OUTPUT);
 pinMode(led6, OUTPUT);
 pinMode(led7, OUTPUT);
 pinMode(led8, OUTPUT);

  
 pinMode(photoSensorPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(analogRead(photoSensorPin));

  if (analogRead(photoSensorPin) < 500)

digitalWrite(led ,HIGH);

digitalWrite(led2 ,HIGH); 

digitalWrite(led3 ,HIGH);

digitalWrite(led4 ,HIGH);

digitalWrite(led5 ,HIGH);

digitalWrite(led6 ,HIGH);

digitalWrite(led7 ,HIGH);

digitalWrite(led8 ,HIGH);


  else


 delay (2000);
digitalWrite(led ,LOW);
delay (3000);
digitalWrite(led2 ,LOW);
delay (4000);
digitalWrite(led3 ,LOW); 
delay (5000);
digitalWrite(led4 ,LOW);
delay (42000);
digitalWrite(led5 ,LOW);
delay (15000);
digitalWrite(led6 ,LOW);
delay (19000);
digitalWrite(led7 ,LOW);
delay (13000);
digitalWrite(led8 ,LOW);
delay (10000000);





delay(60000000);
}

Cela donnerait ceci ?

Il manque les accolades autour du bloc de code dans le if et dans le else.
https://www.arduino.cc/reference/en/language/structure/control-structure/if/

Bonsoir escaper13

Tu y est presque?
En appliquant la remarque de @fdufnews ta loop() donne ceci

void loop() 
{
	// put your main code here, to run repeatedly:
	Serial.println(analogRead(photoSensorPin));

	if (analogRead(photoSensorPin) < 500)
	{
		digitalWrite(led ,HIGH);
		digitalWrite(led2 ,HIGH);
		digitalWrite(led3 ,HIGH);
		digitalWrite(led4 ,HIGH);
		digitalWrite(led5 ,HIGH);
		digitalWrite(led6 ,HIGH);
		digitalWrite(led7 ,HIGH);
		digitalWrite(led8 ,HIGH);
	}
	else
	{
		delay (2000);
		digitalWrite(led ,LOW);
		delay (3000);
		digitalWrite(led2 ,LOW);
		delay (4000);
		digitalWrite(led3 ,LOW);
		delay (5000);
		digitalWrite(led4 ,LOW);
		delay (42000);
		digitalWrite(led5 ,LOW);
		delay (15000);
		digitalWrite(led6 ,LOW);
		delay (19000);
		digitalWrite(led7 ,LOW);
		delay (13000);
		digitalWrite(led8 ,LOW);

		while(analogRead(photoSensorPin) > 500) {}
	}	
}

Pour supprimer le delay(60000000); je t'ai mis while(analogRead(photoSensorPin) > 500) {}, ce qui fait que tant que la lumière ne baisse pas on attend. Donc il faut que la lumière baisse puis remonte pour redémarrer une séquence.

Cordialement
jpbbricole

Top merci beaucoup je vais tester tout ca et je vous dirai :slight_smile:

J'ai bien avancé mais le programme ne réagis pas comme je veux.

Avec ce programme:

Si je démarre l'arduino avec le sensor dans le noir, tout les relais ce mettent en route en même temps.

Si je démarre l'arduino avec le sensor dans la lumière, les relais restent éteint et c'est lorsque je met le sensor dans le noir que le programme démarre. Le programme se déroule bien mais je voudrais que si le sensor retourne dans la lumiere que le programme ce stop et revienne a l’état initial c'est a dire les relais éteint.

Je précise que mes relais sont alimentés directement sur le transfo et que le GND des relais est relié au GND de l'arduino.

Je ne sais pas si je suis très claire :wink:

Bonsoir escaper13

Postes ton code en entier.

Cordialement
jpbbricole

Oui, mais là il va falloir modifier l'architecture de ton programme parce que les delay() que tu as semés partout dans ton code bloque la possibilité de tester le capteur de lumière.
Ce que tu sembles vouloir faire demande, à mon avis, l'utilisation d'une machine à état.

int led =4;
int led2 =5;
int led3 =6;
int led4 =7;
int led5 =8;
int led6 =9;
int led7 =10;
int led8 =11;

static int photoSensorPin = A0;


void setup() {
  // put your setup code here, to run once:
 pinMode(led , OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 pinMode(led4, OUTPUT);
 pinMode(led5, OUTPUT);
 pinMode(led6, OUTPUT);
 pinMode(led7, OUTPUT);
 pinMode(led8, OUTPUT);

  
 pinMode(photoSensorPin, INPUT);
  Serial.begin(9600);
}


 void loop() 
{
 // put your main code here, to run repeatedly:
  Serial.println(analogRead(photoSensorPin));

  if (analogRead(photoSensorPin) < 500)
  {
    digitalWrite(led ,HIGH);
    digitalWrite(led2 ,HIGH);
    digitalWrite(led3 ,HIGH);
    digitalWrite(led4 ,HIGH);
    digitalWrite(led5 ,HIGH);
    digitalWrite(led6 ,HIGH);
    digitalWrite(led7 ,HIGH);
    digitalWrite(led8 ,HIGH);
  }
  else
  {
    delay (2000);
    digitalWrite(led ,LOW);
    delay (3000);
    digitalWrite(led2 ,LOW);
    delay (4000);
    digitalWrite(led3 ,LOW);
    delay (5000);
    digitalWrite(led4 ,LOW);
    delay (42000);
    digitalWrite(led5 ,LOW);
    delay (15000);
    digitalWrite(led6 ,LOW);
    delay (19000);
    digitalWrite(led7 ,LOW);
    delay (13000);
    digitalWrite(led8 ,LOW);

  delay(60000000);
  }
  } 

j'ai enlevé le while pour voir si cela changé quelque chose mais toujours pareil, et c'est pour ca qu'a la base j'avais mis deux arduino comme ca le premier coupé et rallumé le deuxième suivant l'état du sensor.
Je pense aussi que le delay pose problème mais je n'arrive pas à comprendre une autre solution car c'est assez complexe.

Bonsoir escaper13

Peux-tu donner un lien sur tes relais?

Cordialement
jpbbricole

Bonsoir, voici le lien :

https://www.amazon.fr/Yizhet-Optocoupleur-Raspberry-Arduino-8-Canaux/dp/B07MJF9Z4K/ref=asc_df_B07MJF9Z4K?tag=bingshoppin0f-21&linkCode=df0&hvadid=80882880423371&hvnetw=o&hvqmt=e&hvbmt=be&hvdev=c&hvlocint=&hvlocphy=&hvtargid=pla-4584482457584408&psc=1

Juste pour information je vais vous préciser mon projet, j'ai une video et je voudrais que les relais s'allument à certains moments de la video.
Le seul moyen que j'ai trouvé c'est de mettre une photo résistance sur l'écran et que quand l'écran est plus lumineux mon programme arduino démarre.

Bonsoir escaper13

Bonne idée!
Si tu veux, je regarde ça demain.

Bonne nuit
jpbbricole

Cette opération inverse, il me semble que c'est dû à la façon dont vous avez connecté la photorésistance.
essayez de changer la condition IF en :

if (analogRead(photoSensorPin) > 500)

Il serait pratique que vous indiquiez le schéma de connexion de la photorésistance.
Salutations.

Bonjour escaper13

Le problème vient du fait que ce type de relais à optocoupleurs sont actifs avec un LOW,
image
ainsi, à l'initialisation de ces relais dans setup() après pinMode(led1 , OUTPUT); la ou les sorties sontà LOW, donc tout les relais tiraient d'entrée au démarrage du programme.
Comme, dans ton programme il y avait 2 endroits où mettre tout les relais à off, j'ai créé une fonction, relaisTousOff(); pour ce faire.
J'ai également regroupé l'action sur les relais afin de pouvoir surveiller l'état de la cellule afin de déterminer si le relais doit tirer ou non. Si la luminosité descend pendant la temporisation, celle-ci se termine.
Ainsi tu peux voire l'importance de créer des fonctions pour des tâches répétitives.
Il y a une nouvelle constante photoSensorSeuil, ainsi si tu veux changer le seuil, il n'y a qu'un endroit à modifier.

Sur mon test, la cellule est câblée ainsi
image
mais sur A0

PS: N'oublies pas de voire du côté des tableaux pour optimiser ton programme.

Cordialement
jpbbricole

Bonjour, je comprend ce que tu veux dire, j'ai lu les documents sur créer les fonction cela fait beaucoup de choses et je n'arrive pas à le mettre en pratique.
Je ne sais pas écrire quoi et où, par exemple tu me parle de relais tous off je vois le principe mais je ne sais pas comment le faire.