Ahogy ígértem a rendszer szoftver részét is megosztom veletek. A haladóbb és profi programozó olvasóimtól előre is elnézést kérek, ha valamit nagyon favágó stílusban programoztam le. Építő jellegű kritikákra nyitott vagyok, nem vagyok sértődős típus. Ez a szoftver hobbi szintű a profi rendszerekkel összehasonlítani nem érdemes, nem egy súlycsoport. Hacker támadások elleni védelme egyáltalán nincsen, mert lokális hálózaton fut, és szinte elhanyagolható az esélye annak hogy a háztartás bármelyik tagja megpróbálna SQL injection vagy más technikákat alkalmazni az adatok kinyerésére/módosítására.
Akkor vágjuk bele. A rendszer főbb alkotóelemei:
- ADATBÁZIS
- ARDUINO program
- PHP feldolgozó program
- PHP, Highcharts vizualizációs program
1. Adatbázis
MySQL 5 adatbázist használok, egy táblával a jelenlegi verzióban. Az adatok percenként kerülnek bele, ami napi 700-900 bejegyzés. Hogy miért nem napi 24*60=1440? Azért mert a percenkénti 0 vagy 0,01 Wattóránál kisebb értékeket nem küldöm az adatbázisba, feleslegesen foglalná a helyet. Ha kiszámoljuk a percenkénti 0,01Wh az csak 0,6 Wattperc, ami azt jelenti, hogy az egész napelem rendszer 0,6 Wattal ment egy percig, ez számomra elhanyagolható energia.
A tábla struktúráját a képeken láthatod, lehet hogy vannak benne a számodra feleslegesnek tűnő oszlopok mert ki lehetne számolni a már meglevő adatokból, de mindennek megvan a szerepe.
- id: Elsődleges kulcs, a bejegyzés identifikátora , automatikusan növekszik, nem lehet két egyforma
- power: [W] átlagos teljesítmény az egy perc alatt, lényegében a voltage és a current_hall szorzata
- voltage: [V] átlagos feszültség az egy perc alatt
- current: [A] ide az alternatív áramerőség mérő adatait szoktam rakni jelenleg ugyan az mint a current_hall
- current_hall: [A] A hall szenzor által mért áramerősség perces átlaga
- energy: [Wh] az egyperces átlagokból számolt egy perc alatt termelt energia
- energy_avr: [Wh] egy perc alatt termelt energia, ezt az arduino számolja másodperces mintavételezéssel, pontosabb, jobban követi az egy perc alatti ingadozásokat.
- datum: [YYYY-MM-DD] azt hiszem ez egyértelmű
- ido: [HH:MM:SS] szerintem ez is egyértelmű
- string: napelem füzér sorszáma, lényegében azt jelzi hogy melyik füzér van mérve. Jelen pillanatban csak egy van, de lehet hogy később majd lesz egy akkupakk füzér is.
- Wp: [W] Csúcsteljesítmény. Ez az a szám amit csak laboratóriumi körülmények között (1000W/m2, 20°C) ér el a rendszer, jelen pillanatban csak információs jelleggel bír, lehet hogy később majd felhasználom ezt az adatot.
2. ARDUINO program
Nagy szerencsémre az ARDUINO közösség nagyon sok példaprogramot tesz közzé. Ezek közé tartozik a http://arduino.cc/en/Tutorial/WebClientRepeating címen található web kliens, ami nem csinál más, mint 60 másodpercenként meghív egy weboldalt GET metódussal.
Pont ez kell nekem, 60 másodpercenként átadni paramétereket egy php-ben írt weboldalnak ami aztán feldolgozza az adatokat. A programot csak pár helyen kellet megváltoztatni és kibővíteni a saját számításaimmal és méréseimmel.
A változók, amikkel az ARDUINO dolgozik:
int sample;
long fA0,fA1,fA2,fA3,fA4,fA5,mWattsec,uWattsec,Voltage, Hall1,Hall2 ;
int divider = 11; // Voltage Divider 2k/20k
sample: hányszor mérte az adatokat a 60 másodperc alatt, ha 1 másodperces a mintavételezés, akkor természetesen ez 60
fA0,fA1,fA2,fA3,fA4,fA5: Az analóg bemeneteken átlaga a 60 másodperc alatt
mWattsec: a termelt enegia a 60 másodperc alatt [mWs - miliwattsekundum]
uWattsec: a termelt energia 1 másodperc alatt [uWs - mikrowattsekundum]
Hall1,Hall2: a két +-20A-os HALL senzoron mért áramerősség [mA]. 1mV ennél a típusnál 10mA-nak felel meg. Mivel az ARDUINO ebben a konfigurációban 4,88mV pontosságú akkor kb. +-50mA pontossággal tudok áramerősséget mérni. Itt azt kell még megemlítenem, hogy a szenzorok párhuzamosan vannak kötve így elméletileg +-40A-ig tudok mérni
divider: a feszültségosztó aránya 2k/20k –nál ez 11, szóval maximum 55V-ot tudok mérni az analóg porton.
A programot még kibővítettem annyival hogy kiirkáljon mindent a soros portra is hogy tudjam mi zajlik pontosan a program futása alatt, de ezt csak hibakeresésnél használom.
A webszerverre való adatok küldése ebben a sorban történik.
client.println("GET /ethershield_log/arduino.php?A0=" + String(fA0) + "&A1=" + String(fA1)+ "&A2=" + String(fA2) + "&A3="+ String(fA3)+ "&A4=" + String(fA4)+ "&A5=" + String(fA5)+ "&sec=" +String(postingInterval/1000) + "÷r=" + String(divider) + "&mWattsec=" +String(mWattsec));
Így első ránézésre kicsit bonyolultnak tűnik, de a végeredmény valami hasonló:
/ethershield_log/arduino.php?A0=512&A1=600&A2=601&A3=0&A4=0&A5=0&sec=60÷r=11&mWattsec=11565
Aki kicsit ért a HTML-hez az azonnal látja hogy ez egy arduino.php nevű oldal meghívása és GET metódussal 9 paraméter átadása.
A lényeg az, hogy az ARDUINO 60-szor mér és számol, aztán pedig átadja a kiszámolt értékeket, majd a weboldal válaszát kiírja a soros portra. Hogy mi a weboldal válasza, ezt majd a „PHP feldolgozó program” fejezetben boncolgatom.
3. PHP feldolgozó program
hamarosan ...