我使用以下方法创建了一个莫尔斯电码输入设备:
* Arduino Uno
* Grove Base sheild
* Grove按钮
* Grove光传感器
* LCD RGB背光灯
我有它,所以液晶显示屏上显示一个字(在这种情况下为'黄色')。然后必须通过按钮输入该词作为莫尔斯码。 在输入时,字母从摩尔斯电码翻译成英文并在屏幕上显示为字母。 (光传感器用于重置LCD)。
我的问题是......如何将输入的答案作为莫尔斯代码存储然后检查其正确性?因此,如果我的女儿输入“Yellop”,它将显示一条消息“不正确”。她会重置并再试一次。 我对这一切都非常陌生,并希望得到一些帮助以实现这一目标。 现在,我假设我会以某种方式将每个字母输入存储在某种数组中,然后检查其是否正确。但是,我不知道该怎么做。 这是我的代码......
#include <Wire.h>
#include "rgb_lcd.h"
rgb_lcd lcd;
#define DOT false
#define DASH true
#define MAX_CHAR_LENGTH 6
#define BUTTON A0
#define LIGHTSENSOR A1
#define pinLED 6
#define PULSE_THRESHOLD 400
#define LETTER_SEPARATION 600
#define WORD_SEPARATION 8000
const struct MorseTree *tree = NULL;
const int colorR = 0;
const int colorG = 0;
const int colorB = 100;
int value;
int button = -1;
int pulseThreshold = 0;
int letterSeparation = 0;
int wordSeparation = 0;
void initMorse(int lbutton, int lpulseThreshold, int lletterSeparation, int
lwordSeparation)
{
tree = generateMorseTree();
button = lbutton;
pulseThreshold = lpulseThreshold;
letterSeparation = lletterSeparation;
wordSeparation = lwordSeparation;
}
struct MorseTree
{
// '-' unless this is a leaf node
char character;
struct MorseTree *dotChild;
struct MorseTree *dashChild;
};
struct MorseData
{
char character;
bool code[MAX_CHAR_LENGTH];
byte codeLength;
};
void initMorseTree(struct MorseTree *tree)
{
tree -> character = '-';
tree -> dotChild = NULL;
tree -> dashChild = NULL;
}
struct MorseTree *newMorseTree()
{
struct MorseTree *tree = (struct MorseTree *) malloc(sizeof(struct
MorseTree));
initMorseTree(tree);
return tree;
}
void addTreeMember(struct MorseTree *tree, struct MorseData &data)
{
struct MorseTree *current = tree;
for (byte i = 0; i < data.codeLength; i++)
{
boolean currentSymbol = data.code[i];
if (currentSymbol == DOT)
{
if (current -> dotChild == NULL)
current -> dotChild = newMorseTree();
current = current -> dotChild;
}
else
{
if (current -> dashChild == NULL)
current -> dashChild = newMorseTree();
current = current -> dashChild;
}
}
// now current must be a leaf node
current -> character = data.character;
}
void addTreeMembers(struct MorseTree *tree, struct MorseData data[],
byte dataLength)
{
for (byte i = 0; i < dataLength; i++)
addTreeMember(tree, data[i]);
}
void addAlphabet(struct MorseTree *tree)
{
struct MorseData data[] = {
{'A', {DOT, DASH}, 2},
{'B', {DASH, DOT, DOT, DOT}, 4},
{'C', {DASH, DOT, DASH, DOT}, 4},
{'D', {DASH, DOT, DOT}, 3},
{'E', {DOT}, 1},
{'F', {DOT, DOT, DASH, DOT}, 4},
{'G', {DASH, DASH, DOT}, 3},
{'H', {DOT, DOT, DOT, DOT}, 4},
{'I', {DOT, DOT}, 2},
{'J', {DOT, DASH, DASH, DASH}, 4},
{'K', {DASH, DOT, DASH}, 3},
{'L', {DOT, DASH, DOT, DOT}, 4},
{'M', {DASH, DASH}, 2},
{'N', {DASH, DOT}, 2},
{'O', {DASH, DASH, DASH}, 3},
{'P', {DOT, DASH, DASH, DOT}, 4},
{'Q', {DASH, DASH, DOT, DASH}, 4},
{'R', {DOT, DASH, DOT}, 3},
{'S', {DOT, DOT, DOT}, 3},
{'T', {DASH}, 1},
{'U', {DOT, DOT, DASH}, 3},
{'V', {DOT, DOT, DOT, DASH}, 4},
{'W', {DOT, DASH, DASH}, 3},
{'X', {DASH, DOT, DOT, DASH}, 4},
{'Y', {DASH, DOT, DASH, DASH}, 4},
{'Z', {DASH, DASH, DOT, DOT}, 4},
};
addTreeMembers(tree, data, 26);
}
void addNumbers(struct MorseTree *tree)
{
struct MorseData data[] = {
{'1', {DOT, DASH, DASH, DASH, DASH}, 5},
{'2', {DOT, DOT, DASH, DASH, DASH}, 5},
{'3', {DOT, DOT, DOT, DASH, DASH}, 5},
{'4', {DOT, DOT, DOT, DOT, DASH}, 5},
{'5', {DOT, DOT, DOT, DOT, DOT}, 5},
{'6', {DASH, DOT, DOT, DOT, DOT}, 5},
{'7', {DASH, DASH, DOT, DOT, DOT}, 5},
{'8', {DASH, DASH, DASH, DOT, DOT}, 5},
{'9', {DASH, DASH, DASH, DASH, DOT}, 5},
{'0', {DASH, DASH, DASH, DASH, DASH}, 5},
};
addTreeMembers(tree, data, 10);
}
void addPunctuation(struct MorseTree *tree)
{
struct MorseData data[] = {
{'.', {DOT, DASH, DOT, DASH, DOT, DASH}, 6},
{',', {DASH, DASH, DOT, DOT, DASH, DASH}, 6},
{'?', {DOT, DOT, DASH, DASH, DOT, DOT}, 6},
};
addTreeMembers(tree, data, 3);
}
struct MorseTree *generateMorseTree()
{
struct MorseTree *tree = newMorseTree();
initMorseTree(tree);
addAlphabet(tree);
addNumbers(tree);
addPunctuation(tree);
return tree;
}
void waitFor(int pin, int state)
{
do
{
// spin until the pin reads the given state
while (digitalRead(pin) != state) { }
// delay, to verify the reading
delay(5);
// continue if the reading has changed
} while (digitalRead(pin) != state);
}
boolean getNextSymbol()
{
waitFor(button, HIGH);
unsigned long start = millis();
waitFor(button, LOW);
unsigned long end = millis();
unsigned long pulseLength = end - start;
// Serial.println(pulseLength);
if (pulseLength > pulseThreshold)
return DASH;
else
return DOT;
}
boolean shouldTimeOut()
{
unsigned long start = millis();
while (digitalRead(BUTTON) == LOW)
{
if (millis() - start > letterSeparation)
return true;
}
return false;
}
boolean shouldBeSpace()
{
unsigned long start = millis();
while (digitalRead(BUTTON) == LOW)
{
if (millis() - start > wordSeparation)
return true;
}
return false;
}
char getNextChar()
{
static boolean lastCharWasSpace = false;
const struct MorseTree *current = tree;
byte symbolCount = 0;
if (!lastCharWasSpace && shouldBeSpace())
{
lastCharWasSpace = true;
return ' ';
}
lastCharWasSpace = false;
while (true)
{
symbolCount++;
boolean currentSymbol = getNextSymbol();
// Serial.println(currentSymbol == DOT ? "DOT" : "DASH");
if (currentSymbol == DOT)
current = current -> dotChild;
else
current = current -> dashChild;
if (current == NULL)
return '-';
if (shouldTimeOut() || symbolCount >= MAX_CHAR_LENGTH)
return current -> character;
}
// should never get here
return '!';
}
void setup()
{
pinMode(BUTTON, INPUT);
pinMode(LIGHTSENSOR, INPUT);
value = analogRead(LIGHTSENSOR);
initMorse(BUTTON, PULSE_THRESHOLD, LETTER_SEPARATION, WORD_SEPARATION);
Serial.begin(9600);
while(! Serial);
lcd.begin(16, 2);
lcd.setRGB(colorR, colorG, colorB);
lcd.print("Input 'yellow'");
}
void loop()
{
Serial.println(value);
value = analogRead(LIGHTSENSOR);
if(value<40)
{
lcd.clear();
}
static boolean firstLoop = true; //skips the first space between words.
char c = getNextChar();
if (firstLoop)
{
firstLoop = false;
if (c == ' ')
return;
}
lcd.print(c);
}
非常感谢任何帮助或建议。 (我删除了我的上一个问题并重新发布,因为它的措辞非常糟糕。希望这个更好!)