This week I simply decided to test out some analog input using my morse code emitter code and a potentiometer.
The change was fairly simple: I added 2 more constants for defining a delay window and used the map()
function to map the analog inputs default range of 0 to 1023 onto it. Afterwards I added a delay update at the beginning of the event loop. This way the potentiometer can be used to control the emitter’s baud rate.
As a refactoring measure to save on memory, I also decided to relabel all of my constants, except the message buffer size into #define
s.
Last thing to mention was wiring up the potentiometer to the board. This was fairly simple. The middle pin transmits the signal, which I wired to A0. On this model the right pin (pins facing you) was +5V and the left one was GND, however as long as the middle pin is wired to the Arduino’s analog input and naturally voltage/currents are acceptable, it shouldn’t matter too much which way you wire it.
Lastly, just like last week, I wired the Button to digital pin 2 accordingly to the ports above the analog inputs.
As always, the source code is available for download1 and below you can see a video of the working (updated) mose code emitter, which is availavle for download as well2:
//Some constants for defining arbitrary things
#define PULSELEN_MIN 50
#define PULSELEN_MAX 200
#define PIN_BUTTON 2 // the number of the pushbutton pin
#define PIN_POT A0 // the number of the potentiometer input pin
#define PIN_LED LED_BUILTIN // the number of the LED pin
const int MESSAGE_LENGTH = 64;
//Message buffer. This will be treated as ring memory
char msg[MESSAGE_LENGTH];
0;
byte msgIndex = int pulseLen = PULSELEN_MIN;
// Probing the button
int buttonState = 0;
void LEDOut(char mCode[4]){
//Helper function to translalte morse code into blink patterns. '.' is a short and '-' a long pulse (3x length of short pulse)
for(int i=0; (mCode[i] == '.' || mCode[i] == '-') && i<4 ;i++){
digitalWrite(PIN_LED, HIGH);'.')?pulseLen:3*pulseLen);
delay( (mCode[i] ==
digitalWrite(PIN_LED, LOW);
delay(pulseLen);
}
}
void setup() {
// initialize the LED pin as an output:
pinMode(PIN_LED, OUTPUT);// Pullup for actuation precision
pinMode(PIN_BUTTON, INPUT_PULLUP);//Initialise serial. 9600 Baud just to be safe
9600);
Serial.begin(
}
void loop() {
//Probe button for message trigger
buttonState = digitalRead(PIN_BUTTON);//Determine pulse length. This is basically the inverse of a baud speed and will be used in the output's delay() function
0,1023,PULSELEN_MIN,PULSELEN_MAX);
pulseLen = map(analogRead(PIN_POT),
//Check for available characters over serial
while(Serial.available() > 0){
char c_tmp =Serial.read();
//Probe current message state by entering '?' into serial
if(c_tmp == '?'){
"Echo: ");
Serial.print(//When a control character is recognized, text entry is aborted. NUL/'\0' is used for marking a premature end of input
for(int i=0; msg[i] >= ' ' && i<MESSAGE_LENGTH; i++){
Serial.print(msg[i]);
}'\n');
Serial.print(
}
//Discard anything that isn't A-Z or SPACE
if( (c_tmp >= 'A' && c_tmp <= 'Z') || c_tmp == ' '){
msg[msgIndex] = c_tmp;1)%MESSAGE_LENGTH;
msgIndex = (msgIndex+
}//Mark new end of line
'\0';
msg[msgIndex] =
}
// Button LED switch. As the button is LOW-Active, it is probed against LOW
if (buttonState == LOW) {
/*
LED Morse loop. Basically parses the characters into blink patterns using the LEDOut() function
Flushes the entire message buffer into output at a constant baud rate
*/
for(int i=0; msg[i] >= 'A' && i<MESSAGE_LENGTH; i++){
switch(msg[i]){
case 'A':{
".-");
LEDOut(break;
}case 'B':{
"-...");
LEDOut(break;
}case 'C':{
"-.-.");
LEDOut(break;
}case 'D':{
"-..");
LEDOut(break;
}case 'E':{
".");
LEDOut(break;
}case 'F':{
"..-.");
LEDOut(break;
}case 'G':{
"--.");
LEDOut(break;
}case 'H':{
"....");
LEDOut(break;
}case 'I':{
"..");
LEDOut(break;
}case 'J':{
".---");
LEDOut(break;
}case 'K':{
"-.-");
LEDOut(break;
}case 'L':{
".-..");
LEDOut(break;
}case 'M':{
"--");
LEDOut(break;
}case 'N':{
"-.");
LEDOut(break;
}case 'O':{
"---");
LEDOut(break;
}case 'P':{
".--.");
LEDOut(break;
}case 'Q':{
"--.-");
LEDOut(break;
}case 'R':{
".-.");
LEDOut(break;
}case 'S':{
"...");
LEDOut(break;
}case 'T':{
"-");
LEDOut(break;
}case 'U':{
"..-");
LEDOut(break;
}case 'V':{
"...-");
LEDOut(break;
}case 'W':{
".--");
LEDOut(break;
}case 'X':{
"-..-");
LEDOut(break;
}case 'Y':{
"-.--");
LEDOut(break;
}case 'Z':{
"--..");
LEDOut(break;
}default: break;
}
}
// Reset LED and Buffer
digitalWrite(PIN_LED, LOW);0;
msgIndex = 0] = '\0';
msg[
}
}