4950浏览
查看: 4950|回复: 0

[2019参赛作品] 【脑洞大赛】基于NB-IoT的智慧路灯监控系统(硬件开发)

[复制链接]
    本节将进行嵌入式硬件编程开发,通过电能检测模块实现实时采集路灯节点电压、电流、功率、总耗电量、功率因子、路灯开关状态、耗能产生二氧化碳、光照度、路灯亮度、环境光照度、GPS位置11种传感数据,通过NB-IoT模组实现对华为云物联网平台数据上传及下发获取,达到联动控制效果。
    1、开发软件
    嵌入式硬件开发使用STM32CubeMX和Keil5实现,STM32CubeMX搭建NUCLEO-L432KC开发板GPIO底层配置,Keil5实现NUCLEO-L432KC开发板编程开发。
    STM32CubeMX 是 ST 意法半导体近几年来大力推荐的STM32 芯片图形化配置工具,也是配置和初始化 C 代码生成器(STM32 configuration and initialization C code generation),也就是自动生成开发初期关于芯片相关的一些初始化代码。STM32CubeMX 包含了 STM32 所有系列的芯片,包含示例和样本(Examples and demos)、中间组件(Middleware Components)、硬件抽象层(Hardwaree abstraction layer)。
    STM32CubeMX简介、下载及安装参见:https://blog.csdn.net/m0_38106923/article/details/89458297   
    Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
    Keil5简介、下载、安装及破解参见:https://blog.csdn.net/m0_38106923/article/details/89492257
    2、STM32CubeMX底层环境搭建
    使用STM32CubeMX搭建NUCLEO-L432KC开发板GPIO底层配置,主要配置微控制器晶振、定时器PWM接口UART1、UART2ADC接口LED状态指示灯接口,具体实现如下:
【脑洞大赛】基于NB-IoT的智慧路灯监控系统(硬件开发)图1
    3、Keil5编写控制模块实现代码
    在Keil5开发环境中需要编写硬件基础底层配置功能、电能电耗检测功能、GPS定位功能、环境光照检测功能、NB-IoT模组通信功能和云端交互功能。
    NB-IoT模组配置实现代码如下:
[mw_shl_code=c,true]void BC20_LWM2M_Init()
{
    HAL_UART_Transmit(&huart2,(uint8_t *)"AT+QGNSSC=1\r\n",13,0xff);
    HAL_Delay(1000);        
    HAL_UART_Transmit(&huart2,(uint8_t *)"AT+QGNSSAGPS=1\r\n",16,0xff);
    HAL_Delay(1000);        
    HAL_UART_Transmit(&huart2,(uint8_t *)"AT+QLWSERV=\"49.4.85.232\",5683\r\n",31,0xff);  
    HAL_Delay(1000);
    HAL_UART_Transmit(&huart2,(uint8_t *)"AT+QLWCONF=\"862*************\"\r\n",30,0xff);  
    HAL_Delay(1000);
    HAL_UART_Transmit(&huart2,(uint8_t *)"AT+QLWADDOBJ=19,0,1,\"0\"\r\n",25,0xff);  
    HAL_Delay(1000);
    HAL_UART_Transmit(&huart2,(uint8_t *)"AT+QLWOPEN=0\r\n",14,0xff);  
    HAL_Delay(1000);
    HAL_UART_Transmit(&huart2,(uint8_t *)"AT+QLWCFG=\"dataformat\",1,1\r\n",28,0xff);  
    HAL_Delay(1000);
    memset(usart2_rec_buffer,0,usart2_rcv_len);        
    usart2_rcv_len = 0;
}[/mw_shl_code]
    电能电耗监测功能实现代码如下:
