一、实验目的
利用Arduino模拟灯塔:
- 光照与时间
- 模拟早上7点,天亮则关灯,天暗则开灯;
- 模拟晚上7点,天亮则灯暗,天暗则开灯。
- 地震报警
- 倾斜角大于10度时,蜂鸣器响起;
- 倾斜角为0时,蜂鸣器停下;
- 设置报警开关,优先级最高可打开/关闭报警器。
- 火灾报警
- 当火焰靠近时,蜂鸣器响起;
- 火焰离开,报警停止。
二、实验器件
Arduino开发板、面包板一块、220欧电阻2个、10k电阻(用于按键)、按键、LED灯、有源蜂鸣器、倾斜传感器、火焰传感器、光敏电阻模块各一个以及若干根杜邦线。
三、项目实现
1.光照与时间
(1)利用millis()获取系统时间,模拟早上、晚上7点。
void Time() /*利用millis()模拟早上7点以及晚上7点*/
{
now_time = millis();
if (now_time - last_time >= one_minute)
/*现在获取的系统时间与上一次获取的相差60s以上,则增加一分钟*/
{
last_time = last_time + one_minute;
minute++;
}
if (minute >= 60) /*大于六十分钟,增加一小时,分钟归零*/
{
hour++;
minute = 0;
}
if (hour == 24) /*等于24小时,经过一天,hour以及minute都归零,重新计算*/
{
hour = 0;
minute = 0;
}
}
(2)实现光照和时间控制LED灯
void light(int light_val)
{
Time(); /*获取当前时间*/
if (hour == 7) /*早上7点*/
{
Serial.println("7点了");
if (light_val / 4 <= 50) /*天暗,灯亮*/
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW); /*天亮,灯暗*/
}
}
else if (hour == 19) /*晚上7点*/
{
Serial.println("晚上7点了");
if (light_val / 4 <= 50) /*天暗,灯亮*/
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW); /*天亮,灯暗*/
}
}
}
2.地震报警
(1)获取倾斜角度
tilt_val = analogRead(tiltPin);
angle = (tilt_val / 1023.0) * 180.0; /*倾斜角度=(倾斜传感器获取模拟值/1023)*180度*/
Serial.println(angle);
(2)按钮控制报警器
void Button_state()
{
if (digitalRead(button) == LOW)
{
buzzer_state = !buzzer_state; /*改变蜂鸣器状态*/
}
}
(3)实现地震报警功能
void Eq_alarm(float angle)
{
if (angle > 10)
{
buzzer_state = HIGH;
}
else if (angle == 0)
{
buzzer_state = LOW;
}
Button_state();
digitalWrite(buzzerPin, buzzer_state);
}
3.火灾报警
void Fire_alarm()
{
int fire_val = analogRead(fire);
if (fire_val > 50)
{
digitalWrite(buzzerPin, HIGH);
Serial.println("着火了!");
}
}
4.总代码
int one_minute = 60000; //一分钟时间
int buzzerPin = 6;
int ledPin = 13;
int fire = A5;
int photoresistors = A0;
int tiltPin = A2;
int button = 11;
int tilt_val = 0; //初始化倾斜传感器模拟值为0
int light_val = 0; //初始化光敏电阻模拟值为0
float angle = 0; //初始化倾斜角度为0
int now_time = 0; //现在系统时间
int last_time = 0; //上次获取系统时间
int minute = 0; //初始化分钟为0
int hour = 0; //初始化为0时
int buzzer_state = LOW; //初始化蜂鸣器状态为低电平
void Eq_alarm(float angle);
void Button_state();
void light(int light_val);
void Time();
void Fire_alarm();
void setup() {
// put your setup code here, to run once:
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(button, INPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
tilt_val = analogRead(tiltPin);
angle = (tilt_val / 1023.0) * 180.0; /*倾斜角度=(倾斜传感器获取模拟值/1023)*180度*/
Serial.println(angle);
Eq_alarm(angle);
light_val = analogRead(photoresistors);
light(light_val);
Fire_alarm();
}
void Eq_alarm(float angle)
{
if (angle > 10) /*倾斜角大于10度,蜂鸣器响*/
{
buzzer_state = HIGH;
}
else if (angle == 0) /*倾斜角小于10度,蜂鸣器停*/
{
buzzer_state = LOW;
}
Button_state();
digitalWrite(buzzerPin, buzzer_state);
}
void Button_state()
{
if (digitalRead(button) == LOW)
{
buzzer_state = !buzzer_state; /*改变蜂鸣器状态*/
}
}
void light(int light_val)
{
Time(); /*获取当前时间*/
if (hour == 7) /*早上7点*/
{
Serial.println("7点了");
if (light_val / 4 <= 50) /*天暗,灯亮*/
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW); /*天亮,灯暗*/
}
}
else if (hour == 19) /*晚上7点*/
{
Serial.println("晚上7点了");
if (light_val / 4 <= 50) /*天暗,灯亮*/
{
digitalWrite(ledPin, HIGH);
}
else
{
digitalWrite(ledPin, LOW); /*天亮,灯暗*/
}
}
}
void Time() /*利用millis()模拟早上7点以及晚上7点*/
{
now_time = millis();
if (now_time - last_time >= one_minute)
/*现在获取的系统时间与上一次获取的相差60以上,则增加一分钟*/
{
last_time = last_time + one_minute;
minute++;
}
if (minute >= 60) /*大于六十分钟,增加一小时,分钟归零*/
{
hour++;
minute = 0;
}
if (hour == 24) /*等于24小时,经过一天,hour以及minute都归零,重新计算*/
{
hour = 0;
minute = 0;
}
}
void Fire_alarm()
{
int fire_val = analogRead(fire);
if (fire_val > 50)
{
digitalWrite(buzzerPin, HIGH);
Serial.println("着火了!");
}
}
四、实验接线
(仿真软件中,无倾斜传感器及火焰传感器,假设热敏电阻器模块为倾斜传感器模块,LED灯假设为火焰传感器,倾斜传感器模块以及火焰传感器接线与对应的假设组件接线相同。)
五、总结
在该实验接线中,我们需注意,按键使用的是10K电阻,且接线时需注意LED灯以及火焰传感器的正负极,以防止接反。在写模拟时间的程序时,如果当前所获取的系统时间(now_time)与上一次所获取的时间(last_time)之间的差要大于一分钟的话,需注意,此时增加一分钟,并且last_time应为last_time+60,而不能够直接是等于now_time。