我是arduino的新手。我正在尝试制作一个程序,该程序可以从电视遥控器接收IR代码,并在按每个按钮时将它们用作4位数密码来点亮LED。然后将代码与硬编码的代码进行比较。在这种情况下为1234。 我做了一个函数来验证输入的值等于通过。如果是这样,请点亮绿色LED,否则,点亮红色LED。 但是,即使我输入了正确的代码,也只有红色的指示灯点亮。 这是我的完整代码,因为我不确定其中哪一部分会引起问题:
const int pass[4] = {1, 2, 3, 4};
int value[4] = {};
int digitNum = 0;
int input;
void loop()
{
value[digitNum] = input; //where input is a number between 0 and 9
digitNum++;
if(digitNum == 1){
lightFirstLed();
}
else if(digitNum == 2){
lightSecondLed();
}
else if(digitNum == 3){
lightThirdLed();
}
else if(digitNum == 4){
lightFourthLed();
verify();
}
}
void verify()
{
bool falseCharacter = false;
for(int i = 0; i <= 4; i++){
if(value[i] != pass[i]){
falseCharacter = true;
}
}
if(!falseCharacter){
lightGreenLed();
}
else{
lightRedLed();
}
}
以light * Led形式存在的功能实际上可以执行其应做的事情。 我尝试改变校验功能,最终使绿色指示灯始终亮着。我已经这样做了几个小时,我开始感到完全不同。
非常感谢您的帮助。并且请告诉我我做的事情是否不符合最佳做法,即使超出了本问题的范围。
有关完整的代码和设计,请参见以下指向Autodesk模拟器的链接:https://www.tinkercad.com/things/0keqmlhVqNp-mighty-leelo/editel?tenant=circuits?sharecode=vVUD2_4774Lj4PYXh6doFcOqWUMY2URIfW8VXGxutRE= 编辑:现在重置不起作用
答案 0 :(得分:0)
您在for
中的verify
循环正在访问数组之外:
const int pass[4] = {1, 2, 3, 4};
int value[4] = {};
for(int i = 0; i <= 4; i++){
if(value[i] != pass[i]){
falseCharacter = true;
}
}
将i <= 4
更改为i < 4
。另外,当falseCharacter
设置为true
时,循环中的break
:
for(int i = 0; i < 4; i++)
{
if(value[i] != pass[i])
{
falseCharacter = true;
break;
}
}
更新
您需要在else
中使用loop
语句:
void loop(void)
{
if(irrecv.decode(&results))
{
if (results.value == powBtn)
{
reset();
}
else if (results.value == zeroBtn)
{
input = 0;
}
else if (results.value == oneBtn)
{
input = 1;
}
else if (results.value == twoBtn)
{
input = 2;
}
else if (results.value == threeBtn)
{
input = 3;
}
else if (results.value == fourBtn)
{
input = 4;
}
else if (results.value == fiveBtn)
{
input = 5;
}
else if (results.value == sixBtn)
{
input = 6;
}
else if (results.value == sevenBtn)
{
input = 7;
}
else if (results.value == eightBtn)
{
input = 8;
}
else if (results.value == nineBtn)
{
input = 9;
}
else
{
return; /*** !!! Unrecognized Value !!! ***/
}
value[digitNum] = input;
digitNum++;
if(digitNum == 1)
{
digitalWrite(LED1, HIGH);
}
else if(digitNum == 2)
{
digitalWrite(LED2, HIGH);
}
else if(digitNum == 3)
{
digitalWrite(LED3, HIGH);
}
else if(digitNum == 4)
{
digitalWrite(LED4, HIGH);
verify();
}
else
{
if (results.value == powBtn)
{
reset();
}
}
// Receive the next value
irrecv.resume();
}
}