Bouw een Veilige IoT Puzzeldoos met Arduino MKR Bundle – Stap-voor-Stap Handleiding
Onderdelen en Benodigdheden
| Onderdeel | Aantal |
|---|---|
| Arduino MKR IoT Bundle | 1 |
Apps en Online Services
- Blynk
Over dit Project
Let op: Deze tutorial kan verouderd zijn. Ga hier voor een actueelere versie.
Waardevolle spullen veilig houden is soms lastig, tenzij je een grote kluis hebt... maar wie heeft daar ruimte voor?
Maak in plaats daarvan je eigen puzzeldoos met componenten uit de MKR IoT Bundle en wat karton! We garanderen niet de veiligheid van je spullen, maar het is een leuke afschrikking voor potentiële dieven. Natuurlijk raden we aan om je snoep erin te stoppen... geen echte waardevols.
In een Notendop
Om de doos te openen (gesloten door een servomotor), moet je de potentiometers draaien tot je de juiste combinatie hebt. De combinatie stel je in via de Blynk-app. Een RGB LED geeft kleurfeedback: hoe dichter bij de juiste waarde, hoe "warmer" de kleur (blauw → cyaan → geel → rood).
Bij de juiste combinatie speelt de buzzer een liedje (Star Wars thema) en opent de servo de doos.
Benodigde componenten uit de bundle:
- Buzzer
- RGB LED
- 3x Potentiometer
- LCD scherm
- Servomotor

Leerdoelen
- Kennismaken met Blynk IoT-platform
- Aansluiten en gebruiken van LCD-scherm
- Star Wars thema spelen met buzzer
Meer Willen Weten?
Deze tutorial is deel van een reeks experimenten om vertrouwd te raken met de MKR1000 en IoT. Alle experimenten kunnen met de MKR IoT Bundle worden gebouwd:
- I Love You Pillow
- Puzzle Box
- Pavlov's Cat
- The Nerd
- Plant Communicator
Kennismaken met Blynk
Blynk is een populaire mobiele app voor IoT, waarmee je je internet-verbonden Arduino van overal kunt besturen. Opgericht via Kickstarter, snel een van de meest gebruikte apps door goede documentatie en simpliciteit.
Aan de slag met Blynk
Nieuw project aanmaken is eenvoudig – volg de stappen of bekijk de officiële handleiding.









Na succesvol aanmaken ontvang je per e-mail de Auth Token – unieke identifier om je hardware met je smartphone te verbinden. Elk nieuw project heeft zijn eigen token.
Installeer de Blynk-bibliotheek (in Arduino Web Editor automatisch bij include, anders via Library Manager).
Upload deze sketch en speel met de sliders:
#include <WiFi101.h>
#include <BlynkSimpleWiFiShield101.h>
const char* ssid = SECRET_SSID;
const char* password = SECRET_PSWD;
char auth[] = SECRET_TOKEN;
int SliderValueOne = 1;
int SliderValueTwo = 1;
int SliderValueThree = 1;
BLYNK_WRITE(V1) { SliderValueOne = param.asInt(); }
BLYNK_WRITE(V2) { SliderValueTwo = param.asInt(); }
BLYNK_WRITE(V3) { SliderValueThree = param.asInt(); }
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, password);
}
void loop() {
int Temp_Slider_One_value = SliderValueOne;
int Temp_Slider_Two_value = SliderValueTwo;
int Temp_Slider_Three_value = SliderValueThree;
Blynk.run();
if(Temp_Slider_One_value != SliderValueOne || Temp_Slider_Two_value != SliderValueTwo || Temp_Slider_Three_value != SliderValueThree){
Serial.print("New combination: ");
Serial.print(SliderValueOne); Serial.print(" ");
Serial.print(SliderValueTwo); Serial.print(" ");
Serial.println(SliderValueThree);
}
}

LCD Scherm Gebruiken
Het LCD-scherm is eenvoudig maar vereist veel draden – geduld!

We gebruiken 5V voeding en een 220Ω weerstand. Helderheid regelen via analoog pin 3 (0-255, waar 0 maximaal is): analogWrite(A3, 0);
Test met voorbeeldcode:
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
analogWrite(A3, 0);
lcd.begin(16, 2);
lcd.print("hello, world!");
}
void loop() {
lcd.setCursor(0, 1);
lcd.print(millis() / 1000);
}
Potentiometers Toevoegen
Waarden lezen via analogRead() op pinnen A0, A1, A2.

Waarden lopen 0-1023 – te groot om te raden. Mappen naar 0-9 met map():
int PotOne = map(analogRead(A0), 0, 1023, 0, 9);
Voorbeeldcode om waarden op LCD te tonen:
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
analogWrite(A3, 0);
Serial.begin(9600);
lcd.begin(16, 2);
}
void loop() {
int PotOne = map(analogRead(A0), 0, 1023, 0, 9);
int PotTwo = map(analogRead(A1), 0, 1023, 0, 9);
int PotThree = map(analogRead(A2), 0, 1023, 0, 9);
lcd.setCursor(0, 0); lcd.print(PotOne);
lcd.setCursor(2, 0); lcd.print(PotTwo);
lcd.setCursor(4, 0); lcd.print(PotThree);
}
RGB LED Toevoegen
RGB LED geeft feedback: hoe dichter bij combinatie, hoe warmer de kleur (blauw → cyaan → geel → rood).


int redPin = 6, greenPin = 8, bluePin = 7;
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(9600);
}
void loop() {
setColor(0, 0, 255); delay(1000); // blauw
setColor(0, 255, 255); delay(1000); // cyaan
setColor(255, 255, 0); delay(1000); // geel
setColor(255, 0, 0); delay(1000); // rood
}
void setColor(int red, int green, int blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
Koppelen met Blynk
Nu alles combineren: board aan Blynk koppelen, potentiometers aan LCD, LED knippert groen bij juiste combinatie.
- Functie
giveColorFeedback()stelt LED-kleur in op basis van afstand tot combinatie. - Variabelen
SliderValueOne/Two/Threeopslaan combinatie (standaard 1 1 1). - Boolean
startdetecteert of combinatie al geraden is (voorkomt herhaald openen).
Upload deze sketch:
#include <LiquidCrystal.h>
#include <SPI.h>
#include <WiFi101.h>
#include <BlynkSimpleWiFiShield101.h>
int redPin = 6, greenPin = 8, bluePin = 7;
const char* ssid = SECRET_SSID;
const char* password = SECRET_PSWD;
char auth[] = SECRET_TOKEN;
const int rs = 12, en = 11, d4 = 2, d5 = 3, d6 = 4, d7 = 5;
bool start = true;
int SliderValueOne = 1, SliderValueTwo = 1, SliderValueThree = 1;
BLYNK_WRITE(V1) { SliderValueOne = param.asInt(); }
BLYNK_WRITE(V2) { SliderValueTwo = param.asInt(); }
BLYNK_WRITE(V3) { SliderValueThree = param.asInt(); }
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT);
analogWrite(A3, 0);
Serial.begin(9600);
lcd.begin(16, 2);
Blynk.begin(auth, ssid, password);
}
void loop() {
int Temp_Slider_One_value = SliderValueOne;
int Temp_Slider_Two_value = SliderValueTwo;
int Temp_Slider_Three_value = SliderValueThree;
Blynk.run();
if(Temp_Slider_One_value != SliderValueOne || Temp_Slider_Two_value != SliderValueTwo || Temp_Slider_Three_value != SliderValueThree){
Serial.print("New combination: ");
Serial.print(SliderValueOne); Serial.print(" ");
Serial.print(SliderValueTwo); Serial.print(" ");
Serial.println(SliderValueThree);
}
int PotOne = map(analogRead(A0), 0, 1023, 0, 9);
int PotTwo = map(analogRead(A1), 0, 1023, 0, 9);
int PotThree = map(analogRead(A2), 0, 1023, 0, 9);
lcd.setCursor(0, 0); lcd.print(PotOne);
lcd.setCursor(2, 0); lcd.print(PotTwo);
lcd.setCursor(4, 0); lcd.print(PotThree);
if (start) {
giveColorFeedback(PotOne, PotTwo, PotThree);
if (PotOne == SliderValueOne && PotTwo == SliderValueTwo && PotThree == SliderValueThree) {
blinkGreenLed();
start = false;
}
}
if(!start) {
if(PotOne == 0 && PotTwo == 0 && PotThree == 0) start = true;
}
}
void giveColorFeedback(int PotOne, int PotTwo, int PotThree) {
if (abs(PotOne - SliderValueOne) <= 1 && abs(PotTwo - SliderValueTwo) <= 1 && abs(PotThree - SliderValueThree) <= 1) {
setColor(255, 0, 0); // Rood
} else if (abs(PotOne - SliderValueOne) <= 3 && abs(PotTwo - SliderValueTwo) <= 3 && abs(PotThree - SliderValueThree) <= 3) {
setColor(255, 255, 0); // Geel
} else if (abs(PotOne - SliderValueOne) <= 4 && abs(PotTwo - SliderValueTwo) <= 4 && abs(PotThree - SliderValueThree) <= 4) {
setColor(0, 255, 255); // Cyaan
} else {
setColor(0, 0, 255); // Blauw
}
}
void blinkGreenLed() {
for (int a = 0; a < 2; a++) {
for (int b = 0; b <= 255; b += 5) { setColor(0, b, 0); delay(5); }
for (int b = 255; b >= 0; b -= 5) { setColor(0, b, 0); delay(5); }
}
for (int b = 0; b <= 255; b += 5) { setColor(0, b, 0); delay(5); }
}
void setColor(int red, int green, int blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
Buzzer Toevoegen
Buzzer speelt een melodie bij openen: het Star Wars thema!

const int c = 261, d = 294, e = 329, f = 349, g = 391, gS = 415, a = 440, aS = 455, b = 466;
const int cH = 523, cSH = 554, dH = 587, dSH = 622, eH = 659, fH = 698, fSH = 740, gH = 784, gSH = 830, aH = 880;
int counter = 0;
#define buzzerPin 1
void setup() { pinMode(buzzerPin, OUTPUT); Serial.begin(9600); }
void loop() { play_jingle(); delay(3000); }
void play_jingle() {
beep(a, 500); beep(a, 500); beep(a, 500);
beep(f, 350); beep(cH, 150); beep(a, 500);
beep(f, 350); beep(cH, 150); beep(a, 650); delay(500);
beep(eH, 500); beep(eH, 500); beep(eH, 500);
beep(fH, 350); beep(cH, 150); beep(gS, 500);
beep(f, 350); beep(cH, 150); beep(a, 650); delay(500);
}
void beep(int note, int duration) {
tone(buzzerPin, note, duration);
noTone(buzzerPin);
delay(50);
counter++;
}
Servomotor Toevoegen
De servo is het slot van de doos. Bij juiste combinatie draait hij 90° en opent de doos.

#include <Servo.h>
int pos = 0;
Servo myservo;
void setup() {
myservo.attach(9);
myservo.write(pos);
}
void loop() {
open_the_box(); delay(2000);
close_the_box(); delay(2000);
}
void open_the_box() {
for (pos = 0; pos <= 90; pos += 1) { myservo.write(pos); delay(15); }
}
void close_the_box() {
for (pos = 90; pos >= 0; pos -= 1) { myservo.write(pos); delay(15); }
}
Let op: om de doos weer te sluiten, zet alle potentiometers op 0.
Bouw Je Puzzeldoos
Een doos hoort bij een doos. Download het behuizingsbestand hieronder als gids.
We gebruikten 2mm karton.
Code
Complete Sketch
De volledige geïntegreerde code is beschikbaar in de GitHub repository van het project.
Aangepaste Onderdelen en Behuizingen
2mm karton
Bestand: box_E5j7tnFdNC.dxf
Schema's

Productieproces
- Geïntegreerde Schakelingen (IC's): Compacte, Krachtige Chips die Moderne Elektronica Aandrijven
- TI SensorTag integreren met Blynk via Node-RED op Raspberry Pi Zero
- Arduino Digitale Dobbelsteen: Bouw Je Eigen LCD-willekeurige Getalgenerator
- Meerpositie-temperatuursensorsysteem voor slimme thuisintegratie
- DIY Arduino USB Gaming Controller – Bouw Je Eigen High-Performance Gamepad
- MotionSense: Slimme inbraakdetectie met Arduino en ESP8266
- MOSMusic Project Kit: MOSFET, Arduino en meer
- Essentiële Onderdelen van een Boormachine: Een Uitgebreid Overzicht
- Belangrijkste Componenten van een Interne Verbrandingsmotor
- SPICE Netlist Syntaxis Beheersen: Componentnamen, Passieve & Actieve Elementen, en Brondefinities
- Micro-elektronica: de wetenschap van miniatuur elektronica