## Saturday, March 08, 2014

### Arduino–Day 1: My First Project

Before getting my hands dirty, I read the first chapter of the Arduino Projects Book to give me an overview of what am I getting myself into.  I was hooked!  After quickly absorbing the types of components, I read about Series & Parallel circuits.

My first project was lighting up an LED by hooking up a resister, an LED to the 5v power supply.  I admit I also tried the variation with a switch – depress the switch to get the LED going - from the Arduino book.

At this point, I fired up the IDE and ran the ‘Blink’ sample.  I immediately understood the idea of Arduino’s digital pins.  The pins represent 0/1 (On/off) state by sending / stopping electric current through them.  Cool!

I realized I understood enough to start my first project!  Yes, it’s going to be something I come up with on my own!  It was going to be a Morse Messenger!

I will have my circuit blink out a message in Morse Code!  Of course, what am I good at?  Writing programs

Didn’t realize my C++ was so rusty.  How the heck do you write Jagged arrays?  I’m sorry, Mr. Kanetkar, I have forgotten all my pointer lessons.

Though I was using Visual Micro, I hadn’t yet figured out how to debug with break points.  Subject of another blog post I guess.  For now, I was able to make do with “Serial.print*” statements.

Morse.ino
1. // A dot is a '1',  A dash '0'
2. int letterMorse[][4] = {
3.   {1, 0, -1, -1},
4.   {0, 1, 1, 1},
5.   {0, 1, 0, 1},
6.   {0, 1, 1, -1},
7.   {1, -1, -1, -1},
8.   {1, 1, 0, 1},
9.   {0, 0, 1, -1},
10.   {1, 1, 1, 1},
11.   {1, 1, -1, -1},
12.   {1, 0, 0, 0},
13.   {0, 1, 0, -1},
14.   {1, 0, 1, 1},
15.   {0, 0, -1, -1},
16.   {0, 1, -1, -1},
17.   {0, 0, 0, -1},
18.   {1, 0, 0, 1},
19.   {0, 0, 1, 0},
20.   {1, 0, 1, -1},
21.   {1, 1, 1, -1},
22.   {0, -1, -1, -1},
23.   {1, 1, 0, -1},
24.   {1, 1, 1, 0},
25.   {1, 0, 0, -1},
26.   {0, 1, 1, 0},
27.   {0, 1, 0, 0},
28.   {0, 0, 1, 1}
29. };
30.
31.
32. int numberMorse[][5] = {
33.   { 0, 0, 0, 0, 0 },
34.   { 1, 0, 0, 0, 0 },
35.   { 1, 1, 0, 0, 0 },
36.   { 1, 1, 1, 0, 0 },
37.   { 1, 1, 1, 1, 0 },
38.   { 1, 1, 1, 1, 1 },
39.   { 0, 1, 1, 1, 1 },
40.   { 0, 0, 1, 1, 1 },
41.   { 0, 0, 0, 1, 1 },
42.   { 0, 0, 0, 0, 1 }
43. };
44.
45. int led = 10;
46. const int standardPauseInMilliseconds = 500;
47.
48. void setup() {
49.   // put your setup code here, to run once:
50.   doMorse("I LOVE ARDUINO");
51. }
52.
53. void loop() {
54. }
55.
56. void doMorse(String message)
57. {
58.   // put your main code here, to run repeatedly:
59.   for (int i = 0; i < message.length(); i++)
60.   {
61.     char letter = message.charAt(i);
62.
63.     Serial.println(letter);
64.
65.     if (letter == ' ')
66.     {
67.       //Words are separated by a space equal to 7 dots
68.       delay(standardPauseInMilliseconds * 7);
69.       continue;
70.     }
71.
72.
73.     int value = ((int)letter) - 65;
74.     bool isNumber = value < 0;
75.
76.     Serial.println(value);
77.
78.     int *component = isNumber ? numberMorse[value] : letterMorse[value];
79.
80.     for (int j = 0; j < 4; j++)
81.     {
82.
83.       int number = component[j];
84.       if (number < 0) continue;
85.
86.       bool isDot = (number);
87.
88.       Serial.print(isDot ? "Dot- " : "Dash- ");
89.
90.       //For the duration of a dash (0) is 3 times the duration of a dot (1)
91.       blink(isDot ? standardPauseInMilliseconds : standardPauseInMilliseconds * 3);
92.       beep(isDot ? standardPauseInMilliseconds : standardPauseInMilliseconds * 3);
93.
94.       //Each dot / dash is followed by a short silence, equal to the dot duration
95.       delay(standardPauseInMilliseconds);
96.     }
97.
98.     Serial.println(' ');
99.
100.     //The space between letters is three units
101.     delay(standardPauseInMilliseconds * 3);
102.
103.   }
104. }
105.
107. {
108.   pinMode(led, OUTPUT);
109.   //Turn on the light
110.   digitalWrite(led, HIGH);
111.   //For the duration of a dash (0) is 3 times the duration of a dot (1)
112.   delay(delayInMilliseconds);
113.   digitalWrite(led, LOW);
114.
115. }
116.
117. void beep(int delayInMilliseconds)
118. {
119.   pinMode(led, OUTPUT);
120.   analogWrite(led, 20);
121.   delay(delayInMilliseconds);
122.   analogWrite(led, 0);
123. }

The first version of the circuit did not have the Piezo.  However, I realized I was not able to read the message (despite the fact I was trying to decipher Morse Code for the first time in my life ), and I needed an audible cue to distinguish dashes from dots.  Lo & behold: The parallel circuit with both LED & Piezo.

It’s interesting to note that Arduino allows the use of the same pin (10) for controlling both Piezo  (analog) & LED (digital).