Een nieuwe app (versie 4) voor de MKR1000..

In dit artikel heb ik laten zien hoe je de mkr1000 kunt laten schakelen met een eigengemaakte app, gemaakt via de online appinventor van het MIT (Massachusetts Institute of Technology).

De volgende app is een verbeterde versie hiervan.

Nu kun je op het instelscherm kiezen door middel van een vinkje hoeveel bedienings-knoppen je op het hoofdscherm wilt zien. De aan/uit status van de schakelknoppen wordt nu ook onthouden. Hiermee is de app weer een stukje universeler geworden….

Zo ziet het er dan uit op het scherm van een tablet of telefoon:

Screenshot_2017-05-14-16-02-53
De app kun je hier downloaden.

De code die de MKR1000 nodig heeft is dezelfde als bij versie V2:

 

/*
mkr1000_ledtest_version_2
This is the initial test program for the mkr1000 board from Arduino.
Three LEDs can be switched ON and OFF via WiFi commands.
This program is based on the original program described
in chapter 5.5.2 of the "Arduino and Genuino
MKR1000 Development Workshop 2016" from Agus Kurniawan.
However updated with 7 LEDs connected between output pins D1..D7 via 1kOhm resistors and GND.
If you want to know more about the mkr1000 board,
see https://www.arduino.cc/en/Main/ArduinoMKR1000

modified and improved  april 2017
by Alex Pikkert

Improvements:
. fixed IP address for the mkr1000
. one white LED on port D6 showing "trying to connect"
. one green LED on port D7 showing "connected"
. five ports (D1...D5) that can be switched ON/OFF independent from each other
. automatic reconnection when wiFi goes down and returns
. no connection failures with quick commands
. all C++ commands are removed, only use of standard Arduino commands
*/

#include <WiFi101.h>

int port1 = 1;
int port2 = 2;
int port3 = 3;
int port4 = 4;
int port5 = 5;
int led1 = 6;//White led (trying to connect to WiFi)
int led2 =7;//Green led (WiFi connected)
int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;
int val5 = 0;

int portreq = 0;
String req;
String s;

// Add here your local WiFi network data:
//*********************************************************
IPAddress ip(xxx,xxx,xxx,xxx);// CHANGE INTO YOUR IP ADDRESS
const char* ssid = "xxxxxx"; // CHANGE INTO YOUR NETWORK NAME
const char* password = "xxxxxx"; // CHANGE INTO YOUR SECRET PASSWORD
//*********************************************************

int status = WL_IDLE_STATUS;
WiFiServer server(80);

void setup() {
Serial.begin(9600);
delay(10);

// prepare GPIO pins
pinMode(port1, OUTPUT);
pinMode(port2, OUTPUT);
pinMode(port3, OUTPUT);
pinMode(port4, OUTPUT);
pinMode(port5, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);

digitalWrite(port1, 0);
digitalWrite(port2, 0);
digitalWrite(port3, 0);
digitalWrite(port4, 0);
digitalWrite(port5, 0);
digitalWrite(led1, 0);
digitalWrite(led2, 0);

delay(5000);
}

void loop() {
// Try to connect to the WiFi network
if (WiFi.status() != WL_CONNECTED)
{ConnectWiFi();}

// Wait here until a client has connected
WiFiClient client = server.available();
if (!client) {return;}

// if connected, Wait until the client sends some data
Serial.println("new client");
if(!client.available()){delay(100);}

// Read the first line of the request
req = client.readStringUntil('\r');
Serial.println(req);
client.flush();

// Match the request to switch the leds
if (req.indexOf("/port1/0") != -1)
{val1 = 0;portreq = 1;}
else
if (req.indexOf("/port1/1") != -1)
{val1 = 1;portreq = 1;}
else
if (req.indexOf("/port2/0") != -1)
{val2 = 0;portreq = 2;}
else
if (req.indexOf("/port2/1") != -1)
{val2 = 1;portreq = 2;}
else
if (req.indexOf("/port3/0") != -1)
{val3 = 0;portreq = 3;}
else
if (req.indexOf("/port3/1") != -1)
{val3 = 1;portreq = 3;}
else
if (req.indexOf("/port4/0") != -1)
{val4 = 0;portreq = 4;}
else
if (req.indexOf("/port4/1") != -1)
{val4 = 1;portreq = 4;}
else
if (req.indexOf("/port5/0") != -1)
{val5 = 0;portreq = 5;}
else
if (req.indexOf("/port5/1") != -1)
{val5 = 1;portreq = 5;}
else
{Serial.println("invalid request");
client.stop();
return;
}

// Set the output pins according to the request
digitalWrite(port1,val1);
digitalWrite(port2,val2);
digitalWrite(port3,val3);
digitalWrite(port4,val4);
digitalWrite(port5,val5);
client.flush();

// Prepare the HTML response
s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
if(portreq==1 && val1==0)
{s += "port1 switched OFF ";}
if(portreq==1 && val1==1)
{s += "port1 switched ON ";}

if(portreq==2 && val2==0)
{s += "port2 switched OFF ";}
if(portreq==2 && val2==1)
{s += "port2 switched ON ";}

if(portreq==3 && val3==0)
{s += "port3 switched OFF ";}
if(portreq==3 && val3==1)
{s += "port3 switched ON ";}

if(portreq==4 && val4==0)
{s += "port4 switched OFF ";}
if(portreq==4 && val4==1)
{s += "port4 switched ON ";}

if(portreq==5 && val5==0)
{s += "port5 switched OFF ";}
if(portreq==5 && val5==1)
{s += "port5 switched ON ";}

s += "</html>\n";

// Send the HML response to the client
client.print(s);
delay(100);
client.stop();
Serial.println("Client disconnected");
}

