#include <DS3232RTC.h>
#include <LiquidCrystal.h>
// Defines pin numbers
const int ledPin = 12;
const int trigPin = 5;
const int echoPin = 4;
const int button = 13;
const int rs = 2,
en = 3,
d4 = 6,
d5 = 7,
d6 = 8,
d7 = 9;
// Defines variables
long duration;
int distance;
int safetyDistance;
int currentButtonState;
int lastButtonState;
int a,
b,
c,
x,
y,
z;
// Sets up LCD
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
DS3232RTC RTC;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(button, INPUT);
Serial.begin(115200);
lcd.begin(16, 2);
RTC.begin();
setSyncProvider(RTC.get);
// If the time is wrong then set time with https://www.youtube.com/watch?v=Z-66x-9-7T0
// Initiate RTC
if (timeStatus() != timeSet) {
lcd.setCursor(0, 0);
lcd.print("RTC sync failed");
delay(2000);
lcd.clear();
}
else {
lcd.setCursor(0, 0);
lcd.print("RTC synced");
delay(2000);
lcd.clear();
}
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance = duration * 0.034 / 2;
safetyDistance = distance;
// If the mower docks
if (safetyDistance <= 10) {
// Timestamp for mower entering dock
lcd.setCursor(0, 0);
lcd.print("Mower docked:");
lcd.setCursor(0, 1);
digitalClockDisplay();
digitalTimeStampSet();
delay(5000);
lcd.clear();
// Wait until the mower undocks
while (safetyDistance <= 10) {
lastButtonState = currentButtonState;
currentButtonState = digitalRead(button);
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance = duration * 0.034 / 2;
safetyDistance = distance;
if (lastButtonState == LOW && currentButtonState == HIGH) {
digitalWrite(ledPin, HIGH);
lcd.setCursor(0, 0);
lcd.print("Mower docked:");
lcd.setCursor(0, 1);
digitalTimeStamp();
delay(5000);
digitalWrite(ledPin, LOW);
lcd.clear();
}
delay(100);
}
// Timestamp for mower leaving dock
digitalWrite(ledPin, LOW);
lcd.setCursor(0, 0);
lcd.print("Mower undocked:");
lcd.setCursor(0, 1);
digitalClockDisplay();
digitalTimeStampSet();
delay(5000);
lcd.clear();
}
// When the mower is out in the garden
else if (safetyDistance > 10) {
lastButtonState = currentButtonState;
currentButtonState = digitalRead(button);
digitalWrite(ledPin, LOW);
if (lastButtonState == LOW && currentButtonState == HIGH) {
digitalWrite(ledPin, HIGH);
lcd.setCursor(0, 0);
lcd.print("Mower undocked:");
lcd.setCursor(0, 1);
digitalTimeStamp();
delay(5000);
digitalWrite(ledPin, LOW);
lcd.clear();
}
}
}
void digitalTimeStampSet() {
a = hour();
b = minute();
c = second();
x = day();
y = month();
z = year();
}
void digitalTimeStamp() {
lcd.print(a);
printDigits(b);
printDigits(c);
lcd.print(' ');
lcd.print(x);
lcd.print('/');
lcd.print(y);
lcd.print('/');
lcd.print(z);
lcd.println();
}
void digitalClockDisplay() {
lcd.print(hour());
printDigits(minute());
printDigits(second());
lcd.print(' ');
lcd.print(day());
lcd.print('/');
lcd.print(month());
lcd.print('/');
lcd.print(year());
lcd.println();
}
void printDigits(int digits) {
lcd.print(':');
if (digits < 10) {
lcd.print('0');
}
lcd.print(digits);
}