RuiViana

Battery_Test.ino

Feb 19th, 2021
146
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <LiquidCrystal.h>                                // LCD Lib
  2. LiquidCrystal lcd(4, 5, 6, 7, 8, 9);                      // Ports parra o LCD
  3. #define sensorPin A0                                      // Port para leitura analogica
  4. #define MOSFET 10                                         // Port para MOSFET controle da carga
  5. #define LED 13                                            // Port indiucador de fim de leitura
  6. int valorADC = 0;                                         // Valor lido no port ADC
  7. float voltagem;                                           // Valor calculado da votagem
  8. float minVolt = 0;                                        // Valor da voltagem minima  2,7*1,79/3,96 = 1.22
  9. bool feito = false;                                       // Controle de Leitura
  10. bool parado = false;                                      // Controle de execucao com FET ligado
  11. int minuto = 0;                                           // Tempos de leitura em segundos
  12. float factor = 0.004959;                                  // Fator de calculo do  ADC
  13. float intervalo = 2000;                                   // Valor de calculo do intervalo de leitura
  14. int segundo = intervalo / 1000;                           // Tempos de leitura em minutos
  15. float resistor = 2.2 / 1000;                              // Valor do resistor de carga
  16. float accCorrente = 0;                                    // Valor de corrente acumulado
  17. float corrente = 0;                                       // Valor de corrente calculada
  18. int tentativa = 0;                                        // Tentativas de leitura com valor abaixo do minimo
  19. int overide = 3;                                          // Numero de tentativas abaixo do limite
  20. unsigned long newMillis;                                  // Calculo de segundos
  21. unsigned long tempo = 3600000;                            // 1 hora em milisegundos
  22. //---------------------------------------------------------------------------
  23. void setup()
  24. {
  25.   pinMode(sensorPin, INPUT);                              // Port ADC como entrada
  26.   pinMode(MOSFET, OUTPUT);                                // Port MOSFET como saida
  27.   pinMode(LED, OUTPUT);                                   // Port LED como saida
  28.   Serial.begin(115200);                                   // Inicializa Serial
  29.   lcd.begin(16, 2);                                       // Inicializa o LCD
  30.   lcd.print("Bat PWR Tester[Active]");                    // Imprime LCD
  31.   lcd.setCursor(0, 1);                                    // linha 1 posicao 0
  32.   lcd.print("Detecting Bat Type...");                     // Imprime LCD
  33.   delay(200);                                             // Aguarda
  34.   digitalWrite(MOSFET, LOW);                              // Desliga MOSFET
  35.   lcd.clear();                                            // Limpa o LCD
  36.   valorADC = analogRead(sensorPin);                       // Le ADC
  37.   if (valorADC >= 400 )                                   // Se > 350 é bateria tipo LI-ION
  38.   {
  39.     minVolt =  1.220;                                     // Calcula limite minimo   2,7*1,79/3,96 = 1.22
  40.   }
  41.   if (valorADC < 400 )                                    // Se > 350 é bateria tipo NI-MH
  42.   {
  43.     minVolt = 0.900;                                      // Limite minimo
  44.   }
  45. }
  46. //---------------------------------------------------------------------------
  47. void loop()
  48. {
  49.   if (feito == false)                                     // Se e pra continuar
  50.   {
  51.     digitalWrite(MOSFET, HIGH);                           // Liga MOSFET
  52.     valorADC = analogRead(sensorPin);                     // Le ADC
  53.     voltagem = valorADC * factor;                         // Valor = ADC * o fator do ADC em mili  x.xxx
  54.     corrente = voltagem / resistor;                       // Calcula corrente sobre o resistor
  55.     accCorrente = accCorrente + corrente;                 // Acumula corrente
  56.     if (millis() - newMillis > intervalo)                // A cada segundo
  57.     {
  58.       newMillis = millis();
  59.       segundo += intervalo / 1000;
  60.       if (segundo > 59)
  61.       {
  62.         segundo = 0;
  63.         minuto++;
  64.       }
  65.     }
  66.     lcd.clear();
  67.     lcd.setCursor(0, 0);                                  // linha 0 posicao 0
  68.     if (minVolt >  1.000)                                 // Se Litio
  69.     {
  70.       lcd.print("L ");                                    // Imprime L  pos 0 e 1
  71. //      voltagem =  (resistor + (1.94 / 1000)) * corrente;
  72.     }
  73.     else                                                  // Se nao,  NI-MH
  74.       lcd.print("N ");                                    // Imprime N  pos 0 e 1
  75.     lcd.print("T");                                       // Imprime N  pos 2
  76.     lcd.print(minuto);                                    // Imprime minuto decorridos pos 4 e 5
  77.     lcd.print(":");                                       // Imprime serial pos 6
  78.     lcd.print(segundo);                                   // Imprime LCD segundo pos 7 e 8
  79.     lcd.setCursor(9, 0);                                  // linha 0 posicao 9
  80.     lcd.print(voltagem, 2);                               // Imprime LCD voltagem 9,10,11,12
  81.     lcd.print("V ");                                      // Imprime LCD pos 13 e 14
  82.  
  83.     lcd.setCursor(0, 1);                                  // linha 1 posicao 4
  84.     lcd.print(corrente, 0);                               // Imprime LCD voltagem 9,10,11,12
  85.     lcd.print("mA  ");                                    // Imprime LCD  pos 4, 5, 6, 7
  86.     lcd.setCursor(9, 1);                                  // linha 1 posicao 9
  87.     lcd.print((accCorrente / (tempo / intervalo)), 0);    // Imprime LCD corrente/hora  pos 9, 10, 11,12
  88.     lcd.print("mA/H ");                                   // Imprime LCD  pos 13, 14, 15, 16
  89.  
  90.     //if ((segundo %10) == 0)                             // A cada 10 segundos
  91.     Serial.print(minuto);
  92.     Serial.print(" ");
  93.     Serial.print(segundo);
  94.     Serial.print(" ");
  95.     Serial.print(voltagem , 4);                           // Imprive serial voltagem    x.xxxx
  96.     Serial.print(" ");
  97.     Serial.print(corrente, 4);
  98.     Serial.print(" ");
  99.     Serial.println((accCorrente / (tempo / intervalo)), 4);
  100.  
  101.     delay(intervalo);                                     // Aguarda nova leitura
  102.   }
  103.   else                                                    // Se nao e pra continuar
  104.   {
  105.     if (parado == false)                                  // Se ainda nao parou
  106.     {
  107.       digitalWrite(MOSFET, LOW);                          // Desliga MOSFET
  108.       Serial.println(" Leitura Terminada  ");             // Imprime Serial
  109.       lcd.setCursor(15, 1);                                // linha 1 posicao 0
  110.       lcd.print("F");                                  // Imprime LCD
  111.       parado = true;                                      // Informa que e para parar
  112.     }
  113.   }
  114.   if (voltagem < minVolt)                                 // Se voltagem abaixo do limite
  115.   {
  116.     tentativa ++;                                         // Incrementa tentativas
  117.     if (tentativa >= overide)                             // Se estourou tentativas
  118.     {
  119.       digitalWrite(LED, HIGH);                            // Acende LED indicando fim de leitura
  120.       feito = true;                                       // Informa que leituras feitas
  121.     }
  122.   }
  123.   else                                                    // Se voltagem acima do limite
  124.   {
  125.     tentativa = 0;                                        // Zera tentativas
  126.   }
  127. }
  128.  
RAW Paste Data