找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

用達(dá)特甲醛、攀藤PM2.5傳感器+單片機(jī),制作簡單空氣質(zhì)量檢測器

查看數(shù): 18764 | 評論數(shù): 31 | 收藏 14
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時(shí)間: 2019-1-18 11:18

正文摘要:

12864顯示; adc采集bandgap電壓顯示; 使用100K NTC測溫顯示;        家里的新房交付,自帶簡單裝修,添置了些家具草草入住,同時(shí)考慮室外空氣質(zhì)量也比較差勁,更換了凈化器的濾芯、添 ...

回復(fù)

ID:624444 發(fā)表于 2020-8-24 11:50
雖然我不玩,但是能共享資源,還為大家解答疑問,這個(gè)必須支持,贊一個(gè)
ID:205015 發(fā)表于 2020-8-12 08:53
ico_葉子 發(fā)表于 2020-4-26 19:42
樓主,我也買了個(gè)這個(gè)傳感器,請問您的作品中達(dá)特傳感器只接了VCC,GND,TX,Rx嗎?期待回復(fù)

是的,串口通信只需要收發(fā)電地。如果使用攀藤的休眠功能,可以接個(gè)set引接。
ID:235017 發(fā)表于 2020-4-26 19:42
樓主,我也買了個(gè)這個(gè)傳感器,請問您的作品中達(dá)特傳感器只接了VCC,GND,TX,Rx嗎?期待回復(fù)
ID:235017 發(fā)表于 2020-4-26 19:36
樓主大大,可以再發(fā)一下整個(gè)文件嗎?
ID:205015 發(fā)表于 2020-3-29 09:30
xmfjfhcel 發(fā)表于 2020-3-10 17:03
不明白為什么樓主要取消云盤分享? 怕別人學(xué)習(xí)到了?理解你,但個(gè)人覺得沒有必要,既然分享出來就大家看你 ...

估計(jì)是到期了。。。沒主動(dòng)操作過。
ID:205015 發(fā)表于 2020-3-29 09:29
f516411213 發(fā)表于 2019-12-16 13:07
你好, 按照您的 做出來啦。PM2.5的都能顯示但是甲醛的不顯示數(shù)據(jù)  不知道怎么回事

2個(gè)傳感器直接接在串口助手下看下數(shù)據(jù),記得有一個(gè)是需要先發(fā)數(shù)據(jù)把它改成被動(dòng)模式。
可以考慮在程序中上電時(shí)執(zhí)行一次把主動(dòng)轉(zhuǎn)被動(dòng)。
ID:205015 發(fā)表于 2020-3-29 09:26
kxcuser 發(fā)表于 2020-3-13 11:45
請教一下這句能詳細(xì)講解下嗎zong=((d[2]>>4)*16+(d[2]&0x0f))*256+d[3];這是把16進(jìn)制轉(zhuǎn)換成十進(jìn)制嗎,還有 ...

是十六進(jìn)制到十進(jìn)制轉(zhuǎn)換的過程。不過這個(gè)公式是否正確,我現(xiàn)在再來看,有些糊涂了。。。
傳感器的數(shù)據(jù)格式可以看官方提供的手冊。
ID:136485 發(fā)表于 2020-3-13 11:45
本帖最后由 kxcuser 于 2020-3-17 16:17 編輯

請教一下這句能詳細(xì)講解下嗎zong=((d[2]>>4)*16+(d[2]&0x0f))*256+d[3];這是把16進(jìn)制轉(zhuǎn)換成十進(jìn)制嗎,還有傳感器計(jì)算公式嗎
ID:626079 發(fā)表于 2020-3-10 17:03
不明白為什么樓主要取消云盤分享? 怕別人學(xué)習(xí)到了?理解你,但個(gè)人覺得沒有必要,既然分享出來就大家看你的程序,對各自的學(xué)習(xí)進(jìn)行提高,不是每個(gè)人都要做出這個(gè)玩意,說實(shí)話網(wǎng)上這也就一兩百塊的事。好點(diǎn)的也是300塊左右。 為什么我們的技術(shù)在國際上這么落后? 你既然學(xué)到,我相信也是學(xué)習(xí)了很多別人分享的東西,逛這個(gè)論壇的,我相信學(xué)生是很大部分,希望他們多學(xué)習(xí),多進(jìn)步,為國家的發(fā)展做真正的貢獻(xiàn),逛這個(gè)論壇的我相信一定比那些所謂的看啥演唱會(huì),追星的師兄要值得肯定,至少說明他們有上進(jìn)的心。
個(gè)人所言。不喜請忽略。
ID:136485 發(fā)表于 2020-3-5 12:02
學(xué)習(xí)下,多謝分享
ID:665054 發(fā)表于 2019-12-16 13:07
你好, 按照您的 做出來啦。PM2.5的都能顯示但是甲醛的不顯示數(shù)據(jù)  不知道怎么回事
ID:526058 發(fā)表于 2019-11-10 20:47
攀縢pm7003和達(dá)特WZ-S.差不多都是70+ rmb/個(gè)。
ID:526058 發(fā)表于 2019-11-10 20:43
我也在做一個(gè)甲醛和PM2.5的測試儀,和你用的傳感器一模一樣。
ID:342663 發(fā)表于 2019-10-26 12:28
請問樓主有沒有元器件清單啊
ID:589925 發(fā)表于 2019-7-24 19:57
感謝樓主,準(zhǔn)備弄個(gè),可惜小白,不會(huì)
ID:421308 發(fā)表于 2019-7-22 10:56
學(xué)習(xí)中
ID:136083 發(fā)表于 2019-7-22 09:54
這個(gè)創(chuàng)意很好,圍觀中。
ID:575119 發(fā)表于 2019-7-20 20:00
樓主,如果方便,麻煩你發(fā)下Proteus 的仿真DSN文件唄,謝謝
ID:576501 發(fā)表于 2019-7-2 16:14
樓主我想請教你,怎么加你呢
ID:205015 發(fā)表于 2019-1-26 14:08

