changer deux programes different à l'aide d'un interupteur

Bonjour, je suis débutant sur arduino et je me suis lancé dans un projet un peu fou (enfin j'espère m'en sortir quand même)

La base du projet c'est de faire un dé électronique qui se déclenche à l'aide d'une photo-résistance photosensible.

Ce que j'ai réussi à faire sans trop de problèmes (vive google)

Après, je me suis dit que comme je voulais en faire un projet en vrai (les dé c'est bien pratique pour savoir qui commence dans les jeux de sociétés et c'est toujours plus classe si c'est toi qui l'a fait)

J'ai pensé que mon montage (6 LED avec une photo-résistance le tout alimenté avec une pile 9V sur laquelle j'ai mis un interrupteur) pouvait surement servir à plein d'autre chose et j'ai trouvé que je pouvais en faire un mini feu de camp en positionnant les LED sur les pins PWM.

Jusque là tout va bien j'ai réussi à faire les deux programmes qui marchent si je les implante chacun séparément sur mon arduino nano.

Mais c'est là que les problèmes commencent, j'aimerais mettre les deux programmes sur la carte et les "switch" avec un interrupteur, j'ai tenté de mettre un interrupteur sur l'analog 2, mais je n'arrive pas à combiner les deux programmes, j'ai toujours pleins d'erreurs, si vous pouviez vous pencher sur mon dernier programme histoire de voir qu'elle est le problème ça serait TOP !!! ça me permettrait d'apprendre de nouvelles choses ^^ et de faire marcher le tout.

J'ai placé les différents codes en pièce jointe, mais je peux aussi les mettre dans le post sur demande, c'est juste que ça paraissait un peu long.

Merci d'avance pour votre aide !!!!!

Et si vous avez d'autres idées de projets avec le même montage, je suis preneur!

Combi_feu_et_de.ino (2.67 KB)

De-arduino.ino (1.11 KB)

Feu_de_camp.ino (1.46 KB)

Bonsoir,

j'ai pas lu tes codes, mais plusieurs options s'offrent à toi:

Faire 2 boucles while() dans la fonction loop()

-while(digitalRead(pin))
{code 1}

-while(!digitalRead(pin))
{code 2}

ou encore utiliser la fonction if() avec "else":

if(digitalRead(pin))
{code 1}
else
{code 2}

Par contre, il faut choisir judicieusement ses nom de variables, définitions de pins etc...

dirzi:
j'ai tenté de mettre un interrupteur sur l'analog 2,

Il n'est pas nécessaire dans ce cas de figure, si tu as un seul bouton, de faire une lecture analogique. Une lecture "tout ou rien" digitale suffit.

La première option me semble la plus facile car j'ai déjà des if et else dans les programmes et j'ai peur que ca soit ça qui fasse bugé le tout

par contre j'ai pas bien compris comment la mettre en pratique , faut que j'installe un bouton poussoir sur un pin digital ?

tu peux utiliser les interruptions genre attachinterrupt()

ton code tourne normalement mais si il y a un changement d etat sur la pin 2 c est détecté et l interruption lance une fonction separement sans toucher ton code et ressort quand elle a fini.

le principe standard des interruptions sur microprocesseur.

la solution d'un inter sur une entrée digitale libre est simple a mettre en oeuvre il faut juste savoir si tu veux faire ce changement :

  • a chaud dans ce cas le setup devra prendre en compte les 2 config
  • a froid dans ce cas il faut en debut de setup lire l'état de l'inter et switcher entre les deux config

J'ai tenté comme avec while

const int ECART=50;
const int TEMPO=2000;
const byte pinDEL3 = 3;
const byte pinDEL5 = 5;
const byte pinDEL6 = 6;
const byte pinDEL9 = 9;
const byte pinDEL10 = 10;
const byte pinDEL11 = 11;
int Interup = A2;

void setup(){
randomSeed(analogRead(1));
for(int i=3;i<=11;i++){
pinMode(i,OUTPUT);

byte intensiteDepart = 100;
byte intensiteArrivee;
float variationIntensite;
unsigned int dureeChangement;
unsigned long dateDebutChangement;
bool changementTermine = true;

}
}

