本组设计的功能描述(含所有实现的模块的功能) |
基于小熊派的智慧农业案例
|
本组设计的主要特色 |
硬件方面:小熊派开发板+NB通信模块+智慧农业拓展模块。 软件模块:华为LiteOS+STM32L431RCT6 LiteOS 面向物联网的操作系统,具有轻量级、低功耗、互联互通等特性。 开发环境为IOT Studio。 小熊派开发板,面向物联网,扩展性强。 基本实现云端互通。 |
本组设计的体系结构 |
||||
|
本组设计中的关键模块流程图及程序实现说明 |
实验整体流程 设备开发与应用开发分双线进行,其中,设备开发在IOT studio上进行,以LiteOS为基础,将智慧农业扩展模块和LPWN的NB通信模块分别进行程序移植,并复制裸机驱动到LiteOS工程并将驱动文件的路径添加到makefile文件,初始化E53_IA1扩展板进行数据采集任务。 应用开发部分,先创建项目、在其中创建产品,定义profile,并在线开发编解码插件,等待设备端开发完毕,进行web端应用开发,将设备入云并进行调试,完善,至此完毕。 |
本组设计的软件程序模块说明与使用手册 |
设备开发部分: 智慧农业E53_IA1扩展板程序: E53_IA1扩展板中使用BH1750 光照强度传感器,SHT30温湿度传感器。 // 说 明:初始化BH1750函数Init_BH1750 void Init_BH1750(void) { uint8_t t_Data = 0x01; HAL_I2C_Master_Transmit(&hi2c1,BH1750_Addr,&t_Data,1,0xff); }
// 说 明:启动BH1750函数Start_BH1750 void Start_BH1750(void) { uint8_t t_Data = 0x10; HAL_I2C_Master_Transmit(&hi2c1,BH1750_Addr,&t_Data,1,0xff); }
// 说 明: 数值转换函数 float Convert_BH1750(void) { float result_lx; uint8_t BUF[2]; int result; Start_BH1750(); HAL_Delay(180); HAL_I2C_Master_Receive(&hi2c1, BH1750_Addr+1,BUF,2,0xff); result=BUF[0]; result=(result<<8)+BUF[1]; //Synthetic Digital Illumination Intensity Data result_lx=(float)(result/1.2); return result_lx; }
// 说 明: SHT30复位函数 void SHT30_reset(void) { uint8_t SHT3X_Resetcommand_Buffer[2]={0x30,0xA2}; //soft reset HAL_I2C_Master_Transmit(&hi2c1,SHT30_Addr<<1,SHT3X_Resetcommand_Buffer,2,0x10); HAL_Delay(15);
}
// 说 明: 初始化SHT30函数Init_SHT30 void Init_SHT30(void) { uint8_t SHT3X_Modecommand_Buffer[2]={0x22,0x36}; //periodic mode commands HAL_I2C_Master_Transmit(&hi2c1,SHT30_Addr<<1,SHT3X_Modecommand_Buffer,2,0x10); //send periodic mode commands
}
//检查数据正确性 uint8_t SHT3x_CheckCrc(char data[], char nbrOfBytes, char checksum) {
char crc = 0xFF; char bit = 0; char byteCtr ;
//calculates 8-Bit checksum with given polynomial for(byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr) { crc ^= (data[byteCtr]); for ( bit = 8; bit > 0; --bit) { if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL; else crc = (crc << 1); } }
if(crc != checksum) return 1; else return 0;
}
//温度计算函数名称: SHT3x_CalcTemperatureC //参数: u16sT:读取到的温度原始数据 float SHT3x_CalcTemperatureC(unsigned short u16sT) {
float temperatureC = 0; // variable for result
u16sT &= ~0x0003; // clear bits [1..0] (status bits) //-- calculate temperature [℃] -- temperatureC = (175 * (float)u16sT / 65535 - 45); //T = -45 + 175 * rawValue / (2^16-1)
return temperatureC;
}
//湿度计算函数: SHT3x_CalcRH //参 数: u16sRH:读取到的湿度原始数据 // 返 回 值: 计算后的湿度数据 float SHT3x_CalcRH(unsigned short u16sRH) {
float humidityRH = 0; // variable for result
u16sRH &= ~0x0003; // clear bits [1..0] (status bits) //-- calculate relative humidity [%RH] -- humidityRH = (100 * (float)u16sRH / 65535); // RH = rawValue / (2^16-1) * 10
return humidityRH;
}
// 初始化Init_E53_IA1的马达 void Init_Motor(void) { GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */ IA1_Motor_GPIO_CLK_ENABLE();
/*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = IA1_Motor_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(IA1_Motor_GPIO_Port, &GPIO_InitStruct); }
//初始化Init_E53_IA1的补光灯 void Init_Light(void) { GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */ IA1_Light_GPIO_CLK_ENABLE();
/*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin : PtPin */ GPIO_InitStruct.Pin = IA1_Light_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(IA1_Light_GPIO_Port, &GPIO_InitStruct); }
//扩展板初始化Init_E53_IA1 void Init_E53_IA1(void) { MX_I2C1_Init(); Init_BH1750(); Init_SHT30(); Init_Motor(); Init_Light(); } 扩展板驱动程序: static void timer1_callback(void *arg)//LCD显示器模块 { qr_code = !qr_code; LCD_Clear(WHITE); if (qr_code == 1) LCD_Show_Image(0,0,240,239,gImage_Huawei_IoT_QR_Code); else { POINT_COLOR = RED; LCD_ShowString(40, 10, 200, 16, 24, "IoTCluB BearPi"); LCD_ShowString(15, 50, 210, 16, 24, "LiteOS NB-IoT Test"); LCD_ShowString(10, 100, 200, 16, 16, "NCDP_IP:"); LCD_ShowString(80, 100, 200, 16, 16, cn_app_server); LCD_ShowString(10, 150, 200, 16, 16, "NCDP_PORT:"); LCD_ShowString(100, 150, 200, 16, 16, cn_app_port); } }
//消息处理函数 static int app_msg_deal(void *usr_data, en_oc_lwm2m_msg_t type, void *data, int len) { unsigned char *msg; msg = data; int ret = -1;
if(len <= cn_app_rcv_buf_len) { if (msg[0] == 0xaa && msg[1] == 0xaa) { printf("OC respond message received! \n\r"); return ret; } memcpy(s_rcv_buffer,msg,len); s_rcv_datalen = len;
osal_semp_post(s_rcv_sync);
ret = 0;
} return ret; }
驱动程序主函数 //任务管理与创建 int standard_app_demo_main() { osal_semp_create(&s_rcv_sync,1,0);
osal_task_create("app_collect",app_collect_task_entry,NULL,0x400,NULL,3); osal_task_create("app_report",app_report_task_entry,NULL,0x1000,NULL,2); osal_task_create("app_command",app_cmd_task_entry,NULL,0x1000,NULL,3);
stimer_create("lcdtimer",timer1_callback,NULL,8*1000,cn_stimer_flag_start);
return 0; }
添加驱动程序到路径,LiteOS 的整个项目工程使用 make 构建,完成驱动程序后,需要添加驱动文件的路径到 makefile 中,加入工程编译,就完成了驱动的移植。
配置 CONFIG_USER_DEMO 宏定义,将扩展板程序添加到makefile中进行编译,在工程根目录下的
至此,编译、链接并将程序烧录至开发板,完成设备端开发。
云端开发流程:
应用开发部分: 产品创建,定义profile:
在线创建插件程序
在线调试设备:
设备运行情况检测:
设置设备运行规则,云端数据监测,自动发送消息:
串口助手实时显示数据发送
以Motor_ON为例:
手动发送指令到终端:
|
本组设计主要测试结果与性能分析 |
云端界面展示 |
课程设计总结(包括设计的总结和还需改进的内容)
|
基于小熊派的智慧农业案例总结: 实验中,主要参考小熊派的智慧农业开发案例,基本实现了智慧农业的智能感知、可靠传输、实现了云端的数据可视化、同时可以手动控制终端设备(电机和补光灯)的允许,或者通过设置相应的设备规则,从而实现环境温度、光照的自动调节。
实验不足与改进:
|