// Hardware Setup
// ESP32 Board
// 156 leds - pin 16 - DATA
// LED Strip 26 marks (6 leds in each every 1 meter) - cover 25 meters total
#include "Adafruit_NeoPixel.h"
#include "BluetoothSerial.h"
#include "Simpletimer.h"
#define SERIAL_PORT_SPEED 115200
#define LED_PIN 25
#define NUM_LEDS 52
#define NUM_MARKS 26
#define MARK_COLOR SwimStrip.Color(0, 0, 255) // Blue
int Mode = 0; // not running = 0, running = 1, waiting = 2
int ParameterSpeed = 90;
int ParameterRestDistance = 100;
int ParameterRestTime = 15;
int ParameterBrightness = 30;
String ParameterColor = "Red";
String MsgBT = "";
String strTemp;
int CurrentMark = 1;
boolean MarkDirectionUp = true;
Adafruit_NeoPixel SwimStrip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
BluetoothSerial SerialBT;
Simpletimer timerMarker{};
void TurnOnMark(int mark, uint32_t markColor = MARK_COLOR) {
// mark = 1 to NUM_MARKS
SwimStrip.fill(markColor, (mark - 1) * (NUM_LEDS / NUM_MARKS), NUM_LEDS / NUM_MARKS);
SwimStrip.show();
}
void TurnOffMark(int mark) {
SwimStrip.fill(SwimStrip.Color(0, 0, 0), (mark - 1) * (NUM_LEDS / NUM_MARKS), NUM_LEDS / NUM_MARKS);
SwimStrip.show();
}
void setup() {
Serial.begin(115200);
SwimStrip.begin();
SwimStrip.setBrightness(ParameterBrightness);
SwimStrip.clear(); // trun off all the leds
SwimStrip.show();
SerialBT.begin("SwimLine32");
MsgBT.reserve(150);
Serial.println("Start");
MsgBT = "90,100,15,25,Red"; // Speed,Distance,RestTime,Brightness,Color
MsgParse(MsgBT);
Serial.print("Update Timer Speed: ");
Serial.println(ParameterSpeed / (4.0 * (NUM_MARKS-1)) * 1000.0);
Mode = 1;
}
void loop() {
if (SerialBT.available()) {
MsgBT = SerialBT.readStringUntil('\n');
Serial.print("Bluetooth message: ");
Serial.println(MsgBT);
switch (MsgBT[0]) {
case 'C': // Clear
Mode = 0;
SwimStrip.clear();
SwimStrip.show();
CurrentMark = 1;
MarkDirectionUp = true;
break;
case 'T': // Start
Mode = 1;
Serial.print("Start Timer Speed: ");
Serial.println(ParameterSpeed / (4.0 * (NUM_MARKS-1)) * 1000.0);
break;
case 'S': // Stop
Mode = 0;
break;
case 'U': // Update in possible while running
MsgParse(MsgBT);
SwimStrip.setBrightness(ParameterBrightness);
SwimStrip.show();
Serial.print("Update Timer Speed: ");
Serial.println(ParameterSpeed / (4.0 * (NUM_MARKS-1)) * 1000.0);
break;
}
}
if (Mode == 1) {
if (timerMarker.timer(ParameterSpeed / (4.0 * (NUM_MARKS-1)) * 1000.0)) {
SwimTimer();
}
}
}
void SwimTimer() {
Serial.print("mills: ");
Serial.print(millis());
Serial.print(", mark: ");
Serial.println(CurrentMark);
TurnOnMark(CurrentMark);
if (MarkDirectionUp) {
CurrentMark++;
} else {
CurrentMark--;
}
if (CurrentMark != 1 && not(MarkDirectionUp)) {
if (MarkDirectionUp) {
TurnOffMark(CurrentMark - 1);
} else {
TurnOffMark(CurrentMark + 1);
}
}
SwimStrip.show();
if (CurrentMark == NUM_MARKS || CurrentMark == 1) {
MarkDirectionUp = not(MarkDirectionUp);
}
}
void MsgParse(String Msg) {
ParameterSpeed = (MsgBT.substring(1, MsgBT.indexOf(","))).toInt();
MsgBT = MsgBT.substring(MsgBT.indexOf(",") + 1);
ParameterRestDistance = (MsgBT.substring(0, MsgBT.indexOf(","))).toInt();
MsgBT = MsgBT.substring(MsgBT.indexOf(",") + 1);
ParameterRestTime = (MsgBT.substring(0, MsgBT.indexOf(","))).toInt();
MsgBT = MsgBT.substring(MsgBT.indexOf(",") + 1);
ParameterBrightness = (MsgBT.substring(0, MsgBT.indexOf(","))).toInt();
MsgBT = MsgBT.substring(MsgBT.indexOf(",") + 1);
ParameterColor = (MsgBT.substring(0, MsgBT.indexOf(",")));
Serial.print("Update: " + (String)ParameterSpeed + "," + (String)ParameterRestDistance + ",");
Serial.print((String)ParameterRestTime + "," + (String)ParameterBrightness + "," + ParameterColor);
Serial.println();
}