Stap 7: Arduino
De Arduino-code van het ZIP-bestand op de GEMMA laden. Moet u de bibliotheek van de Neopixel van Adafruit geïnstalleerd dus volg de instructies in de link.
U kunt de volledige code van de Arduino uit het ZIP-bestand in de Arduino IDE, openstellen dus ik zal niet plak hier het hele codebestand. In plaats daarvan ga ik uitleggen alles in secties. Vergeef de opmaak van het plakken van de code hier. Ik beloof dat er veel mooier in het werkelijke codebestand.
#include < Adafruit_NeoPixel.h >
#define LED 1
#define BTN1 0
#define BTN2 2
int lastButton1State = laag;
int lastButton2State = laag;
Deze sectie bevat de Neopixel library waarmee de controlemethoden voor de verlichting. De pin van de LED op de Gemma is 1 en de knoppen zijn op 0 en 2. Als u een verschillende Arduino of bedrading schema gebruikt, moet u deze hier wijzigen. Ten slotte, we slaan de laatste stand van elk van de knoppen, zodat we niet voortdurend het gedrag van de knop activeren als u de knop ingedrukt. We willen alleen dat dat gebeurt eenmaal per klik.
int ledCount = 56;
Parameter 1 = aantal pixels in strip
Parameter 2 = pin-nummer (de meeste zijn geldig)
Parameter 3 = pixel type vlaggen, wens samen toevoegen:
NEO_KHZ800 800 KHz bitstream (de meeste NeoPixel producten w/WS2812 LEDs)
NEO_KHZ400 400 KHz (klassieke 'v1' (niet v2) FLORA pixels, WS2811 drivers)
NEO_GRB Pixels zijn bedraad voor GRB bitstream (de meeste NeoPixel produkten)
NEO_RGB Pixels zijn bedraad voor RGB bitstream (v1 FLORA pixels, niet v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel (ledCount, LED, NEO_GRB + NEO_KHZ800);
Ik gebruikte 56 LEDs in mijn lichaamsbouw, zodat ik dat als een variabele instellen. De strip-object wordt geïnitialiseerd als 56 LEDs, de gedefinieerde LED-pin en de waarden voor Gemma en WS2812b LEDs.
uint32_t kleuren [5] = {strip. Kleur (255, 255, 0), / / geel
strip. Kleur (127, 0, 255), / / paars
strip. Kleur (0, 0, 255), / / groen
strip. Kleur (255, 0, 0), / / rood
strip. Kleur (0, 0, 255)}; blauw
int currentColor = 0;
int maxColor = 5;
int defaultBrightness = 50;
Ik besliste te gebruiken 5 kleuren in de cyclus. Geel is de standaard kleur, Zelda draagt paars, en de rest keek cool. De waarden currentColor en maxColor laten doorlopen van de 5 kleuren. De max helderheid is 255, zodat ik het aan 50 plaatste dat veel ruimte om te groeien in de vuur modus.
VOID Setup {}
Initialiseer de drukknop pin als input:
pinMode (BTN1, INPUT_PULLUP);
pinMode (BTN2, INPUT_PULLUP);
strip.begin();
for (int i = 0; ik < ledCount; i ++)
{
strip.setPixelColor (i, colors[currentColor]);
}
Get helderder
for (int i = 5; ik < defaultBrightness; ik += 2).
{
strip.setBrightness(i);
strip.show();
delay(50);
}
}
Dit is de methode aangeroepen wanneer de boog is ingeschakeld. Het initialiseert de knoppen en de verlichting, wordt de kleur ingesteld op geel en geleidelijk vergroot de helderheid van 0 tot en met 50.
void loop {}
for (int i = 0; i < 2000; i ++)
{
int button1State = digitalRead(BTN1);
Als (button1State! = lastButton1State)
{
lastButton1State = button1State;
Als (button1State == laag)
changeColor();
}
int button2State = digitalRead(BTN2);
Als (button2State! = lastButton2State)
{
lastButton2State = button2State;
Als (button2State == laag)
fireArrow();
}
delay(5);
}
Pulse();
}
Dit is waar de Arduino zal zal looping allermeest naar de tijd, wachten op een knop drukt. Ik wilde de knoppen te spelen, zodat het knop klikken voor ongeveer 10 seconden (2000 iteraties keer een 5ms vertragen) gecontroleerd voordat het toont het inactief pulse-effect. Als een knop is ingedrukt, toont het dat effect alvorens terug te keren naar deze methode en de voortzetting van de lus.
VOID pulse()
{
Krijgen iets dimmer
for (int i = defaultBrightness; ik > defaultBrightness / 2; ik-= 5)
{
strip.setBrightness(i);
strip.show();
delay(50);
}
Get helderder
for (int i = defaultBrightness / 2; ik < defaultBrightness; ik += 5)
{
strip.setBrightness(i);
strip.show();
delay(50);
}
}
Dit is de inactieve effect. Wij willen worden snel, zodat we niet een knop wordt geklikt missen. Het treedt de helderheid af door 5 elke 50 MS, totdat het aan de helft van de inactiviteit helderheid krijgt, dan keert terug naar normaal.
VOID changeColor()
{
currentColor ++;
Als (currentColor == maxColor)
{
currentColor = 0;
}
int i1 = 2;
int i2 = 27;
int i3 = 28;
int i4 = 55;
Doorlopen en wijzigen van de kleur
for (int i = 0; ik < 14; i ++)
{
Set kleuren
strip.setPixelColor (i1, colors[currentColor]);
strip.setPixelColor (i2, colors[currentColor]);
strip.setPixelColor (i3, colors[currentColor]);
strip.setPixelColor (i4, colors[currentColor]);
Update iterators
Als (ik == 3)
I1 = 1;
else if (i == 4)
I1 = 6;
anders als (ik == 5)
I1 = 0;
anders als (ik == 6)
I1 = 7;
anders
I1 ++;
I2--;
i3 ++;
I4--;
Bijwerken en een beetje wachten
strip.show();
delay(50);
}
}
Wanneer op de knop kleur wijzigen wordt geklikt, worden de LEDs gewijzigd naar de volgende kleur in de lus. Ik maakte de lichten beginnen bij het midden van de boog en snel veranderen van kleur in een domino-effect naar buiten gaan. Dit stukje code is raar want de lichten in een lange reeks zijn, maar wij hebben ze verdeeld in 4 delen. De eerste sectie is anders wired van de andere 3 delen, dus de iterator i1 speciale behandeling moet te volgen van de juiste volgorde.
VOID fireArrow()
{
Krijgen iets dimmer
for (int i = defaultBrightness; ik > 20; ik-= 5)
{
strip.setBrightness(i);
strip.show();
vertraging(20);
}
Get helderder
for (int i = 20; ik < 250; ik += 5)
{
strip.setBrightness(i);
strip.show();
delay(30);
}
Een beetje helder blijven
delay(800);
Krijgen dimmer
for (int i = 250; ik > defaultBrightness; i-= 10)
{
strip.setBrightness(i);
strip.show();
delay(30);
}
}
Tot slot, het vuur-effect wordt de boog ingesteld op volledige helderheid voor gewoon verlegen van een seconde, dan dimt terug naar stationair.
Hopelijk is dit alles zinvol. Als u wijzigen van de kleuren of de effecten wilt, moet het vrij gemakkelijk te passen.