Work 7.1 (Rahakarp)

Описание

Благодаря датчику движения копилка обнаруживает движение и открывает отделение для монет с помощью серводвигателя.
Вы можете считать монеты и отображать число на ЖК-экране.
На экране также могут отображаться «эмоции сберкассы» (радость от получения монеты и печаль от долгого ожидания).

Использованые компоненты

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);
}

Видеоотчет