Aide probleme telerupteur arduino nano alimenté en 12V (batterie moto)

Bonjour à tous,

Alors voila, je me suis récemment lancé sur Arduino, j'avais déjà eu l'occasion de programmer des automates mais en langage contact ou avec des portes logiques (logigramme ? je ne suis plus certains de la manière dont on appelle ca).
Bref le projet ici est de programmer un Arduino nano pour gérer mes clignotants, mes phares et mon coupe circuit, j'alimente l'Arduino en allant chercher mes 12v après le contact à clef.
Je me sers de bouton poussoir classiques, 2 sur chaque commodo et je les ai branché directement sur 4 entrée de ma carte Arduino, l'autre fil de chaque bouton poussoir sur le grd commun avec mon alimentation. je me sers des entrée pull_up pour ne pas avoir de problèmes lorsque je n'appuye pas sur le bouton.
En suite ma carte Arduino active en direct une carte avec 4 relais (WPM400), le grd de ma carte relais est branché sur l'autre broche grd et le vcc sur le 5v de la carte Arduino , et en suite chaque IN de ma carte relais est connecté à une sortie de ma carte Arduino.
Bref j'espère que ca reste compréhensible jusque la.
Puisque je n'ai que des boutons poussoirs je dois coder un télérupteur, en l'occurrence voici ce que j'ai écris et qui semble fonctionner :

bouton6v = digitalRead(bouton6);
 

   if (bouton6v!=etat_bouton6v)
    {
       if (!bouton6v)
      {
        
        memoire_2=!memoire_2;
      } 
 
       
       memoire_2=!memoire_2;
     
    }

     
etat_bouton6v=bouton6v;
 
 if(memoire_2 == 0){
   digitalWrite(RELAIS1, HIGH);

 }
if(memoire_2 == 1){
  digitalWrite(RELAIS1, LOW);
} 

bouton6v=bouton6v+2;

toutes les variables sont ici de type int

Voila et ceci pour chaque relais, le logiciel fonctionne mais lorsque je le branche sur l'alimentation de la moto, de manière un peu aléatoire cela ne fonctionne plus comme prévus, lorsque je reset la carte cela semble fonctionner.
En fait lorsque je branche mes boutons poussoirs, ca ne fonctionne plus mais si j'essaye à l'aide d'un fil de fermer le circuit (input-grd) cela fonctionne.
J'ai entendu parler des rebonds mais avant de brancher le tout sur ma moto, les boutons semblaient fonctionner avec ce logiciel sans rebond, tout fonctionnait correctement.
Bref j'aimerai savoir de quel coté creuser, ai-je fais une erreur dans mon logiciel qui conduirait à un dysfonctionnement ou c'est plutôt au niveau de mes branchements ou des boutons poussoirs que je dois creuser.
Au multimetre les boutons poussoirs fonctionnent correctement, la continuité se fait lorsque j'appuye et seulement quand j'appuye.
Voila, je suis assez nouveau dans le domaine de l'électronique donc il est possible que je sois passé a coté de quelque chose d'important, il m'a déjà fallu pas mal de temps avant de comprendre toutes les précédentes erreurs que j'ai faite mais là je sèche et je ne sais pas ou chercher.

j'ai aussi ajouté une partie de programme pour faire clignoter directement avec le logiciel les clignotants (on/off le relais après un temps fixé a 666ms à l'aide de la fonction millis), je ne l'ai pas écris ici pour ne pas plus charger le sujet, si jamais vous pensez que le problème puisse venir de ca, je viendrai ajouter ce que j'ai pu écrire pour ca.

J'ai aussi entendu parler du danger d'alimenter en direct l'Arduino nano avec du 12v et d'alimenter d'autre composant en direct depuis la carte nano ce qui pourrait générer une puissance trop élevée a dissiper, cependant il est peu probable que j'ai plus de 2 relais qui fonctionnent en même temps, et la majorité du temps ils ne fonctionneront pas, et quand bien même je devais venir a claquer ma carte arduino nano d'ici 3 mois, je tacherai de trouver une solution en temps voulu mais la j'aimerai juste avancer sur le projet pour que cela fonctionne.

Merci d'avance d'avoir pris le temps de me lire

Je me permets de mettre tout le code tant qu'à faire, je ne savais pas qu'on pouvait l'ajouter de cette manière

 int RELAIS1 = 9;
int RELAIS2 = 10;
int RELAIS3 = 11;
int RELAIS4 = 12;
int bouton7 = 7;
int bouton8 = 8;
int bouton9 = 5;
int bouton6 = 6;
 
int bouton7v;
int bouton8v;
int bouton9v;
int bouton6v;
 

int memoire_2 = 0;
int memoire_3 = 0;
int memoire_4 = 0;
int memoire_5 = 0;

int etat_bouton6v=0;
int etat_bouton7v=0;
int etat_bouton8v=0;
int etat_bouton9v=0;
 
int ledState = HIGH;
int ledState1 = LOW;
unsigned long previousMillis = 0;  

const long interval = 666;
 

