#include <Wire.h>
#include <RTClib.h>
#include <LedControl.h>
//MATRIX DISPLAY
byte devices = 1;
LedControl lc = LedControl(4, 5, 6, devices); //DIN, CLK, CS, count of displays
RTC_DS3231 rtc;
const int redPin = 11; // D5
const int yellowPin = 10; // D6
const int greenPin = 9; // D7
const int dimRed = 255;
const int dimYellow = 255;
const int dimGreen = 255;
float tPC;
unsigned long initialHighTide; // Initial high tide timestamp
void setup() {
Serial.begin(115200);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
lc.shutdown(0, false); // Wake up MAX7219
lc.setIntensity(0, 8); // Set brightness (0-15)
lc.clearDisplay(0); // Clear display
// Set initial high tide time (replace with actual values)
// Format: Year, Month, Day, Hour, Minute, Second
initialHighTide = DateTime(2025, 2, 22, 4, 57, 0).unixtime();
}
void loop() {
DateTime now = rtc.now();
unsigned long currentTime = now.unixtime();
unsigned long elapsedTime = (currentTime - initialHighTide) % 44700;
if (elapsedTime >= 22350 && elapsedTime < 44700) {
tPC = elapsedTime - 22350;
tPC = tPC / 22350;
tPC = tPC * 100;
updateDisplay(tPC, true);
}
if (elapsedTime >= 0 && elapsedTime < 22350) {
tPC = 22350 - elapsedTime;
tPC = tPC / 22350;
tPC = tPC * 100;
updateDisplay(tPC, false);
}
Serial.print("Current time: ");
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
/*
Serial.print("Initial High Tide: ");
Serial.println(initialHighTide);
*/
Serial.print("Elapsed Time: ");
Serial.println(elapsedTime);
Serial.print("Tide height: ");
Serial.print(tPC);
Serial.println("%");
if (elapsedTime >= 41906.5 && elapsedTime < 44700) {
setLights(true, false, false); // High Tide (Red)
Serial.println("High Tide");
}
else if (elapsedTime >= 25143.5 && elapsedTime < 41906.5) {
setLights(true, true, false); // Rising Tide (Red + Yellow)
Serial.println("Rising Tide");
}
else if (elapsedTime >= 19556.5 && elapsedTime < 25143.5) {
setLights(false, false, true); // Low Tide (Green)
Serial.println("Low Tide");
}
else if (elapsedTime >= 2793.5 && elapsedTime < 19556.5) {
setLights(false, true, true); // Falling Tide (Green + Yellow)
Serial.println("Falling Tide");
}
else if (elapsedTime >= 0 && elapsedTime < 2793.5) {
setLights(true, false, false); // High Tide (Red)
Serial.println("High Tide");
}
else {
setLights(false, false, false);
Serial.println("Something's wrong");
}
//rows();
delay(1000); // Update every minute
}
void setLights(bool red, bool yellow, bool green) {
analogWrite(redPin, red ? dimRed : LOW);
analogWrite(yellowPin, yellow ? dimYellow : LOW);
analogWrite(greenPin, green ? dimGreen : LOW);
}
void updateDisplay(float percentage, bool rising) {
lc.clearDisplay(0); // Clear display before updating
int numRows = map(percentage, 0, 100, 1, 7); // Map percentage to 1-7 rows
for (int row = 0; row < numRows; row++) {
for (int col = 0; col < 8; col++) {
lc.setLed(0, row, col, true); // Light up the row
}
}
// Control the top row (7th row) based on rising/falling
for (int col = 0; col < 8; col++) {
lc.setLed(0, 7, col, rising);
}
}
/*
void rows() {
for(int row=0;row<8;row++) {
delay(20);
lc.setRow(0,row,B11111111);
delay(20);
lc.setRow(0,row,(byte)0);
/*
for(int i=0;i<row;i++) {
delay(1000);
lc.setRow(0,row,B11111111);
delay(1000);
lc.setRow(0,row,(byte)0);
}
*//*
}
}
*/