Arduino 2 pins analogues problemes

Bonjour , dans la cadre d'un projet lampe torche , je dois allumer une lampe led et utiliser un joystick 5 channel navigation ( en gros, qui reunit 5 bouton poussoir en 1 ) avec un arduino nano , le tout qui affiche le niveau de batterie rechargeable.

Concernant des codes, independament ils fonctionnent parfaitement . Le 1er allume la led et affiche le niveau de batterie via le pin A0 et diviseur de tension ( batterie 12V ) . le 2e permet d utiliser le joyestik mais au lieu de relier les 5 Digital , je l'ai mis sur A2 et donc il y a de nouveau un pont de diviseur de tension pour lire chacun des mouvement du joystick.

Le probleme , je pense , c'est quand je reuni les 2 code , les 2 analogue entre en conflit. Le A0 affiche le niveau de batterie en continue ( donc 12V correspond autour de 1023 et quand batterie a moins de V , le pin A0 a une valeur plus faible ) . Le A2 lui ne detecte une valeur que si on appuie l un des 5 mouvement du joystick . Par exemple si joyestick vers le Haut et que sur arduin si il lit cette valeur comprise entre 2 autre ( exemple : 1023 et 900 ) , il actionnera l'action demander.

Mon code est tres long et vous n'aurez pas necessairement envie de le lire ( ni meme comprendre les 3 bibliotheque utiliser ) . Mais je vous demande quand meme si le fait que les 2 analogue peuvent poser probleme pour arduino et comment remedier ?

je vous passe quand meme le code pour les courageux .

//GILZEEBROEK
#include "TM1651.h"
#define CLK 5//pins definitions for TM1651 and can be changed to other ports
#define DIO 4
TM1651 batteryDisplay(CLK,DIO);

const int analogInput = A0;

/*const float TMaxA0 = 5.0;
float R1 = 20000.0;
float R2 = 13000.0;*/

#include <avr/sleep.h>//this AVR library contains the methods that controls the sleep modes
#define inter  3 //A5-6
const int led = 7;
byte etat; //1 ou 0
boolean boutonRelache; //Vrai ou faux (true/false)
//------------------

int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 5000;
//____________________

const int nEchantillons = 400; // correspond au nbr indice total et mets 23 sec approxi pour faire 1 cycle
int echantillon[nEchantillons]; 
int i = 0; 
int minVal ;

//----------------------
#include <VirtualWire.h>  
#define Joystick1 A2
const char* CMD_BUTTON_A = "Av1-PONTX" ;
const char* CMD_BUTTON_B = "Av2-PONTX" ;
const char* CMD_BUTTON_C = "Av3-PONTX" ;
const char* CMD_BUTTON_D = "Av4-PONTX" ;
const char* CMD_BUTTON_E = "Arr1-PONTX" ;
const char* CMD_BUTTON_F = "Arr3-PONTX" ;
const char* CMD_BUTTON_G = "FreinPONTX" ;
const char* CMD_BUTTON_NUL = "NUL" ;
const int Frein = 9;
const int Arr3 = 8;
const int Arr1 = 11;
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0; 

#define U1max 1024
#define U1min 900

#define D3max 600
#define D3min 450

#define L4max 380
#define L4min 300

#define R2max 290
#define R2min 200

