#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)); } } }