#include <Arduino.h>
#include "LowPower.h"
#include <VarSpeedServo.h>
//--------------------НАСТРОЙКИ----------------------
#define maxH 60 // высота срабатывания
#define cap_time 15 // время открытой крышки в секундах
#define open_angle 80 // угол открытия
#define close_angle 0 // угол закрытия
#define debug 0 // вывод информации в порт для отладки (0 выкл, 1 вкл)
//--------------------НАСТРОЙКИ----------------------
// ---ПОДКЛЮЧЕНИЕ---
#define trigPin 11
#define echoPin 12
#define sensorVCC 10
#define MOSFETpin 5
#define servoPin 6
// ---ПОДКЛЮЧЕНИЕ---
VarSpeedServo servo;
volatile boolean intFlag = false;
long duration;
byte distance;
unsigned long open_timer;
volatile boolean open_flag;
void open_cap() {
if (debug) Serial.println("open cap");
digitalWrite(MOSFETpin, 1); // подать питание на серво
delay(10);
servo.write(open_angle, 30, true ); // открыть крышку
delay(1000); // ждать серво
digitalWrite(MOSFETpin, 0); // отключить серво
open_flag = 1; // флаг что крышка открыта
}
void close_cap() {
digitalWrite(MOSFETpin, 1);
if (debug) Serial.println("close cap");// подать питание на серво
delay(10);
servo.write(close_angle, 20, true); // закрыть крышку
delay(1000); // ждать серво
digitalWrite(MOSFETpin, 0); // отключить серво
open_flag = 0; // флаг что крышка закрыта
}
// блок, измеряющий расстояние
byte measure() {
digitalWrite(trigPin, 0);
delayMicroseconds(5);
digitalWrite(trigPin, 1);
delayMicroseconds(15);
digitalWrite(trigPin, 0);
duration = pulseIn(echoPin, HIGH);
return (duration / 2) / 29.1; // получаем расстояние с датчика
}
void Interrupt() {
if (intFlag == true) {intFlag = false;}
if (intFlag == false) {intFlag = true;}
}
void setup() {
Serial.begin(9600);
if (debug) Serial.println("system start");
attachInterrupt(0, Interrupt, RISING ); // аппаратное прерывание на 2 пине
servo.attach(servoPin); // серво на 5 порту
pinMode(trigPin, OUTPUT); // пин триггера в режиме выхода
digitalWrite(trigPin, 0);
pinMode(MOSFETpin, OUTPUT); // пин мосфета в режиме выхода
digitalWrite(MOSFETpin, 0);
pinMode(echoPin, INPUT); // пин эхо в режиме входа
pinMode(sensorVCC, OUTPUT); // пин питания как выход
digitalWrite(sensorVCC, 0); // выключить датчик
open_cap(); // открытие крышки при запуске
}
void loop() {
LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF); // спать 1 секунду
digitalWrite(sensorVCC, 1); // включить дальномер
delay(500);
measure(); // первый "холостой" проход, иначе датчик не алло
distance = measure(); // получить расстояние
digitalWrite(sensorVCC, 0); // выключить дальномер
if (debug) {
Serial.println(distance);
delay(500);
}
if (distance > 5 && distance < maxH && open_flag == 0) { // если расстояние попадает в диапазон
open_timer = 0; // сбросить таймер
if (!open_flag) { // если крышка закрыта
open_cap(); // открыть крышку
}
} else {
if (open_flag) { // если крышка открыта
open_timer++; // прибавить таймер
if (debug) {Serial.print("Open: "); Serial.println(open_timer);}
if (open_timer > cap_time) { // если с момента открытия прошло больше 5сек
close_cap(); // закрыть крышку
}
}
}
}