// Subprogram to connect to the WiFi network
void ConnectWiFi(){
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, password);
digitalWrite(led2,0);digitalWrite(led1,1);

// wait 5 seconds for connection:
delay(5000);
WiFi.config(ip);
Serial.println("");
Serial.println("WiFi connected");

// Start the server
server.begin();
Serial.println("Server started");
digitalWrite(led2,1);digitalWrite(led1,0);

// Print the IP address
IPAddress ip = WiFi.localIP();
Serial.println(ip);
}

Advertenties

MKR1000 WiFi lampschakelaar

Ledjes in- en uitschakelen is leuk, maar het echt bedienen van apparaten in je huiskamer is nog veel leuker….

Met de handige app om de MKR1000 te schakelen (zie hier) kun je eenvoudig een aantal apparaten binnen je WiFi omgeving bedienen, als je in plaats van ledjes per apparaat een relaitje aansluit. Bijvoorbeeld  het Single Relay Board (#27115) van Parallax Inc. kun je rechtstreeks op de MKR1000 aansluiten:

relais

Hiermee kun je tot maximaal 250 Volt AC en 10 Ampere iets in- en uitschakelen.

Je kunt het eenvoudig op een houten bordje schroeven samen met de MKR1000 en een contactdoos voor de aansluiting van wat je maar wilt. De MKR1000 moet dan wel via een 5 Volt voedingssteker via USB-C aangesloten worden.

DSD_3250

Dit mini relais is ook te koop in een viervoudige of zelfs achtvoudige variant, zie hier.

Dit is het aansluitschema:

 

MKR1000 wifi lamp control.jpg

 

 


 

Een nieuwe app (versie 2) voor de MKR1000

In dit artikel heb ik laten zien hoe je de mkr1000 kunt laten schakelen met een eigengemaakte app, gemaakt via de online appinventor van het MIT (Massachusetts Institute of Technology).

De volgende app is een verbeterde versie hiervan. Nu kun je 5 verschillende apparaten in- en uitschakelen met je Android tablet of telefoon. Het IP adres dat de MKR1000 gebruikt kun je in deze app op een apart instelscherm opslaan, net zoals de namen van de vijf apparaten die je kunt in- en uitschakelen en op welke poort ze aangesloten zijn. Deze vernieuwde app kun je  hier downloaden.

Zo ziet het er dan uit op het scherm van een tablet of telefoon:

En dit is een gedeelte van de “block programmering” in de App inventor 2 van het MIT, waarin je kunt zien wat er gebeurt als je op de bovenste schermknop drukt (D1x):
In het kort komt het er op neer dat het IP adres aangeroepen wordt met
http://IPADRES/portPINNUMMER/0 om de poort uit te schakelen en
http://IPADRES/portPINNUMMER/1 om de poort in te schakelen.
Ook wordt aan het eind de benaming op de knop (ON of OFF) en de achtergrondkleur (rood of groen) omgezet.

V2 block1.png

DSD_3248

Deze app en de vorige versie staan allebei ook in de galerij bij het MIT, waar je ze kunt downloaden en bewerken.
Tenslotte kun je hier het Arduino programma bekijken en kopieren dat in de MKR1000 gezet moet worden:

/*
mkr1000_ledtest_version_2
This is the initial test program for the mkr1000 board from Arduino.
Three LEDs can be switched ON and OFF via WiFi commands.
This program is based on the original program described
in chapter 5.5.2 of the "Arduino and Genuino
MKR1000 Development Workshop 2016" from Agus Kurniawan.
However updated with 7 LEDs connected between output pins D1..D7 via 1kOhm resistors and GND.
If you want to know more about the mkr1000 board,
see https://www.arduino.cc/en/Main/ArduinoMKR1000

modified and improved  april 2017
by Alex Pikkert

Improvements:
. fixed IP address for the mkr1000
. one white LED on port D6 showing "trying to connect"
. one green LED on port D7 showing "connected"
. five ports (D1...D5) that can be switched ON/OFF independent from each other
. automatic reconnection when wiFi goes down and returns
. no connection failures with quick commands
. all C++ commands are removed, only use of standard Arduino commands
*/

#include <WiFi101.h>

int port1 = 1;
int port2 = 2;
int port3 = 3;
int port4 = 4;
int port5 = 5;
int led1 = 6;//White led (trying to connect to WiFi)
int led2 =7;//Green led (WiFi connected)
int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;
int val5 = 0;

int portreq = 0;
String req;
String s;

// Add here your local WiFi network data:
//*********************************************************
IPAddress ip(xxx,xxx,xxx,xxx);// CHANGE INTO YOUR IP ADDRESS
const char* ssid = "xxxxxx"; // CHANGE INTO YOUR NETWORK NAME
const char* password = "xxxxxx"; // CHANGE INTO YOUR SECRET PASSWORD
//*********************************************************

int status = WL_IDLE_STATUS;
WiFiServer server(80);

void setup() {
Serial.begin(9600);
delay(10);

// prepare GPIO pins
pinMode(port1, OUTPUT);
pinMode(port2, OUTPUT);
pinMode(port3, OUTPUT);
pinMode(port4, OUTPUT);
pinMode(port5, OUTPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);

digitalWrite(port1, 0);
digitalWrite(port2, 0);
digitalWrite(port3, 0);
digitalWrite(port4, 0);
digitalWrite(port5, 0);
digitalWrite(led1, 0);
digitalWrite(led2, 0);

delay(5000);
}

void loop() {
// Try to connect to the WiFi network
if (WiFi.status() != WL_CONNECTED)
{ConnectWiFi();}

// Wait here until a client has connected
WiFiClient client = server.available();
if (!client) {return;}

// if connected, Wait until the client sends some data
Serial.println("new client");
if(!client.available()){delay(100);}

// Read the first line of the request
req = client.readStringUntil('\r');
Serial.println(req);
client.flush();

// Match the request to switch the leds
if (req.indexOf("/port1/0") != -1)
{val1 = 0;portreq = 1;}
else
if (req.indexOf("/port1/1") != -1)
{val1 = 1;portreq = 1;}
else
if (req.indexOf("/port2/0") != -1)
{val2 = 0;portreq = 2;}
else
if (req.indexOf("/port2/1") != -1)
{val2 = 1;portreq = 2;}
else
if (req.indexOf("/port3/0") != -1)
{val3 = 0;portreq = 3;}
else
if (req.indexOf("/port3/1") != -1)
{val3 = 1;portreq = 3;}
else
if (req.indexOf("/port4/0") != -1)
{val4 = 0;portreq = 4;}
else
if (req.indexOf("/port4/1") != -1)
{val4 = 1;portreq = 4;}
else
if (req.indexOf("/port5/0") != -1)
{val5 = 0;portreq = 5;}
else
if (req.indexOf("/port5/1") != -1)
{val5 = 1;portreq = 5;}
else
{Serial.println("invalid request");
client.stop();
return;
}

// Set the output pins according to the request
digitalWrite(port1,val1);
digitalWrite(port2,val2);
digitalWrite(port3,val3);
digitalWrite(port4,val4);
digitalWrite(port5,val5);
client.flush();

// Prepare the HTML response
s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
if(portreq==1 && val1==0)
{s += "port1 switched OFF ";}
if(portreq==1 && val1==1)
{s += "port1 switched ON ";}

if(portreq==2 && val2==0)
{s += "port2 switched OFF ";}
if(portreq==2 && val2==1)
{s += "port2 switched ON ";}

if(portreq==3 && val3==0)
{s += "port3 switched OFF ";}
if(portreq==3 && val3==1)
{s += "port3 switched ON ";}

if(portreq==4 && val4==0)
{s += "port4 switched OFF ";}
if(portreq==4 && val4==1)
{s += "port4 switched ON ";}

if(portreq==5 && val5==0)
{s += "port5 switched OFF ";}
if(portreq==5 && val5==1)
{s += "port5 switched ON ";}

s += "</html>\n";

// Send the HML response to the client
client.print(s);
delay(100);
client.stop();
Serial.println("Client disconnected");
}

// Subprogram to connect to the WiFi network
void ConnectWiFi(){
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, password);
digitalWrite(led2,0);digitalWrite(led1,1);

// wait 5 seconds for connection:
delay(5000);
WiFi.config(ip);
Serial.println("");
Serial.println("WiFi connected");

// Start the server
server.begin();
Serial.println("Server started");
digitalWrite(led2,1);digitalWrite(led1,0);

// Print the IP address
IPAddress ip = WiFi.localIP();
Serial.println(ip);
}

Een eigen app voor de MKR1000

In dit artikel heb ik laten zien hoe je de mkr1000 kunt laten schakelen met commandoregels via de browser. Dat is niet echt een handige manier, om het iets werkbaarder te maken zou je bijvoorbeeld deze regels op kunnen slaan als favoriet op het scherm.
Maar een veel mooiere manier om de mkr1000 te bedienen is met een appje. Hoe kom je daaraan? In de Google Playstore is op dit gebied momenteel geen enkele app te vinden, ik vond alleen een paar Arduino boeken van Agus Kurniawan….

Zelf een appje maken kan heel goed met behulp van de online appinventor van het MIT (Massachusetts Institute of Technology). het MIT is een van de meest prestigieuze technische universiteiten ter wereld, gevestigd in Cambridge (Massachusetts) en heeft zo’n 10.000 studenten.

Wat is de MIT App Inventor?
De MIT App Inventor gebruikt een innovatieve manier voor het online programmeren  van apps omdat het de complexe programmeertaal taal in visuele, drag-and-drop bouwstenen omzet. Met deze eenvoudige grafische interface kun je zonder programmeerervaring volledig functionele apps maken. Alle apps staan bij het MIT in de cloud totdat je een app omzet in een APK bestand dat je daarna lokaal kunt installeren op  je tablet of telefoon. Mijn uitleg is gebaseerd op het gebruik van Windows 10 op de PC  en Android 6.01 op mijn tablet.

