arduino交互设计作品2019——害羞的郁金香

#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);
    }*_