Arduino data online loggen

Arduino data online loggen

Gepubliceerd op: 02-12-2013 13:32 - Read this in English

Hé, jij houdt niet van advertenties maar wél van kwaliteitscontent? Dat mag, maar misschien wil je dan een donatie doen via PayPal of creditcard?

Of doe je aankopen via één van onze winkelpartner-links in de zijbalk.

Je hebt allerlei sensors aan je Arduino gehangen, en die kun je uitlezen via Serial, of misschien wel via een Ethernet Shield. Leuk, maar misschien wil je wel iets meer doen met je data? Dat kan! Door de data van je Arduino via het Ethernet Shield naar een webserver te sturen!

Dit artikel is min of meer een vervolg op dit artikel over het meten van je energieverbruik.

Beperkingen van de Arduino

Het geheugen en de processing power van een Arduino zijn beperkt. Als je echt uitgebreide visualisaties over periodes van maanden of jaren wilt tonen ontkom je er niet aan dit op een externe computer of server te doen. Omdat ik het zonde vind om thuis 24/7 een computer aan te hebben staan, en ik toch al de beschikking heb over een webserver waar mijn sites op draaien, log ik mijn Arduino sensordata ook naar deze webserver. In dit artikel zal ik beschrijven welke stappen je moet ondernemen om zelf je Arduino naar een externe server te laten loggen.

Allereerst heb je natuurlijk een Arduino nodig, met hieraan enkele sensoren. Ik maak gebruik van mijn Arduino domotica systeem, deze registreert de buitentemperatuur, binnentemperatuur en de zonlichtsterkte. Deze Arduino zit via een Ethernetshield gekoppeld aan een tweede Arduino in de meterkast, verantwoordelijk voor het bijhouden van het stroom- en gasverbruik. Hier kun je een Arduino Uno en aanverwante zaken kopen.

Data loggen via HTTP

Servers en clients op het internet praten met elkaar via HTTP - HyperText Transfer Protocol. Als je je Arduino met een webserver wilt laten praten zal hij dus ook HTTP moeten spreken. Wanneer je een webpagina opvraagt van een server stuur je een zogeheten GET-request, dit ziet er (versimpeld) als volgt uit:

GET /index.php HTTP/1.1
Host: www.engineerathome.com
Connection: close

De webserver zal nu als antwoord een code 200 OK sturen plus de inhoud van het bestand index.php.

In ons geval willen we niet alleen een bestand opvragen, maar ook data overbrengen van onze Arduino naar de server. Dit kunnen we doen door middel van GET-variabelen, zoals je kunt zien in het volgende voorbeeld:

GET /index.php?stroomverbruik=2.7&gasverbruik=3.1 HTTP/1.1
Host: www.engineerathome.com
Connection: close

Een GET-request versturen met de Arduino

Op de Arduino website vind je de juiste code om een webclient te bouwen. Deze webclient vraagt echter een statische pagina op. Door de webclient-sketch uit te breiden met onderstaande code kan ik een GET-request doen waarin de sensorwaardes als GET-variabelen worden meegestuurd.

if (client.connect(myServer, 80)) {
  client.print("GET /log.php?z=");
  client.print(sensorLicht);
  client.print("&tb=");
  client.print(sensorTempBuiten);
  client.print("&tk=");
  client.print(sensorTempKantoor);
  client.print("&s=");
  client.print(sensorStroom);
  client.print("&g=");
  client.print(sensorGas);
  client.println(" HTTP/1.1");
  client.println("Host: www.engineerathome.com");
  client.println("Connection: close");
  client.println();
  delay(100);
  client.stop();
}

De data verwerken op de webserver

Op de webserver bevindt zich het bestand log.php. Dit PHP-bestand verwerkt de binnenkomende data, en slaat de meetwaardes met een timestamp op in een mySQL-database op de webserver.

$zonlicht = $_GET["z"];
$tempbuiten = $_GET["tb"];
$tempkantoor = $_GET["tk"];
$stroom = $_GET["s"];
$gas = $_GET["g"];
$sql = mysql_query("INSERT INTO `data` (
  datetime,
  zonlicht,
  tempbuiten,
  tempkantoor,
  stroom,
  gas
) VALUES (
  '".date("Y-m-d H:i:s")."',
  '".$zonlicht."',
  '".$tempbuiten."',
  '".$tempkantoor."',
  '".$stroom."',
  '".$gas."'
)");

Grafieken tekenen vanuit de database

Als de gegevens eenmaal in de database staan kun je ze op allerlei manieren weergeven. Het eenvoudigst is inloggen op PHPMyAdmin op de server om de ruwe data in een tabel te bekijken. Leuker is het natuurlijk om hier een mooie pagina voor te bouwen die grafieken toont!

Door Arduino gelogde waardes in PHPMyAdmin

Met onderstaande code teken ik een staafdiagram van de zonlichtmetingen van de afgelopen 24 uur. Eerst bereken ik de maximale waarde, zodat ik de grafiek mooi kan schalen. Vervolgens haal ik de daadwerkelijk data op, en zorg ik ervoor dat de staven met de juist hoogte getekend worden.

$sqlmax = mysql_query("SELECT MAX(zonlicht) as maxi FROM `data` LIMIT 24");
$max = mysql_fetch_array($sqlmax);
$sqldata = mysql_query("SELECT s.uur, s.min, s.zonlicht FROM (SELECT HOUR(datetime) as uur, MINUTE(datetime) as min, zonlicht, datetime FROM `data` ORDER BY datetime DESC LIMIT 24) s ORDER BY datetime ASC");
while ($data = mysql_fetch_array($sqldata)) {
?>
<div class="bargraph">
<div style="height:<?=($data['zonlicht']/$max['maxi'])*100?>%;"><?=$data['zonlicht']?></div>
<span><?=$data['uur']?></span>
</div>
} ?>

De nogal ingewikkelde SQL-query is nodig omdat ik de laatste 24 metingen wil ophalen, dus aflopend op datum, maar ze vervolgens wel oplopend wil tonen. Op dezelfde manier verwerk ik ook de temperatuurmetingen wat resulteert in een pagina vol staafdiagrammen.

Staafdiagrammen van Arduino metingen gelogd op een externe server

Uiteraard kan je het zo gek maken als je wilt, ik teken bijvoorbeeld ook daggemiddeldes in een weekoverzicht, en maandgemiddeldes in een jaaroverzicht. Maar je zou ook gebruik kunnen maken van een plugin zoals Google Charts om lijngrafieken of taartdiagrammen te tekenen, of bij de verbruikscijfers van elektriciteit en gas direct de kosten uitrekenen met behulp van het hoog- en laagtarief.

23-08-2014: Hier vind je een compleet voorbeeld van het bestand log.php.

Meer van dit soort artikelen lezen?

Reageren