#include <Adafruit_NeoPixel.h>
#include <Adafruit_TiCoServo.h>
#include "SoftPWM.h"
#define NEOPIXEL_PIN A0
#define TOUCH_SENSOR_PIN 2
#define SERVO_PIN 9
//#define SERVO_OPEN 1750
#define SERVO_OPEN 1650
#define SERVO_SAFE_MIDDLE 1000
#define SERVO_CLOSED 775
#define RED 0
#define GREEN 1
#define BLUE 2
float currentRGB[] = {0, 0, 0};
float changeRGB[] = {0, 0, 0};
byte newRGB[] = {0, 0, 0};
#define MODE_SLEEPING 0
#define MODE_BLOOM 3
#define MODE_BLOOMING 4
#define MODE_BLOOMED 5
#define MODE_FADE 6
#define MODE_FADING 7
#define MODE_FADED 8
#define MODE_FALLINGASLEEP 9
#define MODE_RAINBOW 90
byte mode = MODE_FADED;
byte petalPins[] = {3, 4, 5, 6, 10, 11};
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(7, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ400);
Adafruit_TiCoServo servo;
int servoChange = 1; // open
int servoPosition = SERVO_SAFE_MIDDLE;
void setup() {
Serial.begin(115200);
pixels.begin();
servo.attach(SERVO_PIN, SERVO_CLOSED, SERVO_OPEN);
pinMode(TOUCH_SENSOR_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(TOUCH_SENSOR_PIN), _touchISR, RISING);
randomSeed(analogRead(A7));
SoftPWMBegin();
pixelsUnifiedColor(pixels.Color(0, 0, 0));
//pixelsUnifiedColor(pixels.Color(255, 70, 0));
prepareCrossFade(140, 70, 0, 140);
servo.write(servoPosition);
}
int counter = 0;
byte speed = 15;
void loop() {
boolean done = true;
switch (mode) {
case MODE_BLOOM:
prepareCrossFadeBloom(500);
changeMode(MODE_BLOOMING);
break;
case MODE_BLOOMING:
done = crossFade() && done;
done = openPetals() && done;
done = petalsBloom(counter) && done;
if (done) {
changeMode(MODE_BLOOMED);
}
break;
case MODE_FADE:
//prepareCrossFade(0, 0, 0, 800);
changeMode(MODE_FADING);
break;
case MODE_FADING:
done = crossFade() && done;
done = closePetals() && done;
done = petalsFade(counter) && done;
if (done) {
changeMode(MODE_FADED);
}
break;
case MODE_FADED:
//prepareCrossFade(140, 70, 0, 140);
changeMode(MODE_FALLINGASLEEP);
break;
case MODE_FALLINGASLEEP:
done = crossFade() && done;
done = closePetals() && done;
if (done) {
changeMode(MODE_SLEEPING);
}
break;
case MODE_RAINBOW:
rainbow(counter);
break;
}
counter++;
delay(speed);
}
void changeMode(byte newMode) {
if (mode != newMode) {
mode = newMode;
counter = 0;
}
}
void _touchISR() {
if (mode == MODE_SLEEPING) {
changeMode(MODE_BLOOM);
}
else if (mode == MODE_BLOOMED) {
changeMode(MODE_FADE);
}
}
// petals animations
boolean petalsBloom(int j) {
if (j < 250) {
return false; // delay
}
if (j > 750) {
return true;
}
int val = (j - 250) / 2;
for (int i = 0; i < 6; i++) {
SoftPWMSet(petalPins*, val);*
- }*
- return false;*
}
boolean petalsFade(int j) { - if (j > 510) {*
- return true;*
- }*
- for (int i = 0; i < 6; i++) {*
_ SoftPWMSet(petalPins*, (510 - j) / 2);_
_ }_
_ return false;_
_}_
_// animations*_
void prepareCrossFadeBloom(unsigned int duration) {
* byte color = random(0, 5);*
* switch (color) {*
* case 0: // white*
* prepareCrossFade(140, 140, 140, duration);*
* break;*
* case 1: // red*
* prepareCrossFade(140, 5, 0, duration);*
* break;*
* case 2: // blue*
* prepareCrossFade(30, 70, 170, duration);*
* break;*
* case 3: // pink*
* prepareCrossFade(140, 0, 70, duration);*
* break;*
* case 4: // orange*
* prepareCrossFade(255, 70, 0, duration);*
* break;*
* }*
}
void rainbow(int j) {
* uint16_t i;
_ byte num = pixels.numPixels() - 1;_
_ pixels.setPixelColor(pixels.numPixels() - 1, 100, 100, 100);_
_ for (i = 0; i < num; i++) {_
_ pixels.setPixelColor(i, colorWheel(((i * 256 / num) + j) & 255));_
_ }_
_ pixels.show();_
_}_
_// servo function*_
boolean openPetals() {
* if (servoPosition >= SERVO_OPEN) {
_ return true;_
_ }_
_ servoPosition ++;_
_ servo.write(servoPosition);_
_ return false;_
_}_
boolean closePetals() {
if (servoPosition <= SERVO_CLOSED) {
_ return true;_
_ }_
_ servoPosition --;_
_ servo.write(servoPosition);_
_ return false;_
_}_
_// utility function*_
void pixelsUnifiedColor(uint32_t color) {
* for (unsigned int i = 0; i < pixels.numPixels(); i++) {*
* pixels.setPixelColor(i, color);*
* }*
* pixels.show();*
}
void prepareCrossFade(byte red, byte green, byte blue, unsigned int duration) {
* float rchange = red - currentRGB;*
* float gchange = green - currentRGB;*
* float bchange = blue - currentRGB;*
* changeRGB = rchange / (float) duration;*
* changeRGB = gchange / (float) duration;*
* changeRGB = bchange / (float) duration;*
* newRGB = red;*
* newRGB = green;*
* newRGB = blue;*
* Serial.print(newRGB);*
* Serial.print(" ");*
* Serial.print(newRGB);*
* Serial.print(" ");*
* Serial.print(newRGB);*
* Serial.print(" (");*
* Serial.print(changeRGB);*
* Serial.print(" ");*
* Serial.print(changeRGB);*
* Serial.print(" ");*
* Serial.print(changeRGB);*
* Serial.println(")");*
}
boolean crossFade() {
* if (currentRGB == newRGB && currentRGB == newRGB && currentRGB == newRGB) {*
* return true;*
* }*
* for (byte i = 0; i < 3; i++) {*
if (changeRGB > 0 && currentRGB < newRGB*) {*
currentRGB = currentRGB + changeRGB*;*
* }*
else if (changeRGB < 0 && currentRGB > newRGB*) {*
currentRGB = currentRGB + changeRGB*;*
* }*
* else {*
currentRGB = newRGB*;*
* }*
* }*
* pixelsUnifiedColor(pixels.Color(currentRGB, currentRGB, currentRGB));*
_ /
Serial.print(currentRGB);
Serial.print(" ");
Serial.print(currentRGB);
Serial.print(" ");
Serial.print(currentRGB);
Serial.println();
/
return false;
}
uint32_t colorWheel(byte wheelPos) {
* // Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
wheelPos = 255 - wheelPos;
if (wheelPos < 85) {
return pixels.Color(255 - wheelPos * 3, 0, wheelPos * 3);
}
if (wheelPos < 170) {
wheelPos -= 85;
return pixels.Color(0, wheelPos * 3, 255 - wheelPos * 3);
}
wheelPos -= 170;
return pixels.Color(wheelPos * 3, 255 - wheelPos * 3, 0);
}*_