Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Photobooth pirate LED controller
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- This sketch uses the Adafruit Neopixel library.
- The test was run on a Arduino Nano clone, using pin 3 as the WS2812 control LED.
- Note: I only used a short chain of eight WS2812 LEDs for this code, so that is all that it will operate.
- You need to edit it for longer chains of LEDs.
- ----------------------------
- PATTERNS NEEDED:
- The 1st letter I assume starts and stops the LEDS. When I run the command in the software for "stop LED", it just sends one message: #0=101 [e]
- The 2nd letter represents the speed. s=slow, m=medium, q=fast
- The number [8] represents a color choice: 1=white, 2=red, 3=green, 4=blue, 5=purple, 6=yellow, 7=cyan, 8=orange
- The final letter represents the pattern. z=spinning wheel, x=right fill, c=left fill, v=right ball, b=left ball
- The remaining problem is that the lights do not shut off when a single 'e' is entered.
- */
- #include <Adafruit_NeoPixel.h>
- #ifdef __AVR__
- #include <avr/power.h>
- #endif
- #define PIN 3
- #define NUMPIXELS 8
- Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
- char messageLetters[4];
- int messageCounter = 0;
- int serialMessage_timeOut = 500; // This is the milliseconds that a control message must complete in.
- // I just guessed at this value, 9600 baud is *about* 960 characters per second...
- unsigned long serialMessage_beginTime = 0;
- unsigned long serialMessage_currentTime = 0;
- bool messageIncoming = false;
- bool displayAlreadyCalled = false;
- bool charOutOfRange = false; // This is a value to indicate if a character was not within range (if it was not one of the accepted values)
- int LEDs_off_on = 0; // zero means "all off" and one means show some pattern
- int LEDs_speed = 0; // 0 = slow, 1 = medium and 2 = fast
- int LEDs_color = 0;
- int LEDs_color_red = 0; // 1=white, 2=red, 3=green, 4=blue, 5=purple, 6=yellow, 7=cyan, 8=orange
- int LEDs_color_green = 0;
- int LEDs_color_blue = 0;
- int LEDs_pattern = 0; // the pattern to use: z=spinning wheel, x=right fill, c=left fill, v=right ball, b=left ball
- // the numerical version is 0=spinning wheel, 1=right fill, 2=left fill, 3=right ball, 4=left ball
- int led_pattern_control_1 = 0; // This is a variable used to generate the different patterns.
- // The different patterns use it different ways.
- int LED_change_speed = 0; // This is the speed that the LED display changes at. One of the three values below gets copied into here.
- int LED_change_speed_slow = 3000;
- int LED_change_speed_medium = 700;
- int LED_change_speed_fast = 400;
- unsigned long LED_change_beginTime = 0;
- unsigned long LED_change_currentTime = 0;
- // function prototypes
- void beginMessageTimer();
- void resetMessage();
- void displayLedMode();
- void turnAllLedsOff();
- void performMessage();
- void check_input_letter(char);
- bool returnMessage = true; // test variable
- void echoMessage(); // This is a function to return the sent message
- void echoMessage() {
- Serial.print(messageLetters[0]);
- Serial.print(messageLetters[1]);
- Serial.print(messageLetters[2]);
- Serial.println(messageLetters[3]);
- }
- void setup() {
- Serial.begin(9600);
- for (int x = 0; x < 4; x++) {
- messageLetters[x] = 0; // init the message array to nothing
- }
- pixels.begin(); // This initializes the NeoPixel library.
- turnAllLedsOff();
- }
- void loop() {
- // This section gets characters off the serial connection, if any are there to get.
- if (Serial.available()) {
- while (Serial.available() > 0) {
- if (messageCounter < 4) {
- messageLetters[messageCounter] = Serial.read();
- check_input_letter(messageLetters[messageCounter]);
- if (charOutOfRange == false) {
- messageCounter++;
- if (messageIncoming == false) {
- messageIncoming = true;
- beginMessageTimer();
- }
- if (messageCounter > 3) {
- Serial.println("performMessage(1) being called");
- performMessage();
- displayAlreadyCalled = true;
- messageIncoming = false;
- resetMessage();
- }
- }
- }
- else {
- // reset the message if more than four characters are sent
- resetMessage();
- }
- }
- }
- /*
- if (messageCounter > 3) {
- Serial.println("performMessage(1) being called");
- performMessage();
- displayAlreadyCalled = true;
- messageIncoming = false;
- resetMessage();
- }
- */
- if (messageIncoming == true) { // This section resets a partial message, if it takes too long to complete.
- if (displayAlreadyCalled == false) {
- serialMessage_currentTime = millis();
- if (serialMessage_currentTime > serialMessage_beginTime) {
- if (serialMessage_currentTime > (serialMessage_beginTime + serialMessage_timeOut)) {
- //Serial.println("does this ever work?");
- if (messageCounter == 1) {
- if (messageLetters[0] == 'e') {
- Serial.println("single-e being called");
- //performMessage();
- messageIncoming = false;
- displayAlreadyCalled = true;
- LEDs_off_on == 0;
- turnAllLedsOff();
- resetMessage();
- }
- }
- }
- }
- else {
- serialMessage_beginTime = millis(); // millis() rollover condition
- }
- }
- }
- // This section changes the LEDs, if they are set to light up at all.
- if (LEDs_off_on == 1) {
- LED_change_currentTime = millis();
- if (LED_change_currentTime > LED_change_beginTime) {
- if (LED_change_currentTime > (LED_change_beginTime + LED_change_speed)) {
- //Serial.println("led caller #1");
- displayLedMode();
- //FastLED.show();
- LED_change_beginTime = millis(); // reset the previous change time to now.
- }
- }
- else {
- LED_change_beginTime = millis(); // millis() rollover condition
- }
- }
- } // end of main loop
- void beginMessageTimer() {
- serialMessage_beginTime = millis();
- }
- void resetMessage() {
- if (returnMessage == true) {
- echoMessage();
- }
- //for (int x = 0; x < 4; x++) {
- // messageLetters[x] = 0;
- //}
- messageCounter = 0;
- messageIncoming = false;
- displayAlreadyCalled = false;
- }
- void displayLedMode() {
- // Note: I just wrote five different LED patterns here. I didn't try to duplicate the exact photobooth patterns.
- Serial.print("displayLedMode() pattern = ");
- Serial.println(LEDs_pattern);
- //Serial.print("speed = ");
- //Serial.println(LED_change_speed);
- switch (LEDs_pattern) {
- case 0:
- // This pattern blinks every other light off and on, in two sets.
- if (led_pattern_control_1 == 0) {
- for (int x = 0; x < NUMPIXELS; x = x + 2) {
- pixels.setPixelColor(x, pixels.Color(LEDs_color_red, LEDs_color_green, LEDs_color_blue));
- //Serial.println("pattern call = 0");
- }
- for (int y = 1; y < NUMPIXELS; y = y + 2) {
- pixels.setPixelColor(y, pixels.Color(0, 0, 0));
- }
- led_pattern_control_1 = 1;
- pixels.show();
- //Serial.println("pattern call = 0");
- }
- else {
- for (int x = 0; x < NUMPIXELS; x = x + 2) {
- pixels.setPixelColor(x, pixels.Color(0, 0, 0));
- }
- for (int y = 1; y < NUMPIXELS; y = y + 2) {
- pixels.setPixelColor(y, pixels.Color(LEDs_color_red, LEDs_color_green, LEDs_color_blue));
- }
- led_pattern_control_1 = 0;
- pixels.show();
- }
- break;
- case 1:
- // This pattern chases one LED in one direction.
- for (int x = 0; x < NUMPIXELS; x++) {
- pixels.setPixelColor(x, pixels.Color(0, 0, 0));
- if (x == led_pattern_control_1) {
- pixels.setPixelColor(x, pixels.Color(LEDs_color_red, LEDs_color_green, LEDs_color_blue));
- }
- }
- led_pattern_control_1++;
- if (led_pattern_control_1 == NUMPIXELS) {
- led_pattern_control_1 = 0;
- }
- pixels.show();
- break;
- case 2:
- // This pattern chases one LED in the opposite direction of pattern #1.
- for (int x = 0; x < NUMPIXELS; x++) {
- pixels.setPixelColor(x, pixels.Color(0, 0, 0));
- if (x == led_pattern_control_1) {
- pixels.setPixelColor(x, pixels.Color(LEDs_color_red, LEDs_color_green, LEDs_color_blue));
- }
- }
- led_pattern_control_1--; // <--------- to reverse the direction, only 1 line is changed compared to pattern #1
- if (led_pattern_control_1 == -1) {
- led_pattern_control_1 = (NUMPIXELS - 1);
- }
- //FastLED.show();
- pixels.show();
- break;
- case 3:
- // This pattern fills the LEDs in one direction.
- for (int x = 0; x < NUMPIXELS; x++) {
- if (x <= led_pattern_control_1) {
- pixels.setPixelColor(x, pixels.Color(LEDs_color_red, LEDs_color_green, LEDs_color_blue));
- }
- else {
- pixels.setPixelColor(x, pixels.Color(0, 0, 0));
- }
- }
- led_pattern_control_1++;
- if (led_pattern_control_1 == NUMPIXELS) {
- led_pattern_control_1 = 0;
- }
- pixels.show();
- break;
- case 4:
- // This pattern fills the LEDs in the opposite direction of pattern #3.
- for (int x = 0; x < NUMPIXELS; x++) {
- if (x >= led_pattern_control_1) {
- pixels.setPixelColor(x, pixels.Color(LEDs_color_red, LEDs_color_green, LEDs_color_blue));
- }
- else {
- pixels.setPixelColor(x, pixels.Color(0, 0, 0));
- }
- }
- led_pattern_control_1--;
- if (led_pattern_control_1 == -1) {
- led_pattern_control_1 = (NUMPIXELS - 1);
- }
- pixels.show();
- break;
- default:
- Serial.println("no led pattern!");
- break;
- }
- }
- void turnAllLedsOff() {
- for (int x = 0; x < NUMPIXELS; x++) {
- pixels.setPixelColor(x, pixels.Color(0, 0, 0));
- }
- pixels.show();
- }
- void performMessage() {
- //Serial.println("performMessage() being called");
- if (messageCounter == 1) {
- if (messageLetters[0] == 'e') {
- // this turns all the LEDs off
- Serial.println("performMessage() turning LEDs off");
- LEDs_off_on = 0;
- turnAllLedsOff();
- }
- else {
- // any message that does not begin with 'e' gets tossed out
- resetMessage();
- }
- }
- else if (messageCounter == 4) {
- LEDs_off_on = 1;
- // The 2nd letter represents the speed. s=slow, m=medium, q=fast
- if (messageLetters[1] == 's') {
- LED_change_speed = LED_change_speed_slow;
- }
- else if (messageLetters[1] == 'm') {
- LED_change_speed = LED_change_speed_medium;
- }
- else if (messageLetters[1] == 'q') {
- LED_change_speed = LED_change_speed_fast;
- }
- else {
- // If the [speed] character is not correct, set the charOutOfRange indicator.
- charOutOfRange = true;
- }
- //Serial.print("set speed = ");
- //Serial.println(LED_change_speed);
- //Serial.print("color char = ");
- //Serial.println(messageLetters[2]);
- //Serial.print("range check #1 = ");
- //Serial.println(charOutOfRange);
- if (charOutOfRange == false) {
- // The number [8] represents a color choice: 1=white, 2=red, 3=green, 4=blue, 5=purple, 6=yellow, 7=cyan, 8=orange
- Serial.println("inside condition?");
- //LEDs_color = messageLetters[2] - 48; // This gets the single-digit-character's numerical value.
- //Serial.println("conditionals?...");
- Serial.print("LEDs_color = ");
- Serial.println(messageLetters[2]);
- if (messageLetters[2] == '1') {
- // color = white
- LEDs_color_red = 255;
- LEDs_color_green = 255;
- LEDs_color_blue = 255;
- }
- else if (messageLetters[2] == '2') {
- // color = red
- LEDs_color_red = 255;
- LEDs_color_green = 0;
- LEDs_color_blue = 0;
- }
- else if (messageLetters[2] == '3') {
- // color = green
- LEDs_color_red = 0;
- LEDs_color_green = 255;
- LEDs_color_blue = 0;
- }
- else if (messageLetters[2] == '4') {
- // color = blue
- LEDs_color_red = 0;
- LEDs_color_green = 0;
- LEDs_color_blue = 255;
- }
- else if (messageLetters[2] == '5') {
- // color = purple
- LEDs_color_red = 128;
- LEDs_color_green = 0;
- LEDs_color_blue = 128;
- }
- else if (messageLetters[2] == '6') {
- // color = yellow
- LEDs_color_red = 255;
- LEDs_color_green = 255;
- LEDs_color_blue = 0;
- }
- else if (messageLetters[2] == '7') {
- // color = cyan
- LEDs_color_red = 0;
- LEDs_color_green = 255;
- LEDs_color_blue = 255;
- }
- else if (messageLetters[2] == '8') {
- // color = orange
- LEDs_color_red = 255;
- LEDs_color_green = 165;
- LEDs_color_blue = 0;
- }
- else {
- // If the [color] character is not correct, set the charOutOfRange indicator.
- charOutOfRange = true;
- Serial.print("performMessage() color char = ");
- Serial.println(messageLetters[2]);
- }
- /*
- Serial.print("red = ");
- Serial.println(LEDs_color_red);
- Serial.print("green = ");
- Serial.println(LEDs_color_green);
- Serial.print("blue = ");
- Serial.println(LEDs_color_blue);
- */
- if (charOutOfRange == false) {
- //int LEDs_pattern = 0; // the pattern to use: z=spinning wheel, x=right fill, c=left fill, v=right ball, b=left ball
- // the numerical version is 0=spinning wheel, 1=right fill, 2=left fill, 3=right ball, 4=left ball
- if (messageLetters[3] == 'z') {
- LEDs_pattern = 0;
- }
- else if (messageLetters[3] == 'x') {
- LEDs_pattern = 1;
- }
- else if (messageLetters[3] == 'c') {
- LEDs_pattern = 2;
- }
- else if (messageLetters[3] == 'v') {
- LEDs_pattern = 3;
- }
- else if (messageLetters[3] == 'b') {
- LEDs_pattern = 4;
- }
- else {
- // If the [speed] character is not correct, set the charOutOfRange indicator.
- charOutOfRange = true;
- }
- Serial.print("performMessage() pattern = ");
- Serial.println(LEDs_pattern);
- led_pattern_control_1 = 0; // reset the pattern control sub-value
- }
- }
- /*
- Serial.print("red = ");
- Serial.println(LEDs_color_red);
- Serial.print("green = ");
- Serial.println(LEDs_color_green);
- Serial.print("blue = ");
- Serial.println(LEDs_color_blue);
- */
- if (charOutOfRange == true) {
- resetMessage();
- }
- } // if messageCounter == 3
- else {
- // any message that does not have 1 or 4 characters gets tossed out
- resetMessage();
- }
- // LEDs_off_on = 1;
- //Serial.print("LEDs_off_on = ");
- //Serial.println(LEDs_off_on);
- }
- void check_input_letter(char tLetter) {
- charOutOfRange = true;
- if (messageLetters[0] == 'e') {
- charOutOfRange = false;
- }
- // -------------------------------
- if (messageLetters[0] == 's') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == 'm') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == 'q') {
- charOutOfRange = false;
- }
- // ------------------------------
- if (messageLetters[0] == '1') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == '2') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == '3') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == '4') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == '5') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == '6') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == '7') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == '8') {
- charOutOfRange = false;
- }
- // ---------------------------
- if (messageLetters[0] == 'z') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == 'x') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == 'c') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == 'v') {
- charOutOfRange = false;
- }
- if (messageLetters[0] == 'b') {
- charOutOfRange = false;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement