我编程的时间不长,我只想使用 Arduino UNO 板扩展电子工程。
我已经开始了一个基于 Steve Hoefer 在 Grathio 上的 Secret Knock Detecting Door Lock 的新项目,我想实现以下内容:
( http://grathio.com/2009/11/secret_knock_detecting_door_lock/ ) ( http://grathio.com/assets/secret_knock_detector.pde )
执行
如果全局值等于 0 并且有效的敲击模式为真,则使用毫秒而不是延迟使黄色 LED 闪烁 4 次,以便它仍然可以“收听”。
如果在 6 秒内未听到另一个有效的爆震模式,它将超时并将全局重置为 0,以便它可以确认初始真实模式并闪烁黄色 LED。
如果在 6 秒内听到另一个有效的敲击模式,则增加一个计数器。
如果计数器等于 1,则等待另一个有效的敲击模式,如果在 6 秒内为真,则再次增加计数器并且不闪烁黄色 LED。
否则,超时并重置所有值。
依此类推,直到计数器大于或等于 4 时触发主 LED 阵列。
一旦成功敲击 4 次,我希望它触发我构建的主 LED 阵列。
问题
该项目的灵感来自客机上使用的测试面板。我见过他们很多,并认为这将是一个开始和了解时间的好地方。
有一些问题,因为我不希望每次都重置 millis() 并且我使用的是按钮而不是爆震检测脚本中的布尔值,所以我不会迷失在代码中。
我知道这不会在 50 秒后响应,这是一个初学者的错误,但如果我按住按钮证明了我所拥有的。下面的代码在第一次 digitalRead HIGH 或 true boolean 之后也没有超时(我正在为此苦苦挣扎)。
阿杜诺素描
int inPin = 2; // input pin switch
int outPin = 3; // output pin LED
long currentTime = 0; // counter
long nextTime = 0; // counter
long lastTime = 0; // counter
int patternCounter = 0; // build up
int globalValue = 0; // lock out
int breakIn = 0; // waste of time?
void setup()
{
pinMode(inPin, INPUT);
pinMode(outPin, OUTPUT);
Serial.begin(9600);
Serial.println("GO");
}
void loop(){
// boolean true, switch just for testing
if (digitalRead(inPin)==HIGH&&globalValue==0&&breakIn==0) {
Serial.println("CLEARED 1st");
delay (500); // flood protection
globalValue++;
breakIn++;
if (globalValue>0&&breakIn>0){
currentTime = millis(); // start a 'new' counter and 'listen'
if (currentTime<6000) { // less than
if (digitalRead(inPin)==HIGH) { // and true
Serial.println("CLEARED 2nd"); // cleared the stage
delay (500); // flood protection
patternCounter++;
} // if counter less
} // if true or high
if (currentTime>6000) {
Serial.println("TIMEOUT waiting 2nd"); // timed out
globalValue = 0;
patternCounter = 0;
breakIn = 0;
} // if more than
} // global master
}
// 3rd attempt
if (globalValue==1&&patternCounter==1){ // third round
nextTime = millis(); // start a 'new' counter and 'listen'
if (nextTime<6000) { // less than
if (digitalRead(inPin)==HIGH) { // and true
Serial.println("CLEARED 3rd");
delay (500); // flood protection
patternCounter++;
} // if counter less
} // if true or high
if (nextTime>6000) {
Serial.println("TIMEOUT waiting 3rd"); // timed out
globalValue = 0;
patternCounter = 0;
} // if more than
} // global master
// 4th attempt and latch
if (globalValue==1&&patternCounter==2){ // last round
lastTime = millis(); // start a 'new' counter and 'listen'
if (lastTime<6000) { // less than
if (digitalRead(inPin)==HIGH) { // and true
digitalWrite(outPin, HIGH); // LED on
Serial.println("CLEARED 4th ARRAY"); // cleared the stage
delay(500); // flood protection
} // true or high
} // counter
if (lastTime>6000) {
Serial.println("TIMEOUT waiting 4th"); // timed out
globalValue = 0;
patternCounter = 0;
} // if more than
} // global and alarm
} // loop end
这是当前的草图,我知道我使用的计数器几乎毫无意义。
任何帮助将不胜感激!