void loop() {

while(analogRead(Interup))

int luminosite1=analogRead(0);
delay(100);
int luminosite2=analogRead(0);
if(luminosite2-luminosite1>ECART){

afficheDe(random(2,7));
delay(TEMPO);
eteintDe();
}
}
void afficheDe(int nombre){

if(nombre==1){
digitalWrite(3,HIGH);
}

if(nombre==2){
digitalWrite(3,HIGH);
digitalWrite(5,HIGH);
}

if(nombre==3){
digitalWrite(3,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
}

if(nombre==4){
digitalWrite(3,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(9,HIGH);
}
if(nombre==5){
digitalWrite(3,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
}

if(nombre==6){
digitalWrite(3,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
}
}
void eteintDe(){
for(int i=3;i<=11;i++){
digitalWrite(i,LOW);

while(!analogRead(Interup))

if (changementTermine) {
// Calcule une nouvelle variation d'intensité lumineuse
// tire aléatoirement une duree de changement en ms
dureeChangement = random(20, 250);
dateDebutChangement = millis();
// tire aléatoirement une intensité cible
intensiteArrivee = random(5, 200);
// calcule la variation de l'intensité par unité de temps
variationIntensite = (float)(intensiteArrivee - intensiteDepart) /
(float)dureeChangement;
// lance la variation d'intensite
changementTermine = false;
}
else {
byte tempsEcoule = millis() - dateDebutChangement;
if (tempsEcoule < dureeChangement) {
// en cours de variation d'intensité
byte intensite = variationIntensite * tempsEcoule + intensiteDepart;
analogWrite(pinDEL3, intensite);
analogWrite(pinDEL5, intensite);
analogWrite(pinDEL6, intensite);
analogWrite(pinDEL9, intensite);
analogWrite(pinDEL10, intensite);
analogWrite(pinDEL11, intensite);
}
else {
changementTermine = true;
intensiteDepart = intensiteArrivee;
}
}
}
}

il me donne encore des erreur dans mon code et je comprend pas bien pourquoi, si vous avez des idées ?

merci d'avance

la solution d'un inter sur une entrée digitale libre est simple a mettre en oeuvre il faut juste savoir si tu veux faire ce changement :

  • a chaud dans ce cas le setup devra prendre en compte les 2 config
  • a froid dans ce cas il faut en debut de setup lire l'état de l'inter et switcher entre les deux config

j'ai un peu de mal à comprendre, mais en gros soit je change mon interrupteur avant d'allumer mon programme (a froid ), soit je le fait pendant que le programme est lancé (a chaud )?

les deux me vont le plus simple m'ira encore mieux ^^

Utilise digitalRead au lieu d'analogRead.

DigitalRead renvoie soit True soit False, et c'est que qui est testé avec while().

AnalogRead renvoie une valeur entre 0 et 1023

dirzi:
les deux me vont le plus simple m'ira encore mieux ^^

le plus simple est donc a froid
mais avant cela il faut que tu lise les messages de bienvenue tu y trouveras :

  • un lien vers un tuto (Eskimon) pour comprendre la programmation arduino
  • les règles pour bien poster sur ce forum

Précision de vocabulaire :
Un bouton poussoir ne peut faire qu'un contact temporaire : le temps ou le bouton est appuyé.
Un interrupteur simple possède deux positions fixes : ouvert ou fermé.
Un interrupteur inverseur est un interrupteur à 3 sorties : un commun et deux sorties. Le commun est alternativement connecté à chacune des sorties.

Je vois bien un interrupteur connecté entre la masse et une entrée avec une résistance de rappel au Vcc (qui peut être la résistance interne du micro --> pull-up.

Il n'y a aucune contre indication a utiliser un if.
Si tu utilise l'indentation tu aura une bonne aide visuelle.

Tu n'es pas non plus obliger d'utiliser l'éditeur (assez nul) de l'IDE. Dans les "preferences" tu peux choisir d'utiliser un éditeur externe.
Sous windows tu peux utiliser notepad**++**, sous linux tous les éditeurs sont à la hauteur.

PS : suite a un message précédent j'ajoute qu'Arduino fait une conner*e en appelant les entrées A0à A5 entrées analogiques : CE SONT DES ENTRÉES/SORTIES DIGITALES qui peuvent avoir comme fonction secondaire de faire des mesures analogiques.
L'IDE te permet de les appeler 14 à 19 c'est bien la preuve que ce sont D'ABORD des E/S numériques.

Comme dit plus haut, je ferais pour ma part une initialisation commune aux deux modes de fonctionnement, ce qui ne doit poser trop de problème puisque le câblage étant le même dans les deux cas, ben... C'est le même dans les deux cas.

Puis je sortirais le code des loop des deux programmes, mettrais l'un dans une fonction loop_de() pour le dé, et loop_feu() pour le feu de camp par exemple, et renverrai vers l'une ou l'autre des deux fonctions en testant l'état de l'interrupteur à chaque loop().
S'il vaut 0 on lance le dé, s'il vaut 1 on lance le feu de camp.
Comme cela a été dit, on peut tester cette condition avec un if/else, ou aussi avec un switch/case. :wink: