Zelf een snoepautomaat bouwen met Arduino: Slimme snackdispenser
Onderdelen en benodigdheden
- Arduino UNO
- Servo (180 graden)
- Adafruit Standaard LCD - 16x2 Wit op Blauw (met I2C-backpack)
- Drukknop (12 mm, SparkFun)
- PHPoC Shield voor Arduino (voor netwerkfunctionaliteit, optioneel)
- IR-afstandssensor
- Aan/uit-schakelaar (voor batterijvoeding)
- Breadboard
Benodigde tools
- Soldeerbout
Apps en online diensten
- Arduino IDE
Over dit project
Het project
Dit is een eenvoudige manier om een snoepautomaat te bouwen met slechts een IR-sensor, een servo en een drukknop. Het project bestaat uit deze fasen:
- Arduino Uno R3 klaarmaken
- Programmeren en configureren
- Behuizing en mechanische delen maken
- Elektronica installeren
- Testen en gebruiken
Hier is een korte demonstratievideo:
Het programmeren was voor mij het lastigste deel omdat ik nog nieuw ben in coderen, maar na meerdere fouten en hulp van meneer Google en vrienden lukte het wel. Het schrijven van de code nam de meest tijd in beslag.
Credits aan de man die me INSPIREERDE tot deze snoepautomaat! Dit is een vereenvoudigde versie van: https://www.hackster.io/gatoninja236/candy-dispenser-with-google-assistant-564724
De doos en mechanische delen maken
Dit was het leukste deel. Het kostte me minstens een hele dag na meerdere pogingen en niet-passende onderdelen.
Stap 1: Componenten uitleggen
Dit ziet er misschien rommelig uit, maar het is de makkelijkste manier om elk component te sorteren en te testen op fouten. Ik gebruikte verschillende kleuren draad voor overzicht. Alles werd op een stuk karton geplaatst.

Stap 2: De doos ontwerpen
Ik maakte een technische tekening van de doos. De meeste onderdelen zijn van karton, sommige van acrylaat. Afmetingen:
- Voor- en achterkant: 20 cm × 16 cm (achterkant is acrylaat)
- Zijden: 12 cm × 16 cm
- Boven- en onderkant: 20 cm × 12 cm

Stap 3: Samenstellen en uitzagen
Eerst alles vastplakken met masking tape.



Uitzagen voor componenten:
- LCD: 7,2 cm × 2,5 cm
- Knoppen: 1,2 cm × 1,2 cm

Voor het kopje:
- Lengte × Hoogte: 9 cm × 12 cm
- Breedte × Diepte: 9 cm × 9 cm

Vergeet de sensoren niet uit te zagen:

Ik maakte de dispenser in trapvorm zodat de snoep niet direct valt:

Stap 4: Breadboard en Arduino monteren
Ik plaatste breadboard en Arduino achter elkaar en bevestigde ze met acrylaat om ruimte te besparen.


Stap 5: Componenten bevestigen
Begin met LCD en knoppen.


Na het bedraden plaats ik alles in het midden van de doos.

Servo bevestigen:

Achterkant met aan/uit-knop voor batterijvoeding:


Stap 6: Het eindresultaat

Code
Candy Dispenser (Arduino)
//------BIBLIOTHEKEN-----
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
//------BIBLIOTHEKEN-----
// LCD-adres 0x27 voor 16 tekens, 2 regels
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myservo;
int pos = 90; // servo startpositie
int buttonCLK = 7; // kloksgewijs knop
int buttonAntiCLK = 6; // tegenkloksgewijs knop
int set = 0;
const int avoidPin = 5; // IR-obstakelsensor op pin 5
void setup() {
lcd.begin();
lcd.clear();
myservo.attach(9); // Servo op digitale pin 9
pinMode(buttonCLK, INPUT);
pinMode(buttonAntiCLK, INPUT);
pinMode(avoidPin, INPUT);
Serial.begin(9600);
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("Welcome to");
lcd.setCursor(3,1);
lcd.print("Candy Land");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("How much candy?");
lcd.setCursor(0,1);
lcd.print("A Little A Lot");
delay(5000);
}
void loop() {
//--- KNOPFUNCTIES ---
if(digitalRead(buttonCLK) == HIGH) {
lcd.clear();
lcd.print("Please Place Cup");
delay(2000);
lcd.clear();
set = set + 1;
}
if(digitalRead(buttonAntiCLK) == HIGH) {
lcd.clear();
lcd.print("Please Place Cup");
delay(2000);
lcd.clear();
set = set + 2;
}
if(set == 1) { IRCLK(); }
if(set == 2) { IRAntiCLK(); }
//--- EINDE KNOPFUNCTIES ---
}
void TurnClockwise() {
Serial.println("Candy 1 Being Dispensed");
CandyText1();
for(pos = 90; pos < 180; pos += 1) {
myservo.write(pos);
delay(15);
}
if(pos == 180) {
delay(2000);
ThankYouText();
}
}
void TurnAntiClockwise() {
Serial.println("Candy 2 Being Dispensed");
CandyText2();
for(pos = 90; pos < 180; pos += 1) {
myservo.write(pos);
delay(20);
}
if(pos == 180) {
delay(3000);
ThankYouText();
}
}
void IRCLK() {
delay(1000);
boolean avoidVal = digitalRead(avoidPin);
lcd.setCursor(0,0);
lcd.print("Detecting Cup");
lcd.setCursor(0,14);
lcd.print("...");
if(avoidVal == LOW) {
lcd.clear();
lcd.print("Cup Placed");
delay(2000);
TurnClockwise();
}
}
void IRAntiCLK() {
delay(1000);
boolean avoidVal = digitalRead(avoidPin);
lcd.setCursor(0,0);
lcd.print("Detecting Cup");
lcd.setCursor(0,14);
lcd.print("...");
if(avoidVal == LOW) {
lcd.clear();
lcd.print("Cup Placed");
delay(2000);
TurnAntiClockwise();
}
}
void CandyText1() {
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Pouring");
lcd.setCursor(1,1);
lcd.print("Little Candy");
}
void CandyText2() {
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Pouring");
lcd.setCursor(3,1);
lcd.print("Lot Candy");
}
void ThankYouText() {
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Thank");
lcd.setCursor(6,1);
lcd.print("You");
delay(15);
software_Reset();
}
void software_Reset() {
asm volatile ("jmp 0");
}
Schema
Het schema ziet er ingewikkeld uit, maar volg de kleurcodering van de draden.
Productieproces
- Suikerstokje: Geschiedenis, Productie en de Zoete Wetenschap Achter de Klassieke Feestlikker
- Snoepkorrels: van traditie tot moderne productie
- Jawbreaker: De Geschiedenis, Ingrediënten en Vakmanschap van een Klassieke Harde Snoep
- Suikerspin: Van Klassiek Snoepje tot Moderne Productietechnologie
- De Zoete Wetenschap van Gummy Snoep: Van Geschiedenis tot Moderne Productie
- M&M's®: Van Uitvinding tot Moderne Productie
- Arduino-gebaseerd schakelaar- & LED-paneel voor Microsoft Flight Simulator 2020
- Bluetooth-gecontroleerde Arduino Spybot bouwen
- FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen
- DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
- Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter