Advertisement
Guest User

Ferdig morse code

a guest
Nov 25th, 2014
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.79 KB | None | 0 0
  1. #include <LiquidCrystal.h> //dette er et innebygd biblotek som gjør at Arduino kan kontrollere og styre LCD displayet
  2.  
  3. #include "string.h"
  4.  
  5. LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // igangsetter bibloteket ved å koble følgende pinner til LCD skjermen.(bruker 6 bit av totalt 8)
  6.  
  7. //==============================================================================================================================================================
  8.  
  9. const int buzzer = 13;//setter en constant for pinnenes utgang
  10. const int knapp = 7;//setter en constant for pinnenes utgang
  11.  
  12. const int dotDelay = 200; //varigheten til buzzer hvor lenge hver "." eller "-" skal vare før den skrurseg av.
  13.  
  14. //==============================================================================================================================================================
  15.  
  16. //definerer morsekodene for alphabetet og nummerne
  17. char* letters[] = {
  18. ".-", // A
  19. "-...", // B
  20. "-.-.", // C
  21. "-..", // D
  22. ".", // E
  23. "..-.", // F
  24. "--.", // G
  25. "....", // H
  26. "..", // I
  27. ".---", // J
  28. "-.-", // K
  29. ".-..", // L
  30. "--", // M
  31. "-.", // N
  32. "---", // O
  33. ".--.", // P
  34. "--.-", // Q
  35. ".-.", // R
  36. "...", // S
  37. "-", // T
  38. "..-", // U
  39. "...-", // V
  40. ".--", // W
  41. "-..-", // X
  42. "-.--", // Y
  43. "--.." // Z
  44. };
  45.  
  46. char* numbers[] = {
  47. "-----", // 1
  48. ".----", // 2
  49. "..---", // 3
  50. "...--", // 4
  51. "....-", // 5
  52. ".....", // 6
  53. "-....", // 7
  54. "--...", // 8
  55. "---..", // 9
  56. "----."
  57. };
  58.  
  59.  
  60. const char bokstaverTall[]={'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','0','1','2','3','4','5','6','7','8','9'};
  61. const String letters2[] = {
  62.  
  63. //====================================================================================================================================================================
  64. ".-****", // A
  65. "-...**", // B
  66. "-.-.**", // C
  67. "-..***", // D
  68. ".*****", // E
  69. "..-.**", // F
  70. "--.***", // G
  71. "....**", // H
  72. "..****", // I
  73. ".---**", // J
  74. "-.-***", // K
  75. ".-..**", // L
  76. "--****", // M
  77. "-.****", // N
  78. "---***", // O
  79. ".--.**", // P
  80. "--.-**", // Q
  81. ".-.***", // R
  82. "...***", // S
  83. "-*****", // T
  84. "..-***", // U
  85. "...-**", // V
  86. ".--***", // W
  87. "-..-**", // X
  88. "-.--**", // Y
  89. "--..**", // Z
  90. "-----*", // 0
  91. ".----*", // 1
  92. "..---*", // 2
  93. "...--*", // 3
  94. "....-*", // 4
  95. ".....*", // 5
  96. "-....*", // 6
  97. "--...*", // 7
  98. "---..*", // 8
  99. "----.*" // 9
  100.  
  101. };
  102. const int sizeOfArrays = 36; //setter størrelsen på arrayet(antall forskjellige bokstaver,tegn)
  103.  
  104. //===============================================================================================================================================================
  105.  
  106. void setup()
  107. {
  108. pinMode(buzzer, OUTPUT); //definerer buzzers pinne som en utgang
  109. pinMode(knapp, INPUT); //definerer knppens pinne som en inngang
  110. pinMode(6,INPUT);
  111.  
  112. Serial.begin(9600); //Setter serial monitor til 9600.
  113.  
  114. lcd.begin(16, 2); //denne forteller hvor mange kolonner og rader displayet vi har består av(16 kolonner og 2 rader)
  115. }
  116.  
  117. //=============================================================================================================================================================
  118.  
  119. void loop()
  120. {
  121. static int SerialReadFlag = 0; //legger til en funksjon som sier om flagget er nede da er funksjonen lik 0 og hvis flagget er oppe så skal den gjøre noe.
  122. static unsigned long forrigeTrykk = 0; //med en unsigned long funksjon kontrollerer vi tiden siden forgje gang trykket inn i en millis funksjon.
  123. static int forrigeTrykkFlag = 0; //denne funksjonen foteller når vi faktisk har trykket på knappen hvis ikke er den 0 og det skal ikke skje noe..
  124. static unsigned long lcdTid = 0; //foretller hvor lenge skjermen skal være på før den renser skjermen på lcd displayet.
  125.  
  126. int pulsType = 0; // Resetter pulstypen til 0 (1="." og 2="-")
  127. if(digitalRead(knapp) == 1){ // Når knappen trykkes ned...
  128. pulsType = lengde(); // ...kjøres funksjonen "lengde()" som returnerer pulstype
  129. forrigeTrykk = millis(); // setter forgje trykk lik millis for
  130.  
  131. forrigeTrykkFlag = 1; //når vi har trykket inn knappen en kort gang er denne høy og funksjonen starter.
  132. if(pulsType == 1){ // hvis det har vært et kort trykk på knappen som er det samme som "." så blir buzzer høy og skal pipe
  133. digitalWrite(buzzer, HIGH); // og etter 200ms som jeg har satt som dotDelay så setter man buzzeren tilbake til lav tiltilstand og det gjør at buzzeren
  134. delay(dotDelay); //og det gjør at buzzeren slutter å pipe.
  135. digitalWrite(buzzer, LOW);
  136. Serial.print("."); // skriver ut "." i serial monitor hvis kort trykk.
  137. }
  138. if(pulsType == 2){ //når vi har trykket inn knappen en lang gang er denne høy og funksjonen starter.
  139. digitalWrite(buzzer, HIGH); //Et langt trykk på knappen som er det samme som "-" så blir buzzer høy og skal pipe
  140. delay(dotDelay*3); //og etter 3*200ms som jeg har satt som dotDelay så setter man buzzeren tilbake til lav tiltilstand og det gjør at buzzeren
  141. digitalWrite(buzzer, LOW); //buzzeren slutter å pipe.
  142. Serial.print("-"); //skriver ut "-" i serial monitor hvis langt trykk.
  143. }
  144. }
  145. //===============================================================================================================================================================
  146.  
  147. if(millis()-forrigeTrykk >= 3000 && forrigeTrykkFlag == 1){ //hvis tiden mills()-forgjeTrykk er større eller lik 3000ms og forrgjeTrykkFlag er høy
  148. Serial.println(" "); //så skal den skrive ut mellomrom (" ") både i serial monitor og i lcd displayet.
  149. lcd.print(" ");
  150. forrigeTrykkFlag = 0; //setter så flagget til nede for å resette funksjonen slik at den ikke fortsetter å skrive mellomrom.
  151. }
  152.  
  153. //===============================================================================================================================================================
  154.  
  155. char ch;
  156. if (Serial.available()) // venter på data fra serial communication
  157. {
  158. lcdTid = millis();
  159. ch = Serial.read(); // leser vi hver bokstav.
  160.  
  161.  
  162. Serial.print(ch);//printer ut i serial monitor og til lcd displayet bokstavene vi skal sende.
  163. lcd.print(ch);
  164.  
  165.  
  166.  
  167. if (ch >= 'a' && ch <= 'z') // hvis små bokstaver
  168. {
  169. morseCodeSequence(letters[ch - 'a']);
  170. }
  171. else if (ch >= 'A' && ch <= 'Z') // eller hvis store bokstaver
  172. {
  173. morseCodeSequence(letters[ch - 'A']);
  174. }
  175. else if (ch >= '0' && ch <= '9') // eller hvis tall
  176. {
  177. morseCodeSequence(numbers[ch - '0']);
  178. }
  179. else if (ch == ' ') // ved mellomrom vent 4*dotDelay som jeg har satt til 200ms
  180. {
  181. delay(dotDelay * 4);
  182. }
  183. SerialReadFlag = 1; // hvis SerialReadFlag blir satt til høy så skal den rense lcd displayet hvis det har gått mer enn10 sekunder siden forrige gang
  184. if(millis()-lcdTid > 10000){ //noe var skrevet.
  185. lcd.clear();
  186. }
  187. } else if (SerialReadFlag == 1){ //hvis serialReadFlag er høy skal den lage mellomrom i serial monitor.
  188. Serial.println(" ");
  189. lcd.print(" ");
  190. SerialReadFlag = 0; //hvis SerialReadFlag er lav skal den ikke lage noen ting.
  191.  
  192. }
  193. if(millis()-lcdTid<=10000 && millis()-lcdTid>= 5000){ //hvis tiden millis bruker- lcdTiden er mindre eller lik 10s og tiden millis -lcdTid er større eller lik 5s
  194. lcd.setCursor(0,1); //så skriver den i kolonne 0 rad 2 siden den starter standard i kolonne 0 rad 1.
  195. }
  196. if(millis()-lcdTid >= 10000){ //hvis millis tiden- lcd tiden er større eller lik 10s så den rense lcd skjermen og sette tilbake
  197. lcd.clear(); //lcden i vanlig standard somm er kolonne 0, rad 0.
  198. lcd.setCursor(0,0);
  199. }
  200. if(digitalRead(6) == HIGH) // hvis knappen en tryket inn så er den høy
  201. {
  202. Serial.print(readUserInput()); //printer ut verdien til variabelen charakter.
  203. }
  204. }
  205. //=====================================================================================================================================================================
  206. //Denne funksjonen blir satt når vi setter pulsType = lengde(); lenger opp. og bestemmer hva funskjonen skal gjøre hvis det er kort trykk eller lang trykk.
  207.  
  208. int lengde(){
  209. int startTid;
  210. int sluttTid;
  211. int pulsLengde;
  212.  
  213. startTid = millis(); // Registrer tiden akkurat nå
  214. delay(10); // Eliminerer klirr når knappen trykkes ned
  215. while(digitalRead(knapp) == 1){} // Venter mens knappen er trykket ned
  216. delay(10); // Eliminerer klirr når knappen trykkes opp
  217. sluttTid = millis(); // Registrer tiden på nytt
  218. if(sluttTid-startTid < 300){ // Hvis tiden knappen var trykket inn er minde enn 300 (KAN JUSTERES)...
  219. pulsLengde = 1; // ...registreres pulslengden som 1
  220. }
  221. else pulsLengde = 2; // Ellers registreres pulslengden som 2
  222. return pulsLengde; //Returnerer pulsLengden 1 som er kort trykk eller 2 som er lang trykk.
  223. }
  224.  
  225. //====================================================================================================================================================================
  226. void morseCodeSequence(char* sequence) // denne funskjonen tar inngangen i et array eller "." og "-" og faktisk kaller den prikk eller strek for hvert element i selve
  227. { //arrayet.
  228. int i = 0;
  229.  
  230. while (sequence[i] != NULL) // sløyfe for hvert elemet i arrayet.
  231. {
  232. dotOrDash(sequence[i]); // sender ut dosh eller dash ("." og "-").
  233. i++; // teller neste element i arrayet. Increment to the next element in the array.
  234. }
  235. delay(dotDelay * 3); // pause mellom hver bokstav som er 3 ganger dot varigheten, dotDelay er 200ms.
  236. }
  237.  
  238. //==================================================================================================================================================================
  239.  
  240. //=============================================================================DOT ELLER DASH=======================================================================
  241.  
  242. void dotOrDash(char dotOrDash) // denne funksjonen ser på utsignalet om det skal være en dot"." eller dash "-"
  243. {
  244. digitalWrite(buzzer, HIGH); // setter buzzer høy hvis dotOrDash er ".".
  245. if (dotOrDash == '.')
  246. {
  247. delay(dotDelay); //setter et delay på 200ms.
  248. }
  249. else // must be a - //ellers må det bli en -
  250. {
  251. delay(dotDelay * 3); //som vi setter til 3* "." for å angi lengden til -.
  252. }
  253. digitalWrite(buzzer, LOW); //hvis buzzer er lav
  254. delay(dotDelay); // pause mellom pipene
  255.  
  256. }
  257.  
  258. char readUserInput()
  259. {
  260. char morseCode[6]; //
  261.  
  262. int startTid,sluttTid; //lager variablene startTid og sluttTid
  263. int puls; //lager variabelen puls
  264. int count = 0; //lager vaiabelen count og setter den lik 0
  265. boolean finishedLetter = false; //lager en boolean med en variabel finishedLetter som vi setter til usann.
  266. boolean finishedDigit = false; //lager en boolean med en variabel finishedDigit som vi setter til usann.
  267.  
  268. while(!finishedLetter) //lager en while løkke som begynner når IKKE er ferdig å skrive(finishedLetter)
  269. {
  270. startTid = millis(); //Setter startTiden lik millis()
  271. sluttTid = 0; //Setter sluttTiden lik 0.
  272. puls = 0; //setter puls lik 0.
  273.  
  274. finishedDigit = false; //setter finishedDigit lik usann.
  275.  
  276. while(!finishedDigit && !finishedLetter) //når finishDigit er sann og den ikke har skrivet ferdig bokstaven skal:
  277. {
  278. if(digitalRead(6) == HIGH) // når knappen er(høy)
  279. {
  280. puls = debounce(); //setter puls lik debounce som er en egen funksjon som definerer om det er et kort eller langt trykk
  281. morseCode[count] = decodePulse(puls); //****** hva?
  282. startTid = millis(); //setter startTiden lik millis()
  283. finishedDigit = true; //setter finishedDigit sann
  284. }
  285. else if (digitalRead(6) == LOW) // hvis ikke setter vi knappen lav og dette skal skje:
  286. {
  287. sluttTid = millis(); //setter sluttTid lik millis()
  288. if(sluttTid-startTid > 1000) // hvis sluttTid-startTid er mindre enn 1s så setter den at man er ferdig med å skrive??
  289. {
  290. finishedLetter = true;
  291. }
  292. }
  293. }
  294. if(finishedLetter == true || count == 5) //
  295. {
  296. for(int j = count; j < 6; j++)
  297. {
  298. morseCode[j] = '*';
  299. }
  300. finishedLetter = true;
  301. }
  302. count++;
  303. }
  304. int index = compareMorseCode(morseCode);
  305. char c = bokstaverTall[index];
  306. return bokstaverTall[index];
  307. }
  308. //=====================================================================================================================================================================
  309. int debounce()
  310. {
  311. int startTid; //lager variabelen startTid
  312. int sluttTid; //lager variabelen sluttTid
  313. int pulsLengde; //lager variabelen pulsLengde
  314.  
  315. startTid = millis(); // setter startTiden lik millis()
  316. delay(10); //delay for å forhindre feil
  317. while(digitalRead(6) == HIGH) {} // dette skal skje når knappen er trykket inn
  318. delay(10); //delay for å forhindre feil
  319.  
  320. sluttTid = millis(); // sluttTiden er lik millis() når:
  321. if(sluttTid-startTid < 50 && sluttTid-startTid > 0) // slutttiden er mindre enn 50ms og sluttTiden-startTiden er større en 0 settes pulslengde lik 0
  322. { // dette gjør jeg for at jeg skal unngår uønskede trykk.
  323. pulsLengde = 0;
  324. }
  325. else if(sluttTid-startTid < 300 && sluttTid-startTid > 50) // denne sier at når sluttTid -startTid er mindre enn 300ms og sluttTid-startTid er større enn 50
  326. { //så setter man pulsLengden lik 1(dette er ".")
  327. pulsLengde = 1;
  328. }
  329. else if (sluttTid-startTid > 300 && sluttTid-startTid < 900) //denne fungerer på samme måte bare større enn 300ms og mindre enn 900ms så setter man
  330. { //pulsLengden lik 2(dette er "-").
  331. pulsLengde = 2;
  332. }
  333. else // hvis man holder knappen lenger inne enn 900ms så sender setter man tilstand 3 som gir et "feil" signal.
  334. {
  335. pulsLengde = 3;
  336. }
  337. return pulsLengde; //returnerer hvilken tilstand den er i.
  338. }
  339. //=====================================================================================================================================================================
  340. char decodePulse(int pulseType)
  341. {
  342. if(pulseType == 1)
  343. return '.';
  344. else if(pulseType == 2)
  345. return '-';
  346. else if (pulseType == 3)
  347. return '*';
  348. }
  349. int compareMorseCode(char morseCode[])
  350. {
  351. String morseCodeString = "";
  352. for(int i = 0; i < 6; i++)
  353. {
  354. morseCodeString = morseCodeString + morseCode[i];
  355.  
  356. }
  357. for(int i = 0; i < sizeOfArrays; i++)
  358. {
  359. if(letters2[i] == morseCodeString)
  360. {
  361. return i;
  362. }
  363. }
  364. return 0;
  365. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement