找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16678|回复: 31
收起左侧

用达特甲醛、攀藤PM2.5传感器+单片机,制作简单空气质量检测器

  [复制链接]
ID:205015 发表于 2019-1-18 11:18 | 显示全部楼层 |阅读模式
12864显示;
adc采集bandgap电压显示;
使用100K NTC测温显示;

       家里的新房交付,自带简单装修,添置了些家具草草入住,同时考虑室外空气质量也比较差劲,更换了净化器的滤芯、添置了壁挂新风,考虑囊中羞涩,决定自己买传感器,拿51和12864来DIY个检测器;说在前面:
        这个东西个人感觉没法定性也没必要,有个参考就可以了。
传感器:        淘宝找得基本最便宜的:国产达特WZ-S-K,带引脚的;PMS5003,不带温湿度、不带甲醛款;
其他配置:
        玩萝丽控陆续攒的STC15w408AS、IIC接口的12864白色OLED屏;
原理:
        两个传感器都是串口,均支持主动、被动通信;收发地一连,MCU接收传感器发来的数据,做个数据解析并给12864显示就完工了。
遇到的问题:
        STC15W408AS自带1个串口,要与2个设备通信;
解决方法1:
        按照网上的方法直连,经测试,估计引脚的输出能力偏弱,攀藤就被干掉了;失败;
解决方法2:
        翻看STC的手册,这货可以分时的方式切换串口到第二、第三组引脚;16pin的stc15引脚比较少,但也有2组可用,满足要求。
程序主要思路:
       通过设定flag的0、1状态,同时配合切换串口位置,分时发送命令给传感器,分时接收数据并做简单判断、解析并在12864上作出显示。
存在的问题:
       未做数据的校验及错误情况的判断及软件重置。反正跑死了,手动重启就好啦。。。

补充说明:


      1,PMS5003默认主动发送数据,掉电会自动恢复默认主动的发送情形,因此程序在每次上电时主动发送命令,使其工作在被动模式;
甲醛传感器貌似没啥影响,串口切到被动后,没注意掉电会不会恢复主动,测试显示数据没发现异常就没管它。发帖此时传感器没在手上,因此就不做测试,后续再议了。
      2,PMS5003的官网手册,最后一些关于校验的协议,像是没写完,没有句号,也没明确2个校验字节的具体内容,因此通过官方要来了基本协议的解释,再次感谢热情的攀藤小姐姐。分享以下:
0x42 0x4D 0xE1 0x00 0x00 0x01 0x70 - passive mode            return:42 4D 00 04 E1 00 01 74 0x42 0x4D 0xE1 0x00 0x01 0x01 0x71 - active mode.            return:42 4D 00 04 E1 01 01 750x42 0x4D 0xE2 0x00 0x00 0x01 0x71 - Passive mode read instruction 0x42 0x4D 0xE4 0x00 0x00 0x01 0x73 - standby mode             return::42 4D 00 04 E4 00 01 77 0x42 0x4D 0xE4 0x00 0x01 0x01 0x74 -Standby wakeup
传感器真身: 1.jpg
检测显示: 4.jpg
2.jpg

杂乱的全家福: 3.jpg

