#include <FastLED.h>
#define NUM_LEDS 7
#define DATA_PIN 6
CRGB leds[NUM_LEDS];
String messageFromPP;
String counterToPP = "";
volatile bool patternChanged = false;
bool flag = false;
bool serialFlag = false;
void setup() {
pinMode(DATA_PIN, OUTPUT);
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
attachInterrupt(digitalPinToInterrupt(2), changePattern, RISING);
FastLED.setBrightness(100);
allOff();
Serial.begin(115200);
delay(1000);
Serial.println("start");
}
void idleTest(){
patternChanged = true;
allOff();
CRGB color = CHSV(60, 255, 100);
int fadeTime = 1500;
// Fade in
fadeIn(color, fadeTime);
// Fade out
fadeOut(color, fadeTime);
}
void alert(){
if(patternChanged){
Serial.println("playAlert");
allOff();
for(int i = 0; i<5; i++){
fadeIn(CHSV(0,255, 60),100);
delay(100);
fadeOut(CHSV(0,200,0), 100);
delay(100);
}
patternChanged = false;
serialFlag = false;
Serial.flush();
messageFromPP = "";
}
}
void turnSignal(){
if(patternChanged){
Serial.println("playTurnSignal");
allOff();
fadeIn(CHSV(74, 200, 60), 350); // fade in for 1 second with yellow color
delay(150);
fadeOut(CHSV(74,200,0), 350);
delay(150);
fadeIn(CHSV(74, 200, 60), 350); // fade in for 1 second with yellow color
delay(150);
fadeOut(CHSV(74,200,0), 350);
delay(150);
fadeIn(CHSV(74, 200, 60), 350); // fade in for 1 second with yellow color
delay(150);
fadeOut(CHSV(74,200,0), 350);
delay(150);
fadeIn(CHSV(74, 200, 60), 350); // fade in for 1 second with yellow color
delay(150);
fadeOut(CHSV(74,200,0), 350);
delay(150);
patternChanged = false;
serialFlag = false;
Serial.flush();
messageFromPP = "";
}
}
void turnSignal2() {
patternChanged = true;
allOff();
int delayTime = 100;
// Set color to be used for the color wipe effect
CRGB color = CRGB::Green;
for(int j = 0; j<5; j++){
for (int i = 0; i < NUM_LEDS; i++) {
// Turn off the previously lit LED by setting its color to black
if (i > 0) {
leds[i-1] = CRGB::Black;
}
// Light up the next LED with the desired color
leds[i] = color;
FastLED.show();
delay(delayTime);
}
allOff();
delay(200);
}
/* redtoblue
patternChanged = true;
allOff();
redToBlue(500, 255, 100);
patternChanged = false;
serialFlag = false;
Serial.flush();
messageFromPP = "";
*/
}
void loop() {
if (Serial.available() > 0) {
messageFromPP = "";
messageFromPP = Serial.readStringUntil('\0');
Serial.println(messageFromPP);
}
if(messageFromPP == "init"){
changePattern();
idleTest();
delay(50);
serialFlag = false;
}
else if(messageFromPP == "r_signal"){
if(!serialFlag){
serialFlag = true;
changePattern();
turnSignal();
delay(50);
}
}
else if(messageFromPP == "alert"){
if(!serialFlag){
serialFlag = true;
changePattern();
alert();
delay(50);
}
}
else if(messageFromPP == "test"){
if(!serialFlag){
serialFlag = true;
changePattern();
turnSignal2();
delay(50);
}
}
}
void allOff() {
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CHSV(0, 0, 0);
}
FastLED.show();
}
void changePattern() {
// Set the patternChanged flag to true when the interrupt is triggered
patternChanged = true;
}
void easeInEaseOut(int startValue, int endValue, int fadeTime) {
unsigned long startTime = millis();
while (millis() - startTime < fadeTime) {
float percent = (millis() - startTime) / (float)fadeTime;
int currentValue = startValue + ((endValue - startValue) * (-cos(percent * PI) / 2.0 + 0.5));
FastLED.setBrightness(currentValue);
FastLED.show();
delay(1);
}
}
void fadeIn(CRGB color, int fadeTime) {
unsigned long startTime = millis();
while (millis() - startTime < fadeTime) {
// Check for "r_signal" message and interrupt the function
if (Serial.available() > 0) {
messageFromPP = Serial.readStringUntil('\0');
if (messageFromPP == "r_signal") {
changePattern();
turnSignal();
return; // exit the function
}
else if(messageFromPP == "alert"){
changePattern();
alert();
return;
}
else if(messageFromPP == "test"){
changePattern();
turnSignal2();
return;
}
}
float percent = (millis() - startTime) / (float)fadeTime;
int brightness = 255 * percent;
if(brightness <=10){
brightness = 10;
}
FastLED.setBrightness(brightness);
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = color;
}
FastLED.show();
delay(10);
}
}
void fadeOut(CRGB color, int fadeTime) {
unsigned long startTime = millis();
while (millis() - startTime < fadeTime) {
// Check for "r_signal" message and interrupt the function
if (Serial.available() > 0) {
messageFromPP = Serial.readStringUntil('\0');
if (messageFromPP == "r_signal") {
changePattern();
turnSignal();
return; // exit the function
}
else if(messageFromPP == "alert"){
changePattern();
alert();
return;
}
else if(messageFromPP == "test"){
changePattern();
turnSignal2();
return;
}
}
float percent = 1 - ((millis() - startTime) / (float)fadeTime);
int brightness = 255 * percent;
if(brightness <= 10){
brightness = 10;
}
Serial.println(brightness);
FastLED.setBrightness(brightness);
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = color;
}
FastLED.show();
delay(10);
}
}
void redToBlue(int duration, uint8_t startBrightness, uint8_t endBrightness) {
CRGB startColor = CRGB::Red;
startColor.fadeLightBy(255 - startBrightness); // Set the brightness of the starting color
CRGB endColor = CRGB::Blue;
endColor.fadeLightBy(255 - endBrightness); // Set the brightness of the ending color
unsigned long startTime = millis();
while (millis() - startTime < duration) {
float progress = (millis() - startTime) / (float)duration;
CRGB color = CRGB(
(1 - progress) * startColor.r + progress * endColor.r, // red component
(1 - progress) * startColor.g + progress * endColor.g, // green component
(1 - progress) * startColor.b + progress * endColor.b // blue component
);
FastLED.showColor(color);
delay(10);
}
FastLED.showColor(endColor);
}