Étape 3: logiciel
Le logiciel est écrit en traitement et téléchargé par le biais de l’IDE Arduino. Le code contient une boucle qui dure 9 heures pour compléter, bien 10 à mettre l’écran retour en position initiale. Mais si tout va bien, vous quitterez le « Office » après la deuxième boucle de quatre heures et pouvoir le gadget au large. Dès la mise sous tension, il se remettra le servo à la position d’origine. À l’intérieur de cette boucle principale, qui est configurée pour exécuter pour toujours, sont les deux boucles de quatre heures et deux boucles d’une heure.Panne de code : code réel en italique, commentaires dans "BOLD". Voici un lien vers le code si vous n’avez pas à copier / coller si vous souhaitez l’utiliser.
https://github.com/robboz4/Hour-Glass/Tree/July-Entry
Si vous décidez d’utiliser les codes s’il vous plaît incluent toutes les instructions concernant l’utilisation des bibliothèques Adafruit.
#include < SoftwareSerial.h >
#include < Servo.h >
#include < Wire.h >
Base comprend des instructions de débogage pour le port série, la bibliothèque de Servo et la bibliothèque I2C.
#include « Adafruit_LEDBackpack.h »
#include « Adafruit_GFX.h »
Ces deux sont les bibliothèques pour la matrice de LED Adafruit et sac à dos. Il y a un bloc de texte décrivant l’utilisation de ces bibliothèques qui est répertoriée dans le code.
#define matin 0 Matrice de Adafruit_8x8matrix = Adafruit_8x8matrix() ; Servo myservo ;
#define après-midi 1
#define MAX_SEQ_NUM 17
int pos = 0 ;
intervalle d’int ;
const int buttonPin = 2 ; le nombre de la tige poussoir
const int ledPin = 13 ; le nombre de l’axe de la LED
buttonState int = 0 ;
Définitions pour l’utiliser plus tard dans le code.
void setup() {} Serial.Begin(9600) ;
Serial.println ("8 x 8 LED matrice Test mod par robbo ») ;
Matrix.Begin(0x70) ; transmettez l’adresse de l’I2C
matrix.setBrightness(2) ;
Matrix.Clear() ;
myservo.Attach(9,544,2300) ; Mettre en place le Servo
myservo.Write(POS) ;
initialiser les broches de la LED en tant que sortie :
pinMode (ledPin, sortie) ;
initialiser la tige poussoir comme entrée :
pinMode (buttonPin, entrée) ;
digitalWrite(buttonPin,HIGH) ;
}
Mettre en place la matrice, le servo, bouton-poussoir et serial port (pour les instructions de débogage).
typedef struct _led
{
ordre de char ;
int x ;
int y ;
} led_t ;
Un tableau pour définir la disposition de LED (un code PIN de 0 ne signifie aucune LED)
Chaque membre du groupe a un numéro de séquence et un numéro d’identification de LED.
Le numéro de séquence détermine l’ordre dans lequel ils activer ou désactiver
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}, {3, 16, 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}}
};
la routine de la boucle s’exécute maintes et maintes fois pour toujours : intervalle de char = matin ; Vérifiez si le bouton est appuyé.
void loop()
{
seqNum int = 0;
int i, j, k, limite ;
int delay_mult = 60 ; option de mode démo.
Matrix.Clear() ;
matrix.blinkRate(0) ;
matrix.writeDisplay() ;
//Demo bouton de mode d’essai
buttonState = digitalRead(buttonPin) ;
Si c’est le cas, le buttonState est haute :
Si (buttonState == HIGH) {}
allumer la LED :
digitalWrite (ledPin, basse) ;
Serial.println ("Cube sablier! \n") ; matrix.setTextSize(1) ;
matrix.setTextWrap(false) ; Nous ne voulons pas envelopper afin qu’il défile joliment du texte
matrix.setTextColor(LED_ON) ;
pour (int8_t x = 0; x > =-36; x--) {}
Matrix.Clear() ;
matrix.setCursor(x,0) ;
Matrix.Print("Club") ;
matrix.writeDisplay() ;
Delay(100) ;
}
matrix.setRotation(3) ;
pour (int8_t x = 7; x > =-36; x--) {}
Matrix.Clear() ;
matrix.setCursor(x,0) ;
Matrix.Print("Robbo") ;
matrix.writeDisplay() ;
Delay(100) ;
}
matrix.setRotation(0) ;
}
else {}
désactiver la LED :
digitalWrite (ledPin, HIGH) ;
delay_mult = 60 ;
Serial.println ("Cube Hour Glass démo! \n") ;
matrix.setTextSize(1) ;
matrix.setTextWrap(false) ; Nous ne voulons pas envelopper afin qu’il défile joliment du texte
matrix.setTextColor(LED_ON) ;
pour (int8_t x = 0; x > =-36; x--) {}
Matrix.Clear() ;
matrix.setCursor(x,0) ;
Matrix.Print("Demo") ;
matrix.writeDisplay() ;
Delay(100) ;
}
matrix.setRotation(3) ;
pour (int8_t x = 7; x > =-36; x--) {}
Matrix.Clear() ;
matrix.setCursor(x,0) ;
Matrix.Print("mode") ;
matrix.writeDisplay() ;
Delay(100) ;
}
matrix.setRotation(0) ;
}
//End de test bouton. Elle met en place l’écran pour imprimer un message disant que le Mode démo si pressé. Aussi, je me suis tourné sur le bord LED
tout en //do (1) cela a mordu pour toujours !
{
pour (k = 0; k < MAX_SEQ_NUM; k ++)
{
Si (intervalle == le matin)
{
pour (i = 0; i < 4; i ++)
{
pour (j = 0; j < 7; j ++)
{
Si (ledArray [i] [j] .ordonner > seqNum)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON) ;
matrix.writeDisplay() ;
}
d’autre
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF) ;
matrix.writeDisplay() ;
}
}
}
pour (i = 4; i < 8; i ++)
{
pour (j = 0; j < 7; j ++)
{
Si (ledArray [i] [j] .ordonner < = seqNum & & ledArray [i] [j] .ordonner! = 0)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON) ;
matrix.writeDisplay() ;
}
d’autre
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF) ;
matrix.writeDisplay() ;
}
}
}
}
d’autre
{
pour (i = 4; i < 8; i ++)
{
pour (j = 0; j < 7; j ++)
{
Si (ledArray [i] [j] .ordonner > seqNum)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON) ;
matrix.writeDisplay() ;
}
d’autre
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF) ;
matrix.writeDisplay() ;
}
}
}
pour (i = 0; i < 4; i ++)
{
pour (j = 0; j < 7; j ++)
{
Si (ledArray [i] [j] .ordonner < = seqNum & & ledArray [i] [j] .ordonner! = 0)
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_ON) ;
matrix.writeDisplay() ;
}
d’autre
{
matrix.drawPixel (ledArray [i] [j] .x, ledArray [i] [j] .y, LED_OFF) ;
matrix.writeDisplay() ;
}
}
}
}
//Depending le matin ou l’après-midi variable, lit le tableau au numéro de séquence et activer la LED dans la matrice (x, y position) ou désactiver en conséquence.
seqNum ++ ;
Si (buttonState == HIGH)
{
retarder ((3750 * delay_mult * 4)/16);// ressemble à proximité d’une minute. C’est pourquoi les multiples de 60 pour une heure ~ = 225 000.
Delay(900000) ;
}
d’autre
{
Delay(3750) ; Mode démo.
}
}
Faire pivoter l’écran Si (intervalle == l’après-midi) pour (pos = 179; pos > 0; pos = 3) / / va de 180 degrés à 0 degrés Delay(60000) ; seqNum = 0 ; }
intervalle de = (intervalle == matin) ? APRÈS-MIDI : MATIN ;
{
POS = 180 ;
myservo.Write(POS) ;
Delay(1000) ;
pour (pos = 0; pos < 180; pos += 3) / / va de 0 degrés à 180 degrés
{/ / pas de degré 3
myservo.Write(POS) ; dire de servo pour aller à positionner dans la variable « pos »
attend 1 minute(debug) pour le servo atteindre la position utiliser l’heure multiplier 225k
Si (buttonState == HIGH)
{
Delay(3750 * delay_mult);// ressemble à proximité d’une minute. C’est pourquoi les multiples de 60 pour une heure ~ = 225 000.
Delay(60000) ;
}
d’autre
{
retard (1000), mode de //demo.
}
}
}
d’autre
{
{/ / pas de-3 degrés
myservo.Write(POS) ; dire de servo pour aller à positionner dans la variable « pos »
1m (débogage) pour le servo atteindre la position d’attente utilise l’heure multiplier 225k
Si (buttonState == HIGH)
{
}
d’autre
{
Delay(1000) ; mode démo.
}
}
}
}