单片机源程序如下:
  1. #include <stc15.h>
  2. #include <12864.h>
  3. #include <delay.h>
  4. #include <character.h>

  5. unsigned char a[32],b[4];
  6. unsigned char n=0;
  7. unsigned char m=0;
  8. unsigned char numb=6;
  9. unsigned int numb2=0x2c;
  10. bit flag;
  11. unsigned int zong,pm10i,pm25i,pm100i;
  12. void UartInit(void)                //9600bps@11.0592MHz
  13. {
  14.         SCON = 0x50;                //8位数据,可变波特率
  15.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  16.         AUXR &= 0xFB;                //定时器2时钟为Fosc/12,即12T
  17.         T2L = 0xE8;                //设定定时初值
  18.         T2H = 0xFF;                //设定定时初值
  19.         
  20.         AUXR |= 0x10;                //启动定时器2
  21.         EA=1;
  22.         ES=1;
  23. }

  24. //发送一个byte;
  25. void sendonebyte(unsigned char udat)
  26. {
  27.         SBUF=udat;
  28.         while(!TI);
  29.         TI=0;
  30. }
  31. //发送字符串;
  32. void sendstrings(unsigned char *upstr)
  33. {
  34.         while(*upstr)
  35.         {
  36.                 sendonebyte(*upstr++);
  37.                
  38.         
  39.         }
  40. }        
  41. void Delay05s()
  42. {
  43.                 Delay50ms();
  44.                 Delay50ms();
  45.                 Delay50ms();
  46.                 Delay50ms();
  47.                 Delay50ms();
  48.                 Delay50ms();
  49.                 Delay50ms();
  50.                 Delay50ms();
  51.                 Delay50ms();
  52. }
  53. unsigned char receivedat()
  54. {
  55.          unsigned char redatbuf;
  56.         
  57.         if(RI == 1)
  58.         {
  59.         
  60.                 redatbuf=SBUF;
  61.                 RI=0;
  62.         }
  63.         return redatbuf;
  64. }

  65. void countnum(unsigned int num)   //int 65536;
  66. {
  67.         //b[4]=(num/10000)%10;  //万位;
  68.         b[3]=(num/1000)%10; //千位;
  69.         b[2]=(num/100)%10; //百位;
  70.         b[1]=(num/10)%10; //十位;
  71.         b[0]=(num/1)%10; //个位;
  72. }

  73. void hcho_T()   //flag=1,计算甲醛
  74. {
  75.         
  76.         Delay05s();
  77.         AUXR1 |= 0x40; //串口切换到 P3.6Rxd  P3.7Txd;
  78.         Delay50ms();
  79.         flag=1;
  80.         sendonebyte(0xff);    //FF 01 86 00 00 00 00 00 79   dart wz-s 请求数据命令;
  81.         sendonebyte(0x01);
  82.         sendonebyte(0x86);
  83.         sendonebyte(0x00);
  84.         sendonebyte(0x00);
  85.         sendonebyte(0x00);
  86.         sendonebyte(0x00);
  87.         sendonebyte(0x00);
  88.         sendonebyte(0x79);
  89.                 //
  90. }

  91. void pm25_T()
  92. {
  93.         
  94.         Delay05s();
  95.         AUXR1 &= 0xbf; //串口切换到 P3.0Rxd  P3.1Txd;
  96.         Delay50ms();
  97.         flag=0;
  98.         sendonebyte(0x42);
  99.         _nop_();
  100.         sendonebyte(0x4d);
  101.         _nop_();
  102.         sendonebyte(0xe2);
  103.         _nop_();
  104.         sendonebyte(0x00);
  105.         _nop_();
  106.         sendonebyte(0x00);
  107.         _nop_();
  108.         sendonebyte(0x01);
  109.         _nop_();
  110.         sendonebyte(0x71);
  111.         _nop_();         
  112. }
  113. void pm25_init()
  114. {
  115.         
  116.         Delay05s();
  117.         flag=0;
  118.         sendonebyte(0x42);
  119.         _nop_();
  120.         sendonebyte(0x4d);
  121.         _nop_();
  122.         sendonebyte(0xe1);
  123.         _nop_();
  124.         sendonebyte(0x00);
  125.         _nop_();
  126.         sendonebyte(0x00);
  127.         _nop_();
  128.         sendonebyte(0x01);
  129.         _nop_();
  130.         sendonebyte(0x70);
  131.         _nop_();
  132. }
  133.         
  134. void hcho_R()
  135. {
  136.         if((a[0]==0xff)&&(a[1]==0x86))
  137.                 {
  138.                 zong=((a[2]>>4)*16+(a[2]&0x0f))*256+a[3];
  139.                 countnum(zong);
  140.                 dxzm(b[3]+0x30,48,0);
  141.                 dxzm('.',56,0);
  142.                 dxzm(b[2]+0x30,64,0);
  143.           dxzm(b[1]+0x30,72,0);
  144.                 dxzm(b[0]+0x30,80,0);
  145.                 dxzm('m',88,0);
  146.                 dxzm('g',96,0);
  147.                 dxzm('/',104,0);
  148.                 dxzm('m',112,0);
  149.           location(120,0);
  150.                 dis_num86('3');
  151.                 }
  152. }
  153. void pm25_R()
  154. {
  155.         if((a[0]==0x42)&&(a[1]==0x4d))
  156.         {
  157.                
  158.                 if(a[3]==0x1c)
  159.                 {
  160.                         pm10i=((a[10]>>4)*16+(a[10]&0x0f))*256+a[11];
  161.                         countnum(pm10i);
  162.                         if(b[3]==0)
  163.                         ;else
  164.                         dxzm(b[3]+0x30,48,2);
  165.                         if(b[2]==0)
  166.                         ;else
  167.                         dxzm(b[2]+0x30,56,2);
  168.                         if(b[1]==0)
  169.                         ;else
  170.                         dxzm(b[1]+0x30,64,2);
  171.                         dxzm(b[0]+0x30,72,2);
  172.                         dxzm('u',80,2);
  173.                         dxzm('g',88,2);
  174.                         dxzm('/',96,2);
  175.                         dxzm('m',104,2);
  176.                         location(112,2);
  177.                         dis_num86('3');
  178.                         
  179.                         pm25i=((a[12]>>4)*16+(a[12]&0x0f))*256+a[13];
  180.                         countnum(pm25i);
  181.                         if(b[3]==0)
  182.                         ;else
  183.                         dxzm(b[3]+0x30,48,4);
  184.                         if(b[2]==0)
  185.                         ;else
  186.                         dxzm(b[2]+0x30,56,4);
  187.                         if(b[1]==0)
  188.                         ;else
  189.                         dxzm(b[1]+0x30,64,4);
  190.                         dxzm(b[0]+0x30,72,4);
  191.                         dxzm('u',80,4);
  192.                         dxzm('g',88,4);
  193.                         dxzm('/',96,4);
  194.                         dxzm('m',104,4);
  195.                         location(112,4);
  196.                         dis_num86('3');
  197.                         
  198.                         
  199.                         pm100i=((a[14]>>4)*16+(a[14]&0x0f))*256+a[15];
  200.                         countnum(pm100i);
  201.                         if(b[3]==0)
  202.                         ;else
  203.                         dxzm(b[3]+0x30,48,6);
  204.                         if(b[2]==0)
  205.                         ;else
  206.                         dxzm(b[2]+0x30,56,6);
  207.                         if(b[1]==0)
  208.                         ;else
  209.                         dxzm(b[1]+0x30,64,6);
  210.                         dxzm(b[0]+0x30,72,6);
  211.                         dxzm('u',80,6);
  212.                         dxzm('g',88,6);
  213.                         dxzm('/',96,6);
  214.                         dxzm('m',104,6);
  215.                         location(112,6);
  216.                         dis_num86('3');
  217.                 }
  218.         }
  219. }
  220. void dis_init()
  221. {
  222.         dxzm('H',8,0);
  223.         dxzm('C',16,0);
  224.         dxzm('H',24,0);
  225.         dxzm('O',32,0);
  226.         dxzm(':',40,0);
  227.         
  228.         dxzm('P',0,2);
  229.         dxzm('M',8,2);
  230.         dxzm('1',16,2);
  231.         dxzm('.',24,2);
  232.         dxzm('0',32,2);
  233.         dxzm(':',40,2);
  234.         
  235.         dxzm('P',0,4);
  236.         dxzm('M',8,4);
  237.         dxzm('2',16,4);
  238.         dxzm('.',24,4);
  239.         dxzm('5',32,4);
  240.         dxzm(':',40,4);
  241.         
  242.         
  243.         dxzm('P',0,6);
  244.         dxzm('M',8,6);
  245.         dxzm('1',16,6);
  246.         dxzm('0',24,6);
  247.         dxzm('.',32,6);
  248.         dxzm(':',40,6);
  249. }
  250. void main()
  251. {
  252.         u8 x;
  253.         Initial_12864();
  254.         clear_12864();
  255.         UartInit();
  256.         dis_init();
  257.         
  258.         Delay05s();
  259.         Delay05s();
  260.         
  261.         pm25_init();               
  262.         Delay50ms();
  263.         m=0;
  264.         
  265.                
  266.         while(1)
  267.         {               
  268.                
  269.                 hcho_T();
  270.                 Delay50ms();
  271.                 hcho_R();
  272.                
  273.                 Delay05s();
  274.                
  275.                 pm25_T();
  276.                 Delay50ms();               
  277.                 pm25_R();        
  278.         
  279.                
  280.                 }        
  281. }
  282. void Serial_interrupt() interrupt 4
  283. {
  284.         if((RI==1)&&(flag==1))
  285.         {
  286.                 if(n==9)
  287.                         n=0;
  288.                 a[n]=SBUF; // a为事先定义的接收缓存,可以持续接收,直到你需要串口数据时来取为止
  289.                 RI=0;//接收中断信号清零,表示将继续接收
  290.                 n++;
  291.         }
  292.         
  293.         if((RI==1)&&(flag==0))
  294.         {
  295.         
  296.                 a[m]=SBUF; // a为事先定义的接收缓存,可以持续接收,直到你需要串口数据时来取为止
  297.                 RI=0;//接收中断信号清零,表示将继续接收
  298.                 m++;
  299.                 if(m==32)
  300.                 m=0;
  301.         }
  302.                
  303. }
  304.                