[mw_shl_code=c,true]void get_electric_energy()
{
    int num=0;
    HAL_Delay(1000);
    char buf[8]={0x01,0x03,0x00,0x48,0x00,0x0A,0x45,0xDB};  
    HAL_UART_Transmit(&huart1,(uint8_t *)buf,8,0xff);
    HAL_Delay(2000);
    num=usart1_rec_buffer[3]*256+usart1_rec_buffer[4];
    Sensor.Voltage[0]=num/10000+'0';
    Sensor.Voltage[1]=num/1000%10+'0';
    Sensor.Voltage[2]=num/100%10+'0';
    Sensor.Voltage[3]='.';
    Sensor.Voltage[4]=num/10%10+'0';
    Sensor.Voltage[5]=num%10+'0';
    num=0;
    num=usart1_rec_buffer[5]*256+usart1_rec_buffer[6];
    Sensor.Electric_current[0]=num/100+'0';
    Sensor.Electric_current[1]='.';
    Sensor.Electric_current[2]=num/10%10+'0';
    Sensor.Electric_current[3]=num%10+'0';
    num=0;
    num=usart1_rec_buffer[7]*256+usart1_rec_buffer[8];
    Sensor.Power[0]=num/10+'0';
    Sensor.Power[1]=num%10+'0';
    num=0;
    num=usart1_rec_buffer[9]*256*256*256+usart1_rec_buffer[10]*256*256+usart1_rec_buffer[11]*256+usart1_rec_buffer[12];
    Sensor.Power_consumption[0]=num/100+'0';
    Sensor.Power_consumption[1]='.';
    Sensor.Power_consumption[2]=num/10%10+'0';
    Sensor.Power_consumption[3]=num%10+'0';
    num=0;
    num=usart1_rec_buffer[13]*256+usart1_rec_buffer[14];
    Sensor.Power_factor[0]='0';
    Sensor.Power_factor[1]='.';
    Sensor.Power_factor[2]=num/100+'0';
    Sensor.Power_factor[3]=num/10%10+'0';
    Sensor.Power_factor[4]=num%10+'0';
    num=0;
    Sensor.LED_flag[0]=usart1_rec_buffer[16]+'0';
    num=usart1_rec_buffer[17]*256*256*256+usart1_rec_buffer[18]*256*256+usart1_rec_buffer[19]*256+usart1_rec_buffer[20];
    Sensor.Carbon_dioxide[0]=num/1000+'0';
    Sensor.Carbon_dioxide[1]='.';
    Sensor.Carbon_dioxide[2]=num/100%10+'0';
    Sensor.Carbon_dioxide[3]=num/10%10+'0';
    Sensor.Carbon_dioxide[4]=num%10+'0';
    num=0;
    num=usart1_rec_buffer[21]*256+usart1_rec_buffer[22];
    Sensor.Frequency[0]=num/1000+'0';
    Sensor.Frequency[1]=num/100%10+'0';
    Sensor.Frequency[2]='.';
    Sensor.Frequency[3]=num/10%10+'0';
    Sensor.Frequency[4]=num%10+'0';
    num=0;               
    memset(usart1_rec_buffer,0,usart1_rcv_len);        
    usart1_rcv_len = 0;
}[/mw_shl_code]
    GPS定位功能实现代码如下:
[mw_shl_code=c,true]void get_gps()
{
    HAL_Delay(1000);
    HAL_UART_Transmit(&huart2,(uint8_t *)"AT+QGNSSRD=\"NMEA/RMC\"\r\n",23,0xff);
    HAL_Delay(2000);
    if((usart2_rec_buffer[2]=='+')&&(usart2_rec_buffer[3]=='Q')&&(usart2_rec_buffer[4]=='G'))
    {
        Sensor.Latitude[0]=usart2_rec_buffer[31];
        Sensor.Latitude[1]=usart2_rec_buffer[32];
        Sensor.Latitude[2]='.';
        Sensor.Latitude[3]=usart2_rec_buffer[33];
        Sensor.Latitude[4]=usart2_rec_buffer[34];
        Sensor.Latitude[5]=usart2_rec_buffer[36];
        Sensor.Latitude[6]=usart2_rec_buffer[37];
        Sensor.Latitude[7]=usart2_rec_buffer[38];
        Sensor.Latitude[8]=usart2_rec_buffer[39];
        Sensor.Longitude[0]=usart2_rec_buffer[43];
        Sensor.Longitude[1]=usart2_rec_buffer[44];
        Sensor.Longitude[2]=usart2_rec_buffer[45];
        Sensor.Longitude[3]='.';
        Sensor.Longitude[4]=usart2_rec_buffer[46];
        Sensor.Longitude[5]=usart2_rec_buffer[47];
        Sensor.Longitude[6]=usart2_rec_buffer[49];
        Sensor.Longitude[7]=usart2_rec_buffer[50];
        Sensor.Longitude[8]=usart2_rec_buffer[51];
        Sensor.Longitude[9]=usart2_rec_buffer[52];
    }
    memset(usart2_rec_buffer,0,usart2_rcv_len);        
    usart2_rcv_len = 0;
}[/mw_shl_code]
    环境光照检测功能实现代码如下:
