title image

Besturing over Internet 

Arduino als internet client 

Youtube

Hoe kun je een Arduino gebruiken om iets te besturen via het Internet?
In dit artikel leg ik uit hoe je dat kunt doen. Maar!... let op! ... Als je op zoek bent naar home automation of domotica, dan zou ik eerst eens kijken naar de Rasberry Pi. Voor dat platform zijn hele mooie oplossingen te krijgen die volgens mij een stuk eenvoudiger zijn om te automatiseren. De Rasberry Pi 3 heeft standaard netwerk (bekabeld) en WiFi, dat maakt het erg makkelijk.

Scope van dit project


We gaan het dus niet hebben over volledige home automation.
Ik ga je laten zien hoe een Arduino gegevens van internet kan halen en daar iets mee kan doen.
In dit voorbeeld maken we een display die weergeeft hoeveel mensen er op dit moment in de ruimte zijn.

peopleInSpace

Bedraad, Goedkoop en eenvoudig


Eerst kijken we naar een bedrade oplossing, we gebruiken deze module.
     Ethernet Module
De ENC2860 ethernet module is een goedkope oplossing waarmee je arduino projecten aan het netwerk kan verbinden.
Voordelen:
+ Goedkoop
+ Klein
+ Werkt met 5 volt logica (geen 3.3 volt conversie nodig)

Nadelen
- Niet draadloos
- Geen TCP/IP Stack intern (zie tekst hieronder>

Deze heeft geen TCP/IP stack aan boord, dat wil zeggen dat de afhandeling van het netwerk verkeer volledig overgelaten word aan de Arduino. Dat kost behoorlijk wat ruimte in het programmageheugen en ook wat processor kracht.



Display Module


Ik gebruik deze display module:
display
te koop op ebay: LINK

Display Library


Ik gebruik deze Arduino library voor de aansturing:
zip file

Sketch 1


De eerste sketch (zie video) gebruikt de seriele monitor en laat het begin en einde van de spakketjes zien
Dit helpt om te analyseren in wel pakket de data zit.
De bron is www.howmanypeopleareinspacerightnow.com

Sketch 2


De tweede sketch is het complete project met www.howmanypeopleareinspacerightnow.com als bron.


Sketch 3


Het ophalen van de data is niet erg dynamisch of intelligent, als het formaat van de bron data een beetje verandert werkt het niet meer.
Daarom vertrouw ik liever op mijn eigen pagina. Ik heb een eigen pagina gemaakt die de data ophaalt vanaf howmanypeopleareinspacerightnow.com en weergeeft in een heel eenvoudig formaat.
Zie http://bartvenneker.nl/Arduino/peopleinspace.php.
De derde sketch is het complete project met http://bartvenneker.nl/Arduino/peopleinspace.php als bron.


Ik heb nog even een eenvoudig front paneeltje gemaakt, van karton.
Hier een foto van het eind produkt (tot nu toe).
peopleInSpace

De PHP Code


De arduino raadpleegt dus een php pagina op mijn eigen website.
Deze pagina haalt de gevens op van www.howmanypeopleareinspacerightnow.com en geeft die weer in een vereenvoudigde opmaak.
Dit is de php code van die pagina:

<?php
//  get the number of people in space from  /peopleinspace.json
//  Save the number to a local file.
//  If the files last modification time is less that one hour ago, then get the value from file
//  If the file is older, get the value from json and update the file
//
//  Output pis=5;1210;  
//  1210 is the time right now.


// Get the time
date_default_timezone_set("Europe/Amsterdam");
$localtime = localtime();

// declare the cache file
$file = "./piscount.txt";

// get the last modification time of the file
$lastmod = filemtime ( $file );

// calculate the difference between now and the last modification time in seconds
$dif = date_timestamp_get(date_create()) - $lastmod ;

// if the last modification time is more than 3600 seconds, get the value from the url
if ($dif > 3600 ) {
  // set the url
  $url="http://www.howmanypeopleareinspacerightnow.com/peopleinspace.json";

  // get the json content
  $jsontxt=@file_get_contents($url); 

  // Get the number value from the json result
  $count=json_decode($jsontxt,true)["number"]; 
  
  // write the number to the cache file
  file_put_contents($file, $count);  
}

// read the value from the cache file.
$count = file_get_contents($file);

// display the number of people is space
echo "pis=".$count.";";

// display the time
echo str_pad( $localtime[2] ,2,"0",STR_PAD_LEFT) . str_pad( $localtime[1] ,2,"0",STR_PAD_LEFT) . ";\r\n" . "<br>";

?>






Deel 2, Wifi.. Eindelijk draadloos


In deel 2 maak ik dit project opnieuw maar dan draadloos.



Ik maak gebruik van deze ESP2866 wifi serial module.
Hier is een ebay link naar die module: Link

esp2866_module

Sketch 1


In de video gebruik ik 2 sketches, dit is de eerste


Sketch 2

En hier is de tweede,


AT Commandos


Voor een volledige lijst met commando verwijs ik je graag de ESP8266 documentatie:
documentatie

In de video gebruik ik de volgende commandos

CommandoUitleg
AT+RSTReset de module
AT+UART_DEF=9600,8,1,0,0Configureer de module om te communiceren op 9600 baud, 8 databits, 1 stop bit, geen parity en geen flow controll
LET OP: Gerbuik geen spaties in dit commando
AT+CWMODE=nn=1 : Station mode (client) [deze gebruik ik]
n=2 : AP Mode (Server)
n=3 : Beide
AT+CWLAPGeeft een lijst met wifi netwerken in de omgeving
AT+CWJAP="ssid","password"Aanmelden bij netwerk. ssid is de netwerknaam, password is het wachtwoord
AT+CWQAPAfmelden bij een netwerk
AT+CIPSTART="TCP","bartvenneker.nl",80Zet een TCP verbinding op met host bartvenneker.nl op poort 80
AT+CIPSEND=69Stuur 69 bytes aan data in de nnu volgende tekst
GET http://www.bartvenneker.nl/Arduino/peopleinspace.php HTTP/1.0

Deel 3, sd Card reader voor configuratie


Wat nu als het wachtwoord of de ssid naam van de wifi veranderd? Dan moet je de wifi module opnieuw kunnen configureren.
Om dat mogelijk te maken koppelen we een sd card reader aan de arduino.
Bekijk de video!
voor de duidelijkheid: die sd card is dus slechts tijdelijk nodig, alleen om de module te configureren. Daarna mag je de sd card weer voor andere dingen gebruiken.



Sketch in deze video



Update, september 2017

Mijn website is door mijn provider verplaatst naar een andere server (in een ander datacentrum zelfs), lang verhaal kort: de response die arduino krijgt is nu een beetje anders waardoor mijn code niet helemaal goed meer werkte,
Om dat op te lossen heb ik de volgende regel toegevoegd in de code (zoek het maar op in de code hierboven)
if (cv=='=') {o=0;}

Update, mei 2018

Ik heb de bovenstaande Arduino sketch en de PHP code (ergens halverwege de pagina) ge-update.