复制代码
0.png
所有资料51hei提供下载:
12864_ser2019pm.zip (155.89 KB, 下载次数: 135)

评分

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

查看全部评分

回复

使用道具 举报

ID:205015 发表于 2019-1-18 13:35 | 显示全部楼层
本帖最后由 omer 于 2019-1-25 09:27 编辑

链接:https://pan.baidu.com/s/18WKYwQf4Pm848L8Imv1ZVQ
提取码:7pbn

增加简单校验,防止程序解析跑死,对齐HCHO使显示一致,修改显示的几个小错误。重传全部代码如下:
链接:https://pan.baidu.com/s/1PEFm2YTODLFywM6pLOD11g
提取码:qi8z


回复

使用道具 举报

ID:205015 发表于 2019-1-23 15:36 | 显示全部楼层
跑了几天发现颗粒物的数值会有超出正常很高的情况(数据解析出错),修改了主程序,避免无校验导致的程序跑死。跑几天看看。贴出主程序。
  1. #include <stc15.h>
  2. #include <12864.h>
  3. #include <delay.h>
  4. #include <character.h>

  5. unsigned char a[32],b[4];
  6. unsigned char n=0;
  7. unsigned char m=0;
  8. unsigned char numb=6;
  9. unsigned int numb2=0x2c;
  10. bit flag;
  11. bit stat;
  12. unsigned char conts=0;
  13. unsigned int zong,pm10i,pm25i,pm100i;
  14. void UartInit(void)                //9600bps@11.0592MHz
  15. {
  16.         SCON = 0x50;                //8位数据,可变波特率
  17.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  18.         AUXR &= 0xFB;                //定时器2时钟为Fosc/12,即12T
  19.         T2L = 0xE8;                //设定定时初值
  20.         T2H = 0xFF;                //设定定时初值
  21.        
  22.         AUXR |= 0x10;                //启动定时器2
  23.         EA=1;
  24.         ES=1;
  25. }

  26. //发送一个byte;
  27. void sendonebyte(unsigned char udat)
  28. {
  29.         SBUF=udat;
  30.         while(!TI);
  31.         TI=0;
  32. }
  33. //发送字符串;
  34. void sendstrings(unsigned char *upstr)
  35. {
  36.         while(*upstr)
  37.         {
  38.                 sendonebyte(*upstr++);
  39.                
  40.        
  41.         }
  42. }       
  43. void Delay05s()
  44. {
  45.                 Delay50ms();
  46.                 Delay50ms();
  47.                 Delay50ms();
  48.                 Delay50ms();
  49.                 Delay50ms();
  50.                 Delay50ms();
  51.                 Delay50ms();
  52.                 Delay50ms();
  53.                 Delay50ms();
  54. }
  55. unsigned char receivedat()
  56. {
  57.          unsigned char redatbuf;
  58.        
  59.         if(RI == 1)
  60.         {
  61.        
  62.                 redatbuf=SBUF;
  63.                 RI=0;
  64.         }
  65.         return redatbuf;
  66. }

  67. void countnum(unsigned int num)   //int 65536;
  68. {
  69.         //b[4]=(num/10000)%10;  //万位;
  70.         b[3]=(num/1000)%10; //千位;
  71.         b[2]=(num/100)%10; //百位;
  72.         b[1]=(num/10)%10; //十位;
  73.         b[0]=(num/1)%10; //个位;
  74. }

  75. void hcho_T()   //flag=1,计算甲醛
  76. {
  77.        
  78.         Delay05s();
  79.         AUXR1 |= 0x40; //串口切换到 P3.6Rxd  P3.7Txd;
  80.         Delay50ms();
  81.         flag=1;
  82.         sendonebyte(0xff);    //FF 01 86 00 00 00 00 00 79   dart wz-s 请求数据命令;
  83.         sendonebyte(0x01);
  84.         sendonebyte(0x86);
  85.         sendonebyte(0x00);
  86.         sendonebyte(0x00);
  87.         sendonebyte(0x00);
  88.         sendonebyte(0x00);
  89.         sendonebyte(0x00);
  90.         sendonebyte(0x79);
  91.                 //
  92. }

  93. void pm25_T()
  94. {
  95.        
  96.         Delay05s();
  97.         AUXR1 &= 0xbf; //串口切换到 P3.0Rxd  P3.1Txd;
  98.         Delay50ms();
  99.         flag=0;
  100.         sendonebyte(0x42);
  101.         _nop_();
  102.         sendonebyte(0x4d);
  103.         _nop_();
  104.         sendonebyte(0xe2);
  105.         _nop_();
  106.         sendonebyte(0x00);
  107.         _nop_();
  108.         sendonebyte(0x00);
  109.         _nop_();
  110.         sendonebyte(0x01);
  111.         _nop_();
  112.         sendonebyte(0x71);
  113.         _nop_();         
  114. }
  115. void pm25_init()   //上电 转化pm5003位被动模式;
  116. {
  117.        
  118.         Delay05s();
  119.         flag=0;
  120.         sendonebyte(0x42);
  121.         _nop_();
  122.         sendonebyte(0x4d);
  123.         _nop_();
  124.         sendonebyte(0xe1);
  125.         _nop_();
  126.         sendonebyte(0x00);
  127.         _nop_();
  128.         sendonebyte(0x00);
  129.         _nop_();
  130.         sendonebyte(0x01);
  131.         _nop_();
  132.         sendonebyte(0x70);
  133.         _nop_();
  134. }
  135.        
  136. void hcho_R()
  137. {
  138.         if((a[0]==0xff)&&(a[1]==0x86))
  139.                 {
  140.                 zong=((a[2]>>4)*16+(a[2]&0x0f))*256+a[3];
  141.                 countnum(zong);
  142.                 dxzm(b[3]+0x30,48,0);
  143.                 dxzm('.',56,0);
  144.                 dxzm(b[2]+0x30,64,0);
  145.           dxzm(b[1]+0x30,72,0);
  146.                 dxzm(b[0]+0x30,80,0);
  147.                 dxzm('m',88,0);
  148.                 dxzm('g',96,0);
  149.                 dxzm('/',104,0);
  150.                 dxzm('m',112,0);
  151.           location(120,0);
  152.                 dis_num86('3');
  153.                 }else
  154.                 {
  155.                         stat=1;
  156.                         n=0;
  157.                         m=0;
  158.                 }
  159. }
  160. void pm25_R()
  161. {
  162.         if((a[0]==0x42)&&(a[1]==0x4d))
  163.         {
  164.                
  165.                 if(a[3]==0x1c)
  166.                 {
  167.                         pm10i=((a[10]>>4)*16+(a[10]&0x0f))*256+a[11];
  168.                         countnum(pm10i);
  169.                         if(b[3]==0)
  170.                         ;else
  171.                         dxzm(b[3]+0x30,48,2);
  172.                         if(b[2]==0)
  173.                         ;else
  174.                         dxzm(b[2]+0x30,56,2);
  175.                         if(b[1]==0)
  176.                         ;else
  177.                         dxzm(b[1]+0x30,64,2);
  178.                         dxzm(b[0]+0x30,72,2);
  179.                         dxzm('u',80,2);
  180.                         dxzm('g',88,2);
  181.                         dxzm('/',96,2);
  182.                         dxzm('m',104,2);
  183.                         location(112,2);
  184.                         dis_num86('3');
  185.                        
  186.                         pm25i=((a[12]>>4)*16+(a[12]&0x0f))*256+a[13];
  187.                         countnum(pm25i);
  188.                         if(b[3]==0)
  189.                         ;else
  190.                         dxzm(b[3]+0x30,48,4);
  191.                         if(b[2]==0)
  192.                         ;else
  193.                         dxzm(b[2]+0x30,56,4);
  194.                         if(b[1]==0)
  195.                         ;else
  196.                         dxzm(b[1]+0x30,64,4);
  197.                         dxzm(b[0]+0x30,72,4);
  198.                         dxzm('u',80,4);
  199.                         dxzm('g',88,4);
  200.                         dxzm('/',96,4);
  201.                         dxzm('m',104,4);
  202.                         location(112,4);
  203.                         dis_num86('3');
  204.                        
  205.                        
  206.                         pm100i=((a[14]>>4)*16+(a[14]&0x0f))*256+a[15];
  207.                         countnum(pm100i);
  208.                         if(b[3]==0)
  209.                         ;else
  210.                         dxzm(b[3]+0x30,48,6);
  211.                         if(b[2]==0)
  212.                         ;else
  213.                         dxzm(b[2]+0x30,56,6);
  214.                         if(b[1]==0)
  215.                         ;else
  216.                         dxzm(b[1]+0x30,64,6);
  217.                         dxzm(b[0]+0x30,72,6);
  218.                         dxzm('u',80,6);
  219.                         dxzm('g',88,6);
  220.                         dxzm('/',96,6);
  221.                         dxzm('m',104,6);
  222.                         location(112,6);
  223.                         dis_num86('3');
  224.                 }
  225.         }else
  226.                 {
  227.                         stat=1;
  228.                         n=0;
  229.                         m=0;
  230.                 }
  231. }
  232. void dis_init()
  233. {
  234.         dxzm('H',8,0);
  235.         dxzm('C',16,0);
  236.         dxzm('H',24,0);
  237.         dxzm('O',32,0);
  238.         dxzm(':',40,0);
  239.        
  240.         dxzm('P',0,2);
  241.         dxzm('M',8,2);
  242.         dxzm('1',16,2);
  243.         dxzm('.',24,2);
  244.         dxzm('0',32,2);
  245.         dxzm(':',40,2);
  246.        
  247.         dxzm('P',0,4);
  248.         dxzm('M',8,4);
  249.         dxzm('2',16,4);
  250.         dxzm('.',24,4);
  251.         dxzm('5',32,4);
  252.         dxzm(':',40,4);
  253.        
  254.        
  255.         dxzm('P',0,6);
  256.         dxzm('M',8,6);
  257.         dxzm('1',16,6);
  258.         dxzm('0',24,6);
  259.         dxzm('.',32,6);
  260.         dxzm(':',40,6);
  261. }
  262. void main()
  263. {
  264.         u8 x;
  265.         Initial_12864();
  266.         clear_12864();
  267.         UartInit();
  268.         dis_init();
  269.        
  270.         Delay05s();
  271.         Delay05s();
  272.        
  273.         pm25_init();               
  274.         Delay50ms();
  275.         m=0;
  276.        
  277.                
  278.         while(1)
  279.         {               
  280.                 Delay50ms();
  281.                 if(stat==1)
  282.                 {
  283.                         conts++;
  284.                         if(conts==3)
  285.                         stat=0;
  286.                 }else
  287.                 {
  288.                         hcho_T();
  289.                         Delay50ms();
  290.                         hcho_R();
  291.                        
  292.                         Delay05s();
  293.                         Delay05s();
  294.                        
  295.                         pm25_T();
  296.                         Delay50ms();               
  297.                         pm25_R();       
  298.        
  299.                 }
  300.                 }       
  301. }
  302. void Serial_interrupt() interrupt 4
  303. {
  304.         if((RI==1)&&(flag==1))
  305.         {
  306.                 if(n==9)
  307.                         n=0;
  308.                 a[n]=SBUF; // a为事先定义的接收缓存,可以持续接收,直到你需要串口数据时来取为止
  309.                 RI=0;//接收中断信号清零,表示将继续接收
  310.                 n++;
  311.         }
  312.        
  313.         if((RI==1)&&(flag==0))
  314.         {
  315.        
  316.                 a[m]=SBUF; // a为事先定义的接收缓存,可以持续接收,直到你需要串口数据时来取为止
  317.                 RI=0;//接收中断信号清零,表示将继续接收
  318.                 m++;
  319.                 if(m==32)
  320.                 m=0;
  321.         }
  322.                
  323. }
  324.                
