嵌入式开发——基于小熊派的智慧农业案例(二)

 

本组设计的功能描述(含所有实现的模块的功能)

基于小熊派的智慧农业案例

  1. 实时监测环境中温湿度变化及光照变化
  2. 通过NB—IOT通信,将数据传至云端,实现云端实时检测。
  3. 通过控制电机和补光灯的启动条件,实现所需环境要求的动态调节。

 

本组设计的主要特色

硬件方面:小熊派开发板+NB通信模块+智慧农业拓展模块。

软件模块:华为LiteOS+STM32L431RCT6

LiteOS 面向物联网的操作系统,具有轻量级、低功耗、互联互通等特性。

开发环境为IOT Studio。

小熊派开发板,面向物联网,扩展性强。

基本实现云端互通。

 

 

本组设计的体系结构

 

云端系统实时检测

Web应用

   

STM32L431RCT6+LiteOS

 

NB通信扩展板NB35—A

 

智慧农业扩展板

E53_IA1

 

 

 

本组设计中的关键模块流程图及程序实现说明

 

实验整体流程

设备开发与应用开发分双线进行,其中,设备开发在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中进行编译,在工程根目录下的.sdkconfig文件中的末尾即可配置:

 

至此,编译、链接并将程序烧录至开发板,完成设备端开发。

 

 

 

 

 

 

 

云端开发流程:

 

 

 

 

 

 

 

 

应用开发部分:

产品创建,定义profile:

 

 

 

 

 

 

 

 

 

 

在线创建插件程序

 

 

在线调试设备:

 

 

 

 

 

 

 

 

 

 

 

 

 

设备运行情况检测:

 

 

 

设置设备运行规则,云端数据监测,自动发送消息:

 

串口助手实时显示数据发送

 

 

 

 

 

 

以Motor_ON为例:

 

 

手动发送指令到终端:

 

 

 

 

 

本组设计主要测试结果与性能分析

 

 

云端界面展示

课程设计总结(包括设计的总结和还需改进的内容)

 

基于小熊派的智慧农业案例总结:

实验中,主要参考小熊派的智慧农业开发案例,基本实现了智慧农业的智能感知、可靠传输、实现了云端的数据可视化、同时可以手动控制终端设备(电机和补光灯)的允许,或者通过设置相应的设备规则,从而实现环境温度、光照的自动调节。

  1. 就整体完成情况而言,以Lite OS为基础,基本实现了嵌入式系统的各个环节。
  2. 2、在LiteOS操作系统的基础上,实现了感知层的智能感知,传输层的NB通信,以华为云平台作为应用层服务,实现云端数据的实时监测,远程控制。
  3. 通过设置在应用端设置设备规则,可将设备启动控制在特定条件下温度大于一定值,则电机启动,否则电机关闭;设定补光灯在光照小于一定值时,补光灯开启,提高光照,从而实现设备的智能化控制。

 

 

 

实验不足与改进:

  1. 实验中数据发送与接受到云端的延时相对较大,一般无法立即观察到数据的实时显示,即便是手动和自动控制设备(电机和补光灯),仍然会有较大延时,但是通过串口发送到数据显示,数据确实是按照程序中要求的实时发送。
  2. 多次实验发现,只有在复位开发板之后,数据才能通过NB通信,发送到云端,但是最多只能持续很短时间的实时发送,可以在云端实时显示温湿度及光照的变化,之后大概就好像中断了,数据就不能传送到云端了。但是通过串口发送的数据显示,数据仍然在实时发送,这一点未能解决。
  3. 本次实验主要参考了小熊派的智慧农业案例,华为物联网系列的相关课程,在掌握嵌入式开发理论的基础上,验证实现了相关实验,这次的课设并没有实质性的扩展,这确实是不足。望老师见谅。

猜你喜欢

转载自blog.csdn.net/qq_42194332/article/details/106171829
今日推荐