arduino实验2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
集美大学计算机工程学院实验报告
课程名称:嵌入式系统应用班级:实验成绩:
指导教师:黄斌姓名:
实验项目名称:学号:上机实践日期:
10.23
实验项目编号:02组号:上机实践时间:5-6
一、目的(本次实验所涉及并要求掌握的知识点)
a) 掌握嵌入式软件设计中的状态机和循环缓冲器
二、实验内容与设计思想(设计思路、主要数据结构、主要代码结构、主要代码段分析)
a) 利用状态机完成一个简单的嵌入式设计。你的设计必须有一定的现实意义,生活中有许多基于状态机的设计,比如智能台灯、儿童玩具等等。(如果你没有足够的元器件完成你的设计,你可以使用LED 模拟输出,数字输入引脚的高低电平信号来模拟输入。当然,你需要在报告里描述清楚你的设计。)
智能台灯,通过光照传感器来识别环境亮度,判断亮度是否足够。再通过声音传感器,来判断是否需要点亮台灯。
设计三种状态来实现,状态1:晚上状态。状态2:亮灯状态。状态3:灭灯状态。
#define DAYTIME 0
#define NIGHT 1
#define LIGHTING 2
#define DARK 3
unsigned long tttime;//计时器计时
unsigned int state = DAYTIME; //状态机状态
int light_sensor = 2; // 光照传感器引脚
bool light = 0; // 光照传感器读数
int belt_sensor = 3; // 声音传感器引脚
bool belt = 0; //声音传感器读数
int led = 4; //LED 灯引脚
void setup() {
Serial.begin(9600);
pinMode(light_sensor, INPUT);
pinMode(belt_sensor, INPUT);
pinMode(led, OUTPUT);
}
void loop() {
light = digitalRead(light_sensor);
belt = digitalRead(belt_sensor);
digitalWrite(led, LOW);
switch (state) {
case DAYTIME: //输出状态
Serial.println("State:DAYTIME");
if (light) {
state = NIGHT;
tttime = millis(); //读取时间戳
}
break;
case NIGHT: //如果无光判断为晚上
Serial.println("State:NIGHT");
if (belt) {
state = LIGHTING;
}
else {
state = DARK;
} break;
case LIGHTING: //如果是晚上,有声音的情况下,亮灯,延迟关闭Serial.println("State:LIGHTING");
digitalWrite(led, HIGH);
if (!light)
state = DAYTIME;
else if (millis() - tttime > 10000) {
state = NIGHT;
tttime = millis();
} break;
case DARK: //如果是晚上的时候,亮灯超时
Serial.println("State:DARK");
if (belt)
state = LIGHTING;
else if
(!light)
state = DAYTIME;
break;
default:
Serial.println("State:UNKNOWN");
break;
}
delay(1000);
}
三、实验现象及结果分析(实验步骤、测试方法、实验效果截图、测试结果分析)
a)无光线之后,从白天转换为晚上状态。判断是否有声音,转换为亮灯状态或者灭灯状态。亮灯状态时10秒判断一次是否还有声音。
b) 在亮灯状态时,若无声音时变成灭灯状态
四、实验小结(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验体会和收获)
通过状态机可以很简单的控制装置的状态。但如果状态转换不正确很容易形成死循环,这点需要注意。