Controlleur de batterie lipo 3.7v avec Attiny85

Bonjour à tous,
Je suis tous nouveau dans le monde de l'arduino et je m'amuse avec cette drôle de bête depuis seulement 3jours et c'est trop cool !

J'ai pour but de me faire une console portable avec un pi-zero et je souhaite avoir un témoins lumineux pour l'état de charge de ma batterie.
J'ai donc acheté un Attiny85 pour le coder. Avant de le connecté et d'envoyer mon code, j'ai fait des plans sur Tinkercad. Et bien heureusement car rien ne marche comme je le souhaite.

Mon attiny reçoit 2 informations en analogread. 1 pour la tension de la batterie pin4 et 1autre pour la tension de charge en pin3. Les autre pin 0 1 2 servent pour la led RGB.

Le probleme est simple analogread ne fonction que sur le pin3. est-ce normal ? on ne peut pas lire plusieurs signal analogique en même temps?

Le lien tinkercad si vous souhaitez voir ça Login | Tinkercad
Voici mon code :

void setup()
{
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);   
  pinMode(3, INPUT);
  pinMode(4, INPUT);
}

void loop()
{ 
int VBat = analogRead(4);
int Cbat = analogRead(3);
  
if (Cbat > 100 ){
  analogWrite(0, 183);
  analogWrite(1, 107); 
  analogWrite(2, 255);
  
  }else{
	
    //couluer Bleu = de à 3.9v à 4.2v (de 70% à 100% de capacité)
    if ((VBat >= 800)&& (VBat <  1023)) {
        analogWrite(0, 47);
        analogWrite(1, 206);
        analogWrite(2, 187);
     }   
     //couleur orange > 3.7 < 3.9v (de 20% à 69% de capacité)
     if ((VBat >= 757)&& (VBat <  800)) {
        digitalWrite(0, 255);
     }  
     //couleur rouge de 3.6v et < 3.7 (de 10% à 20% de capacité)
     if ((VBat >= 739)&& (VBat <  757)) {
        digitalWrite(1, LOW);
        digitalWrite(2, LOW);
        digitalWrite(0, HIGH);   
     }
     //couleur rouge clignotante < 3.6v (  moins de 5% + shutdown pi zero) 
     if ((VBat >= 600)&& (VBat <  739)) { 
      // shutdown pi zero
       digitalWrite(1, LOW);
       digitalWrite(2, LOW); 
       digitalWrite(0, HIGH);
       delay(300);
       digitalWrite(0, LOW);
       delay(300);      
     } 
  }
  //delay(10); // Delais de la boucle en milisecondes
}

Merci

Bonjour,

       analogWrite(2, 187);

La pin 2 n'est pas une pin pwm
Pas de problème pour lire deux entrées analogiques. Comment est ce que vois que la lecture analogique de la pin 4 ne fonctionne pas?

Salut et merci de ta réponse.
Je viens de mettre à jour le code en supprimant les analogWrite au cas ou .
Je le debug en route sur tinkerCad et en passant la souris on voit la valeur. Mais je pense qu'elles sont fausse car je mets un arduino les valeurs sont correct. Avez-vous accé au lien tinkercad pour voir le test?
Le plus étrange est quand je supprime le code Cbat tous fonctionne normalement.

Avec ce code là tous fonctionne. J'ai juste basculé le pin de la batterie sur le pin 3

void setup()
{
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);   
  pinMode(3, INPUT);
  pinMode(4, INPUT);
}

void loop()
{
int VBat = analogRead(3);

    //couluer Bleu = de à 3.9v à 4.2v (de 70% à 100% de capacité)
    if ((VBat >= 800)&& (VBat <  1023)) {
       digitalWrite(1, HIGH);
       digitalWrite(2, LOW);
       digitalWrite(0, LOW);
     }   
     //couleur orange > 3.7 < 3.9v (de 20% à 69% de capacité)
     if ((VBat >= 757)&& (VBat <  800)) {
        digitalWrite(1, HIGH);
     } 
     //couleur rouge de 3.6v et < 3.7 (de 10% à 20% de capacité)
     if ((VBat >= 739)&& (VBat <  757)) {
        digitalWrite(1, LOW);
        digitalWrite(2, LOW);
        digitalWrite(0, HIGH);   
     }
     //couleur rouge clignotante < 3.6v (  moins de 5% + shutdown pi zero)
     if ((VBat >= 600)&& (VBat <  739)) {
      // shutdown pi zero
       digitalWrite(1, LOW);
       digitalWrite(2, LOW);
       digitalWrite(0, HIGH);
       delay(300);
       digitalWrite(0, LOW);
       delay(300);     
     
  }
  //delay(10); // Delais de la boucle en milisecondes
}

Oui, j'ai regardé la simulation. C'est en effet étrange, à première vue ça devrait fonctionner.
Est ce que tu as essayé en réel?

Non j'ai pas essayé en réelle, comme je connait pas encore bien l'arduino j'ai peur de faire des bêtises et j'ai pas encore reçu mon attiny. Donc le simulateur pourrait ne pas être fiable ..... Mince alors :frowning:

