TA的每日心情 | 奋斗 2023-12-3 18:51 |
---|
签到天数: 772 天 连续签到: 1 天 [LV.10]以坛为家III
|
本帖最后由 ddllxxrr 于 2018-2-25 14:26 编辑
在开发板上有一个STM32芯片,它上边自带了个温度检测器。
我想不会太准但测下芯片的大根温度是可以地。
于是,我就又新建了个产品,产品只是上报一下温度:
然后选APP界面,我本想选那个好看点 的,但我选完了一片漆黑,我就选了第二个:
然后下载SDK:
接上一贴程序改哈:
我是这样子改的:
首先加入温度检测程序:
- #define HAL_USER_FLASH_GLOBAL
- #include "include.h"
- void delay_ms(u16 time)
- {
- u16 i=0;
- while(time--)
- {
- i=12000; //自己定义
- while(i--) ;
- }
- }
- void T_Adc_Init(void) //ADC通道初始化
- {
- ADC_InitTypeDef ADC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能GPIOA,ADC1通道时钟
- RCC_ADCCLKConfig(RCC_PCLK2_Div6); //分频因子6时钟为72M/6=12MHz
- ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
- ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
- ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目
- ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
- ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
- ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
- ADC_ResetCalibration(ADC1); //重置指定的ADC1的复位寄存器
- while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1重置校准寄存器的状态,设置状态则等待
- ADC_StartCalibration(ADC1);
- while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC1的校准程序,设置状态则等待
- }
- u16 T_Get_Adc(u8 ch)
- {
- ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道3,第一个转换,采样时间为239.5周期
- ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
- return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
- }
- //得到ADC采样内部温度传感器的值
- //取10次,然后平均
- u16 T_Get_Temp(void)
- {
- u16 temp_val=0;
- u8 t;
- for(t=0;t<10;t++)
- {
- temp_val+=T_Get_Adc(ADC_Channel_16); //TampSensor
- delay_ms(5);
- }
- return temp_val/10;
- }
- //获取通道ch的转换值
- //取times次,然后平均
- u16 T_Get_Adc_Average(u8 ch,u8 times)
- {
- u32 temp_val=0;
- u8 t;
- for(t=0;t<times;t++)
- {
- temp_val+=T_Get_Adc(ch);
- delay_ms(5);
- }
- return temp_val/times;
- }
- //得到温度值
- //返回值:温度值(扩大了100倍,单位:℃.)
- short Get_Temprate(void) //获取内部温度传感器温度值
- {
- u32 adcx;
- short result;
- double temperate;
- adcx=T_Get_Adc_Average(ADC_Channel_16,20); //读取通道16,20次取平均
- temperate=(float)adcx*(3.3/4096); //电压值
- temperate=(1.43-temperate)/0.0043+25; //转换为温度值
- result=temperate*=100; //扩大100倍.
- return result;
- }
复制代码 再在库文件中加入ADC那个库文件。
然后再写个User_Adc.h:- #ifndef __USER_ADC_H__
- #define __USER_ADC_H_
- void delay_ms(u16 time);
- void T_Adc_Init(void); //ADC通道初始化
- u16 T_Get_Adc(u8 ch);
- u16 T_Get_Temp(void);
- u16 T_Get_Adc_Average(u8 ch,u8 times);
- short Get_Temprate(void); //获取内部温度传感器温度值
- #endif
复制代码 然后我是这样改的:
1,改产品标识:注意是本人的标识,请不要考贝。错了不负责哈。- #define PRODUCT_KEY "aMwruVkvkO7Rxano" //开发平台创建产品后生成的16位字符产品唯一标识
复制代码 2,include.h中加入temp变量
- typedef struct {
- uint32_t magic_code;
- uint8_t led_switch;
- uint8_t temp;
- uint8_t work_mode;
- uint8_t led_switch2;
- uint8_t bright_value;
- uint8_t colour[14];
- uint8_t scene[14];
- } TYPE_BUFFER_S;
复制代码 3,在protocol.c中根据SDK改为:- const DOWNLOAD_CMD_S download_cmd[] =
- {
- {DPID_TEMPCURRENT, DP_TYPE_VALUE},
- };
- 上传所有数据改为:
- void all_data_update(void)
- {
- mcu_dp_value_update(DPID_TEMPCURRENT,FlashBuffer.temp); //VALUE型数据上报;
- }
- 上报数据及下传数据处理改为:
- unsigned char dp_download_handle(unsigned char dpid,const unsigned char value[], unsigned short length)
- {
- /*********************************
- 当前函数处理可下发/可上报数据调用
- 具体函数内需要实现下发数据处理
- 完成用需要将处理结果反馈至APP端,否则APP会认为下发失败
- ***********************************/
- unsigned char ret;
- ret=Get_Temprate(); //得到温度值
- FlashBuffer.temp = Get_Temprate();
- switch(dpid)
- {
- default: mcu_dp_value_update(DPID_TEMPCURRENT,FlashBuffer.temp); //VALUE型数据上报;
- break;
- }
- return ret;
- }
复制代码 4,在主程序main()中加入ADC初始化函数:好了,下面看下运行的截图:
|
|