Stap 3: Software
De software is geschreven in Processing en gedownload via de Arduino IDE. De code bevat een lus die 9 uur duurt, goed 10 om te zetten van de weergave terug naar de oorspronkelijke positie. Maar hopelijk, u zal worden verlaten van het "Bureau" na de tweede lus van de vier uur en de macht de gadget uit. Bij het aandrijven op zal op beginstand zetten naar de servo naar de uitgangspositie. Binnen deze hoofdlus, die is ingesteld op altijd worden uitgevoerd, zijn twee vier uur loops en twee lussen van één uur.Uitsplitsing van de code: daadwerkelijke code in cursief, opmerkingen in vet. Hier is een link naar de code, zodat u niet hoeft te knippen en plakken als u wenst te gebruiken.
https://github.com/robboz4/Hour-Glass/tree/July-entry
Als u besluit om het gebruik van de codes vermeld alle verklaringen met betrekking tot het gebruik van Adafruit bibliotheken.
#include < SoftwareSerial.h >
#include < Servo.h >
#include < Wire.h >
Grondslag bevat voor debug verklaringen voor de seriële poort, de Servo-bibliotheek en de I2C-bibliotheek.
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
Deze twee zijn de bibliotheken voor de Adafruit LED matrix en de rugzak. Er is een blok van tekst met een beschrijving van het gebruik van deze bibliotheken die wordt vermeld in de code.
#define ochtend 0 Adafruit_8x8matrix matrix = Adafruit_8x8matrix(); Servo myservo;
#define middag 1
#define MAX_SEQ_NUM 17
int pos = 0;
int interval;
Const int buttonPin = 2; het nummer van de drukknop pin
Const int ledPin = 13; het nummer van de LED-pin
int buttonState = 0;
Definities voor het gebruik later in de code.
VOID Setup {} Serial.begin(9600);
Serial.println ("8 x 8 LED Matrix Test mod door robbo");
matrix.begin(0x70); pas in het adres van de I2C
matrix.setBrightness(2);
matrix.Clear();
myservo.attach(9,544,2300); Servo instellen
myservo.write(POS);
Initialiseer de LED-pin als uitgang:
pinMode (ledPin, OUTPUT);
Initialiseer de drukknop pin als input:
pinMode (buttonPin, INPUT);
digitalWrite(buttonPin,HIGH);
}
Instellen van de matrix, servo, drukknop en seriële poort (voor debug verklaringen).
typedef struct _led
{
char volgorde;
int x;
int y;
} led_t;
Een array om de LED-indeling (een pin-nummer van 0 betekent geen LED) te definiëren
Elk matrixlid heeft een volgnummer en de pincode van een LED.
Het volgnummer bepaalt de volgorde waarin ze in- of uitschakelen overschakelen
Const led_t ledArray [8] [7] = {}
/ * elem 0 * / {{6, 0, 0}, {4, 0, 1}, {2, 0, 2}, {1, 0, 3}, {3: 0, 4}, {5, 0, 5}, {7, 0, 6}},
/ * elem 1 * / {{0, 1, 0}, {11, 1, 1}, {9: 1, 2}, {8: 1, 3}, {10, 1, 4}, {12, 1, 5}, {0, 1, 6}},
/ * elem 2 * / {{0, 2, 0}, {0, 2, 1} {14, 2, 2}, {13, 2, 3}, {15, 2, 4}, {0, 2, 5}, {0, 2, 6}},
/ * elem 3 * / {{0, 3, 0}, {0, 3, 1}, {0, 3, 2}, {16, 3, 3}, {0, 3, 4}, {0, 3, 5}, {0, 3, 6}},
/ * elem 4 * / {{0: 4, 0}, {0: 4, 1}, {0, 4, 2}, {16, 4, 3}, {0, 4, 4}, {0, 4, 5}, {0, 4, 6}},
/ * elem 5 * / {{0, 5, 0}, {0, 5, 1}, {15: 5, 2}, {9: 5, 3}, {14, 5, 4}, {0, 5, 5}, {0, 5, 6}},
/ * elem 6 * / {{0, 6, 0}, {12, 6, 1}, {8, 6, 2}, {4, 6, 3}, {7, 6, 4}, {13: 6, 5}, {0, 6, 6}},
/ * elem 7 * / {{11: 7, 0}, {5, 7, 1}, {3, 7, 2}, {1, 7, 3}, {2, 7, 4}, {6, 7, 5}, {10, 7, 6}}
};
de routine van de lus wordt uitgevoerd over en weer forever: char interval = ochtend; Controleer als de drukknop ingedrukt is.
void loop
{
int seqNum = 0;
int i, j, k, beperking geldt;
int delay_mult = 60; Demo modus optie.
matrix.Clear();
matrix.blinkRate(0);
matrix.writeDisplay();
//Demo modusknop testen
buttonState = digitalRead(buttonPin);
Als het is, is de buttonState hoog:
Als (buttonState == HIGH) {}
LED inschakelen:
digitalWrite (ledPin, laag);
Serial.println ("Hour Glass Cube! \n"); matrix.setTextSize(1);
matrix.setTextWrap(false); We willen niet dat tekst laten teruglopen zodat het mooi rollen
matrix.setTextColor(LED_ON);
voor (int8_t x = 0; x > =-36; x--) {}
matrix.Clear();
matrix.setCursor(x,0);
matrix.Print("Club");
matrix.writeDisplay();
delay(100);
}
matrix.setRotation(3);
voor (int8_t x = 7; x > =-36; x--) {}
matrix.Clear();
matrix.setCursor(x,0);
matrix.Print("Robbo");
matrix.writeDisplay();
delay(100);
}
matrix.setRotation(0);
}
else {}
LED uitschakelen:
digitalWrite (ledPin, hoge);
delay_mult = 60;
Serial.println ("kubus Hour Glass demo! \n");
matrix.setTextSize(1);
matrix.setTextWrap(false); We willen niet dat tekst laten teruglopen zodat het mooi rollen
matrix.setTextColor(LED_ON);
voor (int8_t x = 0; x > =-36; x--) {}
matrix.Clear();
matrix.setCursor(x,0);
matrix.Print("demo");
matrix.writeDisplay();
delay(100);
}
matrix.setRotation(3);
voor (int8_t x = 7; x > =-36; x--) {}
matrix.Clear();
matrix.setCursor(x,0);
matrix.Print("mode");
matrix.writeDisplay();
delay(100);
}
matrix.setRotation(0);
}
//End van knop test. Daarin worden weergegeven voor het afdrukken van een bericht van de Demo-modus als ingedrukt. Ik heb ook ingeschakeld de boordcomputer LED
terwijl (1) //do dit voor eeuwig bit!
{
voor (k = 0; k < MAX_SEQ_NUM; k ++)
{
Als (interval == ochtend)
{
voor (ik = 0; ik < 4; i ++)
{
voor (j = 0; j < 7; j ++)
{
Als (ledArray [i] [j] .order > seqNum)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON);
matrix.writeDisplay();
}
anders
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF);
matrix.writeDisplay();
}
}
}
voor (ik = 4; ik < 8; i ++)
{
voor (j = 0; j < 7; j ++)
{
Als (ledArray [i] [j] .order < = seqNum & & ledArray [i] [j] .order! = 0)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON);
matrix.writeDisplay();
}
anders
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF);
matrix.writeDisplay();
}
}
}
}
anders
{
voor (ik = 4; ik < 8; i ++)
{
voor (j = 0; j < 7; j ++)
{
Als (ledArray [i] [j] .order > seqNum)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON);
matrix.writeDisplay();
}
anders
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF);
matrix.writeDisplay();
}
}
}
voor (ik = 0; ik < 4; i ++)
{
voor (j = 0; j < 7; j ++)
{
Als (ledArray [i] [j] .order < = seqNum & & ledArray [i] [j] .order! = 0)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON);
matrix.writeDisplay();
}
anders
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF);
matrix.writeDisplay();
}
}
}
}
//Depending op de ochtend of middag variabele, lezen de array naar het volgnummer en de LED in de matrix (x, y-positie) in- of uitschakelen dienovereenkomstig.
seqNum ++;
Als (buttonState == HIGH)
{
((3750 * delay_mult * 4)/16 vertraging) ;// ziet er dicht bij een minuut. Daarom meerdere door 60 uurtje ~ = 225.000.
delay(900000);
}
anders
{
delay(3750); Demo-modus.
}
}
De weergave draaien Als (interval == middag) voor (pos = 179; pos > 0; pos-= 3) / / gaat van 180 graden tot 0 graden delay(60000); seqNum = 0; }
interval = (interval == ochtend)? NAMIDDAG: 'S OCHTENDS;
{
POS = 180;
myservo.write(POS);
delay(1000);
voor (pos = 0; pos < 180; pos += 3) / / gaat van 0 graden tot 180 graden
{/ / in stappen van 3 graden
myservo.write(POS); servo naar positie in de variabele 'pos' vertellen
wacht 1 minute(debug) voor de servo om de positie te bereiken gebruik het uur mulitplier 225k
Als (buttonState == HIGH)
{
delay(3750 * delay_mult) ;// ziet er dicht bij een minuut. Daarom meerdere door 60 uurtje ~ = 225.000.
delay(60000);
}
anders
{
vertraging (1000); //demo-modus.
}
}
}
anders
{
{/ / in stappen van-3 graad
myservo.write(POS); servo naar positie in de variabele 'pos' vertellen
wacht 1m (debug) voor de servo om de positie te bereiken gebruik het uur mulitplier 225k
Als (buttonState == HIGH)
{
}
anders
{
delay(1000); Demo-modus.
}
}
}
}