Testar pilhas com o Arduino

AABatteriesEveready

 

Boa tarde pessoal! Mais uma vez trazemos até vocês outro tutorial sobre Arduino.

Desta vez, apresentamos um projeto que irá servir para testar pilhas, mostrando a sua tensão aos terminais, a sua potência usada para alimentar a carga numa hora (Watt-hora), a temperatura do ambiente, o tempo e a energia gasta pela pilha (Joules).

Material:

1 LCD 16×2;
1 Sensor de temperatura LM35;
4 Resistências 22 ohm;
1 Resistência 1k;
1 Potenciómetro 10k;

Montagem:

asdasd

 

Código Arduino:


#include <Time.h>
#include <LiquidCrystal.h>
#include <Wire.h>

#define V_LOAD_PIN A0
#define R_LOAD 5.5
#define FINAL_VOLTAGE 0.2

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

float joules = 0;
float voltage = 0;
float temp = 0;
uint8_t hours = 0;
uint8_t mins = 0;
uint8_t lastSecond;
bool batteryAttached = false;
bool testComplete = false;
time_t startTime = 0;

void setup() {
Serial.begin(9600);
pinMode(V_LOAD_PIN, INPUT);
lcd.begin(16, 2);
lcd.print("Coloca pilhas");
lcd.setCursor(0, 1);
lcd.print("para testar");
time_t t = now();
lastSecond = second(t);
}

void loop() {
if (batteryAttached) {
if (testComplete) {
updateDisplay();
} else {
time_t t = now()-startTime;
uint8_t sec = second(t);
if (sec != lastSecond) {
lastSecond = sec;
hours = hour(t);
mins = minute(t);
voltage = 5.0 * ((float) analogRead(V_LOAD_PIN)) / 1023.0;
float current = voltage / R_LOAD;
joules += voltage * current;
int val = analogRead(A1);
float voltagetemp = (val) * 5;
voltagetemp /= 1024.0;
temp = (voltagetemp - 0.5) * 10 ;
updateDisplay();
Serial.print(t);
Serial.print(",");
Serial.print(voltage);
Serial.print(",");
Serial.print(current);
Serial.print(",");
Serial.print(joules);
Serial.print(",");
Serial.print(temp);
Serial.println();
if (voltage < FINAL_VOLTAGE) {
testComplete = true;
}
}
}
} else {
voltage = 5.0 * ((float) analogRead(V_LOAD_PIN)) / 1024.0;
if (voltage > 0.02) {
startTime = now();
batteryAttached = true;
Serial.println("time,voltage,current,joules,temp");
}
}
}

// Update the LCD with the following format:
//
// +----------------+
// |99999.9J 99.99Wh|
// |9.99V 99^C 59:59|
// +----------------+

void updateDisplay() {
char row[32];
memset(row, 0, 17);

float wattHours = joules / 3600;
if (joules < 9999)
fmtDouble(joules, 2, &row[0], 8);
else
fmtDouble(joules, 1, &row[0], 8);
strcat(row, "J");
char whStr[9];
fmtDouble(wattHours, 2, whStr, sizeof(whStr));
sprintf(&row[9], "%5sWh", whStr);
for (int i=0;i<16;i++)
if (row[i] == 0)
row[i] = ' ';
lcd.setCursor(0, 0);
lcd.print(row);

if (testComplete) {
lcd.setCursor(0, 1);
lcd.print(" Teste Completo! ");
} else {
memset(row, 0, 17);
fmtDouble(voltage, 2, &row[0], 8);
strcat(row, "V");
fmtDouble(temp, 0, &row[6], 8);
strcat(&row[6], "\xDF");
strcat(&row[6], "C");
uint8_t degree = 0xEF;
sprintf(&row[11], "%02d:%02d", hours, mins);
for (int i=0;i<16;i++)
if (row[i] == 0)
row[i] = ' ';
lcd.setCursor(0, 1);
lcd.print(row);
}
}

void fmtDouble(double val, byte precision, char *buf, unsigned bufLen = 0xffff);
unsigned fmtUnsigned(unsigned long val, char *buf, unsigned bufLen = 0xffff, byte width = 0);

unsigned fmtUnsigned(unsigned long val, char *buf, unsigned bufLen, byte width) {
if (!buf || !bufLen)
return(0);

// produce the digit string (backwards in the digit buffer)
char dbuf[10];
unsigned idx = 0;
while (idx < sizeof(dbuf)) {
dbuf[idx++] = (val % 10) + '0';
if ((val /= 10) == 0)
break;
}

// copy the optional leading zeroes and digits to the target buffer
unsigned len = 0;
byte padding = (width > idx) ? width - idx : 0;
char c = '0';
while ((--bufLen > 0) && (idx || padding)) {
if (padding)
padding--;
else
c = dbuf[--idx];
*buf++ = c;
len++;
}

// add the null termination
*buf = '\0';
return(len);
}

void fmtDouble(double val, byte precision, char *buf, unsigned bufLen) {
if (!buf || !bufLen)
return;

const byte maxPrecision = 6;
if (precision > maxPrecision)
precision = maxPrecision;

if (--bufLen > 0) {
// check for a negative value
if (val < 0.0) {
val = -val;
*buf = '-';
bufLen--;
}

// compute the rounding factor and fractional multiplier
double roundingFactor = 1;
unsigned long mult = 1;
for (byte i = 0; i < precision; i++) {
roundingFactor /= 10.0;
mult *= 10;
}

if (bufLen > 0) {
// apply the rounding factor
val += roundingFactor;

// add the integral portion to the buffer
unsigned len = fmtUnsigned((unsigned long)val, buf, bufLen);
buf += len;
bufLen -= len;
}

// handle the fractional portion
if ((precision > 0) && (bufLen > 0)) {
*buf++ = '.';
if (--bufLen > 0)
buf += fmtUnsigned((unsigned long)((val - (unsigned long)val) * mult), buf, bufLen, precision);
}
}

// null-terminate the string
*buf = '\0';
}

 

Agora pessoal, é só pegar no vosso arduino, dar uma vista de olhos a este tutorial e começar a desenvolver o vosso projecto! Se ainda não tiveres o material necessário para o projecto, encontra-o aqui na nossa loja Boxelectronica ou então na lista abaixo:

Sensor LM35;
Potenciómetro 10k;
Resistências.

Comentários no Facebook