|
stm32单片机测温湿度和紫外线程序,原创。
- #include "stm32f10x.h"
- #include "bsp_SysTick.h"
- #include "bsp_am2302.h"
- #include "bsp_usart.h"
- #include "bsp_led.h"
- #include "bsp_i2c_gpio.h"
- #include "bsp_adc.h"
- #include "OLED_I2C.h"
- /***********温湿度结构体声明************/
- AM2302_Data_TypeDef AM2302_Data;
- /*************湿度值,温度值************/
- unsigned int RH_Value,TEMP_Value;
- /*湿度高八位,低八位,温度高八位,低八位*/
- unsigned char RH_H,RH_L,TP_H,TP_L,UV;
- uint16_t i=0,n=0,m=0;
- /********传感器传回来的值****************/
- extern __IO uint16_t ADC_getvalue;
- /**********传感器转化后的值*************/
- float ADC;
- /*******温湿度、紫外处理函数声明********/
- void Temp_RH_deal(void);
- void ADC_Deal(void);
- /********OLED处理函数声明*************/
- void OLED_deal(void);
- void KaiJi_Init(void);
- int main(void)
- {
- /* 配置SysTick 为1us中断一次 */
- SysTick_Init();
- LED_Init();
- USARTx_Init();//初始化串口1
- printf("\r\n***野火STM32 AM2302温湿度传感器实验***\r\n");
- AM2302_Init ();
- ADCx_Init();
- i2c_Init();/*I2C总线的GPIO初始化*/
- OLED_Init();
- KaiJi_Init();
- while(1)
- {
- Temp_RH_deal();
- ADC_Deal();
- OLED_deal();
- }
- }
- /***********************************************************************************************************
- ************ ******** ******* **
- ** * * * * **
- ** * * * * **
- ** * * * **
- ** * * * ** *
- ** * ****** ******* * * ******* ** *
- ** * * * * * * * * * ** *
- ** * * * * * * * * * * ** *********
- ** * * * * * * * * * * ** *
- ** * * * * * * * * * * * ** *
- ** * * *** * * * ***** ******* ** *****
- ************ ******
- *****************************************************************************************************************/
- void KaiJi_Init(void)
- {
- for(i=3;i<7;i++){OLED_ShowCN((i-1)*16,0,i);}
- OLED_ShowStr(12,3,(unsigned char*)"Name:",2);
- for(i=0;i<3;i++){OLED_ShowCN((i+4)*16,3,i);}
- OLED_ShowStr(12,6,(unsigned char*)"Date:",2);
- OLED_ShowStr(52,6,(unsigned char*)"2019/2/14",2);
- Delay_s(1);
- OLED_CLS();
- }
- void OLED_deal(void)
- {
- //定义三个数组,作为传感器值缓冲
- char buffer1[5]={0},buffer2[5]={0},buffer3[5]={0};
- //用sprintf函数将测量值转换为字符形式
- sprintf(buffer1,"%.2f",(float)TEMP_Value/10);
- sprintf(buffer2,"%.2f",(float)RH_Value/10);
- sprintf(buffer3,"%.0f",(float)UV);
- //显示中文字符,源码在codetab.h文件,
- for(i=7;i<15;i++)
- {
- OLED_ShowCN((i-7)*16,0,i);
- }
- //显示TEMP:
- OLED_ShowStr(0,2,(unsigned char*)"Temp:",2);
- //显示温度测量值
- OLED_ShowStr(40,2,buffer1,2);
- //显示“℃”符号
- for(i=15;i<16;i++)
- {OLED_ShowCN((i-10)*16,2,i);}
- //显示Rh:
- OLED_ShowStr(0,4,(unsigned char*)"Rh:",2);
- //显示湿度测量值
- OLED_ShowStr(40,4,buffer2,2);
- //显示“%”符号
- OLED_ShowStr(82,4,(unsigned char*)"%",2);
- //显示Uv:
- OLED_ShowStr(0,6,(unsigned char*)"Uv:",2);
- //显示紫外线测量值
- OLED_ShowStr(40,6,buffer3,2);
- //显示紫外线强度单位
- OLED_ShowStr(64,6,(unsigned char*)"UVIndex",2);
- }
-
- void Temp_RH_deal(void)
- {
- /*调用DHT11_Read_TempAndHumidity读取温湿度,若成功则输出该信息*/
- if( AM2302_Read( &AM2302_Data) == SUCCESS)
- {
- RH_Value= AM2302_Data.humi_int*256+ AM2302_Data.humi_deci;
- RH_H=RH_Value/10;//读取整数部分
- RH_L=RH_Value%10;//读取小数部分
- //计算出实际温度值的10倍,这是传感器手册上注明的
- TEMP_Value= AM2302_Data.temp_int*256+ AM2302_Data.temp_deci;
- TP_H=TEMP_Value/10;//读取整数部分
- TP_L=TEMP_Value%10;//读取小数部分
- printf("\r\n读取AM2302成功!%d\r\n\r\n湿度为%d.%d%RH\
- ,温度为%d.%d℃\r\n",n,RH_H,RH_L,TP_H,TP_L);//“\”表示转向下一行
- n++;
- }
- else
- {
- printf("\nRead AM2302 ERROR!%d\n",m);
- m++;
- }
- Delay_ms(1000);
- }
- void ADC_Deal(void)
- {
- int adc=0;
- ADC=(float) ADC_getvalue/4096*3.3*1000;
-
- ADC+=5;
- if(ADC>0)
- {
- if(0<ADC&ADC<50)
- adc=0;
- else if(200<=ADC&ADC<=260)
- adc=1;
- else if(290<=ADC&ADC<=350)
- adc=2;
- else if(380<=ADC&ADC<=440)
- adc=3;
- else if(380<=ADC&ADC<=540)
- adc=4;
- else if(580<=ADC&ADC<=640)
- adc=5;
- else if(670<=ADC&ADC<=730)
- adc=6;
- else if(770<=ADC&ADC<=830)
- adc=7;
- else if(850<=ADC&ADC<=910)
- adc=8;
- else if(950<=ADC&ADC<=1010)
- adc=9;
- else if(950<=ADC&ADC<=1110)
- adc=10;
- }
- switch(adc)
- {
- case 0:UV=0;break;
- case 1:UV=1;break;
- case 2:UV=2;break;
- case 3:UV=3;break;
- case 4:UV=4;break;
- case 5:UV=5;break;
- case 6:UV=6;break;
- case 7:UV=7;break;
- case 8:UV=8;break;
- case 9:UV=9;break;
- case 10:UV=10;break;
- }
- printf("当前电压为 = %3.0f mV \n",ADC);
- printf("当前紫外线指数等级为%d级\r\n",UV);
- }
复制代码
全部资料51hei下载地址:
原创-AM2302.7z
(210.68 KB, 下载次数: 69)
|
评分
-
查看全部评分
|