
Описание
Благодаря датчику движения копилка обнаруживает движение и открывает отделение для монет с помощью серводвигателя.Вы можете считать монеты и отображать число на ЖК-экране.
На экране также могут отображаться «эмоции сберкассы» (радость от получения монеты и печаль от долгого ожидания).
Использованые компоненты
1x ультразвуковой датчик HC-SR04
1x потенциометр
1x 1602 LCD экран
1x RGB LED
1x Servo мотор
4x 220 Ω резисторы
27x стандартные одиночные провода «папа-папа»
Код программы
#include <Servo.h>
#include <LiquidCrystal.h>
#define DEBUG
const int ECHO_PIN = 12;
const int TRIGGER_PIN = 13;
const int LED_PIN_RED = 3;
const int LED_PIN_BLUE = 2;
const int LED_PIN_GREEN = 10;
Servo servo_;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
pinMode(ECHO_PIN, INPUT);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(LED_PIN_RED, OUTPUT);
pinMode(LED_PIN_BLUE, OUTPUT);
pinMode(LED_PIN_GREEN, OUTPUT);
servo_.attach(11);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Dist: ");
#ifdef DEBUG
Serial.begin(9600);
delay(100);
servo_.write(90);
delay(1000);
servo_.write(0);
delay(1000);
#endif
}
void loop()
{
digitalWrite(TRIGGER_PIN, HIGH);
digitalWrite(TRIGGER_PIN, LOW);
int distance = pulseIn(ECHO_PIN, HIGH, 15000);
distance = constrain(distance / 58, 0, 300);
int cur_pos = servo_.read();
#ifdef DEBUG
Serial.println(distance);
Serial.println(cur_pos);
#endif
lcd.setCursor(6, 0);
lcd.print(distance);
lcd.print(" cm ");
if (distance > 0 && distance < 30) {
digitalWrite(LED_PIN_RED, LOW);
digitalWrite(LED_PIN_GREEN, HIGH);
digitalWrite(LED_PIN_BLUE, LOW);
lcd.setCursor(0, 1);
lcd.print("Open ");
for (int pos = cur_pos; pos < 90; pos += 2)
servo_.write(pos > 90 ? 90: pos);
} else if (distance == 0 || distance > 30) {
digitalWrite(LED_PIN_RED, HIGH);
digitalWrite(LED_PIN_GREEN, LOW);
digitalWrite(LED_PIN_BLUE, LOW);
lcd.setCursor(0, 1);
lcd.print("Close");
for (int pos = cur_pos; pos > 0; pos -= 2)
servo_.write(pos < 0 ? 0 : pos);
}
delay(1000);
}