沒用到的,可以干掉。應(yīng)該是做別功能的時(shí)候用到的,警告可以忽略。
ID:446113 發(fā)表于 2019-1-25 15:06
omer 發(fā)表于 2019-1-25 09:16
IIC的12864,除了電地外2路數(shù)據(jù),2個(gè)傳感器的鏈接就是stc15w408as的2組串口引腳,沒多復(fù)雜,程序內(nèi)部有對 ...

Void main()
{
   u8 x;
}
這一段出現(xiàn)警告,說x未被引用。
ID:446113 發(fā)表于 2019-1-25 14:48
omer 發(fā)表于 2019-1-25 09:19
沒有夏普傳感器,同時(shí)不明確型號,沒法作出比較。家里有某訊的M1,顆粒物傳感器一個(gè)廠家,數(shù)值幾乎一致; ...

好的那我在認(rèn)真看多幾遍程序,真的太感謝了
ID:205015 發(fā)表于 2019-1-25 09:19
51hei團(tuán)團(tuán) 發(fā)表于 2019-1-25 02:47
和夏普的傳感器想必哪個(gè)更好呢?

沒有夏普傳感器,同時(shí)不明確型號,沒法作出比較。家里有某訊的M1,顆粒物傳感器一個(gè)廠家,數(shù)值幾乎一致;
ID:205015 發(fā)表于 2019-1-25 09:16
GodWorks 發(fā)表于 2019-1-25 08:18
可否提供一下電器原理圖呢?

IIC的12864,除了電地外2路數(shù)據(jù),2個(gè)傳感器的鏈接就是stc15w408as的2組串口引腳,沒多復(fù)雜,程序內(nèi)部有對應(yīng)的引腳定義,讀下程序就能找到了。有不懂得可以提問。
ID:205015 發(fā)表于 2019-1-25 09:14
主程序pm數(shù)值的顯示有幾個(gè)錯(cuò)誤,修正一下錯(cuò)誤;調(diào)整HCHO對其左側(cè)0位置,請?zhí)鎿Q下。
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 發(fā)表于 2019-1-25 08:18
可否提供一下電器原理圖呢?
ID:446113 發(fā)表于 2019-1-25 08:12
omer 發(fā)表于 2019-1-18 13:35
鏈接:https://pan.baidu.com/s/18WKYwQf4Pm848L8Imv1ZVQ
提取碼:7pbn

感謝樓主的無私奉獻(xiàn),樓主萬歲萬歲萬萬歲。
ID:328014 發(fā)表于 2019-1-25 02:47
和夏普的傳感器想必哪個(gè)更好呢?
ID:205015 發(fā)表于 2019-1-23 15:36
跑了幾天發(fā)現(xiàn)顆粒物的數(shù)值會(huì)有超出正常很高的情況(數(shù)據(jù)解析出錯(cuò)),修改了主程序,避免無校驗(yàn)導(dǎo)致的程序跑死。跑幾天看看。貼出主程序。
  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位數(shù)據(jù),可變波特率
  17.         AUXR |= 0x01;                //串口1選擇定時(shí)器2為波特率發(fā)生器
  18.         AUXR &= 0xFB;                //定時(shí)器2時(shí)鐘為Fosc/12,即12T
  19.         T2L = 0xE8;                //設(shè)定定時(shí)初值
  20.         T2H = 0xFF;                //設(shè)定定時(shí)初值
  21.        
  22.         AUXR |= 0x10;                //啟動(dòng)定時(shí)器2
  23.         EA=1;
  24.         ES=1;
  25. }

  26. //發(fā)送一個(gè)byte;
  27. void sendonebyte(unsigned char udat)
  28. {
  29.         SBUF=udat;
  30.         while(!TI);
  31.         TI=0;
  32. }
  33. //發(fā)送字符串;
  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; //個(gè)位;
  74. }

  75. void hcho_T()   //flag=1,計(jì)算甲醛
  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 請求數(shù)據(jù)命令;
  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()   //上電 轉(zhuǎn)化pm5003位被動(dòng)模式;
  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為事先定義的接收緩存,可以持續(xù)接收,直到你需要串口數(shù)據(jù)時(shí)來取為止
  309.                 RI=0;//接收中斷信號清零,表示將繼續(xù)接收
  310.                 n++;
  311.         }
  312.        
  313.         if((RI==1)&&(flag==0))
  314.         {
  315.        
  316.                 a[m]=SBUF; // a為事先定義的接收緩存,可以持續(xù)接收,直到你需要串口數(shù)據(jù)時(shí)來取為止
  317.                 RI=0;//接收中斷信號清零,表示將繼續(xù)接收
  318.                 m++;
  319.                 if(m==32)
  320.                 m=0;
  321.         }
  322.                
  323. }
  324.                
復(fù)制代碼

評分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 回帖助人的獎(jiǎng)勵(lì)!

查看全部評分

ID:205015 發(fā)表于 2019-1-18 13:35
本帖最后由 omer 于 2019-1-25 09:27 編輯

鏈接:https://pan.baidu.com/s/18WKYwQf4Pm848L8Imv1ZVQ
提取碼:7pbn

增加簡單校驗(yàn),防止程序解析跑死,對齊HCHO使顯示一致,修改顯示的幾個(gè)小錯(cuò)誤。重傳全部代碼如下:
鏈接:https://pan.baidu.com/s/1PEFm2YTODLFywM6pLOD11g
提取碼:qi8z


小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表