# define trigPin 13
# define echoPin 12
# define led 11
# define rele 10
# define buzzer 9
# define ACK 7
int buzzerState = 0;
unsigned long currentMillis;
unsigned long previousMillis;
const long interval = 777;
void setup()
{
Serial.begin (115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ACK, INPUT_PULLUP);
pinMode(led, OUTPUT);
pinMode(rele, OUTPUT);
pinMode(buzzer, OUTPUT);
}
void loop()
{
long distance;
distance = getEcho();
currentMillis = millis();
bool acknowledge = !digitalRead(ACK);
static bool operate = true;
bool enteredAlarm = false;
static unsigned char alarmState;
if (distance < 10) {
if (acknowledge) enteredAlarm = true;
if (!alarmState) {
alarmState = 1;
enteredAlarm = 1;
}
digitalWrite(led, HIGH);
digitalWrite(rele, LOW);
operate = false;
}
else { // distance > 10
if (alarmState) {
alarmState = 0;
}
if (operate) {
digitalWrite(led, LOW);
digitalWrite(rele, HIGH);
}
else if (acknowledge) operate = true;
}
beepMachine(enteredAlarm);
}
enum {IDLE, OFF, ON,};
# define BEEPS 10
void beepMachine(bool enter)
{
static unsigned long lastBeep;
static unsigned char beepCount;
static unsigned char beepState = IDLE;
unsigned long now = currentMillis;
bool timeTo = now - lastBeep > 125;
switch (beepState) {
case IDLE :
if (!enter) break;
beepCount = BEEPS;
timeTo = true;
beepState = OFF;
enter = false;
case OFF :
if (!timeTo) break;
if (!beepCount) {
beepState = IDLE;
break;
}
tone(buzzer, 440);
beepState = ON;
lastBeep = now;
break;
case ON :
if (!timeTo) break;
noTone(buzzer);
beepState = OFF;
beepCount--;
lastBeep = now;
break;
}
if (enter) {
beepCount = BEEPS;
}
}
long getEcho()
{
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1;
return distance;
}