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));
}
}
}
}