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 .