Hi,
I am building a BT operated mood light (with an Android app) that has a few fading patterns.
When I send a fixed color from the app and I want to change it, the response is instantaneous, but when there is a fader pattern running and I want to pick a color or different pattern, it ends the current pattern first and then calls the new function.
I've been looking around on how to do this, but I can't seem to find what I am looking for.
The idea is that as soon as the program receives new serial data, it interrupts it's current operation and executes whatever function is called by the app.
To stick to the rules, here is my code:
/* This code is to operate an RGB mood light driven by TLC5940 LED driver, controlled through an android app over BT
Current status:
All desired colors implemented
BT communication up and running
Android APP in development
Libraries used:
Tlc5940 for the TLC chip (LED driver)
SoftwareSerial: To enable BT communication and uploading code to the Arduino chip simulataniously
Hardware used:
Atmega 328 chip with Arduino bootloader (or Arduino Uno/Nano)
Texas Instruments TLC5940 LED Driver
5 Common Anode RGB LED's
HC-06 BT module
various resistors
*/
#include "Tlc5940.h"
#include "SoftwareSerial.h"
//states
#define A 0
#define B 1
#define C 2
#define D 3
#define E 4
#define F 5
#define G 6
#define H 7
#define I 8
#define J 9
#define K 10
#define L 11
#define M 12
#define N 13
#define O 14
#define P 15
#define Q 16
#define Z 17
//colors on the TLC pins
int red[] = {0, 3, 6, 9, 12}; //Red LED's
int blue[] = {1, 4, 7, 10, 13}; //Blue LED's
int green[] = {2, 5, 8, 11, 14}; //Green LED's
int bright = 2048;
byte state = 'Z';
SoftwareSerial BTSerial (7, 8);
void setup() {
BTSerial.begin(9600);
Serial.begin(9600);
Tlc.init(); //initialize TLC chip
delay(1000); //this delay is in place so that the first part of the code is not skipped.
for (int i = 0; i <= 4; i++) {
Tlc.set(red[i], 500);
}
Tlc.update();
delay(500);
Tlc.clear();
for (int i = 0; i <= 4; i++) {
Tlc.set(green[i], 500);
}
Tlc.update();
delay(500);
Tlc.clear();
for (int i = 0; i <= 4; i++) {
Tlc.set(blue[i], 500);
}
Tlc.update();
delay(500);
Tlc.clear();
Tlc.update();
}
void loop() {
if (BTSerial.available() > 0) {
state = BTSerial.read();
}
Serial.println(state);
switch (state)
{
case 'A':
redled();
break;
case 'B':
greenled();
break;
case 'C':
blueled();
break;
//deleted some states for length
case 'Q':
basicfade();
break;
case 'R':
rainbowfade();
break;
case 'Z':
reset();
break;
}
}
void redled() {
Tlc.clear();
for (int i; i <= 4; i++) {
Tlc.set(red[i], bright);
}
Tlc.update();
}
void greenled() {
Tlc.clear();
for (int i; i <= 4; i++) {
Tlc.set(green[i], bright);
}
Tlc.update();
}
void blueled() {
Tlc.clear();
for (int i; i <= 4; i++) {
Tlc.set(blue[i], bright);
}
Tlc.update();
}
//deleted a bunch of functions for length but you get the idea
void basicfade() {
Tlc.clear();
for (int fade = 0; fade <= bright; fade += 10) {
Tlc.set(0, fade);
Tlc.set(3, fade);
Tlc.set(6, fade);
Tlc.set(9, fade);
Tlc.set(12, fade);
Tlc.update();
delay(20);
}
for (int fade = 0; fade <= bright; fade += 10) {
Tlc.set(1, fade);
Tlc.set(4, fade);
Tlc.set(7, fade);
Tlc.set(10, fade);
Tlc.set(13, fade);
Tlc.update();
delay(20);
}
for (int fade = 0; fade <= bright; fade += 10) {
Tlc.set(2, fade);
Tlc.set(5, fade);
Tlc.set(8, fade);
Tlc.set(11, fade);
Tlc.set(14, fade);
Tlc.update();
delay(20);
}
for (int fade = bright; fade >= 0; fade -= 5) {
Tlc.setAll(fade);
Tlc.update();
delay(20);
}
}
void rainbowfade() {
//red
for (int fade = 0; fade <= bright; fade += 10) {
Tlc.set(0, fade);
Tlc.set(3, fade);
Tlc.set(6, fade);
Tlc.set(9, fade);
Tlc.set(12, fade);
Tlc.update();
delay(10);
}
//orange
for (int fade = 0; fade <= 1147; fade += 10) {
Tlc.set(1, fade);
Tlc.set(4, fade);
Tlc.set(7, fade);
Tlc.set(10, fade);
Tlc.set(13, fade);
Tlc.update();
delay(10);
}
//yellow
for (int fade = 1147; fade <= bright; fade += 10) {
Tlc.set(1, fade);
Tlc.set(4, fade);
Tlc.set(7, fade);
Tlc.set(10, fade);
Tlc.set(13, fade);
Tlc.update();
delay(10);
}
//green
for (int fade = bright; fade >= 0; fade -= 10) {
Tlc.set(0, fade);
Tlc.set(3, fade);
Tlc.set(6, fade);
Tlc.set(9, fade);
Tlc.set(12, fade);
Tlc.update();
delay(10);
}
//blue
for (int fade = 0; fade <= bright; fade += 10) {
Tlc.set(2, fade);
Tlc.set(5, fade);
Tlc.set(8, fade);
Tlc.set(11, fade);
Tlc.set(14, fade);
Tlc.update();
delay(10);
}
for (int fade = bright; fade >= 0; fade -= 10) {
Tlc.set(1, fade);
Tlc.set(4, fade);
Tlc.set(7, fade);
Tlc.set(10, fade);
Tlc.set(13, fade);
Tlc.update();
delay(10);
}
//indigo
for (int fade = 0; fade <= 594; fade += 10) {
Tlc.set(0, fade);
Tlc.set(3, fade);
Tlc.set(6, fade);
Tlc.set(9, fade);
Tlc.set(12, fade);
Tlc.update();
delay(10);
}
for (int fade = 255; fade >= 1044; fade -= 10) {
Tlc.set(2, fade);
Tlc.set(5, fade);
Tlc.set(8, fade);
Tlc.set(11, fade);
Tlc.set(14, fade);
Tlc.update();
delay(10);
}
//violet
for (int fade = 594; fade <= 1904; fade += 10) {
Tlc.set(0, fade);
Tlc.set(3, fade);
Tlc.set(6, fade);
Tlc.set(9, fade);
Tlc.set(12, fade);
Tlc.update();
delay(10);
}
for (int fade = 0; fade <= 1044; fade += 10) {
Tlc.set(1, fade);
Tlc.set(4, fade);
Tlc.set(7, fade);
Tlc.set(10, fade);
Tlc.set(13, fade);
Tlc.update();
delay(10);
}
for (int fade = 1044; fade <= 1905; fade += 10) {
Tlc.set(2, fade);
Tlc.set(5, fade);
Tlc.set(8, fade);
Tlc.set(11, fade);
Tlc.set(14, fade);
Tlc.update();
delay(10);
}
Tlc.clear();
Tlc.update();
delay(50);
}
void reset() {
Tlc.clear();
Tlc.update();
}