复制代码

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2019-1-25 02:47 | 显示全部楼层
和夏普的传感器想必哪个更好呢?
回复

使用道具 举报

ID:446113 发表于 2019-1-25 08:12 | 显示全部楼层
omer 发表于 2019-1-18 13:35
链接:https://pan.baidu.com/s/18WKYwQf4Pm848L8Imv1ZVQ
提取码:7pbn

感谢楼主的无私奉献,楼主万岁万岁万万岁。
回复

使用道具 举报

ID:446113 发表于 2019-1-25 08:18 | 显示全部楼层
可否提供一下电器原理图呢?
回复

使用道具 举报

ID:205015 发表于 2019-1-25 09:14 | 显示全部楼层
主程序pm数值的显示有几个错误,修正一下错误;调整HCHO对其左侧0位置,请替换下。
void pm25_R()
{
        if((a[0]==0x42)&&(a[1]==0x4d))
        {
               
                if(a[3]==0x1c)
                {
                        pm10i=((a[10]>>4)*16+(a[10]&0x0f))*256+a[11];
                        countnum(pm10i);
                        if(b[3]==0)
                        dxzm(32,48,2);       
                        else
                        dxzm(b[3]+0x30,48,2);
                        if((b[2]==0)&&(b[3]==0))
                                        dxzm(32,56,2);       
                        else
                        dxzm(b[2]+0x30,56,2);
                        if((b[1]==0)&&(b[2]==0)&&(b[3]==0))
                                        dxzm(32,64,2);       
                        else
                        dxzm(b[1]+0x30,64,2);
                        dxzm(b[0]+0x30,72,2);
                        dxzm('u',80,2);
                        dxzm('g',88,2);
                        dxzm('/',96,2);
                        dxzm('m',104,2);
                        location(112,2);
                        dis_num86('3');
                       
                        pm25i=((a[12]>>4)*16+(a[12]&0x0f))*256+a[13];
                        countnum(pm25i);
                        if(b[3]==0)
                                        dxzm(32,48,4);       
                        else
                        dxzm(b[3]+0x30,48,4);
                        if((b[2]==0)&&(b[3]==0))
                                dxzm(32,56,4);       
                        else
                        dxzm(b[2]+0x30,56,4);
                        if((b[1]==0)&&(b[2]==0)&&(b[3]==0))
                                dxzm(32,64,4);       
                        else
                        dxzm(b[1]+0x30,64,4);
                        dxzm(b[0]+0x30,72,4);
                        dxzm('u',80,4);
                        dxzm('g',88,4);
                        dxzm('/',96,4);
                        dxzm('m',104,4);
                        location(112,4);
                        dis_num86('3');
                       
                       
                        pm100i=((a[14]>>4)*16+(a[14]&0x0f))*256+a[15];
                        countnum(pm100i);
                        if(b[3]==0)
                        dxzm(32,48,6);
                        else
                        dxzm(b[3]+0x30,48,6);
                        if((b[2]==0)&&(b[3]==0))
                        dxzm(32,56,6);
                        else
                        dxzm(b[2]+0x30,56,6);
                        if((b[1]==0)&&(b[2]==0)&&(b[3]==0))
                        dxzm(32,64,6);
                        else
                        dxzm(b[1]+0x30,64,6);
                        dxzm(b[0]+0x30,72,6);
                        dxzm('u',80,6);
                        dxzm('g',88,6);
                        dxzm('/',96,6);
                        dxzm('m',104,6);
                        location(112,6);
                        dis_num86('3');
                }
        }else
                {
                        stat=1;
                        n=0;
                        m=0;
                }
}
void dis_init()
{
        dxzm('H',0,0);
        dxzm('C',8,0);
        dxzm('H',16,0);
        dxzm('O',24,0);
        dxzm(':',32,0);
       
        dxzm('P',0,2);
        dxzm('M',8,2);
        dxzm('1',16,2);
        dxzm('.',24,2);
        dxzm('0',32,2);
        dxzm(':',40,2);
       
        dxzm('P',0,4);
        dxzm('M',8,4);
        dxzm('2',16,4);
        dxzm('.',24,4);
        dxzm('5',32,4);
        dxzm(':',40,4);
       
       
        dxzm('P',0,6);
        dxzm('M',8,6);
        dxzm('1',16,6);
        dxzm('0',24,6);
        dxzm('.',32,6);
        dxzm(':',40,6);
}
回复

