2025-06

主题:感应节能灯(四级)

器件

Atmega328P主控板1块,红外接收套件1套,LED模块1个,光敏电阻模块1个,超声波传感器模块1个。以上模块也可使用分立器件结合面包板搭建。

任务要求:

感应节能灯实现的功能是当光线较暗时,如有行人通过,LED灯点亮。感应节能灯有三种工作模式:常开、常闭、自动感应。装置通过光敏电阻检测环境光的亮度,使用手不同程度地遮挡光敏电阻来模拟环境光亮度的变化;通过超声波传感器检测是否有行人通过,当超声波检测的距离在5~10厘米范围时,表示有行人通过。

具体要求如下:

(1)点击红外遥控器的1键,感应节能灯进入常开状态,此时LED灯保持常亮;

(2)点击红外遥控器的2键,感应节能灯进入常闭状态,此时LED灯保持熄灭;

(3)点击红外遥控器的3键,感应节能灯进入自动感应状态;

(4)进入自动感应后,当没有行人通过时,LED灯保持熄灭;

(5)进入自动感应后,当光敏电阻的返回值小于600(阈值可自行设定)时,表明是白天,此时如有人通过,LED灯保持熄灭;

(6)进入自动感应后,当光敏电阻的返回值不小于600时,此时有人通过,LED灯需要点亮,LED灯的亮度随着环境光的变暗而增加,当环境光达到最暗时,LED灯达到最亮;

(7)未作规定处可自行处理,无明显与事实违背即可。

说明

请考生在考试结束前,按照如下要求提交相关文件。

(1) 将程序放在一个文件夹中,压缩为1个“rar或zip”格式文件,并命名为:DJKS4_身份证号,大小5M以下;

(2) 将程序文件通过“上传附件”按钮进行上传;

(3) 程序编写过程中不得打开其它示例程序,不得使用图形化软件生成代码,如发现,实操成绩按照0分处理。

评分项

1.器件及器件连接(20分)

2.功能实现(80分)

(1)实现点击红外遥控器1键,感应节能灯进入常开状态,此时LED灯保持常亮;(10分)

(2)实现点击红外遥控器2键,感应节能灯进入常闭状态,此时LED灯保持熄灭;(10分)

(3)实现感应节能灯进入自动感应状态后,当光敏电阻模块没有遮挡时(表明是白天),LED灯保持熄灭状态;(5分)

(4)实现感应节能灯进入自动感应状态后,当光敏电阻模块没有遮挡时(表明是白天),当有行人通过时,LED灯保持熄灭状态;(10分)

(5)实现感应节能灯进入自动感应状态后,当光敏电阻模块有遮挡时(表明天色变暗),没有行人通过时,LED灯保持熄灭状态;(10分)

(6)实现感应节能灯进入自动感应状态后,当光敏电阻模块有遮挡时(表明天色变暗),有行人通过时,LED灯点亮;(15分)

(7)实现感应节能灯进入自动感应状态后,当LED灯点亮时,LED灯的亮度随着环境光的变暗而增加亮度;(15分)

(8)实现感应节能灯进入自动感应状态后,当环境光最暗时,LED灯的亮度达到最亮。(5分)

(9)实现感应节能灯进入自动感应状态后,当环境光最暗时,LED灯的亮度达到最亮。(5分)

程序参考

器件 引脚
遥控器接收头 A0
LED 10
光敏电阻 A1
超声波T 8
超声波E 9
#include <IRremote.h>//安装IRremote库,版本号3.7.1

int cm()
{
    pinMode(8, OUTPUT); 
    pinMode(9, INPUT);  
    digitalWrite(8, 0);
    delayMicroseconds(2);
    digitalWrite(8, 1);
    delayMicroseconds(10);
    digitalWrite(8, 0);
    int s = pulseIn(9, 1) / 58.0;
    return s;
}

const String IR_PROTOCOL_TYPE[] = {
    "UNKNOWN",
    "PULSE_DISTANCE",
    "PULSE_WIDTH",
    "DENON",
    "DISH",
    "JVC",
    "LG",
    "LG2",
    "NEC",
    "PANASONIC",
    "KASEIKYO",
    "KASEIKYO_JVC",
    "KASEIKYO_DENON",
    "KASEIKYO_SHARP",
    "KASEIKYO_MITSUBISHI",
    "RC5",
    "RC6",
    "SAMSUNG",
    "SHARP",
    "SONY",
    "ONKYO",
    "APPLE",
    "BOSEWAVE",
    "LEGO_PF",
    "MAGIQUEST",
    "WHYNTER"};
IRrecv irrecv(A0); // 接收头引脚号

int f = -1;
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(10,OUTPUT);
  pinMode(A1,INPUT);
}

void loop()
{
  if (irrecv.decode())
  {
    struct IRData *pIrData = &irrecv.decodedIRData;
    long ir_item = pIrData->decodedRawData;
    String irProtocol = IR_PROTOCOL_TYPE[pIrData->protocol];
    Serial.print("IR TYPE:" + irProtocol + "\tVALUE:");
    Serial.println(ir_item, HEX);
    irrecv.resume();
    Serial.println(ir_item, HEX);
    //以下的分支结构为按键编码,按几号按键就把赋值为几
    if (ir_item == 0xE916FF00)
    {
      f = 0;
    }
    else if (ir_item == 0xf30cff00)
    {
      f = 1;
    }
    else if (ir_item == 0xe718ff00)
    {
      f = 2;
    }
    else if (ir_item == 0xA15EFF00)
    {
      f = 3;
    }
  }
  //以下分支结构为按对应按键时循环执行什么内容
  if (f == 0)
  {
    ;
  }
  else if (f == 1)
  {
    digitalWrite(10,1);
  }
  else if (f == 2)
  {
    digitalWrite(10,0);
  }
  else if (f == 3)
  {
    int s=cm();
    Serial.print(s);
    Serial.println("cm");
    Serial.print("A1-");
    Serial.println(analogRead(A1));
    delay(500);
    if(s>=5 and s<=10){
      if(analogRead(A1)<600){
        digitalWrite(10,0);
      }
      else{
        analogWrite(10,map(analogRead(A1),600,1023,0,255));
      }
    }
  }
}