Skip to content

Commit 45671a8

Browse files
committed
adds ino script and readme
1 parent 7a60057 commit 45671a8

File tree

2 files changed

+196
-0
lines changed

2 files changed

+196
-0
lines changed

README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Arudino and Morse Code
2+
3+
Use 3 buttons to write morse-code.
4+
5+
<a href="http://www.youtube.com/watch?feature=player_embedded&v=CJriiDdaXP0" target="_blank"><img src="http://img.youtube.com/vi/CJriiDdaXP0/0.jpg" alt="arduino and morse code" width="640" /></a>
6+
7+
Code is available in [script.ino](script.ino) file.
8+
9+
Any contributions are welcome.
10+
11+
## Special characters
12+
13+
6 times , (comma) : Deletes all
14+
15+
6 times . (dot) : Deletes last character
16+
17+
## More info
18+
19+
More info [here](https://www.itnetwork.cz/hardware-pc/arduino/zapisovatko-morseovky-s-arduinem) (in czech language).
20+

script.ino

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
2+
/*ZAPISOVÁTKO MORSEOVY ABECEDY
3+
Využívá 3 tlačíka (tečka, čárka, oddělovač)
4+
Zapisuje na LCD
5+
https://github.com/tesar-tech/arduino_and_morse_code
6+
*/
7+
#include <Wire.h> // pro práci s I2C
8+
#include <LiquidCrystal_I2C.h> // pro práci s displayem
9+
10+
11+
#define CARKABUTTONPIN 12
12+
#define TECKABUTTONPIN 8
13+
#define ODDELBUTTONPIN 10
14+
#define DISPLAY_NUMOFCOLUMNS 16 //Pracuji s displayem 16x2
15+
16+
17+
18+
19+
int carkaButtonState = 0;
20+
int carkaButtonLastState = 0;
21+
int teckaButtonState = 0;
22+
int teckaButtonLastState = 0;
23+
int oddelButtonState = 0;
24+
int oddelButtonLastState = 0;
25+
String tonesBuffer;
26+
String text;
27+
String expectedText;
28+
29+
String symbolsAlphabet[][2] =
30+
{
31+
{ ".-","A" },
32+
{ "-...","B" },
33+
{ "-.-.","C" },
34+
{ "-..","D" },
35+
{ ".","E" },
36+
{ "..-.","F" },
37+
{ "--.","G" },
38+
{ "....","H" },
39+
{ "..","I" },
40+
{ ".---","J" },
41+
{ "-.-","K" },
42+
{ ".-..","L" },
43+
{ "--","M" },
44+
{ "-.","N" },
45+
{ "---","O" },
46+
{ ".--.","P" },
47+
{ "--.-","Q" },
48+
{ ".-.","R" },
49+
{ "...","S" },
50+
{ "-","T" },
51+
{ "..-","U" },
52+
{ "...-","V" },
53+
{ ".--","W" },
54+
{ "-..-","X" },
55+
{ "-.--","Y" },
56+
{ "--..","Z" },
57+
{ ".----","1" },
58+
{ "..---","2" },
59+
{ "...--","3" },
60+
{ "....-","4" },
61+
{ ".....","5" },
62+
{ "-....","6" },
63+
{ "--...","7" },
64+
{ "---..","8" },
65+
{ "----.","9" },
66+
{ "-----","0"}
67+
};
68+
69+
LiquidCrystal_I2C lcd(0x27, DISPLAY_NUMOFCOLUMNS, 2);
70+
char getToneFromButtonStates()
71+
{
72+
//vrátí v případě uvolnění tlačítka
73+
//tedy když nynější stav je 0, předchozí 1
74+
75+
if (!carkaButtonState&& carkaButtonLastState)
76+
return '-';
77+
if (!teckaButtonState && teckaButtonLastState)
78+
return '.';
79+
if (!oddelButtonState && oddelButtonLastState)
80+
return ' ';
81+
82+
return (char)0;
83+
84+
}
85+
86+
87+
char getSymbolFromBuffer()
88+
{
89+
if (tonesBuffer == "")
90+
return ' '; //udělá mezeru, pokud předím nejsou žádné znaky
91+
92+
for (int i = 0; i < sizeof symbolsAlphabet / sizeof symbolsAlphabet[0]; i++)
93+
//Projdu všechny symboly a porovnávám buffer s abecedou
94+
if (tonesBuffer == symbolsAlphabet[i][0])
95+
return symbolsAlphabet[i][1][0];//pokud se rovna vrátím daný symbol
96+
97+
//Buffer neodpovídá žádnému symbolu, pošlu tedy nic
98+
return (char)0;
99+
}
100+
101+
void extractActionFromTonesBuffer()
102+
{
103+
if (tonesBuffer == "......")//6x tečka
104+
text.remove(text.length() - 1, 1);//umaže jedno písmeno
105+
if (tonesBuffer == "------")//6x čárka
106+
text = "";//smaže celý text
107+
}
108+
109+
110+
void setup() {
111+
112+
lcd.init();
113+
lcd.backlight();
114+
lcd.print("Morseovkovnitko");
115+
lcd.setCursor(0, 1);
116+
lcd.print("6x.Smaze1 6x-Vse");
117+
118+
pinMode(CARKABUTTONPIN, INPUT);
119+
pinMode(TECKABUTTONPIN, INPUT);
120+
pinMode(ODDELBUTTONPIN, INPUT);
121+
}
122+
123+
void loop() {
124+
125+
//načtení stavů tlačítek
126+
carkaButtonState = digitalRead(CARKABUTTONPIN);
127+
teckaButtonState = digitalRead(TECKABUTTONPIN);
128+
oddelButtonState = digitalRead(ODDELBUTTONPIN);
129+
130+
char tone = getToneFromButtonStates();//zjistí jestli a jaké tlačítko je stisklé
131+
132+
if (tone != (char)0)
133+
{
134+
if (tone == ' ')//ukončuji sekvenci tónů, hledám symbol
135+
{
136+
char symbol = getSymbolFromBuffer();
137+
138+
if (symbol != (char)0)//Sled tónů nalezl nějaký symbol, zapíše se do textu
139+
{
140+
text += symbol;
141+
if (text.length() > DISPLAY_NUMOFCOLUMNS)//Pokud přesáhne počet znaků velikost displaye,
142+
//napíše se nový znak na první místo. Ostatní se vymažou.
143+
{
144+
text = (String)symbol;
145+
}
146+
}
147+
else//Sled tónů nedává žádný symbol, ale možná nějakou akci (například vymazání znaku)
148+
{
149+
extractActionFromTonesBuffer();
150+
}
151+
tonesBuffer = "";//vymaže se buffer (čárky a tečky)
152+
}
153+
else//čárka nebo tečka
154+
{
155+
tonesBuffer += tone;
156+
if (tonesBuffer.length() > DISPLAY_NUMOFCOLUMNS)//pokud je tónů víc než velikost displaye, vymže se buffer
157+
{
158+
tonesBuffer = (String)tone;
159+
}
160+
}
161+
162+
//psaní na display se provádí pouze v případě, že bylo zmačknuté nějaké tlačítko
163+
164+
lcd.clear();//vyčistí se display
165+
lcd.print(text);//napíše se text
166+
lcd.setCursor(0, 1);
167+
lcd.print(tonesBuffer);//napíše se sled tónů
168+
169+
}
170+
171+
//aktualizuje se předchozí stav
172+
carkaButtonLastState = carkaButtonState;
173+
teckaButtonLastState = teckaButtonState;
174+
oddelButtonLastState = oddelButtonState;
175+
176+
}

0 commit comments

Comments
 (0)