#include <LiquidCrystal.h>
#include <Thread.h>
const int ALPHABET_SIZE = 26;
const char alpha[ALPHABET_SIZE] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
const String morse[81] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};
const int TIME_UNIT = 70;
const int dot = TIME_UNIT;
const int dash = TIME_UNIT * 3;
const int symbol_space = TIME_UNIT;
const int letter_space = TIME_UNIT * 3;
const int word_space = TIME_UNIT * 7;
const String reset = "......";
const int MAX_LENGTH = 4;
String set_text = "";
String morse_text = "";
String new_morse = "";
String display_text = "";
const int COLUMNS = 16, ROWS = 2;
bool scroll = true;
unsigned long counter = 0;
int last_value = 0;
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 23, en = 22, d4 = 39, d5 = 41, d6 = 38, d7 = 40;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(COLUMNS, ROWS);
lcd.clear();
Serial.begin(9600);
/*
Thread myThread(scroll_until_not, "Welcome, morse code user! To begin, start pressing the button. To clear your text, enter 10 dots");
myThread.run();
*/
for (int i = 0; i < ALPHABET_SIZE; i ++){
Serial.println(String(alpha[i]) + ": " + morse[i]);
}
}
bool can_enter = false;
void loop() {
int value = digitalRead(48);
bool new_result = false;
if (last_value != value){
new_result = rel(value);
// Serial.println(counter);
counter = 0;
}
else{
new_result = hold(value);
}
counter ++;
if (new_result){
scroll = false;
// // Serial.println("Stopped scrolling");
display_text = set_text;
lcd.clear();
int l = (display_text + morse_text + new_morse).length();
if (l > 16){
String new_text = "";
for (int i = l - COLUMNS; i < display_text.length(); i ++){
new_text += display_text[i];
}
display_text = new_text;
}
lcd.print(display_text + morse_text + new_morse);
lcd.setCursor(0, 1);
lcd.print("");
lcd.setCursor(0, 0);
}
last_value = value;
delay(1);
}
String get_letter(){
String letter = "";
for (int i = 0; i < ALPHABET_SIZE; i ++){
if (morse_text == morse[i]){
letter = alpha[i];
}
}
return letter;
}
bool hold(int v){
String past_morse = new_morse, past_morse_text = morse_text, past_set_text = set_text;
if (v == 1){
if (counter <= dot){
new_morse = '.';
}
else if (counter >= dash){
new_morse = '-';
}
}
else {
if (counter >= letter_space){
String l = get_letter();
if (l != ""){
set_text += l;
}
if (morse_text == reset){
clear_text();
}
morse_text = "";
}
}
return past_morse != new_morse || past_morse_text != morse_text || past_set_text != set_text;
}
bool rel(int v){
String pm = morse_text, pt = set_text;
if (v == 0){
morse_text += new_morse;
new_morse = "";
}
else {
if (counter >= word_space){
set_text += " ";
}
}
return pm != morse_text || pt != set_text;
}
void clear_text(){
set_text = "";
}
/*
void scroll_until_not(String text){
// Serial.println("entered");
// Serial.println(text);
while (scroll){
// Serial.println("scrolling1");
String temp_text = text;
if (text.length() > 16){
lcd.clear();
lcd.print(text);
delay(1000);
for (int i = 1; i < text.length() - 15; i ++){
// Serial.println("scrolling2");
if (!scroll){
break;
}
lcd.clear();
temp_text = substr(text, i, text.length());
lcd.print(temp_text);
delay(300);
}
}
else {
// Serial.println("scrolling3");
lcd.clear();
lcd.print(text);
}
if (!scroll){
break;
}
delay(1000);
}
}
String substr(String t, int s, int l){
String b = "";
for (int i = s; i < s + l; i ++){
if (i >= t.length()){
break;
}
b += t[i];
}
return b;
}
*/
Comments