void setup() {
  Serial.begin(9600);
  pinMode(bouton6,INPUT_PULLUP);
 pinMode(bouton7,INPUT_PULLUP);
 pinMode(bouton8,INPUT_PULLUP);
 pinMode(bouton9,INPUT_PULLUP);
 pinMode(RELAIS1,OUTPUT);
 pinMode(RELAIS2,OUTPUT);
 pinMode(RELAIS3,OUTPUT);
 pinMode(RELAIS4,OUTPUT);
}
 
void loop() {
  
 
 
bouton6v = digitalRead(bouton6);
 

   if (bouton6v!=etat_bouton6v)
    {
       if (!bouton6v)
      {
        
        memoire_2=!memoire_2;
      } 
 
       
       memoire_2=!memoire_2;
     
    }

     
etat_bouton6v=bouton6v;
 
 if(memoire_2 == 0){
   digitalWrite(RELAIS1, HIGH);

 }
if(memoire_2 == 1){
  digitalWrite(RELAIS1, LOW);
} 

bouton6v=bouton6v+2;
 
//-------------------
bouton7v = digitalRead(bouton7);
 

   if (bouton7v!=etat_bouton7v)
    {
       if (!bouton7v)
      {
        
        memoire_3=!memoire_3;
      } 
 
       
       memoire_3=!memoire_3;
     
    }

     
etat_bouton7v=bouton7v;
 
 if(memoire_3 == 0){
   unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    
    previousMillis = currentMillis;

    
    if (ledState1 == LOW) {
      ledState1 = HIGH;
    } else {
      ledState1 = LOW;
    }

   
    digitalWrite(RELAIS2, ledState1);
 }
 }
if(memoire_3 == 1){
  digitalWrite(RELAIS2, LOW);
} 

bouton7v=bouton7v+2;
//---------------------
bouton8v = digitalRead(bouton8);
 

   if (bouton8v!=etat_bouton8v)
    {
       if (!bouton8v)
      {
        
        memoire_4=!memoire_4;
      } 
 
       
       memoire_4=!memoire_4;
     
    }

     
etat_bouton8v=bouton8v;
 
 if(memoire_4 == 0){
   digitalWrite(RELAIS3, HIGH);

 }
if(memoire_4 == 1){
  digitalWrite(RELAIS3, LOW);
} 

bouton8v=bouton8v+2;
//-------------------------
bouton9v = digitalRead(bouton9);
 

   if (bouton9v!=etat_bouton9v)
    {
       if (!bouton9v)
      {
        
        memoire_5=!memoire_5;
      } 
 
       
       memoire_5=!memoire_5;
     
    }

     
etat_bouton9v=bouton9v;
 
 if(memoire_5 == 0){
 
unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    
    previousMillis = currentMillis;

    
    if (ledState == HIGH) {
      ledState = LOW;
    } else {
      ledState = HIGH;
    }

   
    digitalWrite(RELAIS4, ledState);
 }
 }
if(memoire_5 == 1){
  digitalWrite(RELAIS4, LOW);
} 

bouton9v=bouton9v+2; 
Serial.println(memoire_2);
}

hello
j'ai revu ton code
j'ai réaffecté les entrées et les sorties, à toi de mettre ton câblage en accord avec le code , mais pas l'inverse. j'ai aussi passé le moniteur en 115200 bauds.
sur ma paillasse, le code est opérationnel. s'il ne l'est pas sur ta moto, il faudra voir au niveau du hard
perso, je préfère descendre le 12V en 7 volts avant d'attaquer la platine Arduino.
ceci m'évite de voir le régulateur de la platine surchauffer.
masse moto raccordée à GND platine

byte BP[5]      = {0, 2, 3, 4, 5};
byte led[5]     = {0, 6, 0, 7, 0};
byte relais[5]  = {0, 8, 9, 10, 11};
byte etat_BP[5] = {0, 0, 0, 0, 0};
byte memo_BP[5] = {0, 1, 1, 1, 1};
unsigned long currentMillis[5];
unsigned long previousMillis[5];
int ledState [5]   = {HIGH, HIGH, HIGH, HIGH, HIGH};
int ledState1[5]   = { LOW,  LOW,  LOW,  LOW,  LOW};
const long interval = 666;
void setup() {
  Serial.begin(115200);
  for (int f = 2; f <= 5; f++) {
    pinMode(f, INPUT_PULLUP);
  }
  for (int f = 6; f <= 11; f++) {
    digitalWrite(f, LOW);
    pinMode(f, OUTPUT);
  }
}
void loop() {
  for (int f = 1; f <= 4; f++)
  {
    etat_BP[f] = digitalRead(BP[f]); delay(100);
    if (etat_BP[f] != memo_BP[f])
    {
      if (!etat_BP[f])
      {
        digitalWrite(relais[f], !digitalRead(relais[f]));
        Serial.print(F("relais "));
        Serial.print(f);
        Serial.print(F(" est à "));
        Serial.println(digitalRead(relais[f]));
      }
    }
    etat_BP[f] = memo_BP[f];
    if (!digitalRead(relais[f]))
    {
      if (((BP[f] == 2) || (BP[f] == 4)))
      {
        currentMillis[f] = millis();
        digitalWrite(led[f], LOW);
      }
    }
    else
    {
      if ((currentMillis[f] - previousMillis[f] >= interval)
          && (((BP[f] == 2) || (BP[f] == 4))))
      {
        previousMillis[f] = millis();
        digitalWrite(led[f], !digitalRead(led[f]));
      }
    }
  }
}

