Lucas Teske ревизій цього gist 9 years ago. До ревизії
1 file changed, 180 insertions
pattylove.ino(файл створено)
| @@ -0,0 +1,180 @@ | |||
| 1 | + | #include <Adafruit_NeoPixel.h> | |
| 2 | + | #define PIN 6 | |
| 3 | + | ||
| 4 | + | Adafruit_NeoPixel strip = Adafruit_NeoPixel(40, PIN, NEO_GRB + NEO_KHZ800); | |
| 5 | + | ||
| 6 | + | uint32_t matrix[5][8]; | |
| 7 | + | const float heartPeriod = 500; | |
| 8 | + | const int rainbowPeriod = 10; | |
| 9 | + | const float pattyLovePeriod = 200; | |
| 10 | + | ||
| 11 | + | byte img[5][64] = { | |
| 12 | + | {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | |
| 13 | + | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | |
| 14 | + | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | |
| 15 | + | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | |
| 16 | + | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
| 17 | + | }; | |
| 18 | + | ||
| 19 | + | int stateMachine = 0; | |
| 20 | + | int pattyLoveCycles = 0; | |
| 21 | + | bool pattyLoveLock = true; | |
| 22 | + | uint32_t lastTime = 0; | |
| 23 | + | ||
| 24 | + | void setup() { | |
| 25 | + | // put your setup code here, to run once: | |
| 26 | + | ||
| 27 | + | strip.begin(); | |
| 28 | + | strip.show(); // Initialize all pixels to 'off' | |
| 29 | + | for (int i=0; i<40; i++) { | |
| 30 | + | strip.setPixelColor(i, 0); | |
| 31 | + | } | |
| 32 | + | clearMatrix(); | |
| 33 | + | Serial.begin(115200); | |
| 34 | + | } | |
| 35 | + | ||
| 36 | + | inline byte breath(float period) { | |
| 37 | + | return (byte) (127 * (sin(2 * PI * (1.0/period) * (millis()- lastTime) / PI) + 1)); | |
| 38 | + | } | |
| 39 | + | ||
| 40 | + | inline void clearMatrix() { | |
| 41 | + | for (int x=0;x<8;x++) { | |
| 42 | + | for (int y=0;y<5;y++) { | |
| 43 | + | matrix[y][x] = 0; | |
| 44 | + | } | |
| 45 | + | } | |
| 46 | + | } | |
| 47 | + | ||
| 48 | + | inline void refreshMatrix() { | |
| 49 | + | // 5x8 | |
| 50 | + | for (int x=0;x<8;x++) { | |
| 51 | + | for (int y=0;y<5;y++) { | |
| 52 | + | setColor(x, y, matrix[y][x]); | |
| 53 | + | } | |
| 54 | + | } | |
| 55 | + | strip.show(); | |
| 56 | + | } | |
| 57 | + | ||
| 58 | + | inline void setColor(uint8_t x, uint8_t y, uint32_t color) { | |
| 59 | + | strip.setPixelColor(x + y * 8, color); | |
| 60 | + | } | |
| 61 | + | ||
| 62 | + | inline uint32_t proportional(uint32_t value, uint32_t intensity) { | |
| 63 | + | return (intensity * value / 255) & 0xFF; | |
| 64 | + | } | |
| 65 | + | ||
| 66 | + | void doPattyLove() { | |
| 67 | + | byte pos = ((int)((millis()- lastTime) / pattyLovePeriod)) % (64 - 8); | |
| 68 | + | if (pos == 0 && !pattyLoveLock) { | |
| 69 | + | pattyLoveCycles++; | |
| 70 | + | pattyLoveLock = true; | |
| 71 | + | } else if (pos != 0) { | |
| 72 | + | pattyLoveLock = false; | |
| 73 | + | } | |
| 74 | + | ||
| 75 | + | for (int x=0; x<8; x++) { | |
| 76 | + | for (int y=0; y<5; y++) { | |
| 77 | + | matrix[y][x] = img[y][x+pos] ? Wheel((x+pos)*8, 64) : 0x000000; | |
| 78 | + | } | |
| 79 | + | } | |
| 80 | + | } | |
| 81 | + | ||
| 82 | + | void doHeart() { | |
| 83 | + | byte intensity = breath(heartPeriod); | |
| 84 | + | uint32_t pink = proportional(0xCC, intensity) << 16 | proportional(0x11, intensity); | |
| 85 | + | ||
| 86 | + | matrix[0][2] = pink; | |
| 87 | + | matrix[0][5] = pink; | |
| 88 | + | ||
| 89 | + | for (int i=1;i<7;i++) { | |
| 90 | + | matrix[1][i] = pink; | |
| 91 | + | } | |
| 92 | + | ||
| 93 | + | for (int i=1;i<7;i++) { | |
| 94 | + | matrix[2][i] = pink; | |
| 95 | + | } | |
| 96 | + | ||
| 97 | + | for (int i=1;i<6;i++) { | |
| 98 | + | matrix[2][i] = pink; | |
| 99 | + | } | |
| 100 | + | ||
| 101 | + | for (int i=2;i<6;i++) { | |
| 102 | + | matrix[3][i] = pink; | |
| 103 | + | } | |
| 104 | + | ||
| 105 | + | matrix[4][3] = pink; | |
| 106 | + | matrix[4][4] = pink; | |
| 107 | + | } | |
| 108 | + | ||
| 109 | + | void doRainbow() { | |
| 110 | + | byte pos = ((millis()- lastTime) / rainbowPeriod) & 255; | |
| 111 | + | for (int i=0; i< strip.numPixels(); i++) { | |
| 112 | + | matrix[i/8][i%8] = Wheel((i+pos) & 255, 32); | |
| 113 | + | } | |
| 114 | + | } | |
| 115 | + | ||
| 116 | + | uint32_t Wheel(byte WheelPos, byte intensity) { | |
| 117 | + | WheelPos = 255 - WheelPos; | |
| 118 | + | if(WheelPos < 85) { | |
| 119 | + | return strip.Color(proportional(255 - WheelPos * 3, intensity), 0, proportional(WheelPos * 3, intensity)); | |
| 120 | + | } | |
| 121 | + | if(WheelPos < 170) { | |
| 122 | + | WheelPos -= 85; | |
| 123 | + | return strip.Color(0, proportional(WheelPos * 3, intensity), proportional(255 - WheelPos * 3, intensity)); | |
| 124 | + | } | |
| 125 | + | WheelPos -= 170; | |
| 126 | + | return strip.Color(proportional(WheelPos * 3, intensity), proportional(255 - WheelPos * 3, intensity), 0); | |
| 127 | + | } | |
| 128 | + | ||
| 129 | + | void updateMachineState() { | |
| 130 | + | switch(stateMachine) { | |
| 131 | + | case 0: | |
| 132 | + | if (millis() - lastTime > 4600) { | |
| 133 | + | stateMachine = 1; | |
| 134 | + | lastTime = millis(); | |
| 135 | + | pattyLoveCycles = 0; | |
| 136 | + | Serial.println("Patty Love!"); | |
| 137 | + | } | |
| 138 | + | break; | |
| 139 | + | case 1: | |
| 140 | + | if (pattyLoveCycles == 1) { | |
| 141 | + | stateMachine = 2; | |
| 142 | + | lastTime = millis(); | |
| 143 | + | Serial.println("Heart Only"); | |
| 144 | + | } | |
| 145 | + | break; | |
| 146 | + | case 2: | |
| 147 | + | if (millis() - lastTime > 4000) { | |
| 148 | + | stateMachine = 3; | |
| 149 | + | lastTime = millis(); | |
| 150 | + | Serial.println("Blank"); | |
| 151 | + | clearMatrix(); | |
| 152 | + | } | |
| 153 | + | case 3: | |
| 154 | + | if (millis() - lastTime > 5000) { | |
| 155 | + | stateMachine = 0; | |
| 156 | + | Serial.println("Heart BG"); | |
| 157 | + | lastTime = millis(); | |
| 158 | + | } | |
| 159 | + | break; | |
| 160 | + | } | |
| 161 | + | } | |
| 162 | + | ||
| 163 | + | void loop() { | |
| 164 | + | updateMachineState(); | |
| 165 | + | switch (stateMachine) { | |
| 166 | + | case 0: | |
| 167 | + | doRainbow(); | |
| 168 | + | doHeart(); | |
| 169 | + | break; | |
| 170 | + | case 1: | |
| 171 | + | doPattyLove(); | |
| 172 | + | break; | |
| 173 | + | case 2: | |
| 174 | + | doHeart(); | |
| 175 | + | break; | |
| 176 | + | } | |
| 177 | + | ||
| 178 | + | refreshMatrix(); | |
| 179 | + | delay(1); | |
| 180 | + | } | |
Новіше
Пізніше