Probleme de code et question sur la tension

Bonjour a tous,
Depuis quelques jour je tente de fabriquer une lampe avec des LEDs RGB contrôlées par un arduino nano.
Mon idée est qu'a l'allumage les LEDs soient blanches, quand j'appuie sur un des boutons je passe dans une couleur prédéfinie dans le code. Pour changer de couleur je dois appuyer sur le bouton RESET qui me fais retourner au blanc (sert de MENU en quelque sorte). J'utilise aussi un potentiomètre qui devrait me servir à regler l'intensité des LEDs.
Après avoir fais tous mes branchements et les avoir vérifiés j'allume l'arduino et les LEDs sont blanches, jusque la tout vas bien. Mais aucun bouton ne répond sauf le reset qui e fais afficher du violet ( boucle du bouton 8 a voir dans le code).
EDIT : Le potentiomètre n'a aucun effet non plus.
Bref je suis un peu perdu quant à d'ou vient le problème.

Le Code :

/* Broches */
int potentio = analogRead(A0);
int valpotentio = 0;
int pinBouton1 = 11;
int pinBouton2 = 10;
int pinBouton3 = 9;
int pinBouton4 = 8;
int pinBouton5 = 7;
int pinBouton6 = 6;
int pinBouton7 = 5;
int pinBouton8 = 13;
int pinBoutonReset = 12;
const byte PIN_LED_R = 2;
const byte PIN_LED_G = 3;
const byte PIN_LED_B = 4;

/** Affiche une couleur */
void displayColor(byte r, byte g, byte b) 
{
  // Assigne l'état des broches
  // Version cathode commune
  //analogWrite(PIN_LED_R, r);
  //analogWrite(PIN_LED_G, g);
  //analogWrite(PIN_LED_B, b);
  // Version anode commune
  analogWrite(PIN_LED_R, ~r);
  analogWrite(PIN_LED_G, ~g);
  analogWrite(PIN_LED_B, ~b);
}

void setup() {

  // Initialise les broches
  pinMode(pinBouton1, INPUT_PULLUP);
  pinMode(pinBouton2, INPUT_PULLUP);
  pinMode(pinBouton3, INPUT_PULLUP);
  pinMode(pinBouton4, INPUT_PULLUP);
  pinMode(pinBouton5, INPUT_PULLUP);
  pinMode(pinBouton6, INPUT_PULLUP);
  pinMode(pinBouton7, INPUT_PULLUP);
  pinMode(pinBoutonReset, INPUT_PULLUP);
  pinMode(PIN_LED_R, OUTPUT);
  pinMode(PIN_LED_G, OUTPUT);
  pinMode(PIN_LED_B, OUTPUT);
  displayColor(0, 0, 0);
}

void loop() {

  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
  boolean etatBouton4 = digitalRead(pinBouton4);
  boolean etatBouton5 = digitalRead(pinBouton5);
  boolean etatBouton6 = digitalRead(pinBouton6);
  boolean etatBouton7 = digitalRead(pinBouton7);
  boolean etatBouton8 = digitalRead(pinBouton8);
  boolean etatBoutonReset = digitalRead(pinBoutonReset);
  
    valpotentio = map(potentio, 0, 1023, 0, 255);
    displayColor(255-valpotentio, 255-valpotentio, 255-valpotentio);
    
    if (etatBouton1==1)
    {
       while (etatBoutonReset !=1)
       {
        valpotentio = map(potentio, 0, 1023, 0, 255);
        displayColor(255-valpotentio, 0, 0);
       }
    }

    if (etatBouton2==1)
    {
       while (etatBoutonReset !=1)
       {
        valpotentio = map(potentio, 0, 1023, 0, 255);
        displayColor(0, 255-valpotentio, 0);
       }
    }

    if (etatBouton3==1)
    {
       while (etatBoutonReset !=1)
       {
        valpotentio = map(potentio, 0, 1023, 0, 255);
        displayColor(0, 0, 255-valpotentio);
       }
    }

    if (etatBouton4==1)
    {
       while (etatBoutonReset !=1)
       {
        valpotentio = map(potentio, 0, 1023, 0, 255);
        displayColor(255-valpotentio, 0, 255-valpotentio);;
       }
    }

    if (etatBouton5==1)
    {
       while (etatBoutonReset !=1)
       {
        valpotentio = map(potentio, 0, 1023, 0, 255);
        displayColor(0, 255-valpotentio, 255-valpotentio);
       }
    }

    if (etatBouton6==1)
    {
       while (etatBoutonReset !=1)
       {
        valpotentio = map(potentio, 0, 1023, 0, 255);
        displayColor(255-valpotentio, 255-valpotentio, 0);
       }
    }

    if (etatBouton7==1)
    {
       while (etatBoutonReset !=1)
       {
        valpotentio = map(potentio, 0, 1023, 0, 255);
        displayColor(0, 0, 0);
       }
    }
    if (etatBouton8==1)
    {
       while (etatBoutonReset !=1)
       {
        valpotentio = map(potentio, 0, 1023, 0, 255);
        displayColor(230-valpotentio, 66-valpotentio, 225-valpotentio);
       }
  }
  delay(200);
}

Aussi j'aimerais, au lieu d'allumer les leds RGB en blanc, allumer au démarrage un autre bandeau de LEDs (non RGB) de 12V. Je sais que les Arduino ne peuvent sortir que du 5V à un ampérage très bas...

J'aimerais donc savoir, si c'est possible, comment additionner les tensions de différents pins de l'Arduino afin d'obtenir à partir de 2 pins entre 1 et 7 V (grâce a la fonction map: un qui varie entre 1 et 2V et l'autre entre 0 et 5V) et 5V qui viendrait d'une prise USB (qui elle pourra fournir l'intensité nécessaire).

J'espère avoir été clair ( je m'enmèle souvent dans mes explications XD).
Merci de prendre le temps de me lire et de m'aider ^^

Si tu déclares tes boutons en INPUT_PULLUP, il sont à LOW (soit 0) lorsqu'ils sont appuyés. Tu les testes à 1, état dans lequel ils sont par défaut, les uns après les autres. Le while qui suit chaque test fait que rien ne change si tu n'appuies pas sur le bouton reset.

Donc seule cette instruction est prise en compte si tu n'appuies sur aucun bouton :
    displayColor(255-valpotentio, 255-valpotentio, 255-valpotentio);C'est censé faire un gris plus ou moins clair selon la valeur lue sur le potentiomètre, mais sur les LEDs ça se traduit par un violet.

Merci de ta réponse.

Je viens de modifier le code de deux manière différentes sans succès :
tous les if et while “en condition” sur 0 au lieu de 1, plus aucun bouton ne répond.
seuls les if passent sur 0, les while restent sur 1 : même problème qu’avant, seul le bouton reset repond comme à l’origine du problème.

Aussi mon potentiomètre ne semble toujours pas avoir d’effet

Je viens de réussir a faire marche le potentiomètre, cela me permet de voir dans quel état sont les LEDs à l'allumage, toutes à fonds et le potentiomètre ne semble agir que sur la LED verte.
Après avoir appuyer sur le bouton reset il semble que la LED verte soit encore la seule affectée par le potentiomètre mais que l’échelle a changée, quand je passe d'un bout a l'autre du potentiomètre, la LED verte vas baisser d'intensité, s'éteindre puis se rallumer à fond avant de rediminuer... J'ai l'impression que la valeur de la LED fait quelque chose comme ça :
120,119,118,.....,2,1,0,255,254,253... ect.

J'aimerais donc savoir, si c'est possible, comment additionner les tensions de différents pins de l'Arduino afin d'obtenir à partir de 2 pins entre 1 et 7 V

Ce n'est pas possible car les tensions des E/S sont référencée par rapport à la même référence : la masse et la capacité en courant d'une sortie du micro ne dépasse pas 20 mA et encore dans un cas idéal, tu oublie ta proposition.

Il faut voir le sujet différemment. Il te faut une alimentation 12 V indépendante pour alimenter le bandeau de Dels et relier les masses de la carte Arduino et de l'alim 12 V entre elles.
Dans le type des cartes qui nous intéresse la référence des tensions "la masse" ou le "ground (gnd)" en anglais est fixé sur le fil "moins".

Il sera alors possible d'utiliser une interface de puissance entre le bandeau et la sortie du micro.
Comme interface tu peux utiliser un relais ou bien mieux un transistor.

Si le courant est inférieur à 0,5A, A Mon Humble Avis un transistor bipolaire comme un vénérable et très classique 2N2222 fera l'affaire (Imax = 0,8A).
Au delà de 0,5A un Mosfet sera plus approprié mais il faut le prendre "Logic Level" si tu ne veux pas te prendre la tête dans les caractéristiques internes.

Si tu veux tu peux lire ce tuto sur les transistors : Le transistor bipolaire ou MosFet simplifié

Bonjour,

Tu ne lis pas la valeur du potentiomètre dans la loop.
If lat que tu mettes ton instruction "int potentio = analogRead(A0);" au début de la loop et non une seule fois au début du programme

Merci 68tjs, néanmoins je ne comprends pas vraiment comment faire pour régler mon problème, les LEDs s'allument aux alentours de 6V et sont a fond a 12V je voudrais trouver un moyen d'utiliser le potentiomètre et l'arduino afin de gérer les LEDs sur cet intervalle de tension.

kamill merci aussi, j'ai pu régler le pb du potentiomètre inactif mais il n'affecte que la LED de couleur verte et pas la rouge ni la bleue, une idée ? Je pense qu'au lieu d'écrire en paramètre "255-valpotentio" je devrai créer des variables qui contiendrai les bonnes valeurs (ce qui devrait éviter aussi le problème "d'échelle" décrit plus haut).

Pour ce que tu veux faire je te conseille la méthode des petits pas : tu fais des tests unitaire où tu ne traite qu'un seul problème à la fois.
Quand tous les tests unitaires fonctionnent tu peux commencer à les assembler un par un mais pas avant qu'ils soient fonctionnels.

Je ne sais pas si j'ai bien compris tes questions mais pour alimenter un bandeaux 12V je te propose le schéma suivant :
Schéma de principe (les valeurs des composants sont à calculer):

Tuto_2018_10_24_13_24_23.png

Comme je pense l'avoir déjà écrit si le courant dépasse 500 mA il est préférable de prendre un transistor MosFet à la place du transistor bipolaire.
Nota : ce schéma est valable quelle que soient les Dels, dans le cas d'un bandeau prévu pour fonctionner sous 12V la résistance R3 n'est pas nécessaire (son équivalent est déjà incorporée dans le bandeau).

les LEDs s'allument aux alentours de 6V et sont a fond a 12V je voudrais trouver un moyen d'utiliser le potentiomètre

Il faut utiliser une entrée analogique pour lire le potentiomètre et une sortie PWM pour faire varier l'éclairement de la Diode ElectroLuminescente ou DEL (led in angliche).
Principe logiciel

  • Si la tension lue sur le potentiomètre est égale à 0 ou est inférieure à une valeur de consigne basse les diodes sont éteintes --> la PWM est mise à 0.
  • Si la tension lue est 5V ou supérieure à une valeur de consigne haute les diodes sont allumées à fond --> la PWM est mise à 255.
  • Entre les deux l'éclairement des diodes est proportionnel à la valeur lue --> la PWM est réglée entre 0 et 255.

Je crois qu'il existe une fonction arduino qui s'appelle map(), mais à ce que j'en ai compris il s'agit d'une règle de 3...............................

Si tu as des difficultés je te conseille de t'occuper séparément du potentiomètre et des DELs.
Un petit programme indépendant pour chaque, et quand les deux petits programmes fonctionnent tu peux commencer à les assembler mais pas avant.

NB : je n'ai pas fait figurer l'alimentation de la carte arduino.

Tuto_2018_10_24_13_24_23.png

Pour suivre ta méthode des petits pas j'ai décider de m'attaquer aux boutons qui ne sembles pas marcher et au potentiomètre.
Après modification du code :

/
/* Broches */
int R = 0;
int G = 0;
int B = 0;
int potentio;
int valpotentioR = 0;
int valpotentioG = 0;
int valpotentioB = 0;
int pinBouton1 = 11;
int pinBouton2 = 10;
int pinBouton3 = 9;
int pinBouton4 = 8;
int pinBouton5 = 7;
int pinBouton6 = 6;
int pinBouton7 = 5;
int pinBouton8 = 13;
int pinBoutonReset = 12;
const byte PIN_LED_R = 2;
const byte PIN_LED_G = 3;
const byte PIN_LED_B = 4;

/** Affiche une couleur */
void displayColor(byte r, byte g, byte b) 
{
  // Assigne l'état des broches
  // Version cathode commune
  //analogWrite(PIN_LED_R, r);
  //analogWrite(PIN_LED_G, g);
  //analogWrite(PIN_LED_B, b);
  // Version anode commune
  analogWrite(PIN_LED_R, ~r);
  analogWrite(PIN_LED_G, ~g);
  analogWrite(PIN_LED_B, ~b);
}

void setup() {

  // Initialise les broches
  pinMode(pinBouton1, INPUT_PULLUP);
  pinMode(pinBouton2, INPUT_PULLUP);
  pinMode(pinBouton3, INPUT_PULLUP);
  pinMode(pinBouton4, INPUT_PULLUP);
  pinMode(pinBouton5, INPUT_PULLUP);
  pinMode(pinBouton6, INPUT_PULLUP);
  pinMode(pinBouton7, INPUT_PULLUP);
  pinMode(pinBoutonReset, INPUT_PULLUP);
  pinMode(PIN_LED_R, OUTPUT);
  pinMode(PIN_LED_G, OUTPUT);
  pinMode(PIN_LED_B, OUTPUT);
  Serial.begin(115200);
}

void loop() {

  boolean etatBouton1 = digitalRead(pinBouton1);
  boolean etatBouton2 = digitalRead(pinBouton2);
  boolean etatBouton3 = digitalRead(pinBouton3);
  boolean etatBouton4 = digitalRead(pinBouton4);
  boolean etatBouton5 = digitalRead(pinBouton5);
  boolean etatBouton6 = digitalRead(pinBouton6);
  boolean etatBouton7 = digitalRead(pinBouton7);
  boolean etatBouton8 = digitalRead(pinBouton8);
  boolean etatBoutonReset = digitalRead(pinBoutonReset);


  
    potentio = analogRead(A0);
    valpotentioR = map(potentio, 0, 1023, 0, 255);
    valpotentioG = map(potentio, 0, 1023, 0, 255);
    valpotentioB = map(potentio, 0, 1023, 0, 255);
    R = 255 - valpotentioR; 
    G = 255 - valpotentioG;
    B = 255 - valpotentioB;
    displayColor(R, G, B);
    Serial.println("blanc");
    
    if (etatBouton1==0)
    {
      Serial.println("bouton 1");
       while (etatBoutonReset !=1)
       {
        potentio = analogRead(A0);
        valpotentioR = map(potentio, 0, 1023, 0, 255);
        valpotentioG = map(potentio, 0, 1023, 0, 255);
        valpotentioB = map(potentio, 0, 1023, 0, 255);
        R = 255 - valpotentioR; 
        G = 255 - valpotentioG;
        B = 255 - valpotentioB;
        displayColor(R, G, B);
       }
    }
    else if (etatBouton2==0)
    {
      Serial.println("bouton 2");
       while (etatBoutonReset !=1)
       {
        potentio = analogRead(A0);
        valpotentioR = map(potentio, 0, 1023, 0, 255);
        valpotentioG = map(potentio, 0, 1023, 0, 255);
        valpotentioB = map(potentio, 0, 1023, 0, 255);
        R = 255 - valpotentioR; 
        G = 255 - valpotentioG;
        B = 255 - valpotentioB;
        displayColor(R, G, B);
       }
    }
    else if (etatBouton3==0)
    {
      Serial.println("bouton 3");
       while (etatBoutonReset !=1)
       {
        potentio = analogRead(A0);
        valpotentioR = map(potentio, 0, 1023, 0, 255);
        valpotentioG = map(potentio, 0, 1023, 0, 255);
        valpotentioB = map(potentio, 0, 1023, 0, 255);
        R = 255 - valpotentioR; 
        G = 255 - valpotentioG;
        B = 255 - valpotentioB;
        displayColor(R, G, B);
       }
    }
    else if (etatBouton4==0)
    {
      Serial.println("bouton 4");
       while (etatBoutonReset !=1)
       {
        potentio = analogRead(A0);
        valpotentioR = map(potentio, 0, 1023, 0, 255);
        valpotentioG = map(potentio, 0, 1023, 0, 255);
        valpotentioB = map(potentio, 0, 1023, 0, 255);
        R = 255 - valpotentioR; 
        G = 255 - valpotentioG;
        B = 255 - valpotentioB;
        displayColor(R, G, B);
       }
    }
    else if (etatBouton5==0)
    {
      Serial.println("bouton 5");
       while (etatBoutonReset !=1)
       {
        potentio = analogRead(A0);
        valpotentioR = map(potentio, 0, 1023, 0, 255);
        valpotentioG = map(potentio, 0, 1023, 0, 255);
        valpotentioB = map(potentio, 0, 1023, 0, 255);
        R = 255 - valpotentioR; 
        G = 255 - valpotentioG;
        B = 255 - valpotentioB;
        displayColor(R, G, B);
       }
    }
    else if (etatBouton6==0)
    {
      Serial.println("bouton 6");
       while (etatBoutonReset !=1)
       {
        potentio = analogRead(A0);
        valpotentioR = map(potentio, 0, 1023, 0, 255);
        valpotentioG = map(potentio, 0, 1023, 0, 255);
        valpotentioB = map(potentio, 0, 1023, 0, 255);
        R = 255 - valpotentioR; 
        G = 255 - valpotentioG;
        B = 255 - valpotentioB;
        displayColor(R, G, B);
       }
    }
    else if (etatBouton7==0)
    {
      Serial.println("bouton 7");
       while (etatBoutonReset !=1)
       {
        potentio = analogRead(A0);
        valpotentioR = map(potentio, 0, 1023, 0, 255);
        valpotentioG = map(potentio, 0, 1023, 0, 255);
        valpotentioB = map(potentio, 0, 1023, 0, 255);
        R = 255 - valpotentioR; 
        G = 255 - valpotentioG;
        B = 255 - valpotentioB;
        displayColor(R, G, B);
       }
    }
    else if (etatBouton8==0)
    {
      Serial.println("bouton 8");
       while (etatBoutonReset !=1)
       {
        potentio = analogRead(A0);
        valpotentioR = map(potentio, 0, 1023, 0, 255);
        valpotentioG = map(potentio, 0, 1023, 0, 255);
        valpotentioB = map(potentio, 0, 1023, 0, 255);
        R = 255 - valpotentioR; 
        G = 255 - valpotentioG;
        B = 255 - valpotentioB;
        displayColor(R, G, B);
       }
  }
}

Les deux problèmes semblent liés, en effet sur le moniteur série celui ci m'affiche
"blanc"
"bouton 8"
"blanc"
"bouton 8"
ect...

Mais je ne vois pas pourquoi...
Je pense que le problème du potentiomètre qui ne controle que la LED verte vient de ce premier problème...

Tu fais comme tu veux mais un programme qui fait 200 lignes et qui gère potentiomètre, boutons et les 3 couleurs n’est pas ce que j’appelle un petit programme de test.

Si j’étais à ta place je ferais :

  • un programme qui teste uniquement l’état d’un bouton
    Puis deux boutons, puis 3 boutons
  • un programme qui fait uniquement varier une couleur.
    Puis deux couleurs, puis 3 couleurs.
    Pour tester il n’est pas utile de mettre potentiomètre ou bouton, il suffit d’écrire une boucle for pour parcourir toutes les valeurs de la PWM : for (i=0 ; i<=255; i++).
    Tu peux faire des pas plus grand ou ajouter des délais pour mieux voir les changements d’éclairement, les délais sont déconseillés dans un programme définitif mais pour la mise au point on peut en user et abuser, comme du terminal série pour afficher des résultats intermédiaires.
  • un programme pour lire la tension en sortie de potentiomètre

Une fois que tout fonctionne tu associes.
C’est la méthode la plus rapide, sinon comment pourra tu savoir où est l’origine du dysfonctionnement sans faire des hypothèses qui se révèlent rarement justes. Il faut décomposer les problèmes et n’en traiter qu’un seul à la fois, là au moins on sait d’où cela vient quand cela ne marche pas.

dacc je vais tenter ca