SolDa - ein Datenlogger für Sonnenfänger geschrieben am 24.03.2012
Ich habe schon eine Weile ein kleines Solarpannel stehen, mit dem Laptop und Telefon aufgeladen wird. Nun möchte ich auch mal wissen was da so an Strom rein und raus geht. Dazu dieses Projekt, was in vier Teilprojekte gliedert ist:
- Hardware
- Software
- Interface
- Datenauswertung
Hardware (29.12.2011)
Als Ausgangsplattform dient mir ein Arduino Ethernet Board. Auf ihm sitzt ein kleiner ATMEGA328, ein WizNet W5100 TCP/IP Embedded Ethernet Controller und ein micro-SD-Sockel (Kostenpunkt ca. 50,-€ bei watterott).
Dazu kommt noch eine Echtzeituhr (RTC) die per I²C ausgelesen wird. Zwei ACS714 Stromsensoren (-5 bis +5A) und zwei Spannungsteiler hängen am Analogport.
Zusätzlich sind am I²C noch zwei LM75-Temperatursensoren angeschlossen.
Alle Hardwareelemente habe ich auf Lochraster aufgebaut. Was etwas schwierig war, da die Platine auf Kopf steht. Die Pfostenstecker ließen sich so aber einfacher anlöten.
Auf der Oberseite (die jetzt unten ist) befinden sich die Widerstände der Spannungsteiler und einige Drahtbrücken.
Den Aufbau sei mal schematisch in Frizing dargestellt:
Wie man sieht werden sämtliche Analogports genutzt. Dabei kann an Port A0 + A1 der Strom und Port A2 + A3 die Spannung abgelesen werden. Port A4 ist SDA und Port A5 SCL für den I²C-Bus.
Software
An sich wollte ich die Arduino-Software V1.0 nehmen - leider gab es zu viele Neuerungen die den kostbaren Speicher des ATMegas füllten - so habe ich die ältere Version 0022 eingesetzt.
Auch mit der V0022 musste ich noch viel optimieren, so habe ich zum Beispiel meine Bibliotheken entschlackt. Im Projektverlauf hatte ich noch ein LCD am I²C-Port das aber aus Speichermangel raus flog. Dafür läuft jetzt alles über Ethernet.
Da mit den Standardlibs kein Mischbetrieb von Ethernet und SD-Karte möglich ist setzte ich für die Benutzung der SD-Karte die SdFat-Lib ein.
Um den RAM-Verbrauch niedrig zu halten, benutze ich die Flash-Lib um Daten im Flashbereich zu halten.
Für die Ansteuerung der RTC ist die Wire-Lib eingebunden.
Der Sketch und die Libs können hier geladen und studiert werden:
download: get_SolarData_001.pde 17.37kb
download: I2C_DS1307.rar 3.17kb
download: I2C_PCF8574.rar 1.96kb
download: I2C_LM75.zip 1.53kb (update 26.1.2012)
Interface
Das Abfragen der aktuellen Werte findet über einen Webbrowser statt.
Momentan habe ich mein Board über 192.168.0.10 im lokalen Netzwerk erreichbar gemacht.
Um die Werte anzuzeigen parse ich mit Arduino alle .htm-Dateien, suche nach bestimmten Stichwörtern und ersetze diese mit Werten:
- [time] gibt die Server-Zeit aus
- [date] gibt das Server-Datum aus
- [day] Tag der Woche 1..7 1=Montag
- [list] klickbare Dateiliste auf SD Karte
- [vers] Programmversion
- [temp3] Temperatursensor I2C Adresse 3
- [temp7] Temperatursensor I2C Adresse 7
- [a0] Analogport 0 Strom Pannel 1
- [a1] Analogport 1 Strom Pannel 2
- [a2] Analogport 2
- [a3] Analogport 3
Steht in der HTML-Seite zum Beispiel
Temp 3: [temp3]°C
kommt folgendes heraus:
Temp 3: 19.5°C
Die Daten der Analogports sind Zahlen von 0 bis 1023, die z.B. mit JavaScript weiterverarbeitet werden können. Das spart auf dem Arduino RAM- und Flash-Speicher.
Datenauswertung
Für jeden Tag wird eine Log-Datei angelegt deren Namen sich aus dem aktuellen Datum ableitet (z.B. 111207.csv).
Die ermittelten Daten der Analogports und Temperatursensoren werden neben der aktuellen Uhrzeit alle 5 Minuten in die CSV-Datei geschrieben.
Der Aufbau jeder Daten-Zeile ist recht einfach:
05:49,18.5,17.5,507,510,100,128
Der erste Wert ist die aktuelle Uhrzeit, dann kommen die beiden Temperaturwerte und der Stand der vier Analog-Ports.
Die Datei kann mit LibriOffice/OpenOffice etc. ausgewertet werden.
Momentan arbeite ich an der Darstellung der Logfiles mit Javascript. Der heutige Tag sieht dann so aus:
Dazu lade ich dynamisch per XMLHttp-Request die csv-Datei ein und parse sie Zeile für Zeile. Die Werte werden dann im "Bild" dargestellt.
Wenn es interessiert kann hier den Quellcode studieren:
download: log.txt 4.41kb
update (3.1.2012)
Heute habe ich ein paar Anzeigeinstrumente erzeugt. An sich wollte ich Bilder nehmen aber der Arduino macht mit da Probleme mit dem übertragen der Bilder, sie werden zwar geladen aber dann sind sie weg...
...deshalb habe ich die Anzeigen aus span- und div-Containern mit etwas CSS gebaut.
download: script.rar 2.52kbupdate (7.1.2012)
Nun habe ich die Anzeigen etwas gefälliger gestaltet:
update (24.3.2012)
Da die erste Hardware-Version sehr wackelig war, habe ich die Platine mit den Sensoren neu aufgebaut und das ganze in eine Kiste gepackt:
Da ich die Spannung nicht einfach messen konnte, misst der A2-Port jetzt per LDR die Lichtstärke und A3 ist unbenutzt:
- [a0] Analogport 0 Strom Pannel 1
- [a1] Analogport 1 Strom Pannel 2
- [a2] Analogport 2 LDR
- [a3] Analogport 3 nicht benutzt
update (21.7.2012)
Damit man was zu spielen hat, ist hier der download der Dateien die auf meiner SD-Karte liegen: solda_html.rar 9.38kb
Hilfsdateien (das sind keine HTML-Dateien, da ich nur HTML parse haben sie diese Endung):
- t7.htm gibt die Temperatur des Sensors 7 aus
- t3.htm gibt die Temperatur des Sensor 3 aus
- SD.htm Liste aller Dateien auf SD-Karte
- list.htm Liste der .CSV-Dateien auf SD-Karte
- datetime.htm gibt Datum und Zeit vom Arduino-Board aus
- a0.htm (... a3.htm) gibt den Wert vom AnalogPort0 (... 3) aus
Das was man sieht:
- style.css damits schön aussieht
- FAVICON.ICO ein Icon für den Browser
- script.js etwas Javascript, liest Werte aus und befüllt die Anzeigen
- show.htm zeigt einen Tagesverlauf an (Aufruf: http://192.168.0.11/show.htm?q=120719.CSV)
- info.htm Infos zu Einstellungen und Optionen
- index.htm Startseite mit ein paar Anzeigen
- data.htm Liste der .CSV-Dateien auf SD-Karte
- 120130.CSV Datensatz vom 30.01.2012
Das Projekt ist auch auf github verfügbar.