-模拟灯塔

一、实验目的

利用Arduino模拟灯塔:

  • 光照与时间
  1. 模拟早上7点,天亮则关灯,天暗则开灯;
  2. 模拟晚上7点,天亮则灯暗,天暗则开灯。
  • 地震报警
  1. 倾斜角大于10度时,蜂鸣器响起;
  2. 倾斜角为0时,蜂鸣器停下;
  3. 设置报警开关,优先级最高可打开/关闭报警器。
  • 火灾报警
  1. 当火焰靠近时,蜂鸣器响起;
  2. 火焰离开,报警停止。

二、实验器件

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。

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值