Ga om te beginnen naar de website http://appinventor.mit.edu/explore/
Je hebt een Google account nodig om in te kunnen loggen.

 

Klik op de oranje button “create apps!” rechtsbovenin en log vervolgens in met je Google account. Daarna kom je via je persoonlijke app overzicht op het designer hoofdscherm van de MIT app inventor 2 terecht.
Een uitgebreide uitleg van dit scherm staat hier.
Ook ontbreekt het niet aan uitgebreide tutorials met heel veel voorbeelden, zie hier.

Schermafdruk 2017-04-06 15.24.13

Vanuit het palette overzicht aan de linkerkant kun je alle elementen naar het scherm in het midden slepen. Die worden dan ook zichtbaar in het Components overzicht en daarna kun je de eigenschappen per element aanpassen in het Properties overzicht. Als je alle elementen geplaatst en goedgezet hebt kun je naar het “blocks ” scherm gaan met de Blocks button rechtsbovenin.

Screenshot_2017-04-10-11-56-29.png

Door in het Blocks overzicht aan de linkerkant een element aan te klikken kun je de bijbehorende blocks oproepen, in het scherm plaatsen en aanpassen.

Screenshot_2017-04-10-12-04-36.png

Tijdens het programmeren kun je on the fly zien wat het effect is door je telefoon of tablet met het programma te koppelen. Installeer hiervoor eerst de app MIT AI2 Companion uit de Google Playstore op je telefoon of tablet. Als je die app start en vervolgens in het programma ook de AI Companion start met de button “Connect” linksbovenin dan krijg je een 6 letter code die je vervolgens op je tablet of telefoon in kunt vullen. Daarna zie je de app verschijnen en alle wijzigingen die je daarna aanbrengt worden direct zichtbaar.

companion

 

 

Als voorbeeld laat ik hier zien hoe een van de schermbuttons geprogrammeerd is:

button1

Als er op button1 geklikt wordt en de tekst op de button is “switch ON” dan wordt de commandoregel naar het IP adres van de mkr1000 gestuurd om de blauwe led in te schakelen. Vervolgens wordt de tekst op de button veranderd in “switch OFF” en wordt de achtergrondkleur van button4 blauw gemaakt. Button4 is een ronde button die verder niet actief is en alleen de status van de blauwe led op het scherm aangeeft (blauw = AAN). Als de tekst op button1 niet “switch ON” was dan wordt het ELSE statement uitgevoerd. Hierin zit de commandoregel voor de mkr1000 om de blauwe led uit te schakelen, de tekst te veranderen in “switch ON” en button4 grijs te maken, wat aangeeft dat de led uitgeschakeld is. De terugkoppeling uit de mkr1000 verschijnt ook op het scherm (bijvoorbeeld Blue led switched ON).

