Arduino: definição da bateria e saída de informações para o console

Provavelmente todo mundo, criando seu próprio robô autônomo, queria determinar o nível de carga da bateria e exibi-lo no monitor ou no console. Essa função é principalmente necessária para depuração, mas em alguns casos, determinar a cobrança é uma parte importante da funcionalidade do robô. A dificuldade em executar esta tarefa é a limitação da tensão máxima de entrada no conversor analógico-digital ( 5V ), bem como os grandes saltos no valor obtido. Neste post, gostaria de mostrar minha maneira de ler a tensão das baterias e determinar a carga.

Antes de tudo, é necessário soldar dois resistores de 1 kΩ no plugue de energia deste circuito divisor de tensão:

imagem

assim, se a tensão de saída das baterias totalmente carregadas não exceder 10V , a tensão após o divisor será menor que 5V, o que significa que será adequadamente reconhecido por um conversor analógico-digital .

Agora você precisa conectar a saída do divisor a qualquer entrada analógica no Arduino. No meu caso, esta é a perna A5. Em seguida, tente ler a voltagem das baterias:

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

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

Acontece que não está claro isso, pois esquecemos de converter o valor em um sistema de números decimais. Para fazer isso, divida tudo por 1024:

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

Agora, selecionamos com um voltímetro um coeficiente no qual a voltagem será aproximadamente igual à voltagem real:

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

Temos uma forte tensão de subida e descida, geralmente não semelhante ao necessário. Para corrigir esse erro, adicione filtragem passa-baixo com o fator de suavização mais apropriado para o seu projeto:


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

Agora resta medir a tensão em baterias totalmente carregadas e totalmente descarregadas. No meu caso, a diferença é exatamente 1V.

Depois disso, você precisa encontrar a carga da bateria em porcentagem:

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

Só precisamos traduzir isso no ícone da bateria (ou nos quadrados, como o meu) e enviá-lo para o 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");  

Para visualizar o resultado, recomendo usar o PuTTY, pois ele suporta qualquer codificação, diferente do habitual "monitor de porta" no Arduino IDE.

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


All Articles