init repo
This commit is contained in:
commit
03243aee56
300
lipoTester.ino
Normal file
300
lipoTester.ino
Normal file
@ -0,0 +1,300 @@
|
||||
#include <LiquidCrystal.h>
|
||||
|
||||
#define gatePin 8
|
||||
#define highPin A5
|
||||
#define lowPin A4
|
||||
|
||||
float mAh = 0.0;
|
||||
float shuntRes = 5.3;
|
||||
float voltRef = 4.89; // AREF Spannung
|
||||
float current = 0.0;
|
||||
float battVolt = 0.0;
|
||||
float shuntVolt = 0.0;
|
||||
float battLow = 2.9;
|
||||
float battHigh = 4.3;
|
||||
boolean cellOkay = false;
|
||||
|
||||
float sample1 = 0;
|
||||
float sample2 = 0;
|
||||
|
||||
unsigned long previousMillis = 0;
|
||||
unsigned long millisPassed = 0;
|
||||
unsigned long started = 0;
|
||||
unsigned long finished = 0;
|
||||
|
||||
unsigned long hour = 0;
|
||||
unsigned long minute = 0;
|
||||
unsigned long second = 0;
|
||||
unsigned long time_target = 0;
|
||||
char timeBuffer[11];
|
||||
|
||||
unsigned int delayTime = 0;
|
||||
|
||||
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
|
||||
|
||||
byte batStat0[8] = {
|
||||
0b01110,
|
||||
0b10001,
|
||||
0b10001,
|
||||
0b10001,
|
||||
0b10001,
|
||||
0b10001,
|
||||
0b10001,
|
||||
0b11111
|
||||
};
|
||||
|
||||
byte batStat2[8] = {
|
||||
0b01110,
|
||||
0b10001,
|
||||
0b10001,
|
||||
0b10001,
|
||||
0b10001,
|
||||
0b11111,
|
||||
0b11111,
|
||||
0b11111
|
||||
};
|
||||
|
||||
byte batStat4[8] = {
|
||||
0b01110,
|
||||
0b10001,
|
||||
0b10001,
|
||||
0b11111,
|
||||
0b11111,
|
||||
0b11111,
|
||||
0b11111,
|
||||
0b11111
|
||||
};
|
||||
|
||||
|
||||
byte batStat6[8] = {
|
||||
0b01110,
|
||||
0b11111,
|
||||
0b11111,
|
||||
0b11111,
|
||||
0b11111,
|
||||
0b11111,
|
||||
0b11111,
|
||||
0b11111
|
||||
};
|
||||
|
||||
|
||||
byte batWrench[8] = {
|
||||
0b01110,
|
||||
0b11111,
|
||||
0b10101,
|
||||
0b10001,
|
||||
0b11011,
|
||||
0b11011,
|
||||
0b11111,
|
||||
0b11111
|
||||
};
|
||||
|
||||
|
||||
byte batWarning[8] = {
|
||||
0b01110,
|
||||
0b10001,
|
||||
0b10001,
|
||||
0b10001,
|
||||
0b11011,
|
||||
0b11111,
|
||||
0b11011,
|
||||
0b11111
|
||||
};
|
||||
|
||||
byte chargeplug[8] = {
|
||||
0b01010,
|
||||
0b01010,
|
||||
0b11111,
|
||||
0b10001,
|
||||
0b11111,
|
||||
0b00100,
|
||||
0b00100,
|
||||
0b00011
|
||||
};
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
Serial.println("Starting...");
|
||||
|
||||
pinMode(gatePin, OUTPUT);
|
||||
digitalWrite(gatePin, LOW);
|
||||
|
||||
lcd.begin(16, 2);
|
||||
|
||||
lcd.createChar(0, batStat0);
|
||||
lcd.createChar(1, batStat2);
|
||||
lcd.createChar(2, batStat4);
|
||||
lcd.createChar(3, batStat6);
|
||||
lcd.createChar(4, batWrench);
|
||||
lcd.createChar(5, batWarning);
|
||||
lcd.createChar(6, chargeplug);
|
||||
|
||||
lcd.setCursor(2, 0);
|
||||
lcd.print("LiIon Tester");
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("gurkengewuerz.de");
|
||||
|
||||
delay(2000);
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("Bitte Warten ");
|
||||
lcd.setCursor(12, 1);
|
||||
delay(500);
|
||||
lcd.write(".");
|
||||
delay(500);
|
||||
lcd.write(".");
|
||||
delay(500);
|
||||
lcd.write(".");
|
||||
delay(1000);
|
||||
|
||||
lcd.clear();
|
||||
}
|
||||
|
||||
void draw() {
|
||||
lcd.setCursor(0, 0);
|
||||
|
||||
char str_battVolt[6];
|
||||
dtostrf(battVolt, 3, 2, str_battVolt);
|
||||
lcd.print(str_battVolt);
|
||||
lcd.print("V ");
|
||||
|
||||
if (battVolt < 1 && !cellOkay) {
|
||||
lcd.setCursor(15, 0);
|
||||
lcd.write(byte(5));
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print(" KEINE BATTERIE ");
|
||||
} else if (battVolt > battHigh && !cellOkay) {
|
||||
lcd.setCursor(15, 0);
|
||||
lcd.write(byte(6));
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("MAXIMAL SPANNUNG");
|
||||
} else if (battVolt < battLow && !cellOkay) {
|
||||
lcd.setCursor(15, 0);
|
||||
lcd.write(byte(0));
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("GERINGE SPANNUNG");
|
||||
} else {
|
||||
char str_current[6];
|
||||
dtostrf(current, 3, 2, str_current);
|
||||
lcd.print(str_current);
|
||||
lcd.print("A ");
|
||||
|
||||
// Hinweis geben, wenn Zelle leer ist
|
||||
if (finished > 0)
|
||||
lcd.write(byte(0));
|
||||
else
|
||||
lcd.write(byte(6));
|
||||
|
||||
|
||||
|
||||
lcd.setCursor(0, 1);
|
||||
|
||||
if (finished > 0)
|
||||
time_target = finished;
|
||||
else
|
||||
time_target = (millis() / 1000) - started;
|
||||
|
||||
|
||||
hour = time_target / 3600;
|
||||
second = time_target % 3600;
|
||||
minute = second / 60;
|
||||
second %= 60;
|
||||
|
||||
if (hour < 10) {
|
||||
lcd.print("0");
|
||||
}
|
||||
lcd.print(hour);
|
||||
lcd.print(":");
|
||||
if (minute < 10) {
|
||||
lcd.print("0");
|
||||
}
|
||||
lcd.print(minute);
|
||||
lcd.print(":");
|
||||
if (second < 10) {
|
||||
lcd.print("0");
|
||||
}
|
||||
lcd.print(second);
|
||||
lcd.write(" ");
|
||||
|
||||
char str_mAh[6];
|
||||
dtostrf(mAh, 4, 0, str_mAh);
|
||||
lcd.print(str_mAh);
|
||||
lcd.print("mAh");
|
||||
}
|
||||
}
|
||||
|
||||
void resetVals() {
|
||||
mAh = 0.0;
|
||||
current = 0.0;
|
||||
battVolt = 0.0;
|
||||
shuntVolt = 0.0;
|
||||
cellOkay = false;
|
||||
finished = 0;
|
||||
started = 0;
|
||||
|
||||
sample1 = 0;
|
||||
sample2 = 0;
|
||||
|
||||
previousMillis = 0;
|
||||
millisPassed = 0;
|
||||
}
|
||||
|
||||
void loop() {
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
sample1 = sample1 + analogRead(highPin);
|
||||
delay (2);
|
||||
}
|
||||
sample1 = sample1 / 100;
|
||||
battVolt = 2 * sample1 * voltRef / 1024.0;
|
||||
|
||||
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
sample2 = sample2 + analogRead(lowPin);
|
||||
delay (2);
|
||||
}
|
||||
sample2 = sample2 / 100;
|
||||
shuntVolt = 2 * sample2 * voltRef / 1024.0;
|
||||
|
||||
if ( battVolt > battHigh) {
|
||||
digitalWrite(gatePin, LOW);
|
||||
Serial.println("High Voltage");
|
||||
delayTime = 1000;
|
||||
} else if (battVolt < 1) {
|
||||
digitalWrite(gatePin, LOW);
|
||||
Serial.println("No Battery");
|
||||
resetVals(); // Nur Resetten der Variabeln, wenn keine Batterie drin ist (sonst wird nach der Messung das Display geleert!)
|
||||
delayTime = 1000;
|
||||
} else if (battVolt < battLow) {
|
||||
digitalWrite(gatePin, LOW);
|
||||
Serial.println("Low Voltage");
|
||||
|
||||
if (cellOkay && finished == 0) {
|
||||
finished = (millis() / 1000) - started;
|
||||
}
|
||||
|
||||
delayTime = 1000;
|
||||
} else if (finished == 0) {
|
||||
digitalWrite(gatePin, HIGH);
|
||||
|
||||
if (!cellOkay) {
|
||||
cellOkay = true;
|
||||
started = millis() / 1000;
|
||||
}
|
||||
|
||||
millisPassed = millis() - previousMillis;
|
||||
current = (battVolt - shuntVolt) / shuntRes;
|
||||
mAh = mAh + (current * 1000.0) * (millisPassed / 3600000.0);
|
||||
previousMillis = millis();
|
||||
Serial.print(battVolt);
|
||||
Serial.print("\t");
|
||||
Serial.print(current);
|
||||
Serial.print("\t");
|
||||
Serial.println(mAh);
|
||||
delayTime = 4000;
|
||||
}
|
||||
|
||||
draw();
|
||||
|
||||
delay(delayTime);
|
||||
}
|
BIN
mega8_pinout.jpg
Normal file
BIN
mega8_pinout.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 526 KiB |
Loading…
Reference in New Issue
Block a user