文章目录
目录
一、项目要求
1.光照
光照早上七点开灯,晚上七点关灯(若早上七点还是很暗,则依旧开灯,直到光线足够亮;若晚 上七点还是很亮,则依旧关灯,直到光线够暗)。
2.地震报警
①当倾斜度大于10度时,蜂鸣器警报响起。
②当倾斜度等于0时,蜂鸣器报警停止。
③设置报警开关,优先级最高可打开/关闭报警器。
3.火灾报警
①当火灾来临时,红色消防灯(红色LED灯代替)亮起。
②火灾后,红色消防灯关闭。
二、项目准备
arduino面包板、1k电阻 3个、220电阻 1个、烟雾传感器传感器 1个、倾斜传感器 1个、光敏电阻 1个、LED灯(红、白)、按钮 1个、有源蜂鸣器 1个、杜邦线若干
三、接线
下面接线图中,青色LED代表烟雾传感器,紫色LED代表倾斜传感器。
四、项目局部代码
1.控制LED模块
因为要求是“若早上七点还是很暗,则依旧开灯,直到光线足够亮;若晚 上七点还是很亮,则依旧关灯,直到光线够暗” ,那么只要根据光线强度控制照明LED就好了,并不用时间来控照明LED。
①初始化
int LedPin = 10; //照明LED灯
int LDRPin = A0; //光敏电阻
int LDRval = 0; //光敏电阻的读数
unsigned long lastCheck = 0; //上次检查的时间
int day = 0; //当前的天数
void setup() {
pinMode(LedPin, OUTPUT);
Serial.begin(9600);
}
②每0.1秒检查一次光照强度
if (millis() - lastCheck >= 10000) //每10秒检查一次光线强度
{
lastCheck = millis(); // 更新lastCheck为当前时间(毫秒),以便下次检查
Control_Led(LDRval); //引用Control_Led函数,看着LED灯的亮灭
}
③根据光照强度来判断是否开灯
void Control_Led(int LDRval)
{
// 读取并打印当前时间在串行监视器
long now = millis() - (day * 86400000);
Serial.println(now);
//如果光照强度小于600,LED点亮
if (LDRval < 600)
{
digitalWrite(LedPin, HIGH);
}
//如果光照强度大于600,LED熄灭
if (LDRval > 600)
{
digitalWrite(LedPin, LOW);
}
}
2.地震检测模块
本模块中布尔变量比较多,需要分清每个布尔变量的作用。
justQuake 标记是否刚刚发生震动
BuzzerReady 标记蜂鸣器是否准备好进行下一次触发
BuzzerState 蜂鸣器当前的状态(开/关)
EarthquakeCome 标记是否发生地震
①初始化
②.检测地震是否来临
bool Judge()
{
if (TSval < 10)
EarthquakeCome = true;
if (TSval >= 10)
EarthquakeCome = false;
}
③.地震时的操作函数
void Earthquake()
{
//如果蜂鸣器已经准备好了,且是倾斜的时候,触发蜂鸣器
if (BuzzerReady == true)
{
tone(BuzzerPin, 1000);
}
//倾斜的时候,按钮控制蜂鸣器
if (digitalRead(ButtonPin) == HIGH)
{
BuzzerReady = false;
// 按钮按下时,若蜂鸣器未开启,则开启
if (BuzzerState == false)
{
tone(BuzzerPin, 1000);
BuzzerState = true;
}
//按钮按下时,若蜂鸣器已开启,则关闭
else
{
noTone(BuzzerPin);
BuzzerState = false;
}
delay(500);
}
}
④.没有地震来临时的操作函数
void noEarthquake()
{
// 如果刚发生过地震,则关闭蜂鸣器
if (justQuake == true)
{
noTone(BuzzerPin);
justQuake = false;
}
if (digitalRead(ButtonPin) == HIGH)
{
// 按钮按下时,若蜂鸣器未开启,则开启
if (BuzzerState == false)
{
tone(BuzzerPin, 1000);
BuzzerState = true;
}
// 按钮按下时,若蜂鸣器已开启,则关闭
else
{
noTone(BuzzerPin);
BuzzerState = false;
}
delay(500);
}
}
3.烟雾报警模块
①初始化
int FSPin = A5; //火焰传感器
int FSval = 0; //火焰传感器的读数
int FireLedPin = 2; //火焰传感器
void setup() {
pinMode(FireLedPin,OUTPUT);
Serial.begin(9600);
}
②检测烟雾传感器数据,并控制消防灯
void CheckFire(int FSval)
{
if (FSval > 51)
digitalWrite(FireLedPin, HIGH);//若检测到有火焰,消防灯亮起
else
digitalWrite(FireLedPin, LOW);//若没有检测到有火焰,消防灯关闭
delay(20);
}
4.总代码
//定义引脚
int FireLedPin = 2; //火焰警报灯
int LedPin = 10; //照明LED灯
int ButtonPin = 12; //按钮
int BuzzerPin = 6; //蜂鸣器
int LDRPin = A0; //光敏电阻
int TSPin = A2; //倾斜传感器
int FSPin = A5; //火焰传感器
//初始化
int TSval = 0; //倾斜传感器的读数
int LDRval = 0; //光敏电阻的读数
int FSval = 0; //火焰传感器的读数
bool justQuake = true; //标记是否刚刚发生震动
bool BuzzerReady = true; //标记蜂鸣器是否准备好进行下一次触发
bool BuzzerState = false; //蜂鸣器当前的状态(开/关)
bool EarthquakeCome = false; //标记地震是否发生
unsigned long lastCheck = 0; //上次检查的时间
int day = 0; //当前的天数
void setup() {
Serial.begin(9600);
pinMode(ButtonPin, INPUT);
pinMode(LedPin, OUTPUT);
pinMode(BuzzerPin, OUTPUT);
pinMode(FireLedPin,OUTPUT);
}
void loop() {
//控制LED模块
//读取并打印光敏电阻当前读数在串行监视器
LDRval = analogRead(LDRPin);
Serial.println(LDRval);
if (millis() - lastCheck >= 10000) //每10秒检查一次光线强度
{
lastCheck = millis(); // 更新lastCheck为当前时间(毫秒),以便下次检查
Control_Led(LDRval); //引用Control_Led函数,看着LED灯的亮灭
}
//地震检测模块
//读取并打印倾斜传感器当前读数在串行监视器
TSval = analogRead(TSPin);
Serial.println(TSval);
Judge(); //引用Judge函数,判断现在是否地震
if (EarthquakeCome == false)
{
BuzzerReady = true; //没地震时,蜂鸣器准备好好进行下一次触发
noEarthquake();
}
if (EarthquakeCome == true)
{
justQuake = true; //用于不地震后让蜂鸣器停止发出响声
Earthquake();
}
//检查火焰模块
//读取并打印火焰传感器当前读数在串行监视器
FSval = analogRead(FSPin);
Serial.println(FSval);
CheckFire(FSval); //烟雾传感器检测是否有火灾
}
//探测光照强度,以光照强度控制LED的函数
void Control_Led(int LDRval)
{
// 读取并打印当前时间在串行监视器
long now = millis() - (day * 86400000);
Serial.println(now);
//如果光照强度小于600,LED点亮
if (LDRval < 600)
{
digitalWrite(LedPin, HIGH);
}
//如果光照强度大于600,LED熄灭
if (LDRval > 600)
{
digitalWrite(LedPin, LOW);
}
}
//检测是否有地震
bool Judge()
{
if (TSval < 100)
EarthquakeCome = true;
if (TSval >= 100)
EarthquakeCome = false;
}
//地震时函数
void Earthquake()
{
//如果蜂鸣器已经准备好了,且是倾斜的时候,触发蜂鸣器
if (BuzzerReady == true)
{
tone(BuzzerPin, 1000);
}
//倾斜的时候,按钮控制蜂鸣器
if (digitalRead(ButtonPin) == HIGH)
{
BuzzerReady = false;
// 按钮按下时,若蜂鸣器未开启,则开启
if (BuzzerState == false)
{
tone(BuzzerPin, 1000);
BuzzerState = true;
}
//按钮按下时,若蜂鸣器已开启,则关闭
else
{
noTone(BuzzerPin);
BuzzerState = false;
}
delay(500);
}
}
//没地震时函数
void noEarthquake()
{
// 如果刚发生过地震,则关闭蜂鸣器
if (justQuake == true)
{
noTone(BuzzerPin);
justQuake = false;
}
if (digitalRead(ButtonPin) == HIGH)
{
// 按钮按下时,若蜂鸣器未开启,则开启
if (BuzzerState == false)
{
tone(BuzzerPin, 1000);
BuzzerState = true;
}
// 按钮按下时,若蜂鸣器已开启,则关闭
else
{
noTone(BuzzerPin);
BuzzerState = false;
}
delay(500);
}
}
//火焰检测与报警
void CheckFire(int FSval)
{
if (FSval > 51)
digitalWrite(FireLedPin, HIGH); //若检测到有火焰,消防灯亮起
else
digitalWrite(FireLedPin, LOW); //若没有检测到有火焰,消防灯关闭
}
5、总结
本项目是在比较理想的环境下完成的,且本人是新手,所以还有很多欠缺的地方。如地震报警模块,可以检查灯塔是否倾斜,但是地震是来回晃动的,布尔变量EarthquakeCome会因此来回变化。