#include #define RTC_RST 0 #define RTC_DAT 1 #define RTC_CLK 2 #define SR04_TRIG 6 #define SR04_ECHO 7 // HC_SR04 #define DIST_TIMEOUT (25000UL) #define SOUND_SPEED (0.340) #define DIST_THRESH1 400 #define DIST_THRESH2 600 #define BUF_LENGTH 64 static int input_i; static char input_buf[BUF_LENGTH]; static char output_buf[BUF_LENGTH]; // DS1302 init DS1302 rtc(RTC_RST, RTC_DAT, RTC_CLK); // main loop logic static int ticks = 0; static int triggered = 0; void setup() { rtc.halt(false); rtc.writeProtect(false); rtc.setTCR(TCR_OFF); Serial.begin(9600); pinMode(SR04_TRIG, OUTPUT); pinMode(SR04_ECHO, INPUT); digitalWrite(SR04_TRIG, LOW); } void sync_date() { int n; int t_year; int t_mon; int t_date; int t_hour; int t_min; int t_sec; int t_dow; n = sscanf(input_buf, "S%4d-%2d-%2d %2d:%2d:%2d %d", &t_year, &t_mon, &t_date, &t_hour, &t_min, &t_sec, &t_dow); if (n == 7) { rtc.setDate(t_date, t_mon, t_year); rtc.setTime(t_hour, t_min, t_sec); rtc.setDOW(t_dow); Serial.println("Date synced."); } else { Serial.println("ERROR in date format."); } } int measure_dist() { long measure; int measure_mm; digitalWrite(SR04_TRIG, HIGH); delayMicroseconds(10); digitalWrite(SR04_TRIG, LOW); measure = pulseIn(SR04_ECHO, HIGH, DIST_TIMEOUT); measure_mm = (int)(measure / 2.0 * SOUND_SPEED); return measure_mm; } void alarm(int d) { Time t = rtc.getTime();; sprintf(output_buf, "%04d-%02d-%02d %02d:%02d:%02d %d mm\n", t.year, t.mon, t.date, t.hour, t.min, t.sec, d); Serial.print(output_buf); } void loop() { int dist; char c; if (Serial.available()) { c = Serial.read(); if (input_i == BUF_LENGTH-1 || c == '\n') { input_buf[input_i] = '\0'; input_i = 0; sync_date(); } else { input_buf[input_i] = c; input_i++; } } ticks++; if (ticks == 200) { dist = measure_dist(); if (triggered) { if (dist > DIST_THRESH2) { triggered = 0; } } else { if (dist < DIST_THRESH1) { triggered = 1; alarm(dist); } } ticks = 0; } delay(2); }