Arduino: definición de batería y salida de información a la consola

Probablemente todos, al crear su propio robot autónomo, quisieron determinar el nivel de batería y mostrarlos en la pantalla o en la consola. Esta función es principalmente necesaria para la depuración, pero en algunos casos, determinar la carga es una parte importante de la funcionalidad del robot. La dificultad para realizar esta tarea es la limitación de la tensión de entrada máxima en el convertidor analógico a digital ( 5V ), así como los grandes saltos en el valor obtenido. En esta publicación, me gustaría mostrar mi forma de leer el voltaje de las baterías y determinar la carga.

En primer lugar, es necesario soldar dos resistencias de 1 kΩ al enchufe de alimentación de este circuito divisor de voltaje: por lo

imagen

tanto, si el voltaje de salida de las baterías completamente cargadas no excede los 10 V , entonces el voltaje después del divisor será inferior a 5 V , lo que significa que será reconocido adecuadamente por un convertidor analógico a digital .

Ahora necesita conectar la salida del divisor a cualquier entrada analógica en el Arduino. En mi caso, esta es la pierna A5. Luego intente leer el voltaje de las baterías:

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

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

Resulta que no está claro eso, ya que olvidamos convertir el valor en un sistema de números decimales. Para hacer esto, divida todo por 1024:

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

Ahora seleccionamos con la ayuda de un voltímetro un coeficiente al cual el voltaje será aproximadamente igual al voltaje real:

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

Obtuvimos un fuerte voltaje de subida y bajada, a menudo no similar a lo que se requería. Para corregir este error, agregue un filtro de paso bajo con el factor de suavizado más apropiado para su proyecto:


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);
}

Ahora queda medir el voltaje en baterías completamente cargadas y completamente descargadas. En mi caso, la diferencia es exactamente 1V.

Después de eso, debe encontrar la carga de la batería en porcentaje:

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

Solo necesitamos traducir esto en el icono de la batería (o en los cuadrados, como el mío) y enviarlo a la consola:


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");  

Para ver el resultado, recomiendo usar PuTTY, ya que admite cualquier codificación, a diferencia del "monitor de puerto" habitual en el IDE de Arduino.

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


All Articles