Arduino: définition de la batterie et sortie d'informations vers la console

Probablement, tout le monde, créant son propre robot autonome, voulait déterminer le niveau de la batterie et les afficher sur l'écran ou dans la console. Cette fonction est principalement nécessaire pour le débogage, mais dans certains cas, la détermination de la charge est une partie importante des fonctionnalités du robot. La difficulté de réaliser cette tâche est la limitation de la tension d'entrée maximale au convertisseur analogique-numérique ( 5V ), ainsi que les énormes sauts de la valeur obtenue. Dans cet article, je voudrais montrer ma façon de lire la tension des batteries et de déterminer la charge.

Tout d'abord, il est nécessaire de souder deux résistances de 1 kΩ à la fiche d'alimentation de ce circuit diviseur de tension:

image

Ainsi, si la tension de sortie des batteries complètement chargées ne dépasse pas 10 V , la tension après le diviseur sera inférieure à 5 V, ce qui signifie qu'elle sera correctement reconnue par un convertisseur analogique-numérique. .

Vous devez maintenant connecter la sortie du diviseur à n'importe quelle entrée analogique de l'Arduino. Dans mon cas, c'est la jambe A5. Essayez ensuite de lire la tension des batteries:

void setup() {
  Serial.begin(9600);
  pinMode(A5, INPUT);
}

void loop() {
  float k = 2;
  float voltage = k*analogRead(A5);
}

Il s'avère que ce n'est pas clair, puisque nous avons oublié de convertir la valeur en un système de nombres décimaux. Pour ce faire, divisez tout par 1024:

void loop() {
  float k = 2/1024;
  float voltage = k*analogRead(A5);
}

Maintenant, nous sélectionnons avec un voltmètre un coefficient auquel la tension sera approximativement égale à la tension réelle:

  float k = 2*1.12;
  float voltage = k*4.5f/1024*analogRead(A5);

Nous avons eu une forte tension de montée et de descente, souvent pas similaire à ce qui était nécessaire. Pour corriger cette erreur, ajoutez un filtrage passe-bas avec le facteur de lissage le plus approprié pour votre projet:


void loop() {
  float k = 2*1.12;
  float voltage = k*4.5f/1024*analogRead(A5);
  float chargeLevel_procents;
  float chargeLevel;
  float y;
  int z;

  //   

  float A_v = voltage; //
  float A_K = 0.3; // 
  static float A_y; // 
  
  A_y = A_y - A_K * (A_y - A_v);
}

Reste maintenant à mesurer la tension sur des batteries complètement chargées et complètement déchargées. Dans mon cas, la différence est exactement de 1V.

Après cela, vous devez trouver la charge de la batterie en pourcentage:

  y = A_y / 8.4 * 100;
  
  chargeLevel_procents = y;
  chargeLevel = z;

Il suffit de traduire cela dans l'icône de la batterie (ou dans les carrés, comme le mien) et de le restituer à la console:


if(chargeLevel_procents >= 0 && chargeLevel_procents < 33) {
    z = 1; // 1/3 
  }
  
  else if(chargeLevel_procents >= 33 && chargeLevel_procents < 66) {
    z = 2; // 2/3 
  }

  
  else if(chargeLevel_procents >= 66 && chargeLevel_procents <= 100) {
    z = 3; //  
  }

Serial.print("\t Voltage: ");
    Serial.print(A_y);
    Serial.print(" V ");
    Serial.print("\t Charge: ");
    if(z == 1) {
      Serial.print("■");
    }
    else if(z == 2) {
      Serial.print("■■");
    }
    else if(z == 3) {
      Serial.print("■■■");
    }
    else {
      Serial.print("ERROR");
    }
    Serial.print("\r\n");  

Pour voir le résultat, je recommande d'utiliser PuTTY, car il prend en charge n'importe quel encodage, contrairement au «moniteur de port» habituel dans l'IDE Arduino.

Source: https://habr.com/ru/post/fr390967/


All Articles