Тема 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