Своими руками: Автомат для конфет на Arduino — умный снек-диспенсер
Компоненты и материалы
| Arduino UNO | 1 шт. |
| Сервопривод 180° (стандартный) | 1 шт. |
| LCD 16x2 с I2C-модулем (синий/белый) | 1 шт. |
| Тактильная кнопка 12мм | 2 шт. (по 1 для «мало» и «много») |
| PHPoC Shield для Arduino (Ethernet/WiFi) | 1 шт. (опционально, для расширения) |
| ИК-датчик препятствия (FC-51 или аналогичный) | 1 шт. (детект стакана) |
| Кнопка питания (вкл/выкл) | 1 шт. |
| Макетная плата и перемычки | 1 набор |
Инструменты
- Паяльник
Программное обеспечение
- Arduino IDE
- Библиотеки:
Wire.h,LiquidCrystal_I2C.h,Servo.h
О проекте
Простой автомат для выдачи конфет: пользователь нажимает кнопку «Мало» или «Много», ставит стакан под ИК-датчик — сервопривод поворачивается, сыплет конфеты. Проект вдохновлён работой gatoninja236, но упрощён (без Google Assistant).
Этапы создания
- Сборка и тестирование электроники на макетке
- Написание и отладка кода
- Изготовление корпуса и механики (картон + акрил)
- Монтаж электроники в корпус
- Тестирование и эксплуатация
Механическая часть: Корпус и дозатор
Размеры деталей (картон/акрил)
- Фасад и задняя стенка: 20×16 см (задняя — акрил)
- Боковые стенки: 12×16 см
- Крышка и дно: 20×12 см
Вырезы под компоненты
- LCD: 7.2×2.5 см
- Кнопки: 1.2×1.2 см (по две)
- Стакан (дозатор): 9×12 см (внутреннее сечение 9×9 см)
- ИК-датчик: отверстия напротив стакана
Механика дозатора выполнена ступенчато — конфеты не высыпаются сразу, а дозируются поворотом сервы.
Монтаж электроники
Arduino и макетная плата закреплены акриловыми стойками одна за другой — экономия места. LCD и кнопки спереди, серва и ИК-датчик в зоне дозатора, кнопка питания сзади.
Код (Candy Dispenser.ino)
//------БИБЛИОТЕКИ------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
//------НАСТРОЙКИ------
LiquidCrystal_I2C lcd(0x27, 16, 2); // Адрес I2C может быть 0x3F
Servo myservo;
int pos = 90; // стартовая позиция сервы
int buttonCLK = 7; // кнопка «По часовой» (Мало)
int buttonAntiCLK = 6; // кнопка «Против часовой» (Много)
const int avoidPin = 5; // ИК-датчик стакана
int set = 0; // режим: 1=мало, 2=много
void setup() {
lcd.begin();
lcd.clear();
myservo.attach(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() {
// Кнопка «Мало»
if (digitalRead(buttonCLK) == HIGH) {
lcd.clear(); lcd.print("Please Place Cup"); delay(2000); lcd.clear();
set = 1;
}
// Кнопка «Много»
if (digitalRead(buttonAntiCLK) == HIGH) {
lcd.clear(); lcd.print("Please Place Cup"); delay(2000); lcd.clear();
set = 2;
}
// Ожидание стакана и выдача
if (set == 1) IRCLK();
if (set == 2) IRAntiCLK();
}
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...");
if (avoidVal == LOW) { // 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...");
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"); }
Схема подключения
Следуйте цветовой разводке на фото схемы. Важные моменты:
- LCD — по I2C (SDA → A4, SCL → A5 на UNO)
- Серва: сигнал → D9, питание → 5V/GND (лучше внешнее)
- Кнопки: D6, D7 — к GND при нажатии (INPUT_PULLUP рекомендуется)
- ИК-датчик: OUT → D5, VCC → 5V, GND → GND
Приятного снекинга!
Производственный процесс
- Кенди-кейн: история, производство и сладкая наука о классическом рождественском угощении
- Конфетное кукурузное зернышко: от традиции к современному производству
- Жавбрейкер: история, ингредиенты и ремесло классической твёрдой конфеты
- Сахарная вата: от классического угощения к современным производственным технологиям
- Сладкая наука жевательных конфет: от истории к современному производству
- M&M's: от изобретения к современному производству
- Панель переключателей и LED для Microsoft Flight Simulator 2020 на Arduino
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора