#物联网征文# 基于物联网节点的智能晾衣杆设计 原创 精华
DS小龙哥
发布于 2022-8-10 09:25
浏览
2收藏
axisFormat %m/%d
title 智能晾衣杆开发流程
section 市场调研
需求分析 :a1, 2016-06-22, 5d
概念验证 : 5d
section 项目开发
概要设计 :2016-07-05 , 5d
详细设计 :2016-07-08, 10d
编码 :2016-07-15, 10d
测试 :2016-07-22, 5d
section 最终测试
发布: 2d
验收: 3d
1. 功能说明
智能晾衣杆在现在的装修里已经不再稀奇,很多家庭新装修的房子都安装了类似的晾衣杆。 可以根据下雨,晴天,自动伸缩。并且通过ZigBee节点将晾衣杆与家里的控制中心连在一起。用户在外地也可以通过手机APP远程操作家里的晾衣杆,根据传感器了解外面的环境温度,湿度。当前设计的晾衣杆支持语音控制、手动控制,温度检测,湿度检测。 利用步进电机完成晾衣杆的操作,利用离线语音模块识别语音控制指令,采用DHT11采集环境温度湿度。
2. 硬件介绍
2.1 CC2530开发板
2.2 雨滴传感器
2.3 步进电机
2.4 MR-LD3320语音识别模块
3. 源代码
3.1 雨滴传感器数据采集
/*===================ADC初始化函数====================*/
void Init_ADC0()
{
P0SEL |= 0x01; //P0_0端口设置为外设功能
P0DIR &= ~0x01; //P0_0端口设置为输入端口
APCFG |= 0x01; //P0_0作为模拟I/O使用
}
/*===================读取ADC的数据====================*/
u16 Get_ADC0_Value()
{
//存放采集的ADC数据
u16 adc_dat=0;
u8 dat[2];
ADCIF = 0;
//参考电压选择AVDD5引脚,256抽取率,AIN0通道0
ADCCON3 = (0x80 | 0x10 | 0x00);
while(!ADCIF); //等待A/D转换完成,
dat[0]= ADCL; //读取ADC数据低位寄存器
dat[1]= ADCH; //读取ADC数据高位寄存器
adc_dat=dat[1]<<8|dat[0];
return adc_dat;
}
// P0.6
void Init_ADC6(void)
{
APCFG |=1<<6; //PCFG[7:0]选择P0.7- P0.0作为模拟I/O
P0SEL |= 0x01;
P0DIR &= ~0x01;
P0SEL |= (1<<6); //P0_6端口设置为外设功能
P0DIR &= ~(1<<6); //P0_6端口设置为输入端口
APCFG |= 1<<6; //P0_6作为模拟I/O使用
}
//读取光敏传感器的值 P0.6
u16 Get_ADC6_Value( void )
{
u16 reading = 0;
/* Enable channel */
ADCCFG |= 0x40;
/* writing to this register starts the extra conversion */
ADCCON3 = 0x86;// AVDD5 引脚 00: 64 抽取率(7 位ENOB) 0110: AIN6
/* Wait for the conversion to be done */
while (!(ADCCON1 & 0x80));
/* Disable channel after done conversion */
ADCCFG &= (0x40 ^ 0xFF); //按位异或。如1010^1111=0101(二进制)
/* Read the result */
reading = ADCL;
reading |= (u16) (ADCH << 8);
reading >>= 8;
return (reading);
}
3.2 步进电机控制代码
typedef unsigned char uchar;
typedef unsigned int uint;
#define A1 P0_4 //定义步进电机连接端口
#define B1 P0_5
#define C1 P0_6
#define D1 P0_7
uchar phasecw[4] ={0x80,0x40,0x20,0x10};//正转 电机导通相序 D-C-B-A
uchar phaseccw[4]={0x10,0x20,0x40,0x80};//反转 电机导通相序 A-B-C-D
void MotorData(uchar data)
{
A1 = 1&(data>>4);
B1 = 1&(data>>5);
C1 = 1&(data>>6);
D1 = 1&(data>>7);
}
//ms延时函数
void Delay_MS(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<535;j++);
}
//顺时针转动
void MotorCW(uchar Speed)
{
uchar i;
for(i=0;i<4;i++)
{
MotorData(phasecw[i]);
Delay_MS(Speed);//转速调节
}
}
//逆时针转动
void MotorCCW(uchar Speed)
{
uchar i;
for(i=0;i<4;i++)
{
MotorData(phaseccw[i]);
Delay_MS(Speed);//转速调节
}
}
//停止转动
void MotorStop(void)
{
MotorData(0x00);
}
void InitIO(void)
{
P0SEL &= 0x0F; //P04 05 06 07定义为普通IO
P0DIR |= 0xF0; //P04 05 06 07定义为输出
}
3.3 串口初始化-接收语音识别指令
uint lenU1 = 0;
uchar tempRXU1;
#define MAXCHAR 81
uchar RecdataU1[MAXCHAR];
unsigned char dataRecv;
unsigned char Flag = 0;
void clearBuffU1(void)
{
int j;
for(j=0;j<MAXCHAR;j++)
{
RecdataU1[j]=0x00;
}
lenU1=0;
}
/*
函数功能:串口0初始化
*/
void Init_Uart00(void)
{
PERCFG&=~(1<<0); //串口0的引脚映射到位置1,即P0_2和P0_3 RX0 --- P0_2 TX0 --- P0_3
P0SEL|=0x3<<2; //将P0_2和P0_3端口设置成外设功能
U0BAUD = 59; //32MHz的系统时钟产生9600BPS的波特率
U0GCR&=~(0x1F<<0);//清空波特率指数
U0GCR|=8<<0; //32MHz的系统时钟产生9600BPS的波特率
U0UCR |= 0x80; //禁止流控,8位数据,清除缓冲器
U0CSR |= 0x3<<6; //选择UART模式,使能接收器
UTX0IF = 0; //清除TX发送中断标志
URX0IF = 0; //清除RX接收中断标志
URX0IE = 1; //使能URAT0的接收中断
EA = 1; //使能总中断
}
/*================UR0接收中断服务函数================*/
#pragma vector = URX0_VECTOR
__interrupt void UART0_RecvInterrupt()
{
URX0IF = 0; //清除RX接收中断标志
dataRecv = U0DBUF; //将数据从接收缓冲区读出
if(lenU1<81)
{
RecdataU1[lenU1]=dataRecv;
lenU1++;
}
//U0DBUF = dataRecv; //将要发送的1字节数据写入U0DBUF
//while(UTX0IF == 0);//等待数据发送完成
//UTX0IF = 0; //清除发送完成标志,准备下一次发送
}
【本文正在参加物联网有奖征文活动】,活动链接: https://ost.51cto.com/posts/14758
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
赞
3
收藏 2
回复
相关推荐
好奇楼主的成品会是啥样的。
如果感应到雨滴再收会不会太晚了?