void setup()
{
  Serial.begin(9600);//Start Serial Comunication
  pinMode(LED_BUILTIN,OUTPUT);//We use the led on pin 13 to indecate when Arduino is A sleep
  pinMode(inter, INPUT_PULLUP); //entree interrupteur, en Pull up afin d'avoir un signale claire (et car il est integre a l'arduino contrairement au pull down <-- necessite un circuit en plus)
  digitalWrite(LED_BUILTIN,HIGH);//turning LED on
  pinMode(led, OUTPUT);
  // on verifie l'etat du bouton au cas ou il est deja enfonce quand on commence
  boutonRelache = (digitalRead(inter) == HIGH); //Initialisation de la variable "boutonRelache", on teste la variable inter pour savoir si elle = HIGH, si oui boutonRelache = 0, si non boutonRelache = 1
  etat = boutonRelache ? LOW : HIGH; //if(), si boutonRelache = true (valeur boolean), etat = LOW, sinon etat = HIGH
   // on allume la LED en fonction de l'etat (etat = LOW ou a HIGH, a 1 ou a 0)
  
  //-----------------------
  pinMode(analogInput, INPUT);
  batteryDisplay.init();
  batteryDisplay.set(BRIGHTEST);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
  batteryDisplay.frame(FRAME_ON);//light the frame of the battery display
  /*for(uint8_t level = 0; level < 6; level ++)
  {
    batteryDisplay.displayLevel(level);
  //delay(500);
  }*/
  //----------------
  for (int i = 0; i < nEchantillons; i++) {
  echantillon[i] = 0;
  }
  minVal = 1023; // ou mettre 1023
  
  //--------------------------
  pinMode(Joystick1, INPUT);
  pinMode(Frein, INPUT);
  pinMode(Arr3, INPUT);
  pinMode(Arr1, INPUT); 
  pinMode(13,OUTPUT);  
  vw_set_ptt_inverted(true); //  
  vw_set_tx_pin(12);  
  vw_setup(4500);
  
   
}
void loop()
{
  
  //----------------------------------------------------------------------
  
  /*Serial.print("indice :");  
  Serial.print(i);

  Serial.print(", ");*/ 
  
  echantillon[i] = analogRead(analogInput);
  /*Serial.print("A0 :");
  Serial.print(echantillon[i]);*/

   if(minVal > echantillon[i]){
     minVal = echantillon[i];
  }
  /*Serial.print(", ");
  Serial.print("le min :");
  Serial.print(minVal);*/
  
  //float Vout = ((minVal * (TMaxA0 / 1024))/(R2/(R1+R2)));
  float Vout = ((minVal * (5.0 / 1024))/(13000.0/(20000.0+13000.0)));
  
  /*   Serial.print(", ");
  Serial.print("le min volt :");
  Serial.println(Vout);*/
  
   i++;

  if (Vout > 12.6) // max est 100%
  {
    Vout = 12.6;
  }
  else if (Vout < 9.0) //min est 0%
  {
    Vout = 9.0;
  }
  
  if(Vout<=12.6 && Vout>12.04) 
  {
    batteryDisplay.displayLevel(5);
    batteryDisplay.frame(FRAME_ON);
  }
  else{
    if(Vout<=12.04 && Vout>11.71) 
    {
      batteryDisplay.displayLevel(4);
      batteryDisplay.frame(FRAME_ON);
    }
    else{
      if(Vout<=11.71 && Vout>11.49){
         batteryDisplay.displayLevel(3);
         batteryDisplay.frame(FRAME_ON);
      }
      else{
        if(Vout<=11.49 && Vout>11.29){
          batteryDisplay.displayLevel(2);
          batteryDisplay.frame(FRAME_ON);
        }
        else{
          if(Vout<=11.29 && Vout>11){
            //blinkfaible();
            batteryDisplay.displayLevel(1);
            batteryDisplay.frame(FRAME_ON);
          }
          else{
            if(Vout<=11 && Vout>9){
              //blinkTresfaible();
              batteryDisplay.displayLevel(0);
              batteryDisplay.frame(FRAME_ON);
            }
          }
        }
      }
    }
  }
  
  
  if (i >= nEchantillons) {
  i = 0;
  minVal = echantillon[nEchantillons-1];
  }
  
  //----------------------------------------------------------------------
  
  int reading = digitalRead(inter);
  if (reading != lastButtonState){
    lastDebounceTime = millis();
  }
  if (digitalRead(inter) == HIGH) { // PULLUP = logique inversee, le bouton est relache en HIGH
    if (!boutonRelache) { // on vient de relacher, on debounce et memorise
      //delay(20); // debounce
      boutonRelache = true;
    }
  } 
  else {
    // le bouton est appuye. est-ce un nouvel appui?
    if (boutonRelache) {
      // le bouton n'etait pas appuye avant donc c'est un nouvel appui, on inverse l'etat de la lampe
      boutonRelache = false;
      etat = (etat == HIGH) ? LOW : HIGH; // ou de facon pas tres propre etat = 1 - etat <-- Inverser l'etat (qui vaut 0 ou 1);
      //delay(20); // debounce
    }
  }
  //--------------------------------------------------
  



  //------------------------------------------
  digitalWrite(led, etat); // allume led
  lastButtonState = reading;
  unsigned long diff = millis() - lastDebounceTime;
  if(abs(diff) > debounceDelay){
    Going_To_Sleep();
    } 

  //--------------------------------------------------------------------------------

  int value = analogRead(Joystick1);
  buttonState1 = digitalRead(Arr1);
  buttonState2 = digitalRead(Arr3);
  buttonState3 = digitalRead(Frein); 
  //Serial.println(value); 
 if (value < U1max && value > U1min)  
 {     
 vw_send((byte*) CMD_BUTTON_A, strlen(CMD_BUTTON_A) + 1);  
 vw_wait_tx(); // Wait until the whole message is gone  
 digitalWrite(13,LOW);  
 }
 else if (value < R2max && value > R2min)  
 {     
 vw_send((byte*) CMD_BUTTON_B, strlen(CMD_BUTTON_B) + 1);  
 vw_wait_tx(); // Wait until the whole message is gone  
 digitalWrite(13,LOW);  
 }  
 else if (value < D3max && value > D3min)  
 {     
 vw_send((byte*) CMD_BUTTON_C, strlen(CMD_BUTTON_C) + 1);  
 vw_wait_tx(); // Wait until the whole message is gone  
 digitalWrite(13,LOW);  
 }
  else if (value < L4max && value > L4min)  
 {     
 vw_send((byte*) CMD_BUTTON_D, strlen(CMD_BUTTON_D) + 1);  
 vw_wait_tx(); // Wait until the whole message is gone  
 digitalWrite(13,LOW);  
 }
  else if (buttonState1 == HIGH)  
 {     
 vw_send((byte*) CMD_BUTTON_E, strlen(CMD_BUTTON_E) + 1);  
 vw_wait_tx(); // Wait until the whole message is gone  
 digitalWrite(13,LOW);  
 }
 else if (buttonState2 == HIGH)  
 {     
 vw_send((byte*) CMD_BUTTON_F, strlen(CMD_BUTTON_F) + 1);  
 vw_wait_tx(); // Wait until the whole message is gone  
 digitalWrite(13,LOW);  
 }
 else if (buttonState3 == HIGH)  
 {     
 vw_send((byte*) CMD_BUTTON_G, strlen(CMD_BUTTON_G) + 1);  
 vw_wait_tx(); // Wait until the whole message is gone  
 digitalWrite(13,LOW);  
 }   
  else  
  {   
 vw_send((byte*) CMD_BUTTON_NUL, strlen(CMD_BUTTON_NUL) + 1);  
 vw_wait_tx(); // Wait until the whole message is gone  
 digitalWrite(13, HIGH);  
  }  
  
  
}

