#include <Servo.h> //используем библиотеку для работы с сервоприводом
Servo servo; //объявляем переменную servo типа Servo
int trigPin = 6; //Триггер
int echoPin = 7; //Эхо
long duration, dist, average, duration2, dist2; //переменные
long aver[3]; //массив для расчёта среднего арифметического
bool flag = false; //сост кнопки
int key_pin = 3; // фиксируем пин кнопки
bool key_press = false; // переменная перехода состояния кнопки
bool musor = false; // состояние мусора
int trigPin2 = 10; //Триггер
int echoPin2 = 11; //Эхо
int ugol = 40; //Угол закрытия
bool cap = false; //состояние крышки
void setup() {
servo.attach(5); //серво на 5 порту
pinMode(key_pin,INPUT_PULLUP); //кнопка
pinMode(9, OUTPUT);
pinMode(trigPin, OUTPUT); //пин триггера в режиме выхода
pinMode(echoPin, INPUT); //пин эхо в режиме входа
servo.write(ugol); //при подключении питания поставить крышку закрытой
pinMode(trigPin2, OUTPUT); //пин триггера в режиме выхода
pinMode(echoPin2, INPUT); //пин эхо в режиме входа
Serial.begin(9600);
}
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; //получаем расстояние с датчика 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; //получаем расстояние с датчика 2
}
void loop() {
bool key = digitalRead(key_pin);
if (key && !key_press){ //кнопка нажата и была отпущенна?
key_press = true; //переход кнопки в состояние нажатия
delay(20); // убираем дребезг
musor = false;
}
if (!key && key_press){ // кнопка отпущена и была нажата?
key_press = false; //переход кнопки в состояние отпускания
delay(20); // убираем дребезг
flag = !flag; // поменяли состояние кнопки!
}
if (flag==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-х измерений
servo.write(ugol);
cap = false;
}
if (flag==true) {
servo.write(180);
digitalWrite(9, 0);
cap=true;
}
if (dist2>0 && dist2<14 && cap==false) { //если мусор до 14 см и крышка закрыта
static uint32_t tmr;
if (millis() - tmr >= 500) {
tmr = millis();
digitalWrite(9, !digitalRead(9));
}
musor = true; //состояние мусора
}
if (dist>5 && dist<40 && flag==false && musor==false) { //если рука от 5 до 40 см, кнопка не нажата
servo.write(180); //открыть крышку
delay(10000); //ждем 10 секунд
servo.write(ugol); //закрыть крышку
delay(1000); //подождать секунду
cap=false;
}
}