Vous en connaissez d'autre éventuellement plus fiable?

Non, je n'en connais pas d'autre (du moins gratuit)

Ok, merci en tout cas pour ces informations.
Je vais attendre de recevoir tous mes composants et je farai un test en réel. Je reviendrai confirmer si Tinkercad Bug ou pas.

Je viens de faire un essai avec un attiny85 réel et ça fait la même chose.

J'ai poursuivi avec des essais plus approfondis.
analogRead(4) ne fonctionne pas. Il faut faire analogRead(A2) et là ça fonctionne.

Par contre A2 n'est pas reconnu sous tinkercad.

Salut Kamill,
Merci d'avoir fait le test pour moi !!! J'avais fait des tests sur tinkercad en écrivant A3 ou A4 et il fonctionnait le soft. Je vais réessayer pour voir.
Normalement d'ici fin de semaine je devrai avoir mes attiny85 et 84. Oui j'ai pris en plus des 84 pour avoir + de sorti PWM pour que ma led fonctionne comme je le veux. Merci encore à toi :wink:

J'ai réessayé sous tinkercad. Pour lire A2 il faut faire analogRead(2) et non analogRead(4).

Ouai c vrai ! par contre regarde ce circuit avec le mode drag and drop il écrit bien A3 ou A2 et ça fonctionne aussi. C'est bon à savoir pour les prochain tests mais il faudrait leur signaler. En tout cas j'ai trop hâte de recevoir mon matériel pour jouer avec tout ça !

Je viens de réessayer, effectivement la notation A2, A3 fonctionne. Pourtant je suis (à peu près :smiley:) sur que ça donnait une erreur quand j'ai essayé.
Pour ton projet un attiny85 suffit, il suffit de réaffecter les pins et d'utiliser A1 et A2 pour les entrées ana. Ça te laissse 3 pins pwm libres.

Salut Kamill,
Les Attiny85 on seulement 2 PWM en sortie. Mais bon peut être que je peux trouver des couleurs avec à 255. Sinon j'ai reçue mes Attiny84 mais pas ma breadbord Grrr je peux pas essayer du coup pffff

Je me suis fié à ce document ou il y a 4 sorties PWM.
J'ai essayé et j'ai constaté que les sorties 0, 1 et 4 peuvent fonctionner en PWM (pas la 3, je ne sais pas pourquoi).

Salut,
Dans le datasheet ils en parlent des sorties PWM et effectivement il y 4 sorties, mais il disent clairement qu'il ne fonctionne pas correctement et qu'il faut que le COM1B1 et COM1B0 soit dans le m^me mode que COMA1 et COMA0 ... Bon je comprend pas trop là mais bon si ça marche après tout je m'en fou !

text original 8.2.3 en 4

Timer Counter 1 PWM output generation on OC1B – XOC1B does not work correctlyTimer Counter1 PWM output OC1B-XOC1B does not work correctly. Only in the case when the control bits,COM1B1 and COM1B0 are in the same mode as COM1A1 and COM1A0, respectively, the OC1B-XOC1B out-put works correctly.Problem Fix/Work aroundThe only workaround is to use same control setting on COM1A[1:0] and COM1B[1:0] control bits, see table 14-4 in the data sheet. The problem has been fixed for Tiny45 rev D.

Salut Kamill,
Enfin des news !! j'ai trainé mais c'est parceque je n'avais tout le matos pour faire mes tests.
Je viens de passer mon weekend à faire des tests avec mon Attiny85 et mes leds.

J'ai des led RGB et en plus j'ai récupéré sur un vieux strip de pc des leds carrés toutes petites celle qui sont sur des rubans pour faire le geek :slight_smile: Bref l'avantage avec celle-ci est que je vais utiliser 1 seule sortie PWM !

J'ai donc fait mon programme avec arduino et programmé mon Attiny... et justement quel galère à faire ce truc là, au début ça ne fonctionné pas puis j'ai vu un gars qui faisait "graver la séquence d'initialisation". Moi au début je cliquai juste sur la flèche pour tout envoyer à l'attiny mais ça marchait pas.

Bref, une fois donc installé sur la planche d’essais je voulais mettre un potard pour jouer avec la tension de ma batterie pour voir les différents stade de couleurs de la led. Mais là j'ai un problème.

Ma résistance variable va de 0 a 1Mohm et juste en test je peut faire varié la tension de la batterie de 1v à 3.9v.
Lorsque je fait tout le montage avec l'attiny ma tension ne varie pas du tout Bizard non ?

On dirai que l'attiny régule la tension de ma batterie. Elle reste à 3.9v.
J'ai essayé en mettant plein de résistances différente et d'affilé .

Le seul moment ou il y a variation c'est quand je mesure la tension de la batterie sur la planche

Tu aurais un explication à ça ?

Tu parles de résistance,est ce un potentiomètre?
Il faut faire un montage en potentiomètre,c'est à dire une extrémité au gnd,une au 5V et le point milieu sur la pin analogique.

