In de video zie je een simpel voorbeeld van hoe je een getal ophaalt van de Random API. Dit getal wordt getoond in een div en gebruikt om de breedte van die div aan te passen. Hier zie je nog een keer de volledige code:
HTML
<div id="blokje"></div>
CSS
#blokje {
background-color: red;
height: 50px;
}
JS
function reqListener () {
var getal = this.responseText.trim();
var blokje = document.querySelector("#blokje");
console.log(getal);
blokje.style.width = getal + "px";
blokje.innerHTML = getal;
}
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", "https://www.random.org/integers/?num=1&min=50&max=350&col=1&base=10&format=plain&rnd=new");
oReq.send();
Maak, als je dat nog niet hebt, een projectmap met bovenstaande code.
Vervang de url naar die van de cmd.camp IOT server, als volgt. In plaats van XXXXX plak je de key die je gekregen hebt.
oReq.open("GET", "https://cmd.camp/iot/get/XXXXX");
Als het goed is zou je nu in je site het getal moeten zien dat je er met de Arduino opgeslagen hebt. Of ga in een ander browservenster naar https://cmd.camp/iot/send/xxxxx/nnn (vervang xxxxx door de key die je hierboven gebruikt hebt en nnn door een willekeurig getal).
Als je in Chrome op Ctrl+Shift+J (Windows / Linux) of Cmd+Opt+J (Mac) drukt, opent de Console. Als je hier een getal (of een andere waarde) ziet, heb je een verbinding met de server gemaakt. Als je hier een rode foutmelding ziet, is er wat fout gegaan.
Goed:
Fout:
![]()
Het kan zijn dat je soms een getal krijgt, en soms een rode foutmelding. Dit heeft er mee te maken dat er niet altijd een stabiele verbinding met de API is. Dat ligt niet aan je code.
Dat je de waarde die uit de server komt in de console ziet, komt door dit zinnetje in je JavaScript:
console.log(getal);
console.log()
betekent: laat zien in de console. Developers gebruiken de console vaak om even iets te testen.
Natuurlijk is het niet handig dat je steeds moet verversen om de laatste waarde te zien. Daarom gaan we dat nu automatisch doen. In de vorige les heb je geleerd dat we daar setInterval
voor kunnen gebruiken.
Maak een functie van de laatste vier regels code in je script:
function serverGet() {
var oReq = new XMLHttpRequest();
oReq.addEventListener("load", reqListener);
oReq.open("GET", "https://cmd.camp/iot/get/XXXXX");
oReq.send();
}
Voeg buiten de functie deze code toe om de functie die je zojuist gemaakt hebt elke twee seconden te starten:
var timer = setInterval(serverGet, 2000);
Als het goed is zie je nu dat, als je Arduino een nieuwe waarde naar de server stuurt, dat getal na 2 seconde automatisch wordt bijgewerkt.
Je kunt met het getal ook een if-statement
gebruiken om de opmaak van de div aan te passen.
Plak dit onderaan in je reqListener functie:
if (getal > 500) {
SLIDER.style.backgroundColor = "red";
} else {
SLIDER.style.backgroundColor = "green";
}
transition: 1s;
toevoegt aan de CSS van het blokje, komt er na elke verandering een transitie van 1 seconde, zodat hij vloeiend van de ene naar de andere opmaak gaat.
We gaan nu een functie maken waarmee we met één druk op een knop een getal naar de server versturen, zodat de Arduino het kan ontvangen. Later kun je natuurlijk meer knoppen maken, of de knop vervangen door een range slider.
console.log("Klik!");
Controleer of je Klik! in de console ziet als je op de knop klikt.var server = new XMLHttpRequest();
server.open("GET", "https://cmd.camp/iot/send/yyyyy/180");
server.send();
Vervang yyyyy door de andere key die je hebt gekregen.
Je hebt twee keys gekregen, zodat je er eentje kunt gebruiken voor communicatie van de Arduino naar JS, en eentje voor JS naar Arduino.
180
in de browser ziet. Zo ja, dan werkt alles.0
naar dezelfde key stuurt.In dit voorbeeld wordt elke 2 seconden een getal van de server ontvangen. De hoogte van het getal bepaalt de lengte en de kleur van de div.
CSS
#SLIDER {
height: 20px;
transition: 1s;
}
JavaScript
var SLIDER = document.querySelector("#SLIDER");
function showResponse () {
console.log(this.responseText);
SLIDER.style.width = this.responseText + "px";
if (this.responseText > 500) {
SLIDER.style.backgroundColor = "red";
} else {
SLIDER.style.backgroundColor = "green";
}
}
function serverGet() {
var server = new XMLHttpRequest();
server.onload = showResponse;
server.open("GET", "https://cmd.camp/iot/get/xxxxx");
server.send();
}
var timer = setInterval(serverGet, 2000);
In dit voorbeeld zie je twee knoppen, waarmee je een 0 of een 1 naar de server kunt sturen. Handig voor een aan/uit schakelaar.
var KNOP1 = document.querySelector("#KNOP1");
var KNOP2 = document.querySelector("#KNOP2");
KNOP1.onclick = aan;
KNOP2.onclick = uit;
function aan() {
var server = new XMLHttpRequest();
server.open("GET", "https://cmd.camp/iot/send/yyyyy/1"); // stuur 1
server.send();
}
function uit() {
var server = new XMLHttpRequest();
server.open("GET", "https://cmd.camp/iot/send/yyyyy/0"); // stuur 0
server.send();
}
Met één druk op de knop eerst de ene waarde sturen, en 3 seconden later de andere waarde
var KNOP1 = document.querySelector("#KNOP1");
KNOP1.onclick = aan;
function aan() {
var server = new XMLHttpRequest();
server.open("GET", "https://cmd.camp/iot/send/yyyyy/1"); // stuur 1
server.send();
window.setTimeout(uit, 3000); // 3000 milliseconden wachten en dan uit() starten
}
function uit() {
var server = new XMLHttpRequest();
server.open("GET", "https://cmd.camp/iot/send/yyyyy/0"); // stuur 0
server.send();
}
In plaats van een schakelaar (1 of 0) kun je ook bijvoorbeeld een range
-input gebruiken om andere waarden te versturen. De minimale en maximale waarde van de range kun je zelf bepalen. Bijvoorbeeld om op de Arduino een servomotor van 0 tot 180 graden te laten draaien.
HTML
<input type="range" min="0" max="180" id="RANGE">
<div id="RESULT"></div>
JavaScript
var RANGE = document.querySelector("#RANGE");
var RESULT = document.querySelector("#RESULT");
RANGE.onchange = send;
function send() {
RESULT.innerHTML = RANGE.value; // laat de RANGE waarde zien in RESULT div
var server = new XMLHttpRequest();
server.open("GET", "https://cmd.camp/iot/send/yyyyy/" + RANGE.value); // verstuur de RANGE waarde naar de server
server.send();
}