OK!

Zie hier tenslotte de WiFi bediening van de mkr1000 in aktie:

 

 


 

MKR1000 testen met leds

workshopIn deze post laat ik zien hoe je de uitgangen van de mkr1000 kunt schakelen via een WiFi signaal. Een handig boek om de eerste stappen te zetten is het boek van Agus Kurniawan “Arduino and Genuino MKR1000 Development workshop” Daarin zit een mooi voorbeeld in hoofdstuk 5.5.2 “writing program” dat ik als uitgangspunt voor het onderstaande programma gebruikt heb. Klik op het boek om naar AMAZON te gaan).
Het programma werkt in grote lijnen als volgt: Stuur met een browser een regel met code naar het IP adres van de mkr1000  en schakel daarmee een uitgang (in dit geval een van de uitgangen D1 tot en met D5) hoog of laag.

Om dit te demonstreren heb ik een vijftal gekleurde leds aangesloten, je kunt je voorstellen dat met gebruik van relais in plaats van deze leds dat je oneindig veel andere apparaten op deze manier kunt in- en uitschakelen. Het sturen van een coderegel met een browser is onhandig en natuurlijk uiteindelijk niet de bedoeling, in een volgende post zal ik ik laten zien hoe je dit met een zelfgemaakt appje veel gemakkelijker kunt doen. De mogelijkheden zijn onbegrensd….

De leds zijn aangesloten op D1 tot en met D5 via een weerstandje van 1000 Ohm naar de GND (massa)  aansluiting. De mkr1000 werkt inwendig met 3.3 Volt, pas dus op om daar geen andere spanning op aan te sluiten.

Dit is het Arduino programma uiteindelijk geworden:

/*
mkr1000_ledtest
This is the initial test program for the mkr1000 board from Arduino.
Three LEDs can be switched ON and OFF via WiFi commands.
This program is based on the original program described
in chapter 5.5.2 of the "Arduino and Genuino
MKR1000 Development Workshop 2016" from Agus Kurniawan.

However updated with 5 LEDs connected between output pins D1..D5 via 1kOhm resistors and GND.
If you want to know more about the mkr1000 board,
see https://www.arduino.cc/en/Main/ArduinoMKR1000

modified and improved  april 2017
by Alex Pikkert

Improvements:
. fixed IP address for the mkr1000
. one white LED showing "trying to connect"
. one green LED showing "connected"
. three LEds (blue, red and yellow) switching ON/OFF independent from each other
. automatic reconnection when wiFi goes down and returns
. no connection failures with quick commands
. all C++ commands are removed, only use of standard Arduino commands
. LEDs connected via 1 kOhm resistors instead of directly on outputs
*/

#include <WiFi101.h>

int led1 = 5;//Yellow led
int led2 = 4;//Red led
int led3 = 3;//Blue led
int led4 = 2;//White led (trying to connect to WiFi)
int led5 = 1;//Green led (WiFi connected)
int val1 = 0;
int val2 = 0;
int val3 = 0;
int ledreq = 0;
String req;
String s;

// Add here your local WiFi network data:
//*********************************************************
IPAddress ip(192,168,0,103);// CHANGE INTO YOUR IP ADDRESS
const char* ssid = "YOUR NETWORK NAME";
const char* password = "YOUR SECRET PASSWORD";
//*********************************************************

int status = WL_IDLE_STATUS;
WiFiServer server(80);

void setup() {
Serial.begin(9600);
delay(10);

// prepare GPIO pins
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
digitalWrite(led1, 0);
digitalWrite(led2, 0);
digitalWrite(led3, 0);
digitalWrite(led4, 0);
digitalWrite(led5, 0);
delay(5000);
}

