Stap 4: Arduino Code
We moeten duwen code naar de Arduino aan de bediening van de elektrische apparaten om ons project uit te voeren. Bibliotheken zijn opgenomen in een zip-bestand en de mappen binnen moet worden geplaatst in de hoofdmap van de bibliotheek Arduino op uw computer na het uitpakken. Inbegrepen zijn bibliotheken voor de IR-sensor, Stappenmotor en het LED-display van Adafruit. Het bijgevoegde zip-bestand met een adellijke titel Arduino Code bevat de map met de Arduino schets nodig de code uit te voeren. Dit moet gewoon worden geflitst aan de Arduino om de code kan worden uitgevoerd.
#include <Adafruit_GFX.h>#include <Adafruit_NeoMatrix.h> #include <Adafruit_NeoPixel.h> #include <StepperAK.h> #include <IRremote.h>#define PIN 6 //LED Matrix input on Pin 6#define gearratio 64 //1:64 gear ratio for stepper motor #define BOARDCOUNT 1 // number of LED matrices Adafruit_NeoPixel strip = Adafruit_NeoPixel(64 * BOARDCOUNT, PIN, NEO_GRB + NEO_KHZ800); //Sets up the number of LED nodes double brightness = .1; // reduce brightness for the LED Matrixconst int stepsPerRevolution = 2048; //2048 steps turn the motor one revolution Stepper myStepper(stepsPerRevolution, A0, A1, A2, A3); // 4-wire stepper on pins A0-A3int RECV_PIN = 9; //IR Receiver connected to Pin 9 IRrecv irrecv(RECV_PIN); //Create a IR receiver object decode_results results; //Create a decode_results objectAdafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN, //Initiates an 8x8 LED Matrix NEO_MATRIX_TOP + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE, NEO_GRB + NEO_KHZ800);const uint16_t colors[] = { matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(0, 0, 255) }; //Defines LED Matrix Colors
De code werkt door tot oprichting van wat bibliotheken nodig zijn en alle pinnen gebruikt en vereiste variabelen te definiëren. Vervolgens de helderheid van de LED-matrix dimt, zet de motor revolutie en maakt een object voor de IR-sensor. De LED-Matrix vervolgens wordt geïnitialiseerd en de kleuren zijn ingesteld.
void setup() {
myStepper.setSpeed(0.15*gearratio); //the motor appears to be geared down 1/64, //meaning that the speed needs to be set 64x. irrecv.enableIRIn(); //Enables the IR device matrix.begin(); //Starts the LED Matrix with a blank display matrix.setTextWrap(false); matrix.setBrightness(40); matrix.setTextColor(colors[0]); }
int x = matrix.width(); //Establishes X as the matrix width int pass = 0; //Establishes pass variable int flag=0; //variable to establish when the device is powered on via remote
In de sectie van de installatie, de overbrengingsverhouding van de stepper is ingesteld voor de controle van de snelheid, de IR-sensor is ingeschakeld en de matrix is ingesteld op een lege weergave. Meerdere variabelen zijn ook gevestigd die later worden gebruikt voor de matrix en om te bepalen wanneer de machtsknoop werd ingedrukt.
void loop() { if (irrecv.decode(&results)) {//has a transmission been received? if (results.value == 3584887633){ //If the power button is pressed the flag variable changes and the main program executes flag=1; } } //irrecv.resume(); // Receive the next value from the IR Sensor
Het project begint met een lege LED-display, en de IR-sensor is geactiveerd en wacht op de power-knop te worden geduwd. Nadat de machtsknoop wordt gedrukt, wordt de hoofdlus van het project ingevoerd. Het getal in de results.value ruimte is het gedecodeerde resultaat van de power-knop op de afstandsbediening van een audiosysteem van Panasonic, maar een andere afstandsbediening kan gebruikt annd moet u de afstandsbediening eerst decoderen met het oog op de numerieke getallen je rode knoppen zijn gekoppeld.
if (flag==1) //If flag is equal to 1, then the power button was pressed{ if (irrecv.decode(&results)) {//has a transmission been received? Serial.println(results.value);//If yes: interpret the received commands... if (results.value == 2354352215){ //If the "-" Button is pressed do the following: matrix.fillScreen(0); //Clears the LED matrix matrix.setCursor(2, 0); //Sets the cursor position matrix.setTextColor(colors[2]); //Sets the text color matrix.print(F("?")); //Prints the "?" character to the screen matrix.show(); //Enables the matrix delay(100); //Delays the matrix myStepper.step(stepsPerRevolution); //Rotates the stepper motor
Als de "+" of "-" knop op de afstandsbediening wordt geraakt, de paddenstoel in tegengestelde richtingen draait en een vraagteken wordt weergegeven op de matrix. De bovenstaande voorbeeldcode toont het proces voor de "-" knop wordt ingedrukt en de code voor de "+" is bijna identiek.
if (results.value == 3584887633){ //If the power button is pressed a Rainbow lights up colorWipe(strip.Color(brightness * 255, 0, 0), 5); // Red colorWipe(strip.Color(0, brightness * 255, 0), 5); // Green colorWipe(strip.Color(0, 0, brightness * 255), 5); // Blue rainbow(5); rainbowCycle(5); } irrecv.resume(); // Receive the next value from the IR Sensor } matrix.fillScreen(0); //If no input on the remote, clear the matrix screen matrix.setCursor(x, 0); //Sets the cursor position to variable 'x' matrix.print(F("MAKE")); //Prints the word "Make" to the matrix if(--x < -36) { //Cycles the cursor position to make text appear to scroll x = matrix.width(); if(++pass >= 3) pass = 0; //Cycles through three colors for the text display matrix.setTextColor(colors[pass]); } matrix.show(); //Prints text to matrix delay(100); //Establishes a delay} }
Wanneer de machtsknoop wordt gedrukt een regenboog verschijnt en doorloopt verschillende kleuren en patronen. Na dit proces, het woord "maken" vervolgens schuift over het scherm in het draaien van kleuren, tenzij een andere knop op de afstandsbediening wordt geraakt. Als de power-knop wordt geraakt opnieuw herhaalt de regenboog weergave. Dit proces herhaalt eindeloos zolang de Arduino aangedreven.
De onderstaande code zijn functies die worden genoemd om uit te voeren van de regenboog-scherm dat wordt weergegeven wanneer de machtsknoop wordt gedrukt.
// Fill the dots one after the other with a colorvoid colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; ivoid rainbow(uint8_t wait) { uint16_t i, j; for(j=0; j<256; j++) { for(i=0; i// Slightly different, this makes the rainbow equally distributed throughout void rainbowCycle(uint8_t wait) { uint16_t i, j; 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)); } strip.show(); delay(wait); } } // 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) { if(WheelPos < 85) { return strip.Color(brightness * WheelPos * 3, brightness * (255 - WheelPos * 3), 0); } else if(WheelPos < 170) { WheelPos -= 85; return strip.Color(brightness * (255 - WheelPos * 3), 0, brightness * WheelPos * 3); } else { WheelPos -= 170; return strip.Color(0, brightness * WheelPos * 3, brightness * (255 - WheelPos * 3)); } }