大家好,又见面了,我是你们的朋友全栈君。
课程设计报告
设计目的:
居民对生活采光很重视,但现在的人们越来越“懒”,对智能化的要求越来越高。为了方便居民在白天把窗帘及时拉开,晚上把窗帘及时拉上,我们设计了光控窗帘。本设计硬件主要是光敏传感器,电机以及单片机;软件主要采用C语言进行编程。同时,为了考虑实际我们还额外加了一些手动装置,以防阴天和雨天等特殊天气。
硬件介绍:
arduino m2560r3单片机,光敏传感器模块(带宽电压LM393比较器的光敏传感器7.5元),电机驱动(HD74HC14P,ULN2003双芯片电机驱动器11元),led灯,步进电机28BYJ-48(5元),导线若干继电器模块(20元)。
对光的感应我们采用光敏传感器模块,驱动部分我们采用了步进电机,避免了一般电机要用额外电源带动的麻烦,同时为了方便用户,我们还加了两个led指示灯,电机转动拉开窗帘一个指示灯亮,当电机反向转动另一个灯亮。
设备通过光敏传感器的感知,对外界环境光线信号输入到单片机,通过单片机的控制,实现电机的自动开合。
软件设计
在软件设计上有三点,第一是单片机在感到光线变强时驱动电机正转或光线变暗时是驱动电机反转,第二是在驱动一段时间以后必须停下驱动来达到省电以及省设备的目的,第三就是合理控制电机转动时间来达到窗帘的合理拉合。以下是软件流程:
int Read=A0; //定义Read为A0口的值
int value =0; //给value赋初始值为0
int i,j=0;
intmotivate=0; //定义电机初始状态
void setup(){
pinMode(Read,INPUT); //定义Read为输入
pinMode(12, OUTPUT); //定义6个输出口,两个用于led指示灯,四个用于连接双芯片电机驱动器
pinMode(13, OUTPUT);
pinMode(24, OUTPUT);
pinMode(26, OUTPUT);
pinMode(28, OUTPUT);
pinMode(30, OUTPUT);
}
void loop()
{
value= digitalRead(Read); //读取A0口的值并赋值给value
if(LOW == value && motivate==0) //如果value值为0,电机为状态0
{
for(i=0;i<500;i ) //运行电机反转程序500次,
{
digitalWrite(24,LOW); //步进电机反转驱动四相:0011,1001,1100,0110
digitalWrite(26, LOW);
digitalWrite(28, HIGH);
digitalWrite(30, HIGH);
delay(2);
digitalWrite(24, HIGH);
digitalWrite(26, LOW);
digitalWrite(28, LOW);
digitalWrite(30, HIGH);
delay(2);
digitalWrite(24, HIGH);
digitalWrite(26, HIGH);
digitalWrite(28, LOW);
digitalWrite(30, LOW);
delay(2);
digitalWrite(24, LOW);
digitalWrite(26, HIGH);
digitalWrite(28, HIGH);
digitalWrite(30, LOW);
delay(2);
digitalWrite(12,HIGH); //点这led指示灯12
digitalWrite(13,LOW); //关闭led指示灯13
}
}
else
if(HIGH == value && motivate==0) //如果value值为1,电机为状态0
{
for(j=0;j<1000;j ) //运行电机正转程序1000次
{
digitalWrite(24,LOW); //电机正转程序四相:0110,1100,1001,0011
digitalWrite(26, HIGH);
digitalWrite(28, HIGH);
digitalWrite(30, LOW);
delay(2);
digitalWrite(24, HIGH);
digitalWrite(26, HIGH);
digitalWrite(28, LOW);
digitalWrite(30, LOW);
delay(2);
digitalWrite(24, HIGH);
digitalWrite(26, LOW);
digitalWrite(28, LOW);
digitalWrite(30, HIGH);
delay(2);
digitalWrite(24, LOW);
digitalWrite(26, LOW);
digitalWrite(28, HIGH);
digitalWrite(30,HIGH);
delay(2);
digitalWrite(12,LOW); //关闭led指示灯12
digitalWrite(13,HIGH); //点亮led指示灯13
}
}
if(value==digitalRead(Read)) //若valuew值与A0口值相等,
motivate=1; //则电机为状态1
else
motivate=0; //否则电机为状态0
}
应用
在实际应用中,应该根据窗帘的长度来调节电机每次驱动所转的转数来调节窗帘是否拉到底或开到底。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152468.html原文链接:https://javaforall.cn