void loop() {
// Try to connect to the WiFi network
if (WiFi.status() != WL_CONNECTED)
{ConnectWiFi();}

// Wait here until a client has connected
WiFiClient client = server.available();
if (!client) {return;}

// if connected, Wait until the client sends some data
Serial.println("new client");
if(!client.available()){delay(100);}

// Read the first line of the request
req = client.readStringUntil('\r');
Serial.println(req);
client.flush();

// Match the request to switch the leds
if (req.indexOf("/gpio1/0") != -1)
{val1 = 0;ledreq = 1;}
else
if (req.indexOf("/gpio1/1") != -1)
{val1 = 1;ledreq = 1;}
else
if (req.indexOf("/gpio2/0") != -1)
{val2 = 0;ledreq = 2;}
else
if (req.indexOf("/gpio2/1") != -1)
{val2 = 1;ledreq = 2;}
else
if (req.indexOf("/gpio3/0") != -1)
{val3 = 0;ledreq = 3;}
else
if (req.indexOf("/gpio3/1") != -1)
{val3 = 1;ledreq = 3;}
else
{Serial.println("invalid request");
client.stop();
return;
}

// Set the output pins according to the request
digitalWrite(led1, val1);
digitalWrite(led2, val2);
digitalWrite(led3, val3);
client.flush();

// Prepare the HTML response
s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
if(ledreq==1 && val1==0)
{s += "Yellow led switched OFF ";}
if(ledreq==1 && val1==1)
{s += "Yellow led switched ON ";}

if(ledreq==2 && val2==0)
{s += "Red led switched OFF ";}
if(ledreq==2 && val2==1)
{s += "Red led switched ON ";}

if(ledreq==3 && val3==0)
{s += "Blue led switched OFF ";}
if(ledreq==3 && val3==1)
{s += "Blue led switched ON ";}
s += "</html>\n";

// Send the HML response to the client
client.print(s);
delay(100);
client.stop();
Serial.println("Client disconnected");
}

// Subprogram to connect to the WiFi network
void ConnectWiFi(){
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
status = WiFi.begin(ssid, password);
digitalWrite(led5,0);digitalWrite(led4,1);

// wait 5 seconds for connection:
delay(5000);
WiFi.config(ip);
Serial.println("");
Serial.println("WiFi connected");

// Start the server
server.begin();
Serial.println("Server started");
digitalWrite(led5,1);digitalWrite(led4,0);

// Print the IP address
IPAddress ip = WiFi.localIP();
Serial.println(ip);
}

Ik heb wel een paar verbeteringen aangebracht:

In het boek worden de ledjes rechtstreeks op de uitgangen aangesloten, zonder tussenweerstand. Dit is niet echt handig, principieel moet een led via een weerstand aangesloten worden om elk risico van kortsluiting of overbelasting te voorkomen..

IPAddress ip(192,168,0,103);// CHANGE INTO YOUR IP ADDRESS

Met deze regel krijgt de mkr1000 een vast IP adres. Dat is veel handiger omdat bij het wegvallen van de WiFi verbinding de router soms een ander IP adres wil toekennen en dan werkt de aansturing dus niet meer. Nu zal de router altijd het genoemde adres gebruiken.

