Étape 7: Arduino
Charger le code de l’Arduino dans le fichier ZIP sur le GEMMA. Vous aurez besoin de la bibliothèque Neopixel de Adafruit installé alors suivez les instructions dans le lien.
Vous pouvez ouvrir le code complet de Arduino dans le fichier ZIP dans l’IDE Arduino, donc je n’il suffit de coller le fichier de code entier ici. Au lieu de cela, je vais vous expliquer tout dans les sections. S’il vous plaît pardonnez la mise en forme de coller le code ici. Je vous promets que c’est beaucoup plus agréable dans le fichier de code réel.
#include < Adafruit_NeoPixel.h >
#define LED 1
#define BTN1 0
#define BTN2 2
int lastButton1State = faible ;
int lastButton2State = faible ;
Cette section inclut la bibliothèque de Neopixel qui fournit les méthodes de contrôle pour les lumières. La broche de LED sur le Gemma est 1, et les boutons sont sur 0 et 2. Si vous utilisez un Arduino différent ou un schéma de câblage, modifier ces ici. Enfin, nous stockons le dernier état de chacun des boutons afin que nous ne déclencher en permanence le comportement du bouton si vous maintenez le bouton enfoncé. Nous voulons seulement que cela se produise une fois par clic.
int ledCount = 56 ;
Paramètre 1 = nombre de pixels dans la bande de
Paramètre 2 = Numéro d’identification (la plupart sont valide)
Paramètre 3 = type de pixel drapeaux, additionner au besoin :
NEO_KHZ800 800 KHz bitstream (la plupart NeoPixel produits w/WS2812 LEDs)
NEO_KHZ400 400 KHz (classique « v1 » (pas v2) pixels de flore, WS2811 pilotes)
NEO_GRB Pixels sont câblés pour GRB bitstream (la plupart des produits NeoPixel)
NEO_RGB Pixels sont câblés pour RGB bitstream (v1 pixels de flore, pas v2)
Bande de Adafruit_NeoPixel = Adafruit_NeoPixel (ledCount, LED, NEO_GRB + NEO_KHZ800) ;
J’ai utilisé 56 LEDs dans ma construction, j’ai donc mis que comme une variable. L’objet de bande est initialisée à 56 LED, la broche LED définie et les valeurs pour Gemma et WS2812b type LED.
uint32_t couleurs [5] = {bande. Color (255, 255, 0), / / jaune
bande. Couleur (127, 0, 255) / / violet
bande. Couleur (0, 255, 0), / / vert
bande. Color (255, 0, 0), / / rouge
bande. Couleur (0, 0, 255);} bleu
currentColor int = 0 ;
int maxColor = 5 ;
int defaultBrightness = 50 ;
J’ai décidé d’utiliser 5 couleurs dans le cycle. Le jaune est la couleur standard, Zelda porte pourpre, et le reste avait juste l’air cool. Les valeurs currentColor et maxColor permettent de faire défiler les 5 couleurs. La luminosité maximale est 255, alors j’ai mis à 50 pour permettre beaucoup d’espace pour grandir dans le mode de tir.
void setup() {}
initialiser la tige poussoir comme entrée :
pinMode (BTN1, INPUT_PULLUP) ;
pinMode (BTN2, INPUT_PULLUP) ;
Strip.Begin() ;
pour (int i = 0; i < ledCount; i ++)
{
strip.setPixelColor (i, colors[currentColor]) ;
}
Obtenez plus lumineux
pour (int i = 5; i < defaultBrightness ; j’ai += 2).
{
strip.setBrightness(i) ;
Strip.Show() ;
Delay(50) ;
}
}
Il s’agit de la méthode appelée lorsque l’arc est allumé. Il initialise les boutons et les lumières, attribue la couleur jaune et augmente progressivement la luminosité de 0 à 50.
void loop() {}
pour (int i = 0; i < 2000; i ++)
{
int button1State = digitalRead(BTN1) ;
Si (button1State! = lastButton1State)
{
lastButton1State = button1State ;
Si (button1State == faible)
changeColor() ;
}
int button2State = digitalRead(BTN2) ;
Si (button2State! = lastButton2State)
{
lastButton2State = button2State ;
Si (button2State == faible)
fireArrow() ;
}
Delay(5) ;
}
Pulse() ;
}
C’est où l’Arduino sera en boucle la plupart du temps, attente d’un bouton. J’ai voulu les boutons pour être adapté aux besoins, alors il vérifie le bouton s’enclenche pendant environ 10 secondes (temps de 2000 itérations retarder un 5ms) avant il montre l’effet de pouls ralenti. Si une touche est pressée, elle montre que l’effet avant de retourner à cette méthode et poursuivant la boucle.
Sub pulse()
{
Obtenir légèrement gradateur
pour (int i = defaultBrightness; i > defaultBrightness / 2; i-= 5)
{
strip.setBrightness(i) ;
Strip.Show() ;
Delay(50) ;
}
Obtenez plus lumineux
pour (int i = defaultBrightness / 2; i < defaultBrightness ; j’ai += 5)
{
strip.setBrightness(i) ;
Strip.Show() ;
Delay(50) ;
}
}
Il s’agit de l’effet de ralenti. Nous voulons qu’elle soit rapide pour que nous ne manquez pas un clic sur un bouton. Il descend la luminosité par 5 chaque 50ms jusqu'à ce qu’il arrive à la moitié de la luminosité ralentie, puis retourne à la normale.
Sub changeColor()
{
currentColor ++ ;
Si (currentColor == maxColor)
{
currentColor = 0 ;
}
int i1 = 2 ;
int i2 = 27 ;
int i3 = 28 ;
i4 int = 55 ;
Parcourez et changer de couleur
pour (int i = 0; i < 14; i ++)
{
Jeu de couleurs
strip.setPixelColor (i1, colors[currentColor]) ;
strip.setPixelColor (i2, colors[currentColor]) ;
strip.setPixelColor (i3, colors[currentColor]) ;
strip.setPixelColor (i4, colors[currentColor]) ;
Mise à jour des itérateurs
Si (j’ai == 3)
I1 = 1 ;
else if (i == 4)
I1 = 6 ;
else if (i == 5)
I1 = 0 ;
else if (i == 6)
I1 = 7 ;
d’autre
I1 ++ ;
I2--;
I3 ++ ;
I4--;
Mise à jour et d’attendre un peu
Strip.Show() ;
Delay(50) ;
}
}
Lorsque l’utilisateur clique sur le bouton de changement de couleur, les LEDs sont remplacées par la couleur suivante de la boucle. J’ai fait les lumières commencent au milieu de l’arc et de modifier rapidement la couleur dans un effet de domino allant vers l’extérieur. Ce morceau de code est bizarre parce que les lumières sont d’une longue série, mais nous avons divisés en 4 sections. La première section est câblée différemment des autres 3 sections, donc l’itérateur i1 a besoin d’un traitement spécial pour suivre le bon ordre.
Sub fireArrow()
{
Obtenir légèrement gradateur
pour (int i = defaultBrightness; i > 20; i-= 5)
{
strip.setBrightness(i) ;
Strip.Show() ;
Delay(20) ;
}
Obtenez plus lumineux
pour (int i = 20 ; j’ai 250 <; i += 5)
{
strip.setBrightness(i) ;
Strip.Show() ;
Delay(30) ;
}
Séjour lumineux un peu
Delay(800) ;
Obtenir le gradateur
pour (int i = 250 ; j’ai > defaultBrightness; i-= 10)
{
strip.setBrightness(i) ;
Strip.Show() ;
Delay(30) ;
}
}
Enfin, l’effet de feu définit l’archet à pleine intensité pour peu moins d’une seconde, puis s’estompe vers le bas à inactif.
J’espère que tout cela est logique. Si vous souhaitez modifier les couleurs ou les effets, il devrait être assez facile de les ajuster.