【发布时间】:2020-12-18 03:08:26
【问题描述】:
目前,我正在为我的学校制作一个项目,当代码多次运行时我遇到了问题。我正在使用 Arduino Mega 2560。我正在做的项目是制作一个需要 PIN 码才能打开的保险箱/盒子。按照事情应该如何运作的顺序如下:
- IR 接收器从激活信号的遥控器接收信号。当系统处于活动状态时,它会打开蓝色 LED。当系统处于非活动状态时,它什么也不做。
- 当系统处于活动状态时,它可以从 4x4 引脚焊盘读取输入。如果它得到一个错误的代码,它会打开一个红色的 LED,然后清除数据,这样它就可以再次输入代码。如果给出正确的代码,则绿色 LED 会亮起,并将伺服电机旋转 90 度。
- 打开正确的代码后,按下按钮可使电机返回 0 度并停用系统。
问题是按下按钮后我无法重新激活系统。它基本上变成了 1 并完成了。该项目的代码可以在下面找到。
#include <Keypad.h>
#include <Servo.h>
#include <IRremote.h>
Servo servo;
const byte ROWS = 4;
const byte COLS = 4;
#define Passcode_L 5
char Data[Passcode_L];
char Master[Passcode_L]="14B6";
char hexaKeys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28};
byte colPins[COLS] = {30, 32, 34, 36};
byte data_count = 0;
char customKey;
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
const int led_blue = 23;
const int led_green = 25;
const int led_red = 27;
const int BUTTON = 47;
int BUTTONstate = 0;
const int RECV_PIN = 44;
int togglestate = 0;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup(){
Serial.begin(9600);
irrecv.enableIRIn();
servo.attach(38);
servo.write(0);
pinMode(led_blue, OUTPUT);
pinMode(led_green, OUTPUT);
pinMode(led_red, OUTPUT);
pinMode(BUTTON, INPUT);
}
void loop(){
char customKey = customKeypad.getKey();
BUTTONstate = digitalRead(BUTTON);
if (irrecv.decode(&results)){
switch(results.value){
case 0xFFA25D:
// Toggle BLUE LED On or Off
if(togglestate==0){
digitalWrite(led_blue, HIGH);
togglestate=1;
}
else {
digitalWrite(led_blue, LOW);
togglestate=0;
}
break;
}
irrecv.resume();
}
if (customKey){
Data[data_count] = customKey;
data_count++;
}
if (data_count == Passcode_L - 1 && togglestate==1) {
if (!strcmp(Data, Master)) {
//password is correct
digitalWrite(led_green, HIGH);
delay(500);
servo.write(90);
delay(1500);
digitalWrite(led_green, LOW);
}
else {
// Password is incorrect
digitalWrite(led_red, HIGH);
delay(1000);
digitalWrite(led_red, LOW);
}
clearData();
}
if (BUTTONstate !=0){
servo.write(0);
togglestate=0;
digitalWrite(led_blue, LOW);
}
}
void clearData() {
// Go through array and clear data
while (data_count != 0) {
Data[data_count--] = 0;
}
return;
}
【问题讨论】:
-
您是否制作了有关该项目预期工作方式的流程图?如果是这样,请将其与您编写的代码进行比较。否则,构建一个记录预期程序流程的流程图将更容易评估您在代码中的哪些位置要求微机做一些您不希望它做的事情..
标签: c if-statement arduino