Spannungslogger.cpp
#include "Spannungslogger.h"
#include <font6x8.h>
void setup() {
analogReference(INTERNAL);
analogRead(VOLTAGEPIN);
analogRead(CURRENTPIN);
pinMode(LED1PIN, OUTPUT);
pinMode(LED2PIN, OUTPUT);
pinMode(RELAISPIN1, OUTPUT);
pinMode(RELAISPIN2, OUTPUT);
pinMode(RESETPIN, INPUT_PULLUP);
digitalWrite(LED1PIN, 0);
digitalWrite(LED2PIN, 1);
digitalWrite(RELAISPIN1, 255);
digitalWrite(RELAISPIN2, 255);
Wire.begin();
ssd1306_128x64_i2c_init();
ssd1306_fillScreen(0x00);
ssd1306_setFixedFont(ssd1306xled_font6x8);
rtc.begin();
Serial.begin(115200);
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
rtc.now();
readConfig(digitalRead(RESETPIN));
//delay(1000);
digitalWrite(LED2PIN, 0);
//delay(3000);
digitalWrite(RELAISPIN2, 0);
}
void loop() {
int current = 0;
float voltage = 0.0;
if (millis() > lastDisplayUpdate + 1000) {
lastDisplayUpdate = millis();
voltage = readVoltage(VOLTAGEPIN, R1, R2);
current = readCurrent();
int i_voltage = int(voltage);
int id_voltage = int((voltage) * 100.0) - (i_voltage * 100);
char t_text[21];
sprintf(t_text, "Spannung: %2i.%02iV", i_voltage, id_voltage);
ssd1306_printFixed(0, 0, t_text, STYLE_NORMAL);
sprintf(t_text, "Strom: %5imA", current);
ssd1306_printFixed(0, 8, t_text, STYLE_NORMAL);
uint32_t t_intervall = intervall;
char e = 's';
if (t_intervall > 7200) {
t_intervall = t_intervall / 60;
e = 'h';
}else if (t_intervall > 120) {
t_intervall = t_intervall / 60;
e = 'm';
}
sprintf(t_text, "Intervall: %6li%c", t_intervall, e);
ssd1306_printFixed(0, 16, t_text, STYLE_NORMAL);
i_voltage = int(cutOutVoltage);
id_voltage = int((cutOutVoltage) * 100.0) - (i_voltage * 100);
sprintf(t_text, "Ende: %2i.%02iV", i_voltage, id_voltage);
ssd1306_printFixed(0, 24, t_text, STYLE_NORMAL);
uint32_t time = millis() / 1000;
if (time > 7200) {
time = time / 60;
e = 'h';
} else if (time > 120) {
time = time / 60;
e = 'm';
}
sprintf(t_text, "Laufzeit: %6li%c", time, e);
ssd1306_printFixed(0, 32, t_text, STYLE_NORMAL);
sprintf(t_text, "Datenpunkte: %8li", logs);
ssd1306_printFixed(0, 40, t_text, STYLE_NORMAL);
DateTime now = rtc.now();
sprintf(t_text, "%02i.%02i.%04i %02i:%02i:%02i", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second());
ssd1306_printFixed(0, 48, t_text, STYLE_NORMAL);
ssd1306_printFixed(0, 56, " ", STYLE_NORMAL);
uint32_t a = (intervall *1000 - (millis()-lastLog));
a = map(a, 0, intervall*1000, 127, 0);
ssd1306_drawHLine(0, 63, a);
if (millis() - lastLog >= intervall * 1000) {
lastLog = millis();
if (voltage < cutOutVoltage)
digitalWrite(RELAISPIN2, 255);
else if (voltage > cutOutVoltage + 0.5) digitalWrite(RELAISPIN2, 0);
String dataString = createString(rtc.now(), voltage, current);
if (writeToSD(dataString)) {
Serial.print("nicht geschrieben:");
led[0].set(-1, -1, -1);
} else {
Serial.print("geschrieben: ");
led[0].set(1, 20, 0);
}
Serial.println(dataString);
}
}
for (int i = 0; i < 2; ++i)
led[i].execute();
}
float readVoltage(int pin, float r1, float r2) {
float a = 0.0;
int sum = 0;
int sample_count = 0;
while (sample_count < 10) {
sum += analogRead(pin);
sample_count++;
delay(10);
}
sum = sum / 10;
a = (float) sum * VREF / 1024.0;
a = a / (r2 / (r1 + r2));
return a;
}
float readCurrent() {
int32_t a = 1000 * readVoltage(CURRENTPIN, R3, R4);
a = a - VNULL;
a = a * 1000 / 66;
return a;
}
String createString(DateTime now, float voltage, int current) {
String dataString = String(now.unixtime());
dataString += ",";
dataString += String(voltage);
dataString += ",";
dataString += String(current);
dataString += ";";
return dataString;
}
void readConfig(int a) {
Serial.print("Initialisiere SD Karte...");
if (!SD.begin(CSPIN)) {
Serial.println("ERROR");
return;
} else {
Serial.println("OK");
File iniFile;
if (!a) {
Serial.print("Schreibe Konfiguration...");
iniFile = SD.open("config.ini", O_WRITE | O_CREAT | O_TRUNC);
if (iniFile) {
iniFile.println("1 #Intervall in Sekunden");
iniFile.println("12.0 #Abschaltspannung");
iniFile.close();
Serial.println("OK");
} else Serial.println("ERROR");
} else {
Serial.print("Lade Konfiguration...");
if (SD.exists("config.ini")) {
iniFile = SD.open("config.ini", FILE_READ);
String text = "";
if (iniFile) {
text = iniFile.readStringUntil(' ');
intervall = text.toInt();
iniFile.readStringUntil('\n');
text = iniFile.readStringUntil(' ');
cutOutVoltage = text.toFloat();
iniFile.close();
Serial.println("OK");
Serial.print("Intervall = ");
Serial.println(intervall);
Serial.print("Abschaltspannung = ");
Serial.println(cutOutVoltage);
}
} else Serial.println("ERROR");
}
}
}
int writeToSD(String dataString) {
File dataFile = SD.open("data8.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
Serial.println("file opened");
dataFile.println(dataString);
dataFile.close();
Serial.println("file closed");
return 0;
logs++;
}
// if the file isn't open, pop up an error:
else {
Serial.println("can't open file");
return 1;
}
}
void Led::set(int count, int onTime, int intervall) {
this->count = count;
this->onTime = onTime;
this->interval = intervall;
action = 1;
nextAction = 0;
}
void Led::execute() {
if ((action) & (millis() >= nextAction)) {
if ((status) & (count > 0)) {
count--;
status = 0;
if (count > 0)
nextAction = millis() + interval - onTime;
else action = 0;
} else if ((!status) & (count > 0)) {
status = 1;
nextAction = millis() + onTime;
} else if ((!status) & (count < 0)) {
status = 1;
action = 0;
}
digitalWrite(pin, status);
}
}
Der Kompiler endet mit:
section size addr
.data 606 8388864
.text 26074 0
.bss 1027 8389470
.comment 17 0
.note.gnu.avr.deviceinfo 64 0
.debug_aranges 168 0
.debug_info 57661 0
.debug_abbrev 10626 0
.debug_line 15772 0
.debug_frame 3744 0
.debug_str 11050 0
.debug_loc 29695 0
.debug_ranges 2192 0
Total 158696
'Finished building target: Spannungslogger'
' '
Sorry, mein Code ist nicht sehr schön. Zu allem Übel verrutsch die Formatierung wenn ich das hier poste, weil Eclipse Tabulatoren zum einrücken verwendet. Da könnte man vieles sauberer Lösen, int statt float, usw. Ich habe das an einem Abend schnell zusammen geschrieben, mit der Prämisse das ganze schnell zum laufen zu bringen.