使用道具 举报

ID:205015 发表于 2019-1-25 09:16 | 显示全部楼层
GodWorks 发表于 2019-1-25 08:18
可否提供一下电器原理图呢?

IIC的12864,除了电地外2路数据,2个传感器的链接就是stc15w408as的2组串口引脚,没多复杂,程序内部有对应的引脚定义,读下程序就能找到了。有不懂得可以提问。
回复

使用道具 举报

ID:205015 发表于 2019-1-25 09:19 | 显示全部楼层
51hei团团 发表于 2019-1-25 02:47
和夏普的传感器想必哪个更好呢?

没有夏普传感器,同时不明确型号,没法作出比较。家里有某讯的M1,颗粒物传感器一个厂家,数值几乎一致;
回复

使用道具 举报

ID:205015 发表于 2019-1-25 09:44 | 显示全部楼层
更新集成后的图片。 a2.png


a3.jpg


a2.jpg


回复

使用道具 举报

ID:446113 发表于 2019-1-25 14:48 | 显示全部楼层
omer 发表于 2019-1-25 09:19
没有夏普传感器,同时不明确型号,没法作出比较。家里有某讯的M1,颗粒物传感器一个厂家,数值几乎一致; ...

好的那我在认真看多几遍程序,真的太感谢了
回复

