183 lines
4.3 KiB
C++
183 lines
4.3 KiB
C++
#include "LedControl.h"
|
|
/*
|
|
pin 12 is connected to the DataIn
|
|
pin 11 is connected to LOAD(CS)
|
|
pin 10 is connected to the CLK
|
|
*/
|
|
LedControl lc=LedControl(12,10,11,1);
|
|
|
|
// web url to make the matrices
|
|
// https://xantorohara.github.io/led-matrix-editor/#18181899db7e3c18|18181899db7e3c18|0018181899db7e3c|000018181899db7e|00000018181899db|0000000018181899|1800000000181818|3c18000000001818|7e3c180000000018|db7e3c1800000000|99db7e3c18000000|1899db7e3c180000|181899db7e3c1800|18181899db7e3c18
|
|
|
|
const uint64_t UPARROW[] = {
|
|
0x18181899db7e3c18,0x0018181899db7e3c,0x000018181899db7e,0x00000018181899db,
|
|
0x0000000018181899,0x1800000000181818,0x3c18000000001818,0x7e3c180000000018,
|
|
0xdb7e3c1800000000,0x99db7e3c18000000,0x1899db7e3c180000,0x181899db7e3c1800
|
|
};
|
|
|
|
const uint64_t DOWNARROW[] = {
|
|
0x183c7edb99181818,0x3c7edb9918181800,0x7edb991818180000,0xdb99181818000000,
|
|
0x9918181800000000,0x1818180000000018,0x181800000000183c,0x1800000000183c7e,
|
|
0x00000000183c7edb,0x000000183c7edb99,0x0000183c7edb9918,0x00183c7edb991818
|
|
};
|
|
|
|
const uint64_t ATTHETOP[] = {
|
|
0x1899db7e3c1800ff
|
|
};
|
|
|
|
const uint64_t ATTHEBOTTOM[] = {
|
|
0xff00183c7edb9918
|
|
};
|
|
|
|
const uint64_t HELPBUTTON[] = {
|
|
0x18ff814242423c18
|
|
};
|
|
|
|
const int UPARROW_LEN = sizeof(UPARROW)/8;
|
|
const int DOWNARROW_LEN = sizeof(DOWNARROW)/8;
|
|
const int ATTHEBOTTOM_LEN = sizeof(ATTHEBOTTOM)/8;
|
|
const int ATTHETOP_LEN = sizeof(ATTHETOP)/8;
|
|
const int HELPBUTTON_LEN = sizeof(HELPBUTTON)/8;
|
|
int i = 0;
|
|
int RX_data=0;
|
|
bool goingup, goingdown, atthetop, atthebottom, helpbutton = false;
|
|
int topbottomtimer = 0;
|
|
|
|
void setup() {
|
|
// put your setup code here, to run once:
|
|
Serial.begin(9600);
|
|
lc.shutdown(0,true);
|
|
/* Set the brightness to a medium values */
|
|
lc.setIntensity(0,0);
|
|
/* and clear the display */
|
|
lc.clearDisplay(0);
|
|
}
|
|
|
|
void loop() {
|
|
// let's read the serial port first to see what action we need to take.
|
|
if(Serial.available())
|
|
{
|
|
RX_data = Serial.read();
|
|
}
|
|
|
|
// now we take that data and make our decisions
|
|
if(RX_data == '1') // elevator going down is 1
|
|
{
|
|
goingup = false;
|
|
goingdown = true;
|
|
}
|
|
else if(RX_data == '2') // elevator going up is 2
|
|
{
|
|
goingdown = false;
|
|
goingup = true;
|
|
}
|
|
else if(RX_data == '3') // elevator stopped is 3
|
|
{
|
|
goingup = false;
|
|
goingdown = false;
|
|
atthebottom = false;
|
|
atthetop = false;
|
|
}
|
|
else if(RX_data == '4') // elevator has reached the top
|
|
{
|
|
goingup = false;
|
|
goingdown = false;
|
|
atthebottom = false;
|
|
atthetop = true;
|
|
}
|
|
else if(RX_data == '5') // elevator is at the bottom
|
|
{
|
|
goingup = false;
|
|
goingdown = false;
|
|
atthetop = false;
|
|
atthebottom = true;
|
|
}
|
|
// for the help button, we only change its status, so when it is pressed/unpressed
|
|
// whatever action was happening before will continue
|
|
else if(RX_data == '6') // someone pressed the help button
|
|
{
|
|
helpbutton = true;
|
|
}
|
|
else if (RX_data == '7') // the help button is not pressed anymore
|
|
{
|
|
helpbutton = false;
|
|
}
|
|
|
|
if (atthetop || atthebottom)
|
|
{
|
|
if (topbottomtimer <= 100)
|
|
{
|
|
topbottomtimer++;
|
|
}
|
|
}
|
|
|
|
// now that we've set the application state based on the serial input, make the LEDs happen!
|
|
if (helpbutton)
|
|
{
|
|
lc.shutdown(0,false);
|
|
displayImage(HELPBUTTON[i]);
|
|
if (++i >= HELPBUTTON_LEN )
|
|
{
|
|
i = 0;
|
|
}
|
|
delay(100);
|
|
}
|
|
else if (goingup)
|
|
{
|
|
lc.shutdown(0,false);
|
|
displayImage(UPARROW[i]);
|
|
if (++i >= UPARROW_LEN )
|
|
{
|
|
i = 0;
|
|
}
|
|
delay(100);
|
|
topbottomtimer = 0;
|
|
}
|
|
else if (goingdown)
|
|
{
|
|
lc.shutdown(0,false);
|
|
displayImage(DOWNARROW[i]);
|
|
if (++i >= DOWNARROW_LEN )
|
|
{
|
|
i = 0;
|
|
}
|
|
delay(100);
|
|
topbottomtimer = 0;
|
|
}
|
|
else if (atthetop && topbottomtimer < 100)
|
|
{
|
|
lc.shutdown(0,false);
|
|
displayImage(ATTHETOP[i]);
|
|
if (++i >= ATTHETOP_LEN )
|
|
{
|
|
i = 0;
|
|
}
|
|
delay(100);
|
|
}
|
|
else if (atthebottom && topbottomtimer < 100)
|
|
{
|
|
lc.shutdown(0,false);
|
|
displayImage(ATTHEBOTTOM[i]);
|
|
if (++i >= ATTHEBOTTOM_LEN )
|
|
{
|
|
i = 0;
|
|
}
|
|
delay(100);
|
|
}
|
|
// otherwise, turn off the display to save energy
|
|
else
|
|
{
|
|
lc.clearDisplay(0);
|
|
lc.shutdown(0,true);
|
|
}
|
|
}
|
|
|
|
void displayImage(uint64_t image) {
|
|
for (int i = 0; i < 8; i++) {
|
|
byte row = (image >> i * 8) & 0xFF;
|
|
for (int j = 0; j < 8; j++) {
|
|
lc.setLed(0, i, j, bitRead(row, j));
|
|
}
|
|
}
|
|
}
|