void loop() {
// Try to connect to the WiFi network
if (WiFi.status() != WL_CONNECTED)
{ConnectWiFi();}

In het oorspronkelijke programma stond het verbinden met het netwerk in de setup, waardoor het slechts eenmaal bij aanzetten doorlopen werd. Bij het wegvallen van de verbinding wordt er dan geen nieuw contact gezocht en stopt het programma.
Ik heb dit deel in een subprogramma (ConnectWiFi) ondergebracht dat elke keer in de hoofdloop aangeroepen wordt, zodat er steeds een nieuwe verbinding tot stand komt als de WiFi uitvalt en weer terugkomt.
In dit subprogramma worden twee leds aangestuurd, zolang er gezocht wordt licht de witte led op D2 op en als de verbinding tot stand gebracht is gaat de groene led op D1 aan. Je kunt ook het verloop bekijken in de IDE monitor als je de mkr1000 op de PC aansluit.

// Set the output pins according to the request
digitalWrite(led1, val1);
digitalWrite(led2, val2);
digitalWrite(led3, val3);
client.flush();

Hier worden de leds in- en uitgeschakeld, in het oorspronkelijke programma kon slechts een led tegelijk aan zijn, hier kunnen ze wel onafhankelijk van elkaar oplichten.

// Try to connect to the WiFi network
if (WiFi.status() != WL_CONNECTED)

In het oorspronkelijke programma was dit een WHILE statement, om onduidelijke redenen zorgde dit voor constant vastlopen. Vervang dit door een IF statement en het werkt zonder vastlopen. != WL_CONNECTED betekent doe het IF statement zolang de status van het netwerk ongelijk aan WL_CONNECTED is (dus zolang er nog GEEN verbinding is).

Tenslotte heb ik een aantal coderegels die in C++ geschreven waren vervangen door standaard in de Arduino library aanwezige code. Blijkbaar slikt de IDE ook C++, wat voor langdurig puzzelwerk kan zorgen als je wilt begrijpen hoe het werkt en je niet echt bekend bent met C++….

Dit zijn de commandoregels die je moet gebruiken in de browser om de leds in- en uit te schakelen: (wel eerst het IP adres vervangen door je eigen toegepaste IP adres en de juiste netwerknaam (SSID) en het wachtwoord invullen voordat je het programma in de mkr1000 laadt).

192.168.0.103/gpio1/0

Dit schakelt led1 (geel) op D5 uit.
Vervang de “1” door een “2” voor de rode led op D4 of een “3” voor de blauwe led op D3.
Vervang de “/0” door “/1” om de led in te schakelen.

Als je een en ander wilt vergelijken, hier is het oorspronkelijke programma:

#include <WiFi101.h>

int led1 = 6;
int led2 = 4;
int led3 = 3;

const char* ssid = "ssid";
const char* password = "ssid_key";
int status = WL_IDLE_STATUS;

WiFiServer server(80);

void setup() {
  Serial.begin(9600);
  delay(10);

  // prepare GPIO5
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  digitalWrite(led1, 0);
  digitalWrite(led2, 0);
  digitalWrite(led3, 0);
  // Connect to WiFi network
 while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, password);

    // wait 10 seconds for connection:
    delay(10000);
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  char ips[24];
  IPAddress ip = WiFi.localIP();
  sprintf(ips, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
  Serial.println(ips);
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }

  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }

  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();

  // Match the request
  int val1 = 0;
  int val2 = 0;
  int val3 = 0;
  int ledreq = 0;
  if (req.indexOf("/gpio1/0") != -1) {
    val1 = 0;
    ledreq = 1;
  }
  else if (req.indexOf("/gpio1/1") != -1) {
    val1 = 1;
    ledreq = 1;
  }
  else if (req.indexOf("/gpio2/0") != -1) {
    val2 = 0;
    ledreq = 2;
  }
  else if (req.indexOf("/gpio2/1") != -1) {
    val2 = 1;
    req = 2;
  }
  else if (req.indexOf("/gpio3/0") != -1) {
    val3 = 0;ledreq = 3;
  }
  else if (req.indexOf("/gpio3/1") != -1) {
    val3 = 1;
    ledreq = 3;
  }
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(led1, val1);
  digitalWrite(led2, val2);
  digitalWrite(led3, val3);

  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\n";
  if(ledreq==1) {
    s += "LED1 is ";
    s += (val1)? "ON": "OFF";
  }else if(ledreq==2) {
    s += "LED2 is ";
    s += (val2)? "ON": "OFF";
  }else if(ledreq==3) {
    s += "LED3 is ";
    s += (val3)? "ON": "OFF";
  }
  s += "</html>\n";
  // Send the response to the client
  client.print(s);
  delay(1);
  client.stop();
  Serial.println("Client disonnected");

}

De MKR1000 installeren in de IDE

genuino-mkr1000-gbx00004-596

In deze post beschrijf ik het installeren van de mkr1000 om met het programmeren te kunnen beginnen.

In de standaard IDE van Arduino (versie 1.8.2) zitten op dit moment nog geen voorzieningen om de mkr1000 te kunnen gebruiken, ik zal daarom stap voor stap laten zien hoe je dit wel voor elkaar kunt krijgen.

Download daarvoor eerst de standaard programmeeromgeving (de IDE oftewel de  Integrated Development Environment) van Arduino op https://www.arduino.cc/en/Main/Software.

mkr1000setup12

De volgende stap is het installeren van de benodigde Wifi101 bibliotheek in de IDE.
Ga hiervoor naar “schets-bibliotheek gebruiken-bibliotheek beheren”.

mkr1000setup1

Scroll vervolgens in de lijst naar beneden tot je de WiFi101 bibliotheek vindt.
De bibliotheek heeft versie 0.14.0.

mkr1000setup2

Klik vervolgens op “more info” en het knopje “installeren” verschijnt.

mkr1000setup3

Klik op installeren en deze bibliotheek verschijnt daarna in de lijst met geïnstalleerde bibliotheken.

mkr1000setup4

De laatste stap is het toevoegen van de mkr1000 zelf.
Ga hiervoor naar “hulpmiddelen-board-bordenbeheerder”.
mkr1000setup5

Zoek uit de lijst van borden de “Arduino SAMD Boards (32-bits ARM Cortex-M0+) op.
Klik dan op “More info” en “installeren” om dit board (versie 1.6.13) te installeren.