使用道具 举报

ID:446113 发表于 2019-1-25 15:06 | 显示全部楼层
omer 发表于 2019-1-25 09:16
IIC的12864,除了电地外2路数据,2个传感器的链接就是stc15w408as的2组串口引脚,没多复杂,程序内部有对 ...

Void main()
{
   u8 x;
}
这一段出现警告,说x未被引用。
回复

使用道具 举报

ID:205015 发表于 2019-1-26 14:08 | 显示全部楼层
GodWorks 发表于 2019-1-25 15:06
Void main()
{
   u8 x;

没用到的,可以干掉。应该是做别功能的时候用到的,警告可以忽略。
回复

使用道具 举报

ID:576501 发表于 2019-7-2 16:14 | 显示全部楼层
楼主我想请教你,怎么加你呢
回复

使用道具 举报

ID:575119 发表于 2019-7-20 20:00 | 显示全部楼层
楼主,如果方便,麻烦你发下Proteus 的仿真DSN文件呗,谢谢
回复

使用道具 举报

ID:136083 发表于 2019-7-22 09:54 | 显示全部楼层
这个创意很好,围观中。
回复

使用道具 举报

ID:421308 发表于 2019-7-22 10:56 | 显示全部楼层
学习中
回复

使用道具 举报

ID:589925 发表于 2019-7-24 19:57 | 显示全部楼层
感谢楼主,准备弄个,可惜小白,不会
回复

使用道具 举报

ID:342663 发表于 2019-10-26 12:28 | 显示全部楼层
请问楼主有没有元器件清单啊
回复

使用道具 举报

ID:526058 发表于 2019-11-10 20:43 | 显示全部楼层
我也在做一个甲醛和PM2.5的测试仪,和你用的传感器一模一样。
回复

使用道具 举报

ID:526058 发表于 2019-11-10 20:47 | 显示全部楼层
攀縢pm7003和达特WZ-S.差不多都是70+ rmb/个。
回复

使用道具 举报

ID:665054 发表于 2019-12-16 13:07 | 显示全部楼层
你好, 按照您的 做出来啦。PM2.5的都能显示但是甲醛的不显示数据  不知道怎么回事
回复

使用道具 举报

ID:136485 发表于 2020-3-5 12:02 | 显示全部楼层
学习下,多谢分享
回复

使用道具 举报

ID:626079 发表于 2020-3-10 17:03 | 显示全部楼层
不明白为什么楼主要取消云盘分享? 怕别人学习到了?理解你,但个人觉得没有必要,既然分享出来就大家看你的程序,对各自的学习进行提高,不是每个人都要做出这个玩意,说实话网上这也就一两百块的事。好点的也是300块左右。 为什么我们的技术在国际上这么落后? 你既然学到,我相信也是学习了很多别人分享的东西,逛这个论坛的,我相信学生是很大部分,希望他们多学习,多进步,为国家的发展做真正的贡献,逛这个论坛的我相信一定比那些所谓的看啥演唱会,追星的师兄要值得肯定,至少说明他们有上进的心。
个人所言。不喜请忽略。
回复

使用道具 举报

ID:136485 发表于 2020-3-13 11:45 | 显示全部楼层
本帖最后由 kxcuser 于 2020-3-17 16:17 编辑

请教一下这句能详细讲解下吗zong=((d[2]>>4)*16+(d[2]&0x0f))*256+d[3];这是把16进制转换成十进制吗,还有传感器计算公式吗
回复

使用道具 举报

ID:205015 发表于 2020-3-29 09:26 | 显示全部楼层
kxcuser 发表于 2020-3-13 11:45
请教一下这句能详细讲解下吗zong=((d[2]>>4)*16+(d[2]&0x0f))*256+d[3];这是把16进制转换成十进制吗,还有 ...

是十六进制到十进制转换的过程。不过这个公式是否正确,我现在再来看,有些糊涂了。。。
传感器的数据格式可以看官方提供的手册。
回复

使用道具 举报

ID:205015 发表于 2020-3-29 09:29 | 显示全部楼层
f516411213 发表于 2019-12-16 13:07
你好, 按照您的 做出来啦。PM2.5的都能显示但是甲醛的不显示数据  不知道怎么回事

2个传感器直接接在串口助手下看下数据,记得有一个是需要先发数据把它改成被动模式。
可以考虑在程序中上电时执行一次把主动转被动。
回复

使用道具 举报

ID:205015 发表于 2020-3-29 09:30 | 显示全部楼层
xmfjfhcel 发表于 2020-3-10 17:03
不明白为什么楼主要取消云盘分享? 怕别人学习到了?理解你,但个人觉得没有必要,既然分享出来就大家看你 ...

估计是到期了。。。没主动操作过。
回复

使用道具 举报

ID:235017 发表于 2020-4-26 19:36 | 显示全部楼层
楼主大大,可以再发一下整个文件吗?
回复

使用道具 举报

ID:235017 发表于 2020-4-26 19:42 | 显示全部楼层
楼主,我也买了个这个传感器,请问您的作品中达特传感器只接了VCC,GND,TX,Rx吗?期待回复
回复

使用道具 举报

ID:205015 发表于 2020-8-12 08:53 | 显示全部楼层
ico_叶子 发表于 2020-4-26 19:42
楼主,我也买了个这个传感器,请问您的作品中达特传感器只接了VCC,GND,TX,Rx吗?期待回复

是的,串口通信只需要收发电地。如果使用攀藤的休眠功能,可以接个set引接。
回复

使用道具 举报

ID:624444 发表于 2020-8-24 11:50 | 显示全部楼层
虽然我不玩,但是能共享资源,还为大家解答疑问,这个必须支持,赞一个
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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