#include "OneWire.h"
#include "DallasTemperature.h"
//#define DEBUG_MODE //开关,负责控制是否输出调试信息
#define LED_PIN 3 // LED灯连接到Arduino的数字引脚3 & 4号引脚不行 分别对应356 引脚
#define LED_COUNT 4 // LED灯的数量
#define ONE_WIRE_BUS 2 // DS18B20数据引脚连接到Arduino的数字引脚2
#ifdef DEBUG_MODE
#define PRINT_DEBUG_INFO printDebugInfo
#else
#define PRINT_DEBUG_INFO
#endif
bool flag = 1; //9号引脚的灯,设置在外面用来提醒人们发生火灾,maybe
int buttonState8 = 0; // 按钮状态
const int buzzerPin = 7; //蜂鸣器连7号引脚
const int buttonPin = 8; // 按钮连接到Arduino的引脚8,控制蜂鸣器响了之后,让其关闭
bool buzzerActive = true;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void btnHandler();
void closeAllLight();
void setAllLightTo100();
void setAllLightTo255();
void playEmergencyMusic();
void printTemprature(float temperature);
void printDebugInfo(const char *format, ...);
#define DEBUG_MODE
void setup()
{
Serial.begin(9600);
pinMode(7, OUTPUT);//蜂鸣器
sensors.begin(); // 初始化DS18B20传感器
for (int i = 0; i < LED_COUNT; i++)
{
pinMode(LED_PIN + i, OUTPUT); // 设置每个LED引脚为输出模式
closeAllLight();
}
pinMode(buttonPin, INPUT); // 设置按钮引脚为输入模式
}
void loop()
{
sensors.requestTemperatures(); // 请求温度读数
float temperature = sensors.getTempCByIndex(0); // 获取温度值(摄氏度)
closeAllLight();
switch((int)(temperature/10))
{
case 0:
{
closeAllLight();
break;
}
case 1:
{
analogWrite(LED_PIN + 0, 20);
break;
}
case 2:
{
analogWrite(LED_PIN + 0, 50);
analogWrite(LED_PIN + 2, 50);
break;
}
case 3:
{
setAllLightTo100();
break;
}
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
{
setAllLightTo255();
btnHandler();
break;
}
default:
{
closeAllLight();
break;
}
}
printTemprature(temperature);
delay(1000); // 延迟1秒钟
}
void closeAllLight()
{
for (int i = 0; i < LED_COUNT; i++)
{
PRINT_DEBUG_INFO("All light had been close!\n");
analogWrite(LED_PIN + i, 0); // 关闭所有LED灯
}
return;
}
void setAllLightTo100()
{
for (int i = 0; i < LED_COUNT; i++)
{
PRINT_DEBUG_INFO(
"All light had been set to%d!\n",
100);
analogWrite(LED_PIN + i, 100); // 设置LED灯亮度为100
}
return;
}
void setAllLightTo255()
{
for (int i = 0; i < LED_COUNT; i++)
{
PRINT_DEBUG_INFO(
"All light had been set to%d!\n",
255);
analogWrite(LED_PIN + i, 255); // 设置LED灯亮度为最大值
}
return;
}
void btnHandler()
{
PRINT_DEBUG_INFO("btnHandler had been called\n");
if (flag == 1)
{
if (buttonState8 == 0)
{
Serial.print("蜂鸣器疯狂响\n");
playEmergencyMusic();
}
else
{
Serial.print("蜂鸣器不响了\n");
flag = 0;
}
}
return;
}
void printTemprature(float temperature)
{
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
return;
}
void playEmergencyMusic()
{
// 紧急逃生音乐序列
for (int i = 200; i <= 800; i++)
{
buttonState8 = digitalRead(buttonPin); // 读取按钮状态
if (buttonState8 == 1)
{
noTone(buzzerPin); // 停止蜂鸣器发声
// 蜂鸣器停止发声时,将 buzzerActive 设置为 false
//buzzerActive = false;
return; // 退出函数
}
else
{
tone(buzzerPin, i); //在7号端口输出频率
delay(5); //该频率维持5毫秒
}
// 控制LED灯的闪烁
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(13, HIGH);
delay(100); // 闪烁时间
digitalWrite(3, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(13, LOW); // 关闭LED灯
delay(100); // 闪烁时间
}
for (int i = 800; i >= 200; i--)
{
buttonState8 = digitalRead(buttonPin); // 读取按钮状态
if (buttonState8 == 1)
{
noTone(buzzerPin); // 停止蜂鸣器发声
// 蜂鸣器停止发声时,将 buzzerActive 设置为 false
//buzzerActive = false;
return; // 退出函数
for (int i = 0; i < LED_COUNT; i++) // 在蜂鸣器停止发声后,关闭LED灯
digitalWrite(LED_PIN + i, LOW);
}
else
{
tone(buzzerPin, i); //在7号端口输出频率
delay(10); //该频率维持5毫秒
}
delay(10);
}
}
void printDebugInfo(const char *format, ...)
{
static char buffer[512];
va_list args;
va_start(args, format);
sprintf(buffer, format, args);
Serial.print(buffer);
}