单片机/MCU论坛
直播中

小猫猫爱吃鱼

4年用户 118经验值
擅长:可编程逻辑 光电显示 控制/MCU
私信 关注
[资料]

ESP8266热点模式WIFI体温检测

``设计目的
  为了满足体温监测传感器在应用中的无线化需求,设计了一种基于WiFi技术的体温监测传感器系统,采用了基于ESP8266的WiFi通信解决方案,提高了系统的集成度和兼容性,使用了一体化的数字温度传感器提高了测量精度,同时降低了电路复杂度,通过详细的设计验证和性能试验,证明了基于WiFi的体温监测传感器具有较强的使用价值,具有较低的功耗,可以满足体温监测的精度和使用寿命的要求.
实现功能
1、实时人体温度测量(DS18B20)
2、WIFI无线传输(ESP8266-01)
3、手机APP编写,显示实测体温
硬件制作
加工完成的PCB板,焊接调试更方便
004.png
温度传感器
003.png
WIFI模块,采用热点模式
002.png
全部制作完成

手机APP登录显示
登录地址默认:192.168.4.1
登录端口默认:5000


测量温度实时显示在APP,随时间温度会慢慢升高


006.png

  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. ***it RS=P3^0;                                                                       
  6. ***it RW=P3^1;
  7. ***it EN=P3^2;
  8. ***it DQ=P3^7;       
  9. uchar code str1[]={0x28,0x08,0xA7,0xBA,0x02,0x00,0x00,0x18};        //ROM 1
  10. uchar code str2[]={0x28,0x0C,0xBA,0xBA,0x02,0x00,0x00,0x54};        //ROM 2
  11. uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};        // 摄氏温度符号
  12. uchar data disdata[5];
  13. uint tvalue;//温度值
  14. uchar tflag;//温度正负标志

  15. /*************************lcd1602程序**************************/
  16. void delay1ms(uint ms)//延时1毫秒(不够精确的)
  17. {  uint i,j;
  18.    for(i=0;i<ms;i++)
  19.     for(j=0;j<100;j++);
  20. }

  21. void wr_com(uchar com)//写指令//
  22. { delay1ms(1);
  23.    RS=0;
  24.    RW=0;
  25.    EN=0;
  26.    P2=com;
  27.    delay1ms(1);
  28.    EN=1;
  29.    delay1ms(1);
  30.    EN=0;
  31. }

  32. void wr_dat(uchar dat)//写数据//
  33. { delay1ms(1);;
  34.    RS=1;
  35.    RW=0;
  36.    EN=0;
  37.    P2=dat;
  38.    delay1ms(1);
  39.    EN=1;
  40.    delay1ms(1);
  41.    EN=0;
  42. }
  43. void wr_new()                   、//写新字符
  44. {
  45.         uchar i;
  46.         wr_com(0x40);
  47.         for(i=0;i<8;i++)
  48.         {
  49.                 wr_dat(table[i]);
  50.         }
  51. }
  52. void lcd_init()//初始化设置//
  53. {        delay1ms(15);
  54.         wr_com(0x38);delay1ms(5);
  55.         wr_com(0x08);delay1ms(5);
  56.         wr_com(0x01);delay1ms(5);
  57.         wr_com(0x06);delay1ms(5);
  58.         wr_com(0x0c);delay1ms(5);
  59.         wr_new();
  60.         wr_com(0x80);
  61.     wr_dat('A');
  62.         wr_com(0x81);
  63.     wr_dat(':');
  64.           wr_com(0x89);
  65.     wr_dat(0x00);
  66.         wr_com(0x8a);
  67.     wr_dat('C');
  68.         wr_com(0xc9);
  69.     wr_dat(0x00);                        、、//摄氏温度字符
  70.         wr_com(0xca);
  71.     wr_dat('C');
  72.         wr_com(0xc0);
  73.     wr_dat('B');
  74.         wr_com(0xc1);
  75.     wr_dat(':');
  76. }

  77. /******************************ds1820程序***************************************/
  78. void delay_18B20(uint i)//延时1微秒
  79. {
  80.    while(i--);
  81. }



  82. void ds1820rst()/*ds1820复位*/
  83. {   uchar x=0;
  84.         DQ = 1;          //DQ复位
  85.         delay_18B20(4); //延时
  86.         DQ = 0;          //DQ拉低
  87.         delay_18B20(100); //精确延时大于480us
  88.         DQ = 1;          //拉高
  89.         delay_18B20(40);
  90. }

  91. uchar ds1820rd()/*读数据*/
  92. { uchar i=0;
  93.   uchar dat = 0;
  94.   for (i=0;i<8;i++)
  95.         {   DQ = 0; //给脉冲信号
  96.     dat>>=1;
  97.     DQ = 1; //给脉冲信号
  98.     if(DQ)
  99.     dat|=0x08;
  100.     delay_18B20(10);
  101.         }
  102.    return(dat);
  103. }
  104. void ds1820wr(uchar dat)/*写数据*/
  105. {         uchar i=0;
  106.     for (i=0; i<8; i++)
  107.                    { DQ = 0;
  108.               DQ = dat&0x10;
  109.               delay_18B20(10);
  110.               DQ = 1;
  111.               dat>>=1;
  112.                    }
  113. }
  114. void b20_Matchrom(uchar a)         //匹配ROM
  115. {
  116.         char j;
  117.         ds1820wr(0x55);           //发送匹配ROM命令
  118.         if(a==1)
  119.         {
  120.         for(j=0;j<8;j++)
  121.                 ds1820wr(str1[j]);                //发送18B20的序列号,先发送低字节
  122.         }
  123.         if(a==2)
  124.         {
  125.         for(j=0;j<8;j++)
  126.                 ds1820wr(str2[j]);                //发送18B20的序列号,先发送低字节
  127.         }

  128. }
  129. read_temp(uchar z)/*读取温度值并转换*/
  130. {        uchar a,b;
  131.         float tt;
  132.         ds1820rst();   
  133.         ds1820wr(0xcc);                         、  //读序列号
  134.         if(z==1)
  135.         {
  136.                 b20_Matchrom(1);                 //匹配ROM 1
  137.         }
  138.         if(z==2)
  139.         {
  140.                 b20_Matchrom(2);                 //匹配ROM         2
  141.         }
  142.         delay1ms(5);
  143.         ds1820rst();   
  144.         ds1820wr(0xcc);                                //读序列号
  145.         ds1820rst();
  146.         if(z==1)
  147.         {
  148.                 b20_Matchrom(1);                            //匹配ROM 1
  149.         }
  150.         if(z==2)
  151.         {
  152.                 b20_Matchrom(2);                                //匹配ROM         2
  153.         }
  154.         ds1820wr(0xbe);//*读取温度*/
  155.         a=ds1820rd();
  156.         b=ds1820rd();
  157.         tvalue=b;
  158.         tvalue<<=8;
  159.         tvalue=tvalue|a;
  160.     if(tvalue<0x0fff)
  161.     tflag=0;
  162.     else
  163.                    {        tvalue=~tvalue+1;
  164.                 tflag=1;
  165.                 }
  166.         tt=tvalue*0.0625;
  167.         tvalue=tt*10;
  168.         return(tvalue);
  169. }

  170. /*****************显示函数******************************/
  171. void ds1820disp(uchar z)//温度值显示
  172. {    uchar flagdat;
  173.      disdata[0]=tvalue/1000+0x30;//百位数
  174.      disdata[1]=tvalue%1000/100+0x30;//十位数
  175.      disdata[2]=tvalue%100/10+0x30;//个位数
  176.      disdata[3]=tvalue%10+0x30;//小数位
  177.    
  178.      if(tflag==0)
  179.      flagdat=0x20;//正温度不显示符号
  180.      else
  181.        flagdat=0x2d;//负温度显示负号:-

  182.      if(disdata[0]==0x30)
  183.     {disdata[0]=0x20;//如果百位为0,不显示
  184.    if(disdata[1]==0x30)
  185.     {disdata[1]=0x20;//如果百位为0,十位为0也不显示
  186.     }
  187.    }
  188.   if(z==1)
  189.     {
  190.     wr_com(0x82);
  191.     wr_dat(flagdat);//显示符号位
  192.     wr_com(0x83);
  193.     wr_dat(disdata[0]);//显示百位
  194.     wr_com(0x84);
  195.     wr_dat(disdata[1]);//显示十位
  196.     wr_com(0x85);
  197.     wr_dat(disdata[2]);//显示个位
  198.     wr_com(0x86);
  199.     wr_dat(0x2e);//显示小数点
  200.     wr_com(0x87);
  201.     wr_dat(disdata[3]);//显示小数位
  202.    }
  203.   if(z==2)
  204.     {
  205.     wr_com(0xc2);
  206.     wr_dat(flagdat);   //显示符号位
  207.     wr_com(0xc3);
  208.     wr_dat(disdata[0]);//显示百位
  209.     wr_com(0xc4);
  210.     wr_dat(disdata[1]);//显示十位
  211.     wr_com(0xc5);
  212.     wr_dat(disdata[2]);//显示个位
  213.     wr_com(0xc6);
  214.     wr_dat(0x2e);      //显示小数点
  215.     wr_com(0xc7);
  216.     wr_dat(disdata[3]);//显示小数位
  217.    }
  218. }
  219. /********************主程序***********************************/
  220. void main()
  221. {
  222.         lcd_init();//初始化显示
  223.     while(1)
  224.     {
  225.                 read_temp(1);//读取温度
  226.                 ds1820disp(1);//显示
  227.                 read_temp(2);//读取温度
  228.                 ds1820disp(2);//显示
  229.                 delay1ms(10000);
  230.   }
  231. }


`` 005.png 001.png

更多回帖

发帖
×
20
完善资料,
赚取积分