void Going_To_Sleep(){
    sleep_enable();//Enabling sleep mode
    attachInterrupt(0, wakeUp, LOW);//attaching a interrupt to pin d3
    set_sleep_mode(SLEEP_MODE_IDLE);//Setting the sleep mode, in our case full sleep
    digitalWrite(LED_BUILTIN,LOW);//turning LED off
    //delay(50); //wait a 0.05 second to allow the led to be turned off before going to sleep
    sleep_cpu();//activating sleep mode
    digitalWrite(LED_BUILTIN,HIGH);//turning LED on
  }

void wakeUp(){
  sleep_disable();//Disable sleep mode
  detachInterrupt(0); //Removes the interrupt from pin 3;
}

Pour préciser certain points , c est le code de l'emeteur qui envoie un message au recepteur . 4 message sont relier au joyestick . Certain digital sont utilisé en poussoir ou DATA ou CLK. Il n'y a pas de delai car c est une fonction blocante, alors c est l'utilisation de millis() pour le timer du mode veille .

Bonjour
Je vais commencer par une remarque : le tableau echantillons n'a pas l'air d'être très utile, étant donné que seul l'échantillon courant est traité.

Probablement pas, mais les impédances des ponts diviseurs peuvent avoir une influence. Quelles sont les valeurs des résistances ?

le tableau echantilon sert à ce que l'arduino puisse se souvenir de la valeur minimun en tension de la batterie et rafraichi sa memoire tout les 25 sec approximativement, le "for" ne marche pas car elle bloque alors la fonction allumer la led. Corcernant les impendance, cote battere R1 = 20k et R2 = 10k . Cotee joyestick, c est que du 10k.

Non, la valeur minimale est déterminée par rapport à l'échantillon courant :

Le tableau n'est jamais parcouru, donc il ne sert à rien.

Des valeurs de 10K et 20K ne devraient pas poser de problème, comme dit dans cet article :

La description du problème est très peu claire.

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