Тема 7.1: Копилка
Компоненты:
Ультразвуковой датчик расстояния,
Серводвигатель,
ЖК-экран,
Светодиод
Бумага/картон или коробка
Цель: Создание копилки. Создайте проект, в котором используются соответствующие датчики, встроенные в коробку.
Функции:
Благодаря датчику движения копилка обнаруживает движение и открывает отделение для монет с помощью серводвигателя.
Вы можете считать монеты и отображать число на ЖК-экране.
На экране также могут отображаться «эмоции сберкассы» (радость от получения монеты и печаль от долгого ожидания).

#include <LiquidCrystal.h>
#include <Servo.h>
#define ECHO_PIN 7
#define TRIG_PIN 8
const int red = 6;
const int blue = 10;
const int buzzerPin = 13;
Servo servo1;
int distance = 1;
int duration;
int coinCount = 0;
// Определяем пины для LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// Настройка нот для мелодии
const int melody[] = {262, 294, 330, 349, 392, 440, 494, 523};
const int noteDurations[] = {4, 4, 4, 4, 4, 4, 4, 4};
void setup() {
// Инициализация ЖК-дисплея
lcd.begin(16, 2);
lcd.print(“Hello! Danger!!!”);
// Инициализация зуммера и сервопривода
pinMode(buzzerPin, OUTPUT);
servo1.attach(9);
// Инициализация ультразвукового датчика
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Настройка светодиодов
pinMode(red, OUTPUT);
pinMode(blue, OUTPUT);
}
void loop() {
// Получение расстояния с ультразвукового датчика
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
// Включение красного светодиода, если объект ближе 10 см
if (distance < 10) {
digitalWrite(red, HIGH);
digitalWrite(blue, LOW);
// Открытие отделения для монет
servo1.write(90); // Открыть
delay(1000); // Ожидание для вкладывания монеты
servo1.write(0); // Закрыть
// Увеличение счетчика монет и отображение на экране
coinCount++;
lcd.setCursor(0, 0);
lcd.print("Coins: ");
lcd.print(coinCount);
// Воспроизведение мелодии
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(buzzerPin, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(buzzerPin);
}
} else {
digitalWrite(red, LOW);
digitalWrite(blue, HIGH);
}
delay(500);
}


https://drive.google.com/file/d/1kZbqEZIYKbPQu5l6rW7jpQkX_fL-Uw1F/view?usp=sharing