Office kub Hour Glass (3 / 4 steg)
Steg 3: programvara
Programmet är skrivet i bearbetning och laddas ner via Arduino IDE. Koden innehåller en loop som tar timmar att slutföra, väl 10 att sätta skärmen tillbaka till ursprungsläget. Men förhoppningsvis, du kommer att lämna "Kontoret" efter den andra fyra timmars loop och power gadget. När förmåga på återställs servo till utgångsläget. Inuti denna viktigaste loop, som är inställd att köra för evigt, finns två fyra timmars loopar och två en timme slingor.Koden uppdelning: faktiska koden i kursiv stil, kommentarer i fet. Här är en länk till koden så du behöver inte klippa och klistra in om du vill använda den.
https://github.com/robboz4/Hour-Glass/Tree/July-Entry
Om du bestämmer dig att använda koderna bifoga alla uttalanden om användningen av Adafruit bibliotek.
#include < SoftwareSerial.h >
#include < Servo.h >
#include < Wire.h >
Basen innehåller för debug uttalanden till den seriella porten, den Servo och I2C biblioteket.
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
Dessa två är bibliotek för Adafruit ledde matrisen och ryggsäck. Det finns ett block av text som beskriver användningen av dessa bibliotek som anges i koden.
#define morgon 0 Adafruit_8x8matrix matrix = Adafruit_8x8matrix(); Servo myservo;
#define eftermiddag 1
#define MAX_SEQ_NUM 17
int pos = 0;
int-intervall.
CONST int buttonPin = 2; numrera av tryckknapp PIN-koden
CONST int ledPin = 13. antal LED stift
int buttonState = 0;
Definitioner för användning senare i koden.
void setup() { Serial.BEGIN(9600); Serial.println ("8 x 8 LED Matrix Test mod av Robban"); Matrix.BEGIN(0x70); passera i adressen till I2C initiera LED stift som en utgång:
matrix.setBrightness(2);
Matrix.Clear();
myservo.attach(9,544,2300); Ställ in Servo
myservo.write(POS);
pinMode (ledPin, produktionen);
initiera tryckknapp PIN-koden som indata:
pinMode (buttonPin, ingång);
digitalWrite(buttonPin,HIGH);
}
Ställ in matrisen, servo, tryckknapp och seriell port (för debug uttalanden).
TypeDef struct _led
{
char ordning;
int x;
int y;
} led_t;
En matris definiera LED layout (en pin-kod 0 betyder ingen LED)
Alla matrismedlemmar har ett sekvensnummer och en LED pin-kod.
Sekvensnumret bestämmer vilken ordning där de slå på eller av
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}}
};
loop rutinen körs för evigt om och om igen: char intervall = morgon; Kontrollera om tryckknappen trycks.
ogiltiga loop()
{
int seqNum = 0;
int i, j, k, gräns;
int delay_mult = 60. demo-läge.
Matrix.Clear();
matrix.blinkRate(0);
matrix.writeDisplay();
//Demo mode knappen Testa
buttonState = digitalRead(buttonPin);
om det är, är buttonState hög:
om (buttonState == hög) {
Aktivera LED:
digitalWrite (ledPin, låg);
Serial.println ("kub Hour Glass! \n"); matrix.setTextSize(1);
matrix.setTextWrap(false); Vi vill inte att texten ska radbrytas så att den rullar fint
matrix.setTextColor(LED_ON);
för (int8_t x = 0, x > =-36; x--) {
Matrix.Clear();
matrix.setCursor(x,0);
Matrix.Print("Club");
matrix.writeDisplay();
Delay(100);
}
matrix.setRotation(3);
för (int8_t x = 7, x > =-36; x--) {
Matrix.Clear();
matrix.setCursor(x,0);
Matrix.Print("Robbo");
matrix.writeDisplay();
Delay(100);
}
matrix.setRotation(0);
}
annat {
Inaktivera LED:
digitalWrite (ledPin, hög);
delay_mult = 60.
Serial.println ("kub Hour Glass demo! \n");
matrix.setTextSize(1);
matrix.setTextWrap(false); Vi vill inte att texten ska radbrytas så att den rullar fint
matrix.setTextColor(LED_ON);
för (int8_t x = 0, x > =-36; x--) {
Matrix.Clear();
matrix.setCursor(x,0);
Matrix.Print("demo");
matrix.writeDisplay();
Delay(100);
}
matrix.setRotation(3);
för (int8_t x = 7, x > =-36; x--) {
Matrix.Clear();
matrix.setCursor(x,0);
Matrix.Print("mode");
matrix.writeDisplay();
Delay(100);
}
matrix.setRotation(0);
}
//End av knappen test. Det sätter upp displayen att skriva ut ett meddelande som säger Demo-läge om du trycker. Jag vände också på ombord LED
samtidigt (1) //do lite detta för evigt!
{
för (k = 0; k < MAX_SEQ_NUM; k ++)
{
om (intervall == morgon)
{
för (jag = 0; jag < 4; i ++)
{
för (j = 0; j < 7; j ++)
{
om (ledArray [i] [j] .order > seqNum)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON);
matrix.writeDisplay();
}
annat
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF);
matrix.writeDisplay();
}
}
}
för (jag = 4; jag < 8; i ++)
{
för (j = 0; j < 7; j ++)
{
om (ledArray [i] [j] .order < = seqNum & & ledArray [i] [j] .order! = 0)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON);
matrix.writeDisplay();
}
annat
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF);
matrix.writeDisplay();
}
}
}
}
annat
{
för (jag = 4; jag < 8; i ++)
{
för (j = 0; j < 7; j ++)
{
om (ledArray [i] [j] .order > seqNum)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON);
matrix.writeDisplay();
}
annat
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF);
matrix.writeDisplay();
}
}
}
för (jag = 0; jag < 4; i ++)
{
för (j = 0; j < 7; j ++)
{
om (ledArray [i] [j] .order < = seqNum & & ledArray [i] [j] .order! = 0)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON);
matrix.writeDisplay();
}
annat
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF);
matrix.writeDisplay();
}
}
}
}
//Depending på morgonen eller eftermiddagen variabel, läsa matrisen till ordningsnummer och som LED i matrisen (x, y-position) eller inaktivera följaktligen.
seqNum ++;
om (buttonState == hög)
{
fördröja ((3750 * delay_mult * 4)/16) ;// ser nära en minut. Därför flera av 60 timme ~ = 225 000.
Delay(900000);
}
annat
{
Delay(3750); Demo-läge.
}
}
Rotera displayen om (intervall == eftermiddag) för (pos = 179; pos > 0; pos-= 3) / / går från 180 grader till 0 grader Delay(60000); seqNum = 0; }
intervall = (intervall == morgon)? EFTERMIDDAG: MORGONEN;
{
POS = 180;
myservo.write(POS);
Delay(1000);
för (pos = 0; pos < 180; pos += 3) / / går från 0 grader till 180 grader
{/ / i steg 3 examen
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Waits 1 minute(debug) för servo att nå ställning använda timme mulitplier 225k
om (buttonState == hög)
{
Delay(3750 * delay_mult) ;// ser nära en minut. Därför flera av 60 timme ~ = 225 000.
Delay(60000);
}
annat
{
fördröjning (1000); //demo läge.
}
}
}
annat
{
{/ / steg i-3 grader
myservo.write(POS); berätta servo gå för att placera i variabel "pos"
Waits 1m (debug) för servo att nå ställning använda timme mulitplier 225k
om (buttonState == hög)
{
}
annat
{
Delay(1000); demo-läge.
}
}
}
}