mkr1000setup7

Daarna verschijnt de mkr1000 in het bordoverzicht.
Zie “Hulpmiddelen-Board-Arduino/Genuino MKR1000”.

mkr1000setup8

Sluit de mkr1000 op de USB poort van de PC aan, klik het bord aan in de IDE en ga tenslotte naar de poortinstelling “Hulpmiddelen-Poort” en vink de poort aan waarbij de mkr1000 nu genoemd is.
mkr1000setup9

Nu kun je de mkr1000 gaan testen. Start hiervoor het standaard in de IDE aanwezige testprogrammaatje “Blink” (te vinden via “Bestand-Voorbeelden-01.Basics_Blink”)

mkr1000setup10

Omdat de mkr1000 (tenminste in mijn geval) al voorzien is van het blink programma bij levering, kun je de test het beste uitvoeren met een gewijzigde blinkfrequentie.
Pas hiervoor de tijdinstelling van het knipperen aan door de delayfactor van 1000 in regel 31 en 33 te veranderen in bijvoorbeeld 100:

Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino model, check
  the Technical Specs of your board  at https://www.arduino.cc/en/Main/Products

  This example code is in the public domain.

  modified 8 May 2014
  by Scott Fitzgerald

  modified 2 Sep 2016
  by Arturo Guadalupi

  modified 8 Sep 2016
  by Colby Newman
*/

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(100);                       // wait for a second
}

 

Het programma maakt gebruik van een standaard variabele “LED_BUILTIN” waarmee van elk type bord de ingebouwde Led aangestuurd wordt. Bij de mkr1000 zit deze Led op D6 en wordt nu met deze variabele aangestuurd.

Kopieer het bovenstaande programma en laad het in de mkr1000 en als alles goedgegaan is zal deze de ingebouwde Led op D6 snel laten knipperen.
Zo. Nu is de mkr1000 gereed om mee te werken. Wordt vervolgd……

MKR1000 aansluiten

Om het bordje makkelijk te kunnen aansluiten heb ik in plaats van de male headers die bijgeleverd worden female headers gebruikt. Het bordje heb ik vervolgens op een plaatje plexiglas gemonteerd met vier boutjes M2 (ja, die bestaan echt) en er een breadboardje naast geplakt. Zo is er lekker veel ruimte voor extra componenten om mee te experimenteren.

De Arduino MKR1000 is ontworpen om een praktische en betaalbare oplossing te bieden om WiFi connectiviteit aan projecten toe te voegen zonder dat diepgaande kennis van netwerken nodig is. Het bord heeft een Li-Po laadcircuit waarmee het kan werken met een batterij of een externe 5V bron, waar
bij de Li-Po batterij geladen wordt wanneer externe bron aangesloten is. De overschakeling van externe voeding naar batterijvoeding gebeurt automatisch.

mkr1000box

Kenmerken:

De MKR1000 heeft een 32 bit processor gelijkwaardig aan de Arduino Zero, voldoende I/O poorten, low power WiFi met een cryptochip voor beveiligde communicatie en het gebruiksgemak van de Arduino Software (IDE) voor de softwareontwikkeling. Al deze kenmerken maken van dit bord de perfecte keuze voor de opkomende IoT batterij gevoede projecten met een kleine form factor. In tegenstelling tot de meeste Arduino borden werkt de MKR1000 op 3,3V. De maximum spanning die de  I/O pinnen kunnen verdragen is dus 3,3V. Hogere spanningen kunnen het bord beschadigen. Uitsturen naar 5V digitale modules is mogelijk, bi-directionele communicatie met 5V modules moet met behulp van levelconverters gebeuren. Li-Po batterijen worden geladen tot 4,2V met een laadstroom van 350mAh.
Dit betekent dat de MINIMUM capaciteit van de gebruikte Li-Po battery 700 mAh moet zijn. Kleiner capaciteiten zullen te warm kunnen worden, oververhitten en zelfs exploderen waarbij ze brandgevaar kunnen veroorzaken.

genuino-mkr1000-gbx00004-596

Specificaties:

  • Microcontroller: SAMD21 Cortex-M0+
  • Werkspanning: 3,3 V
  • Voedingsspanning (aanbevolen): 5 V
  • Digitale I/O pinnen: 8
  • PWM digitale I/O pinnen: 4
  • Analoge inputpinnen: 6
  • Analoge outputpinnen: 1
  • Flashgeheugen: 256 Kb
  • SRAM: 32 Kb
  • Kloksnelheid: 48MHz
  • WiFi, Encryption Chip, LiPo Battery Charger