#include <Servo.h> //используем библиотеку для работы с сервоприводом
Servo servo; //объявляем переменную servo типа Servo
int trigPin = 6; //Триггер
int echoPin = 7; //Эхо
long duration, dist, average, duration2, dist2; //переменные
bool flag=false; //флажок для датчика 1
long aver[3]; //массив для расчёта среднего арифметического
bool key_press = false; // переменная перехода состояния кнопки
int key_pin = 3; // фиксируем пин кнопки
int trigPin2 = 10; //Триггер
int echoPin2 = 11; //Эхо
bool flag2=false; //флажок для датчика 2
bool cap=false; //состояние крышки
void setup() {
servo.attach(5); //серво на 5 порту
pinMode(key_pin, INPUT_PULLUP); //подключаем пин кнопки на прием
pinMode(trigPin, OUTPUT); //пин триггера в режиме выхода
pinMode(echoPin, INPUT); //пин эхо в режиме входа
servo.write(5); //при подключении питания поставить крышку открытой
pinMode(trigPin2, OUTPUT); //пин триггера в режиме выхода
pinMode(echoPin2, INPUT); //пин эхо в режиме входа
}
void measure() { //блок, измеряющий расстояние
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(15);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
dist = (duration/2) / 29.1; //получаем расстояние с датчика
digitalWrite(trigPin2, LOW);
delayMicroseconds(5);
digitalWrite(trigPin2, HIGH);
delayMicroseconds(15);
digitalWrite(trigPin2, LOW);
pinMode(echoPin2, INPUT);
duration2 = pulseIn(echoPin2, HIGH);
dist2 = (duration2/2) / 29.1; //получаем расстояние с датчика
}
void loop() {
bool key = !digitalRead(key_pin); // считываем состояние кнопки
if (flag==false){
if (key && !key_press){ //кнопка нажата и была отпущенна?
servo.write(180); //открыть крышку
delay(20); // убираем дребез
key_press = true; //переход кнопки в состояние нажатия
cap = !cap;
}
if (!key && key_press){ // кнопка отпущена и была нажата?
servo.write(3); //закрыть крышку
delay(20); // убираем дребез
key_press = !key_press;//переход кнопки в состояние отпускания
cap = false;
flag=false;
flag2=false;
}
}
if (flag==false && key_press == false) {
for (int i=0;i<=2;i++) { //заполняем массив тремя измерениями
measure(); //измерить расстояние, получаем dist
aver[i]=dist; //присваиваем значение dist элементу массива с номером i
delay(50); //рекомендуемая задержка между измерениями
}
dist=(aver[0]+aver[1]+aver[2])/3; //расчёт среднего арифметического с 3-х измерений
}
if (dist>10 && dist<40 && flag==0) { //если рука от 10 до 40 см, кнопка не нажата
servo.write(180); //открыть крышку
delay(10000); //подождать 10 секунд
servo.write(3); //закрыть крышку
delay(1000); //подождать секунду
}
if (dist2>1 && dist2<40 && flag2==0 && cap==0) { //если мусор от 1 до 40 см, кнопка не нажата
digitalWrite(9, 1);
delay(500);
digitalWrite(9, 0);
delay(500);
}
}