找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

查看数: 18725 | 评论数: 31 | 收藏 14
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-1-18 11:18

正文摘要:

12864显示; adc采集bandgap电压显示; 使用100K NTC测温显示;        家里的新房交付,自带简单装修,添置了些家具草草入住,同时考虑室外空气质量也比较差劲,更换了净化器的滤芯、添 ...

回复

ID:624444 发表于 2020-8-24 11:50
虽然我不玩,但是能共享资源,还为大家解答疑问,这个必须支持,赞一个
ID:205015 发表于 2020-8-12 08:53
ico_叶子 发表于 2020-4-26 19:42
楼主,我也买了个这个传感器,请问您的作品中达特传感器只接了VCC,GND,TX,Rx吗?期待回复

是的,串口通信只需要收发电地。如果使用攀藤的休眠功能,可以接个set引接。
ID:235017 发表于 2020-4-26 19:42
楼主,我也买了个这个传感器,请问您的作品中达特传感器只接了VCC,GND,TX,Rx吗?期待回复
ID:235017 发表于 2020-4-26 19:36
楼主大大,可以再发一下整个文件吗?
ID:205015 发表于 2020-3-29 09:30
xmfjfhcel 发表于 2020-3-10 17:03
不明白为什么楼主要取消云盘分享? 怕别人学习到了?理解你,但个人觉得没有必要,既然分享出来就大家看你 ...

估计是到期了。。。没主动操作过。
ID:205015 发表于 2020-3-29 09:29
f516411213 发表于 2019-12-16 13:07
你好, 按照您的 做出来啦。PM2.5的都能显示但是甲醛的不显示数据  不知道怎么回事

2个传感器直接接在串口助手下看下数据,记得有一个是需要先发数据把它改成被动模式。
可以考虑在程序中上电时执行一次把主动转被动。
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: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:626079 发表于 2020-3-10 17:03
不明白为什么楼主要取消云盘分享? 怕别人学习到了?理解你,但个人觉得没有必要,既然分享出来就大家看你的程序,对各自的学习进行提高,不是每个人都要做出这个玩意,说实话网上这也就一两百块的事。好点的也是300块左右。 为什么我们的技术在国际上这么落后? 你既然学到,我相信也是学习了很多别人分享的东西,逛这个论坛的,我相信学生是很大部分,希望他们多学习,多进步,为国家的发展做真正的贡献,逛这个论坛的我相信一定比那些所谓的看啥演唱会,追星的师兄要值得肯定,至少说明他们有上进的心。
个人所言。不喜请忽略。
ID:136485 发表于 2020-3-5 12:02
学习下,多谢分享
ID:665054 发表于 2019-12-16 13:07
你好, 按照您的 做出来啦。PM2.5的都能显示但是甲醛的不显示数据  不知道怎么回事
ID:526058 发表于 2019-11-10 20:47
攀縢pm7003和达特WZ-S.差不多都是70+ rmb/个。
ID:526058 发表于 2019-11-10 20:43
我也在做一个甲醛和PM2.5的测试仪,和你用的传感器一模一样。
ID:342663 发表于 2019-10-26 12:28
请问楼主有没有元器件清单啊
ID:589925 发表于 2019-7-24 19:57
感谢楼主,准备弄个,可惜小白,不会
ID:421308 发表于 2019-7-22 10:56
学习中
ID:136083 发表于 2019-7-22 09:54
这个创意很好,围观中。
ID:575119 发表于 2019-7-20 20:00
楼主,如果方便,麻烦你发下Proteus 的仿真DSN文件呗,谢谢
ID:576501 发表于 2019-7-2 16:14
楼主我想请教你,怎么加你呢
ID:205015 发表于 2019-1-26 14:08
GodWorks 发表于 2019-1-25 15:06
Void main()
{
   u8 x;

没用到的,可以干掉。应该是做别功能的时候用到的,警告可以忽略。
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:446113 发表于 2019-1-25 14:48
omer 发表于 2019-1-25 09:19
没有夏普传感器,同时不明确型号,没法作出比较。家里有某讯的M1,颗粒物传感器一个厂家,数值几乎一致; ...

好的那我在认真看多几遍程序,真的太感谢了
ID:205015 发表于 2019-1-25 09:19
51hei团团 发表于 2019-1-25 02:47
和夏普的传感器想必哪个更好呢?

没有夏普传感器,同时不明确型号,没法作出比较。家里有某讯的M1,颗粒物传感器一个厂家,数值几乎一致;
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: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:446113 发表于 2019-1-25 08:18
可否提供一下电器原理图呢?
ID:446113 发表于 2019-1-25 08:12
omer 发表于 2019-1-18 13:35
链接:https://pan.baidu.com/s/18WKYwQf4Pm848L8Imv1ZVQ
提取码:7pbn

感谢楼主的无私奉献,楼主万岁万岁万万岁。
ID:328014 发表于 2019-1-25 02:47
和夏普的传感器想必哪个更好呢?
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: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


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

Powered by 单片机教程网

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