找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4508|回复: 2
收起左侧

STM32单片机测温湿度和紫外线程序,原创

[复制链接]
ID:272776 发表于 2019-2-16 18:46 | 显示全部楼层 |阅读模式
stm32单片机测温湿度和紫外线程序,原创。
  1. #include "stm32f10x.h"
  2. #include "bsp_SysTick.h"
  3. #include "bsp_am2302.h"
  4. #include "bsp_usart.h"
  5. #include "bsp_led.h"
  6. #include "bsp_i2c_gpio.h"
  7. #include "bsp_adc.h"
  8. #include "OLED_I2C.h"




  9. /***********温湿度结构体声明************/
  10. AM2302_Data_TypeDef     AM2302_Data;
  11. /*************湿度值,温度值************/
  12. unsigned int  RH_Value,TEMP_Value;
  13. /*湿度高八位,低八位,温度高八位,低八位*/
  14. unsigned char RH_H,RH_L,TP_H,TP_L,UV;
  15. uint16_t i=0,n=0,m=0;
  16. /********传感器传回来的值****************/
  17. extern __IO uint16_t ADC_getvalue;
  18. /**********传感器转化后的值*************/
  19. float   ADC;
  20. /*******温湿度、紫外处理函数声明********/
  21. void Temp_RH_deal(void);
  22. void ADC_Deal(void);
  23. /********OLED处理函数声明*************/
  24. void  OLED_deal(void);
  25. void  KaiJi_Init(void);



  26. int main(void)
  27. {
  28.         /* 配置SysTick 为1us中断一次 */
  29.         SysTick_Init();
  30.   LED_Init();
  31.         USARTx_Init();//初始化串口1
  32.         printf("\r\n***野火STM32 AM2302温湿度传感器实验***\r\n");
  33.         AM2302_Init ();
  34.         ADCx_Init();
  35.         i2c_Init();/*I2C总线的GPIO初始化*/
  36.         OLED_Init();
  37.         KaiJi_Init();
  38.         while(1)
  39.         {        
  40.           Temp_RH_deal();
  41.                 ADC_Deal();
  42.     OLED_deal();
  43.   }
  44. }        
  45. /***********************************************************************************************************
  46. ************           ********                                 *******                        **
  47.     **                *        *                                *       *                      **
  48.     **               *          *                               *         *                    **
  49.     **              *                                           *           *                  **
  50.     **             *                                            *            *                 **        *
  51.     **            *                  ******      *******        *            *   *******       **        *
  52.     **            *                 *     *      *     *        *           *    *     *       **        *
  53.     **             *               *     * *     *     *        *         *      *     *       **    *********
  54.     **              *              *    *   *    *     *        *       *        *     *       **        *
  55.     **               *         *   *   *     *   *     *        *     *          *     *       **        *
  56.     **                *       *     ***       *  *     *        *****            *******       **         *****
  57. ************            ******
  58. *****************************************************************************************************************/


  59. void KaiJi_Init(void)
  60. {
  61.         for(i=3;i<7;i++){OLED_ShowCN((i-1)*16,0,i);}
  62.   OLED_ShowStr(12,3,(unsigned char*)"Name:",2);
  63.         for(i=0;i<3;i++){OLED_ShowCN((i+4)*16,3,i);}
  64.         OLED_ShowStr(12,6,(unsigned char*)"Date:",2);
  65.         OLED_ShowStr(52,6,(unsigned char*)"2019/2/14",2);
  66.         Delay_s(1);
  67.         OLED_CLS();
  68. }



  69. void  OLED_deal(void)
  70. {
  71.           //定义三个数组,作为传感器值缓冲
  72.                 char buffer1[5]={0},buffer2[5]={0},buffer3[5]={0};
  73.                 //用sprintf函数将测量值转换为字符形式
  74.           sprintf(buffer1,"%.2f",(float)TEMP_Value/10);
  75.           sprintf(buffer2,"%.2f",(float)RH_Value/10);
  76.           sprintf(buffer3,"%.0f",(float)UV);
  77.           //显示中文字符,源码在codetab.h文件,
  78.                 for(i=7;i<15;i++)
  79.                 {
  80.                         OLED_ShowCN((i-7)*16,0,i);
  81.                 }
  82.                 //显示TEMP:
  83.                 OLED_ShowStr(0,2,(unsigned char*)"Temp:",2);
  84.                 //显示温度测量值
  85.                 OLED_ShowStr(40,2,buffer1,2);
  86.                 //显示“℃”符号
  87.                 for(i=15;i<16;i++)
  88.                 {OLED_ShowCN((i-10)*16,2,i);}
  89.                 //显示Rh:
  90.                 OLED_ShowStr(0,4,(unsigned char*)"Rh:",2);
  91.                 //显示湿度测量值
  92.                 OLED_ShowStr(40,4,buffer2,2);
  93.                 //显示“%”符号
  94.     OLED_ShowStr(82,4,(unsigned char*)"%",2);        
  95.                 //显示Uv:
  96.                 OLED_ShowStr(0,6,(unsigned char*)"Uv:",2);
  97.                 //显示紫外线测量值
  98.                 OLED_ShowStr(40,6,buffer3,2);
  99.     //显示紫外线强度单位               
  100.           OLED_ShowStr(64,6,(unsigned char*)"UVIndex",2);               
  101. }




  102. void Temp_RH_deal(void)
  103. {
  104.       /*调用DHT11_Read_TempAndHumidity读取温湿度,若成功则输出该信息*/
  105.                         if( AM2302_Read( &AM2302_Data) == SUCCESS)
  106.                         {
  107.         RH_Value= AM2302_Data.humi_int*256+ AM2302_Data.humi_deci;
  108.                                 RH_H=RH_Value/10;//读取整数部分
  109.                                 RH_L=RH_Value%10;//读取小数部分
  110.                                 //计算出实际温度值的10倍,这是传感器手册上注明的
  111.                                 TEMP_Value= AM2302_Data.temp_int*256+ AM2302_Data.temp_deci;
  112.                                 TP_H=TEMP_Value/10;//读取整数部分
  113.                                 TP_L=TEMP_Value%10;//读取小数部分
  114.                                 printf("\r\n读取AM2302成功!%d\r\n\r\n湿度为%d.%d%RH\
  115. ,温度为%d.%d℃\r\n",n,RH_H,RH_L,TP_H,TP_L);//“\”表示转向下一行
  116.               n++;
  117.                         }                        
  118.                         else
  119.                         {
  120.                                 printf("\nRead AM2302 ERROR!%d\n",m);
  121.                                 m++;
  122.                         }
  123.                  Delay_ms(1000);
  124. }



  125. void ADC_Deal(void)
  126. {
  127.           int adc=0;
  128.     ADC=(float) ADC_getvalue/4096*3.3*1000;
  129.          
  130.       ADC+=5;        
  131.                         if(ADC>0)
  132.                         {
  133.                                 if(0<ADC&ADC<50)
  134.                                         adc=0;
  135.                                 else if(200<=ADC&ADC<=260)
  136.                                   adc=1;
  137.                                 else if(290<=ADC&ADC<=350)
  138.                                   adc=2;
  139.                                 else if(380<=ADC&ADC<=440)
  140.                                   adc=3;
  141.                                 else if(380<=ADC&ADC<=540)
  142.                                   adc=4;
  143.                                 else if(580<=ADC&ADC<=640)
  144.                                   adc=5;
  145.                                 else if(670<=ADC&ADC<=730)
  146.                                   adc=6;
  147.                                 else if(770<=ADC&ADC<=830)
  148.                                   adc=7;
  149.                                 else if(850<=ADC&ADC<=910)
  150.                                   adc=8;
  151.                                 else if(950<=ADC&ADC<=1010)
  152.                                   adc=9;
  153.                                 else if(950<=ADC&ADC<=1110)
  154.                                   adc=10;
  155.                   }
  156.                   switch(adc)
  157.                         {
  158.                           case 0:UV=0;break;
  159.                           case 1:UV=1;break;
  160.                           case 2:UV=2;break;
  161.                           case 3:UV=3;break;
  162.                           case 4:UV=4;break;
  163.                           case 5:UV=5;break;
  164.                           case 6:UV=6;break;
  165.                           case 7:UV=7;break;
  166.                           case 8:UV=8;break;
  167.                           case 9:UV=9;break;
  168.                           case 10:UV=10;break;                        
  169. }
  170.                 printf("当前电压为 = %3.0f mV \n",ADC);
  171.                 printf("当前紫外线指数等级为%d级\r\n",UV);
  172. }
复制代码

全部资料51hei下载地址:
原创-AM2302.7z (210.68 KB, 下载次数: 66)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:855153 发表于 2020-12-7 20:15 | 显示全部楼层
您好!!我想请问一下,您还保存得有这个的电路图麽?想要参考一下。
回复

使用道具 举报

ID:519089 发表于 2021-7-14 22:19 | 显示全部楼层
紫外线程序是个什么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表