[mw_shl_code=c,true]void get_illumination()
{
    int ADC_value=0,num=0;
    float voltage=0;
    HAL_Delay(1000);
    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1,100);
    ADC_value = HAL_ADC_GetValue(&hadc1);
    voltage = (float)(ADC_value *3.3/4096);
    voltage*=100;
    num=100-(int)(voltage*100/329);
    Sensor.Illumination[0]=num/100+'0';
    Sensor.Illumination[1]=num/10%10+'0';
    Sensor.Illumination[2]=num%10+'0';        ´
    num=100-num;
    Sensor.LED_brightness[0]=num/100+'0';
    Sensor.LED_brightness[1]=num/10%10+'0';
    Sensor.LED_brightness[2]=num%10+'0';                        
    LED_brightness_flag=num*21;
}[/mw_shl_code]
    NB-IoT模组模组通信功能实现代码如下:
[mw_shl_code=c,true]void BC20_LWM2M_Send()
{
    char send_buf[100],bufout[100];
    char *bufin=(char*)&Sensor;
    for (int i = 0; i < strlen(bufin); i++)
    {
        sprintf(bufout+i*2, "%02X",bufin);
        HAL_Delay(20);
    }
    sprintf((char *)send_buf, "AT+QLWDATASEND=19,0,0,%d,%s,0x0100\r\n",strlen(bufin),bufout);
    HAL_UART_Transmit(&huart2,(uint8_t *)send_buf,strlen((const char*)send_buf),0xff);  //·¢ËÍÊý¾Ý
    memset(bufin,0,strlen(bufin));        
    memset(bufout,0,strlen(bufout));        
    memset(send_buf,0,strlen(send_buf));        
    memset(usart2_rec_buffer,0,usart2_rcv_len);        
    usart2_rcv_len = 0;
}[/mw_shl_code]
    云端交互功能实现代码如下:
[mw_shl_code=c,true]int num=0;
char flag=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)  
{
    char led_off[8]={0x01,0x05,0x00,0x00,0x00,0x00,0xCD,0xCA};  
    char led_on[8]={0x01,0x05,0x00,0x00,0xFF,0x00,0x8C,0x3A};  
    if(htim->Instance == TIM1)  
    {
        if(num%500==0)  
        {
            if(usart1_rcv_len>=1)
            {
                HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3);
            }
            if(usart2_rcv_len>=1)
            {
                if((usart2_rec_buffer[2]=='+')&&(usart2_rec_buffer[3]=='Q')&&(usart2_rec_buffer[4]=='L'))
                {
                    if(usart2_rec_buffer[26]=='A')
                    {               
                        flag=0;
                        if(usart2_rec_buffer[27]=='1')  
                        {
                            HAL_UART_Transmit(&huart1,(uint8_t *)led_on,8,0xff);  
                        }
                        else if(usart2_rec_buffer[27]=='0')  
                        {
                            HAL_UART_Transmit(&huart1,(uint8_t *)led_off,8,0xff);  
                        }        
                    }
                    else if(usart2_rec_buffer[26]=='B')  
                    {
                        if(usart2_rec_buffer[27]=='1')  
                        {
                            flag=1;
                        }
                        else if(usart2_rec_buffer[27]=='0')  
                        {
                            flag=0;
                        }        
                    }
                    memset(usart2_rec_buffer,0,usart2_rcv_len);        
                    usart2_rcv_len = 0;
                }
                HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_3);
            }
            if(flag==1)
            {
                __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, LED_brightness_flag);
            }
            num=0;
        }
        num++;
    }
}[/mw_shl_code]
    【脑洞大赛】基于NB-IoT的智慧路灯监控系统(云端部署及训练):https://mc.dfrobot.com.cn/thread-296711-1-1.html
【脑洞大赛】基于NB-IoT的智慧路灯监控系统(硬件开发)图2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail