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:

  1. ADATBÁZIS
  2. ARDUINO program
  3. PHP feldolgozó program
  4. PHP, Highcharts vizualizációs program

1. Adatbázis

db_scrshotMySQL 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

ARDUINO PROGI (teljes méret f-betű)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)  + "&divider=" + 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&divider=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 ...