Besturing over Internet |
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.
Bedraad, Goedkoop en eenvoudig
Eerst kijken we naar een bedrade oplossing, we gebruiken deze 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:
te koop op ebay: LINK
Display Library
Ik gebruik deze Arduino library voor de aansturing:
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 https://bartvenneker.nl/Arduino/peopleinspace.php.
De derde sketch is het complete project met https://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).
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="https://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
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:
In de video gebruik ik de volgende commandos
Commando | Uitleg |
---|---|
AT+RST | Reset de module |
AT+UART_DEF=9600,8,1,0,0 | Configureer 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=n | n=1 : Station mode (client) [deze gebruik ik] n=2 : AP Mode (Server) n=3 : Beide |
AT+CWLAP | Geeft een lijst met wifi netwerken in de omgeving |
AT+CWJAP="ssid","password" | Aanmelden bij netwerk. ssid is de netwerknaam, password is het wachtwoord |
AT+CWQAP | Afmelden bij een netwerk |
AT+CIPSTART="TCP","bartvenneker.nl",80 | Zet een TCP verbinding op met host bartvenneker.nl op poort 80 |
AT+CIPSEND=69 | Stuur 69 bytes aan data in de nnu volgende tekst |
GET https://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;}