Witam!
Chciałem wam przedstawić projekt diod, które zrobiłem przed świętami. Założeniem było zrobić coś kolorowego oraz swojego na choinkę.
Powstały więc lampki choinkowe w postaci bombek sterowane z smartphone.
Użyte materiały:
1) Ringi led ws2812b: 1x 24ledowy ring + kula akrylowa 100mm
2) 3x 16ledowe ringi + 3x kula akrylowa 50mm
3) Arduino Nano
4) Moduł Bt Hc-05
5) Przewód 5m usb
6) Przewód pomocniczy
7) Klej na gorąco
8) Papier ścierny wodny
9) Ładowarka od telefonu (min.2A)
Opis programu:
Jako wkład do arduino użyłem programu od Adafruit Neopixel-strandtest. Podzieliłem go na sekcje, które zapętliłem. Następnie utworzyłem oraz przerobiłem program dla dwóch oddzielnych modułów (24 i 16 led), aby dane sekcje zaczynały się i kończyły w jednym czasie na obydwóch ringach. Daną sekcje można wybierać za pomocą modułu bt przesyłając przez serial port paczki danych lub w programie, który zrobiłem, klikając przycisk. Istnieje też możliwość regulacji prędkości oraz natężenia.
Nie wrzucę programu, ponieważ nie chce aby ktoś skopiował i użył go komercyjnie.
Budowa:
Na początku napisałem program z jednym ringiem, który testowałem na płytce stykowe:
Następnie przerobiłem, aby uwzględnić różne ilości bitów w ringach
https://www.youtube.com/watch?v=U6TOBUC4lek&feature=youtu.be
Zmatowiłem bańki akrylowe od środka. Następnie polutowałem arduino z modułem Bt, porobiłem testy.
Podłączyłem przewody zasilające i sterujące pomiedzy ringami oraz zamontowałem w obudowy.
Oczywiście trzeba było zrobić miejsce na przewody łączące oraz
Opis aplikacji:
1. Niebieskim kółkiem zaznaczony jest przycisk do wybrania połączenia z modułem.
2. Na czerwono zaznaczone jest wybór programu:
Program 1 – Przesuwające w koło kolory
Program 2 – Przeskakujący ring Biały
Program 3 – Przeskakujący ring Czerwony
Program 4 – Przeskakujący ring Zielony
Program 5 – Przeskakujący ring Niebieski
Program 6 – Przepływające kolory
Program 7 – Przechodząca tęcza
Program 8 – Przeskakujące kolory
*Program 9 – Standby – Cztery diody przeskakujące pomiędzy sobą o bardzo małym natężeniem.
3. Zaznaczonymi na fioletowymi przyciskami zmniejszamy natężenie
4. W ostatniej grupie koloru zielonego mamy przyciski odpowiadając za prędkość sekencji
Film prezentujący działanie:
https://www.youtube.com/watch?v=VqD8I3SG9Do
EDIT!
Dorzucam kod programu oraz Apke :)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 |
#include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #include <SoftwareSerial.h> #define PIN 2 #define PIN1 9 SoftwareSerial serial2(5,6 ); // rx-tx int prog = 0; String woda = ""; int tim = 60; int bri = 240; int tim1 = 60; int w = 0; Adafruit_NeoPixel strip = Adafruit_NeoPixel(24, PIN, NEO_GRB + NEO_KHZ800); Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(16, PIN1, NEO_GRB + NEO_KHZ800); void setup() { pinMode(13,OUTPUT); pinMode(4,INPUT); pinMode(3,INPUT); // Zasilanie BT digitalWrite(13,LOW); // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket #if defined (__AVR_ATtiny85__) if (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif // End of trinket special code serial2.begin(9600); strip.begin(); strip.show(); // Initialize all pixels to 'off' strip1.begin(); strip1.show(); } void loop() { odczyt(); if (w==1) { w = 0; } else if (w==0 && tim == 0) {tim = 60; bri = 240; strip.setBrightness(bri); strip1.setBrightness(bri); } if (prog == 1) { // Pierwszy program led zmiana koloru kada dioda pokolei colorWipe(strip.Color(255, 0, 0), tim); // Red colorWipe(strip.Color(255, 80, 0), tim); // Orange colorWipe(strip.Color(180, 255, 0), tim); // o-Green colorWipe(strip.Color(0, 255, 0), tim); // Green colorWipe(strip.Color(0, 255, 50), tim); // Green-B colorWipe(strip.Color(0, 120, 255), tim); // G-Blue colorWipe(strip.Color(0, 0, 255), tim); // Blue colorWipe(strip.Color(80, 0, 255), tim); // Blue - R colorWipe(strip.Color(255, 0, 80), tim); // B-Red } else if (prog == 2) { theaterChase(strip.Color(180, 140, 110), tim); // White } else if (prog == 3) { theaterChase(strip.Color(200, 0, 0), tim); // Red } else if (prog == 4) { theaterChase(strip.Color(0, 200, 0), tim); // green } else if (prog == 5) { theaterChase(strip.Color(0, 0, 200), tim); // Blue } else if (prog == 6) { rainbow(tim); } else if (prog == 7) { rainbowCycle(tim); } else if (prog == 8) { theaterChaseRainbow(tim); } else { sleep(tim+2500); } } //XXXXXXXXXXXXXXXXXX OCZYT XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void odczyt() { if (serial2.available() > 0) { woda = serial2.readStringUntil('\n'); if (woda == "p1") {prog = 1; tim = 0;} else if (woda == "p2") {prog = 2 ; tim = 0;} else if (woda == "p3") {prog = 3 ;tim = 0;} else if (woda == "p4") {prog = 4; tim = 0;} else if (woda == "p5") {prog = 5 ;tim = 0;} else if (woda == "p6") {prog = 6; tim = 0;} else if (woda == "p7") {prog = 7 ;tim = 0;} else if (woda == "p8") {prog = 8; tim = 0;} else if (woda == "p9") {prog = 9; tim = 0;} if (woda == "t-"){ if (tim <= 240){ tim = tim + 10; serial2.print("czas"); serial2.println(tim); w=1; } } if (woda == "t+"){ if (tim > 20){ tim = tim - 10; serial2.print("czas"); serial2.println(tim); w=1; } } if (woda == "b+"){ if (bri < 230){ bri = bri + 20; serial2.print("brighnes"); serial2.println(bri); } strip.setBrightness(bri); strip1.setBrightness(bri); } if (woda == "b-"){ if (bri > 5){ bri = bri - 20; serial2.print("brighnes"); serial2.println(bri); } strip.setBrightness(bri); strip1.setBrightness(bri); } } } // Fill the dots one after the other with a color void colorWipe(uint32_t c, uint8_t wait) { for (uint16_t i = 0; i < strip.numPixels(); i++) { strip1.setPixelColor(i/1.5, c); // przygotowane dla dwóch ringów strip.setPixelColor(i, c); if (tim> 10){ strip1.show(); strip.show();} else if (tim<10){ for(int x = 0; x < 24; x++){ strip.setPixelColor(x, strip.Color(0, 0, 0)); ///////////wyczysc ustawione strip1.setPixelColor(x, strip.Color(0, 0, 0)); }} odczyt(); delay(tim); } } void rainbow(uint8_t wait) { uint16_t i, j; for (j = 0; j < 256; j++) { for (i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, Wheel((i + j) & 255)); // przygotowane dla dwóch ringów strip1.setPixelColor(i/1.5, Wheel((i + j) & 255)); odczyt(); } if (tim> 10){ strip1.show(); strip.show();} delay(tim); } } // Slightly different, this makes the rainbow equally distributed throughout void rainbowCycle(uint8_t wait) { uint16_t i, j, n; for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel for (i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); // przygotowane dla dwóch ringów strip1.setPixelColor((i/1.5), Wheel(((i * 256 / strip.numPixels()) + j) & 255)); } if (tim> 10){ strip1.show(); strip.show();} odczyt(); delay(tim); } } //Theatre-style crawling lights. void theaterChase(uint32_t c, uint8_t wait) { for (int j = 0; j < 10; j++) { //do 10 cycles of chasing for (int q = 0; q < 3; q++) { for (int i = 0; i < strip.numPixels(); i = i + 3) { strip.setPixelColor(i + q, c); //turn every third pixel on strip1.setPixelColor(i + q, c); } if (tim> 10){ strip1.show(); strip.show();} odczyt(); delay(tim); for (int i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i + q, 0); //turn every third pixel off strip1.setPixelColor(i + q, 0); //turn every third pixel off } } } } //XXXXXXXXXXXXXXXXXXXXXX chaseRainbow XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void theaterChaseRainbow(uint8_t wait) { for (int j = 0; j < 256; j++) { // cycle all 256 colors in the wheel for (int q = 0; q < 3; q++) { for (int i = 0; i < strip.numPixels(); i = i + 3) { strip.setPixelColor(i + q, Wheel( (i + j) % 255));//turn every third pixel on } for (int i = 0; i < strip1.numPixels(); i = i + 3){ // przygotowane dla dwóch ringów strip1.setPixelColor(i + q, Wheel( (i + j) % 255)); } if (tim> 10){ strip1.show(); strip.show();} odczyt(); delay(tim); for (int i = 0; i < strip.numPixels(); i = i + 3) { strip.setPixelColor(i + q, 0); strip1.setPixelColor(i + q, 0); //turn every third pixel off } } } } // Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if (WheelPos < 85) { return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if (WheelPos < 170) { WheelPos -= 85; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } //XXXXXXXXXXXXXXXXXXXXXXXXXXXX SLEEP XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX void sleep(uint16_t wait) { for(int x = 0; x < 24; x++){ strip.setPixelColor(x, strip.Color(0, 0, 0)); ///////////wyczysc ustawione strip1.setPixelColor(x, strip.Color(0, 0, 0)); } for (int x = 0; x < 4; x++) { strip.setPixelColor(x * 6, strip.Color(9, 4, 0)); // Wersja z 4 ledami strip.setPixelColor((x * 6) - 6, strip.Color(2, 1, 0)); if (x == 0) { strip.setPixelColor(18, strip.Color(2, 1, 0)); strip.setPixelColor(12, strip.Color(2, 1, 0)); strip.setPixelColor(6, strip.Color(2, 1, 0)); } if (tim> 10){ strip.show();} strip1.setPixelColor(x * 4, strip1.Color(9, 4, 0)); strip1.setPixelColor((x * 4) - 4, strip1.Color(2, 1, 0)); if (x == 0) { strip1.setPixelColor(4, strip1.Color(2, 1, 0)); strip1.setPixelColor(8, strip1.Color(2, 1, 0)); strip1.setPixelColor(12, strip1.Color(2, 1, 0)); } if (tim> 10){ strip1.show();} odczyt(); if (tim == 0) {tim=0;} else if (tim>10) tim=2500; delay(tim ); } /* for (int x = 0; x < 20; x++) { strip.setPixelColor(0, strip.Color(x + 1, 0, 0)); strip.show(); delay(wait); } for (int x = 20; x > 0; x--) { strip.setPixelColor(0, strip.Color(x + 1, 0, 0)); strip.show(); delay(wait); } */ } |
Troszeczkę się spóźniłeś, ale projekt robi wielkie wrażenie. Leci 5 gwiazdek.
Zacząłem go robić dokładnie rok temu :P Więc myślę, że musiało to nabrać mocy urzędowej :P
Projekt super, w sam raz do zrobienia na następne święta. Mógłbyś pochwalić się kodem i apką ?
Przypominam piąty punkt regulaminu konkursu:
5. Opublikowany projekt musi być kompletny, tj. posiadać wszystkie części dokumentacji (np. schematy, kody źródłowe, projekty płytek drukowanych, …), które są potrzebne do zrealizowania projektu.
(no chyba, że nie zależy Ci na otrzymaniu 50% rabatu do Nettigo:)
Efekt fajny ale brak kodu apk i źródła dla Arduino dyskwalifikuje projekt na tym portalu.
Teraz jest super
Fajnie że zmieniłeś zdanie w temacie kodu źródłowego. Dałbym teraz 5 gwiazdek ale ocen chyba nie da się zmienić.
Niestety się nie da. Ale w sumie pomyślę o tym… :)