Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal.h> // LCD Lib
- LiquidCrystal lcd(4, 5, 6, 7, 8, 9); // Ports parra o LCD
- #define sensorPin A0 // Port para leitura analogica
- #define MOSFET 10 // Port para MOSFET controle da carga
- #define LED 13 // Port indiucador de fim de leitura
- int valorADC = 0; // Valor lido no port ADC
- float voltagem; // Valor calculado da votagem
- float minVolt = 0; // Valor da voltagem minima 2,7*1,79/3,96 = 1.22
- bool feito = false; // Controle de Leitura
- bool parado = false; // Controle de execucao com FET ligado
- int minuto = 0; // Tempos de leitura em segundos
- float factor = 0.004959; // Fator de calculo do ADC
- float intervalo = 2000; // Valor de calculo do intervalo de leitura
- int segundo = intervalo / 1000; // Tempos de leitura em minutos
- float resistor = 2.2 / 1000; // Valor do resistor de carga
- float accCorrente = 0; // Valor de corrente acumulado
- float corrente = 0; // Valor de corrente calculada
- int tentativa = 0; // Tentativas de leitura com valor abaixo do minimo
- int overide = 3; // Numero de tentativas abaixo do limite
- unsigned long newMillis; // Calculo de segundos
- unsigned long tempo = 3600000; // 1 hora em milisegundos
- //---------------------------------------------------------------------------
- void setup()
- {
- pinMode(sensorPin, INPUT); // Port ADC como entrada
- pinMode(MOSFET, OUTPUT); // Port MOSFET como saida
- pinMode(LED, OUTPUT); // Port LED como saida
- Serial.begin(115200); // Inicializa Serial
- lcd.begin(16, 2); // Inicializa o LCD
- lcd.print("Bat PWR Tester[Active]"); // Imprime LCD
- lcd.setCursor(0, 1); // linha 1 posicao 0
- lcd.print("Detecting Bat Type..."); // Imprime LCD
- delay(200); // Aguarda
- digitalWrite(MOSFET, LOW); // Desliga MOSFET
- lcd.clear(); // Limpa o LCD
- valorADC = analogRead(sensorPin); // Le ADC
- if (valorADC >= 400 ) // Se > 350 é bateria tipo LI-ION
- {
- minVolt = 1.220; // Calcula limite minimo 2,7*1,79/3,96 = 1.22
- }
- if (valorADC < 400 ) // Se > 350 é bateria tipo NI-MH
- {
- minVolt = 0.900; // Limite minimo
- }
- }
- //---------------------------------------------------------------------------
- void loop()
- {
- if (feito == false) // Se e pra continuar
- {
- digitalWrite(MOSFET, HIGH); // Liga MOSFET
- valorADC = analogRead(sensorPin); // Le ADC
- voltagem = valorADC * factor; // Valor = ADC * o fator do ADC em mili x.xxx
- corrente = voltagem / resistor; // Calcula corrente sobre o resistor
- accCorrente = accCorrente + corrente; // Acumula corrente
- if (millis() - newMillis > intervalo) // A cada segundo
- {
- newMillis = millis();
- segundo += intervalo / 1000;
- if (segundo > 59)
- {
- segundo = 0;
- minuto++;
- }
- }
- lcd.clear();
- lcd.setCursor(0, 0); // linha 0 posicao 0
- if (minVolt > 1.000) // Se Litio
- {
- lcd.print("L "); // Imprime L pos 0 e 1
- // voltagem = (resistor + (1.94 / 1000)) * corrente;
- }
- else // Se nao, NI-MH
- lcd.print("N "); // Imprime N pos 0 e 1
- lcd.print("T"); // Imprime N pos 2
- lcd.print(minuto); // Imprime minuto decorridos pos 4 e 5
- lcd.print(":"); // Imprime serial pos 6
- lcd.print(segundo); // Imprime LCD segundo pos 7 e 8
- lcd.setCursor(9, 0); // linha 0 posicao 9
- lcd.print(voltagem, 2); // Imprime LCD voltagem 9,10,11,12
- lcd.print("V "); // Imprime LCD pos 13 e 14
- lcd.setCursor(0, 1); // linha 1 posicao 4
- lcd.print(corrente, 0); // Imprime LCD voltagem 9,10,11,12
- lcd.print("mA "); // Imprime LCD pos 4, 5, 6, 7
- lcd.setCursor(9, 1); // linha 1 posicao 9
- lcd.print((accCorrente / (tempo / intervalo)), 0); // Imprime LCD corrente/hora pos 9, 10, 11,12
- lcd.print("mA/H "); // Imprime LCD pos 13, 14, 15, 16
- //if ((segundo %10) == 0) // A cada 10 segundos
- Serial.print(minuto);
- Serial.print(" ");
- Serial.print(segundo);
- Serial.print(" ");
- Serial.print(voltagem , 4); // Imprive serial voltagem x.xxxx
- Serial.print(" ");
- Serial.print(corrente, 4);
- Serial.print(" ");
- Serial.println((accCorrente / (tempo / intervalo)), 4);
- delay(intervalo); // Aguarda nova leitura
- }
- else // Se nao e pra continuar
- {
- if (parado == false) // Se ainda nao parou
- {
- digitalWrite(MOSFET, LOW); // Desliga MOSFET
- Serial.println(" Leitura Terminada "); // Imprime Serial
- lcd.setCursor(15, 1); // linha 1 posicao 0
- lcd.print("F"); // Imprime LCD
- parado = true; // Informa que e para parar
- }
- }
- if (voltagem < minVolt) // Se voltagem abaixo do limite
- {
- tentativa ++; // Incrementa tentativas
- if (tentativa >= overide) // Se estourou tentativas
- {
- digitalWrite(LED, HIGH); // Acende LED indicando fim de leitura
- feito = true; // Informa que leituras feitas
- }
- }
- else // Se voltagem acima do limite
- {
- tentativa = 0; // Zera tentativas
- }
- }
Add Comment
Please, Sign In to add comment