Salut Kamill,
Merci pour les explications. Grâce à ça j'ai pu faire mes tests et il sont ok le potentiomètre fonctionne maintenant :wink: correctement. En tout cas c'est cool que tu as réussi à comprendre mon charabia avec le potentiomètre. Dans la journée je ferai une photo du montage et je posterai le code et aussi je te demanderai encore conseil sur les différents niveau de batterie.

Bonjour Kamill,

Comme tu le sais j'essaie de faire un voyant pour indiquer le niveau de charge de la batterie de la console. Pour le moment le voyant fonctionne sur la planche d’essais.

Ce qu'il faut savoir c'est que ce bouton servira au "HotKey" pour retropie pour une combinaison de touche. ça veut dire qu'il sera relié au GPIO raspeberry Pi W et aussi à l'attiny85.

Je me suis dit que se voyant pouvait devenir gênant lors d'une partie, alors j'ai fait un condition sur l'attiny85 pour pouvoir l'éteindre.

Pour éteindre la led un appuis long de 5s sur le bouton change une variable "hideled" soit elle vaut 0 ou 1.

Le truc bizard est que sans connecter le pin A2 parfois les conditions se remplissent .... :woozy_face:

Si j'appuis sur le bouton la led devient bleu pour dire "ok tu appuis" puis 5s après les conditions se font !! pas de problème.
Mais sans aucune intervention de ma part au bout d'un certain temps les condition se refont toutes seules. Comme si il y avait encore une tension dans la pine.

Parfois le voyant devient bleu 2s et d'autre fois c'est comme si appuyais sur le bouton 5s

Voici mon code :

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define LED_PIN    0
#define LED_COUNT 1
int hideled = 0;


Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
/*  Pour info le pin est connecté à un bouton poussoir. Ce bouton poussoir sert à la base à faire le "HotKey" et est connecté au GPIO du raspberry W.
 *  Quand je click une fois dessus la led s'allume blue. Mais si je garde enfonçé le bouton 5s les condition se font sur  l'attiny.
 */
pinMode(A2,INPUT);


#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(10); // Set BRIGHTNESS to about 1/5 (max = 255)
}
// loop() function -- runs repeatedly as long as board is on ---------------


void loop() {

//desactivation du voyant d'état de batterie
if (analogRead(A2) > 670) {
   //couleur bleu pour indiquer qu'on appuie sur le bouton
   strip.setPixelColor(0,0,0,255);
   strip.show();
   delay(5000);
  //Si on continue d'appuyer après les 5s alors on fait la condition  
  if (analogRead(A2) > 670) {  
        if (hideled == 0 ) {
          //couleur blanche pour dire on va éteindre le voyant
          strip.setPixelColor(0,255,255,255);
                strip.show();
                hideled = 1;        
        }else{
           hideled = 0 ;
           //couleur verte pour dire on va allumer le voyant
           strip.setPixelColor(0,0,255,0);
           strip.show();
        }
        delay(4000);
  }
}


if (hideled == 0 ) {
     //couluer Bleu = de à 3.9v à 4.2v (de 70% à 100% de capacité)
      if ((analogRead(A3) >= 800)&& (analogRead(A3) <=  1023)) {
        strip.setBrightness(10);
        strip.setPixelColor(0,0,0,230);
        strip.show();
       }   
       //couleur orange > 3.7 < 3.9v (de 20% à 69% de capacité)
       if ((analogRead(A3) >= 757)&& (analogRead(A3) <  800)) {
            strip.setBrightness(10);
            strip.setPixelColor(0,0,230,0);
            strip.show();
       } 
       //couleur rouge de 3.6v et < 3.7 (de 10% à 20% de capacité)
       if ((analogRead(A3) >= 739)&& (analogRead(A3) <  757)) {
          
          strip.setBrightness(10);
          strip.setPixelColor(0,255,0,0); 
          strip.show(); 
       }
       //couleur rouge clignotante < 3.6v (  moins de 5% + shutdown pi zero)
       if ((analogRead(A3) >= 0)&& (analogRead(A3) <  739)) {
        // shutdown pi zero
         
         strip.setBrightness(50);
         strip.setPixelColor(0,255,0,0);
         strip.show();
         delay(300);
         strip.setPixelColor(0,0,0,0);
         strip.show();
         delay(300);     
       }
       if (analogRead(A2) > 1020 ){
           strip.setBrightness(10);
           strip.setPixelColor(0,80,30,255);
           strip.show();
       }

}else {
  strip.setPixelColor(0,0,0,0);
  strip.show();
}

 delay(10); //delais execution de la boucle générale 
}//fin Void loop

Une remarque que j'ai lu : Comme c'est un bouton poussoir la tension n'est présente que si j'appuis dessus et peut être que l'attiny85 à besoin d'une tension constante à mesurer ...?

Merci

Si tu ne connectes rien sur A2 l'entrée est en l'air et tu peux lire n'importe quoi.
Si tu connectes un bouton, il faut un pullup (qui peut être interne) ou un pulldown, dépendant si le bouton est connecté au gnd ou au 5V.