#include "alphabet.h" //separate library containing all capital letters and a ' ' drawn in the 8x8 grid.
#include <EEPROM.h>
int length = 16; //global variable at length of my name. rewritten if user enters something in serial monitor
String input = "ALEXANDRA IRVINE"; //my name. rewritten to user entry
int number; //global variable to determine which letter to print
int buttonPin = 2; //buttonPin declared as pin 2, this is the first priority hardware interrupt for Arduino Mega
volatile int start = 0; //global variable saving button push time in millis
volatile int finish = 0; //global variable saving button release time in millis
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Please enter input: "); //opens serial monitor and prompts user to enter something
pinMode(buttonPin, INPUT_PULLUP); //assigns pin 2 to input_pullup which inverts the highs and lows read. more reliable than just input
attachInterrupt(digitalPinToInterrupt(buttonPin), interrupt, CHANGE); //attaches hardware interrupt to pin 2 when button state changes
for (int initialrow = 23; initialrow < 38; initialrow += 2) { //initialises all row pins for LED matrix
pinMode(initialrow, OUTPUT);
digitalWrite(initialrow, LOW);
}
for (int initialcolumn = 39; initialcolumn < 54; initialcolumn += 2) { //initialises all column pins for LED matrix
pinMode(initialcolumn, OUTPUT);
digitalWrite(initialcolumn, HIGH);
}
}
void loop() {
// put your main code here, to run repeatedly:
if (Serial.available() == 0) { //does nothing if there is no input
}
if (Serial.available() > 0) { //if user inputs something into serial monitor...
input = Serial.readString(); //saves input as global string variable input
length = input.length() - 1; //finds length of input, minus 1 to get addresses of EEPROM correct
for (int b = 0; b < length; b++) { //writes input to EEPROM for length of input one letter at a time
EEPROM.write(b, input.charAt(b));
}
Serial.print("Now printing "); //confirms that it is now printing the user input. Waits until prior input has finished printing
Serial.println(input);
}
input.toUpperCase(); //converts input to uppercase for switch statement
for (int a = 0; a < length; a++) { //turns input into numbers for the alphabet library and prints them on LED matrix
char letter = input[a]; //reads one letter of input at a time
switch (letter) { //based on letter, chooses the corresponding number for that letter inside alphabet library
case 'A': //eg. if letter is A, will make number = 0.
number = 0;
break;
case 'B':
number = 1;
break;
case 'C':
number = 2;
break;
case 'D':
number = 3;
break;
case 'E':
number = 4;
break;
case 'F':
number = 5;
break;
case 'G':
number = 6;
break;
case 'H':
number = 7;
break;
case 'I':
number = 8;
break;
case 'J':
number = 9;
break;
case 'K':
number = 10;
break;
case 'L':
number = 11;
break;
case 'M':
number = 12;
break;
case 'N':
number = 13;
break;
case 'O':
number = 14;
break;
case 'P':
number = 15;
break;
case 'Q':
number = 16;
break;
case 'R':
number = 17;
break;
case 'S':
number = 18;
break;
case 'T':
number = 19;
break;
case 'U':
number = 20;
break;
case 'V':
number = 21;
break;
case 'W':
number = 22;
break;
case 'X':
number = 23;
break;
case 'Y':
number = 24;
break;
case 'Z':
number = 25;
break;
case ' ':
number = 26;
break;
default:
number = 27;
break;
}
int timer = finish - start; //calculates how long button was held based on global variables finish and start
if (timer > 2000) { //if button held longer than two seconds, will print the input from left to right
for (int border = 6 ; border > -6; border--) { //sets border between letters and printing direction. decreases with each increment so scrolls left to right
for (int column = 7; column >= 0 ; column--) { //selects the column within alphabet for each letter
if (column + border <= 8 && column + border >= 0) { //when border and selected column are within 0 and 8, will print the letter
digitalWrite(37, alphabet_display[number][7][column + border]); //letter,row,column within alphabet library
digitalWrite(35, alphabet_display[number][6][column + border]);
digitalWrite(33, alphabet_display[number][5][column + border]);
digitalWrite(31, alphabet_display[number][4][column + border]);
digitalWrite(29, alphabet_display[number][3][column + border]);
digitalWrite(27, alphabet_display[number][2][column + border]);
digitalWrite(25, alphabet_display[number][1][column + border]);
digitalWrite(23, alphabet_display[number][0][column + border]);
digitalWrite((39 + 2 * column ), LOW); //creates a fast flashing of columns between movements so letters look like they are constantly on
delay(1); //short delay makes it look like the whole letter is moving instead of one column of the letter at a time
digitalWrite((39 + 2 * column ), HIGH);
}
}
delay(50); //sets speed of scroll
}
}
if (timer <= 2000) { //if button held for less than two seconds, letters will scroll right to left
for (int border = -6 ; border < 6; border++) { //sets border between letters and printing direction. increases with each increment so scrolls right to left
for (int column = 7; column >= 0 ; column--) { //selects the column within alphabet for each letter
if (column + border <= 8 && column + border >= 0) { //when border and selected column are within 0 and 8, will print the letter
digitalWrite(37, alphabet_display[number][7][column + border]); //letter,row,column within alphabet library
digitalWrite(35, alphabet_display[number][6][column + border]);
digitalWrite(33, alphabet_display[number][5][column + border]);
digitalWrite(31, alphabet_display[number][4][column + border]);
digitalWrite(29, alphabet_display[number][3][column + border]);
digitalWrite(27, alphabet_display[number][2][column + border]);
digitalWrite(25, alphabet_display[number][1][column + border]);
digitalWrite(23, alphabet_display[number][0][column + border]);
digitalWrite((39 + 2 * column ), LOW); //creates a fast flashing of columns between movements so letters look like they are constantly on
delay(1); //short delay makes it look like the whole letter is moving instead of one column of the letter at a time
digitalWrite((39 + 2 * column ), HIGH);
}
}
delay(50); //sets speed of scroll
}
}
}
}
void interrupt() { //hardware interrupt function is called when button is pressed and released
int test = digitalRead(buttonPin); //sees if button has been pressed or released
if (test == HIGH) { //if test is high, button has been released.
finish = millis(); //saves release millis value to global variable finish so it can be used in loop function
//Serial.println("finish");
}
if (test == LOW) { //if test is low, button has been pressed
start = millis(); //saves press millis value to global variable finish so it can be used in loop function.
//Serial.print("Start: ");
}
}