1、01全局变量、自定义函数的声明02自定义函数功能解析03主函数功能代码目录目录CONTENTS01掌握工程文件的添加02掌握变量定义及函数声明方式03掌握NB模块的基本配置步骤技能技能知识点知识点CONTENTS04掌握光照控制灯及模式切换应用开发1全局变量、自定义函数的声明全局变量、自定义函数的声明知识链接01STM32CubeMX生成工程介绍02函数声明和头文件添加STM32CubeMX生成工程介绍01 通过前次课程的学习,大家已经掌握了使用STM32CubeMX快速生成项目的方法。通过STM32CubeMX新建工程,快捷、方便,比使用keil5更加易于理解,不抽象。1、头文件的添加2、自
2、定义变量的添加3、自定义函数的声明02(1)、打开main.c 文件(2)、头文件,变量及函数声明处1、头文件的添加2、自定义变量的添加3、自定义函数的声明02(1)、添加新增的头文件引用,内容如下:#include user_cloud.h#include user_oled.h#include user_usart1.h#include user_usart2.h#include key.h#include oled.h(2)、添加变量声明 uint8_t usart1RxBuf;/串口1接收缓存 uint8_t usart2RxBuf;/串口2接收缓存(3)、添加自定义函数声明 int
3、fputc(int ch,FILE*f);/定向输出函数float get_illumination_value();/ADC采集并转化为光照值void control_light(uint8_t status);/控制灯亮灭功能函数void automatic_mode(int value,int*light_flag);/根据光照强度自动控制灯亮灭的功能函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef*huart);/串口中断服务程序void HAL_UART_ErrorCallback(UART_HandleTypeDef*huart);
4、/串口错误处理程序2自定义函数功能解析自定义函数功能解析任务要求任务要求 本任务要求用户编写功能函数,实现以下函数功能(1)串口的定向输出程序(2)光照强度采集及处理程序(3)灯的亮灭控制程序(4)根据光强自动控制程序(5)串口中断服务程序(6)串口中断错误处理程序功能函数01fputc02Floatget_illumination_value03control_light04automatic_mode05HAL_UART_RxCpltCallbackHAL_UART_ErrorCallback06101此处调用了UART串口写函数,函数功能将字符通过串口1发出HAL_UART_Transm
5、it函数原型如下在main.c文件添加函数:(此处添加位置任意,前面已经声明)int fputc(int ch,FILE*f)HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,10);return ch;02Floatget_illumination_value函数:使用stm32 ADC功能,采集光照产生的模拟电压信号值,利用相关公式计算,将电压值转化为光照强度,作为返回值输出float get_illumination_value()float adcValue;float illumination_value;HAL_ADC_Start(&hadc);H
6、AL_ADC_PollForConversion(&hadc,10);adcValue=HAL_ADC_GetValue(&hadc);adcValue=adcValue*3.3/4096.0;illumination_value=pow(10,(1.78-log10(33/adcValue-10)/0.6);/将电压值转换为光照强度 oled_display_illumination(illumination_value);HAL_ADC_Stop(&hadc);return illumination_value;通过通过IO口输出高低电平控制继口输出高低电平控制继电器开关,进而控制灯的亮灭
7、电器开关,进而控制灯的亮灭。此处使用的。此处使用的IO引脚为引脚为PA8,oled_display_light_status为为LED屏幕显示函数,显示灯的亮灭屏幕显示函数,显示灯的亮灭状态状态03void control_light(uint8_t status)if(status=LIGHT_OPEN)HAL_GPIO_WritePin(Light_GPIO_Port,Light_Pin,GPIO_PIN_SET);oled_display_light_status(LIGHT_OPEN);else HAL_GPIO_WritePin(Light_GPIO_Port,Light_Pin,G
8、PIO_PIN_RESET);oled_display_light_status(LIGHT_CLOSE);04automatic_mode(int value,int*light_flag)Value 采集的光照强度值采集的光照强度值light_flag 当前灯的状态标志当前灯的状态标志0为灭,为灭,1为亮为亮now_ill_value 存储的用于比较的光照强度存储的用于比较的光照强度当检测到光照强度低于当检测到光照强度低于3时且灯灭时,打开灯,时且灯灭时,打开灯,并记录下当前光照强度。当检测到灯的强度比并记录下当前光照强度。当检测到灯的强度比之前存储的强度值高于之前存储的强度值高于1以上(
9、表示外界光照变以上(表示外界光照变强),且灯亮时,关闭灯。强),且灯亮时,关闭灯。void automatic_mode(int value,int*light_flag)static int now_ill_value;if(value3)&(*light_flag=0)control_light(LIGHT_OPEN);*light_flag=1;HAL_Delay(10);now_ill_value=(int)get_illumination_value();else if(now_ill_value+1ErrorCode);huart-ErrorCode=HAL_UART_ERROR_
10、NONE;if(huart=&huart1)HAL_UART_Receive_IT(&huart1,&usart1RxBuf,1);/重新打开串口1接收中断 if(huart=&huart2)HAL_UART_Receive_IT(&huart2,&usart2RxBuf,1);/重新打开串口2接收中断3主函数功能代码添加主函数功能代码添加知识链接01参数介绍02初始化03主流程介绍04开发流程演示参数介绍参数介绍ill_value:经AD转换后得到的光照强度值mod_flag:=1表示自动控制模式,=0表示手动按键模式mod_flag:=1表示当前灯亮,=0表示当前灯灭0102在main主函
11、数,硬件初始化部分添加相关外设初始化代码。主要包含1、oled屏初始化2、按键初始化 3、初始屏显信息4、开串口中断5、nb模块初始化6、nb模块链接服务器7、相关变量的定义OLED_Init();keys_init();oled_display_information();oled_display_connection_status(LINKING);oled_display_light_status(LIGHT_CLOSE);oled_show_mode(MANUAL);HAL_UART_Receive_IT(&huart1,&usart1RxBuf,1);HAL_UART_Receive
12、_IT(&huart2,&usart2RxBuf,1);wait_nbiot_start();nbiot_config();link_server();int i,ret,ill_value,lightStatus,int link_flag=0,send_count;uint8_t mod_flag=0,c=0;03在main.c主文件中添加右侧代码03代码主要实现了,间隔1.5s(i+14)采集传感器数据(get_illumination_value(),当为自动模式时,调用automatic_mode()控制灯的亮灭,将数据上传至云平台send_data_to_cloud(),同时对云平台返回的数据进行接收和处理rcv_data_deal(),switch(ret);主函数中包含扫描按键的代码,对key2和key3进行扫描,当key2按下时,灯的亮灭切换。当key3按下时,灯的控制模式切换(手动和自动)04NB配置nbiot_config在user_cloud.c文件中添加1、nbiot_config()的nb配置代码2、get_time_from_server()函数304程序编译完成以上代码添加后,保存并编译工程,如下图所示