因此,我制作了这种温度/湿度传感器,并决定添加火警传感器功能。这样一切正常,对吗?不,我还决定要为此加声。经过测试,效果很好,所以我将其投入了我的项目。 启动它[项目],打火机,正常工作,LED闪烁,显示文本,蜂鸣器发出警报。但是,在火熄灭之后,即使没有火,蜂鸣器仍会继续演奏两种音调之一。这是代码,以使一切变得清楚:
#include <LiquidCrystal.h>
#include <dht.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
dht DHT;
#define FLAME 13
#define DHT11_PIN 8
#define ALARM A5
const int a9 = 9, a10 = 10, a11 = 11, a12 = 12;
byte z[8] = {
B00100,
B00000,
B11111,
B00001,
B00010,
B00100,
B11111,
B00000,
};
byte st[8] = {
0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000,
};
void setup(){
lcd.begin(16, 2);
lcd.createChar(0, st);
lcd.createChar(1, z);
Serial.begin(9600);
pinMode((a9, a10, a11, a12), OUTPUT);
pinMode(FLAME, INPUT);
pinMode(ALARM, OUTPUT);
}
void loop() {
// Flame sensor code for Robojax.com
int fire = digitalRead(FLAME);// read FLAME sensor
if(fire == HIGH)
{
analogWrite(a9, 255);
analogWrite(a10, 255);
lcd.setCursor(5, 0);
lcd.print("Po");
lcd.print(char(1));
lcd.print("ar!");
tone(ALARM, 4300);
delay(150);
analogWrite(a9, 0);
analogWrite(a10, 0);
lcd.clear();
tone(ALARM, 3500);
delay(150);
} else {
lcd.createChar(0, st);
int chk = DHT.read11(DHT11_PIN);
lcd.home();
lcd.print("Temp.: ");
lcd.print(DHT.temperature);
if(DHT.temperature >= 20.00 && DHT.temperature < 25) {
analogWrite(a11, 255);
delay(750);
analogWrite(a11, 0);
delay(750);
} else if(DHT.temperature >= 25 && DHT.temperature < 30) {
analogWrite(a10, 255);
delay(250);
analogWrite(a10, 0);
delay(250);
} else if(DHT.temperature >= 30) {
analogWrite(a9, 255);
}
lcd.print(char(0));
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Wilg.: ");
lcd.print(DHT.humidity);
if(DHT.humidity >= 45.00 && DHT.humidity < 60.00) {
digitalWrite(a12, HIGH);
delay(250);
digitalWrite(a12, LOW);
delay(250);
} else if(DHT.humidity >= 60.00) {
digitalWrite(a12, HIGH);
}
lcd.print(" %");
delay(750);
}
delay(200);
}
所以,我的意思是即使 fire 从 HIGH 更改为 LOW ,并且代码的其他部分也已执行,蜂鸣器继续播放。 我在做什么错了?
答案 0 :(得分:0)
可以指定持续时间,否则波浪将持续到通话 到
noTone()
。
因此,您可能需要在检查传感器的值(或在LOW分支上显式调用notone
)或使用{{1}的3-arg版本之前,在每个循环开始时重置音调。 }。
我不知道tone
和tone
可能如何相互作用。
我可能会将实际的音调例程作为自己的任务。想法是您将启动警报任务,然后在适当时将其重置。但是现在,请确保在每次循环开始时重置您的状态,或者如果任务听起来太高级,则每个分支都会重置它必须显式执行的任何操作。
确保您了解Arduino世界中的基本“打印”调试。可以在IDE上读取的简单write logging to the serial port非常有价值。
最后:使用函数!如果将所有内容都放在delay
中,则随着程序的增长它们将变得不可读。例如,如果您有某种状态想要每次重置(例如,运行诸如音调,值,标志之类的任务),则创建一个loop
函数,该函数首先被init()
调用,以便任何给定的循环都有良好的开始状态。