ARDUINO蜂鸣器不应该播放声音

时间:2018-08-22 19:23:13

标签: arduino-uno

因此,我制作了这种温度/湿度传感器,并决定添加火警传感器功能。这样一切正常,对吗?不,我还决定要为此加声。经过测试,效果很好,所以我将其投入了我的项目。 启动它[项目],打火机,正常工作,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 ,并且代码的其他部分也已执行,蜂鸣器继续播放。 我在做什么错了?

1 个答案:

答案 0 :(得分:0)

检查documentation for tone

  

可以指定持续时间,否则波浪将持续到通话   到noTone()

因此,您可能需要在检查传感器的值(或在LOW分支上显式调用notone)或使用{{1}的3-arg版本之前,在每个循环开始时重置音调。 }。

我不知道tonetone可能如何相互作用。

我可能会将实际的音调例程作为自己的任务。想法是您将启动警报任务,然后在适当时将其重置。但是现在,请确保在每次循环开始时重置您的状态,或者如果任务听起来太高级,则每个分支都会重置它必须显式执行的任何操作。

确保您了解Arduino世界中的基本“打印”调试。可以在IDE上读取的简单write logging to the serial port非常有价值。

最后:使用函数!如果将所有内容都放在delay中,则随着程序的增长它们将变得不可读。例如,如果您有某种状态想要每次重置(例如,运行诸如音调,值,标志之类的任务),则创建一个loop函数,该函数首先被init()调用,以便任何给定的循环都有良好的开始状态。