merci de ta réponse si rapide

Alors j'ai modifié mon cablage pour l'adapter et cela fonctionne, cependant on s'est mal compris sur un certains points, ce sont bien 2 de mes relais qui doivent clignoter (ON/OFF avec intervalle de 666ms lorsque j'appuye avec toujours la fonction télérupteur) et non pas une led connectée sur 2 autres sorties
2eme problème, j'ai remarqué qu'en réalité le problème apparaissait lorsque j'alimentais ma carte Arduino sur le circuit électrique de la moto, si je branche ma carte par une alim 5V , mes boutons poussoirs fonctionnent normalement
Donc a priori j'ai du mal cabler quelque chose, ici, mes boutons poussoirs sont connecté sur une pine GRD de ma carte Arduino commune avec le GRD destiné a mon alimentation (donc sur la masse moto), et je branche mon + sur la pine VIN.

voila voila il me semblait que c'était correcte mais forcé de constater que ce n'est probablement pas le cas

le câblage que tu décris semble correct.
moteur off ? pas de parasites ?

byte BP[5]      = {0, 2, 3, 4, 5};
byte led[5]     = {0, 6, 0, 7, 0};
byte relais[5]  = {0, 8, 9, 10, 11};
byte memoire[5] = {0, 0, 0, 0, 0};
byte etat_BP[5] = {0, 0, 0, 0, 0};
byte memo_BP[5] = {0, 1, 1, 1, 1};
unsigned long currentMillis[5];
unsigned long previousMillis[5];
int ledState [5]   = {HIGH, HIGH, HIGH, HIGH, HIGH};
int ledState1[5]   = { LOW,  LOW,  LOW,  LOW,  LOW};
const long interval = 666;
void setup() {
  Serial.begin(115200);
  for (int f = 2; f <= 5; f++) {
    pinMode(f, INPUT_PULLUP);
  }
  for (int f = 6; f <= 11; f++) {
    digitalWrite(f, LOW);
    pinMode(f, OUTPUT);
  }
}
void loop() {
  for (int f = 1; f <= 4; f++)
  {
    etat_BP[f] = digitalRead(BP[f]); delay(100);
    if (etat_BP[f] != memo_BP[f])
    {
      if (!etat_BP[f])
      {
        memoire[f] = !memoire[f];
      }
    }
    memo_BP[f] = etat_BP[f];
    // ============================================= les relais fixes
    if (memoire[f] && ((BP[f] == 3) || (BP[f] == 5)))
    {
      digitalWrite(relais[f], HIGH);
      Serial.print(F("relais ")); Serial.print(f);
      Serial.print(F(" = ")); Serial.println(digitalRead(relais[f]));
    }
    else
    {
      if (!memoire[f] && ((BP[f] == 3) || (BP[f] == 5)))
      {
        digitalWrite(relais[f], LOW);
        Serial.print(F("relais ")); Serial.print(f);
        Serial.print(F(" = ")); Serial.println(digitalRead(relais[f]));
      }
    }
    // ============================================= les relais clignotants
    if (!memoire[f])
    {
      if (((BP[f] == 2) || (BP[f] == 4)))
      {
        currentMillis[f] = millis();
        digitalWrite(relais[f], LOW);
      }
    }
    else
    {
      if ((currentMillis[f] - previousMillis[f] >= interval)
          && (((BP[f] == 2) || (BP[f] == 4))))
      {
        previousMillis[f] = millis();
        digitalWrite(relais[f], !digitalRead(relais[f]));
        Serial.print(F("relais ")); Serial.print(f);
        Serial.print(F(" = ")); Serial.println(digitalRead(relais[f]));
      }
    }
  }
}

moteur OFF, oui, en fait je l'ai pas encore remonté sur la moto donc la je suis sur la batterie avec 12v entre les 2 bornes, concernant les parasites, je ne vois pas comment vérifier ca

voila, après quelques recherches il semblerait que brancher un Arduino sur une batterie moto/voiture de 12v est effectivement une mauvaise idée car cela amène pas mal de perturbations.
J'ai vu dans pas mal d'endroit qu'un step down pourrait convenir pour remédier a cela, mais j'ai quelques questions a ce sujet, si je passe par un step down pour descendre en 5v, est ce que je peux le brancher directement sur la pine 5V ? Apparemment passer par la pine 5v contourne toutes les sécurités, donc est ce qu'un step down fournit bel et bien une tension stabilisée a 5v et ne risque pas de fournir plus ou d'endommager la carte Arduino ?

Tu règles le stepdown sur 7v et tu branches sur VIN

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.