找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 18527|回復(fù): 31
收起左側(cè)

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

  [復(fù)制鏈接]
ID:205015 發(fā)表于 2019-1-18 11:18 | 顯示全部樓層 |閱讀模式
12864顯示;
adc采集bandgap電壓顯示;
使用100K NTC測(cè)溫顯示;

       家里的新房交付,自帶簡(jiǎn)單裝修,添置了些家具草草入住,同時(shí)考慮室外空氣質(zhì)量也比較差勁,更換了凈化器的濾芯、添置了壁掛新風(fēng),考慮囊中羞澀,決定自己買傳感器,拿51和12864來(lái)DIY個(gè)檢測(cè)器;說(shuō)在前面:
        這個(gè)東西個(gè)人感覺(jué)沒(méi)法定性也沒(méi)必要,有個(gè)參考就可以了。
傳感器:        淘寶找得基本最便宜的:國(guó)產(chǎn)達(dá)特WZ-S-K,帶引腳的;PMS5003,不帶溫濕度、不帶甲醛款;
其他配置:
        玩蘿麗控陸續(xù)攢的STC15w408AS、IIC接口的12864白色OLED屏;
原理:
        兩個(gè)傳感器都是串口,均支持主動(dòng)、被動(dòng)通信;收發(fā)地一連,MCU接收傳感器發(fā)來(lái)的數(shù)據(jù),做個(gè)數(shù)據(jù)解析并給12864顯示就完工了。
遇到的問(wèn)題:
        STC15W408AS自帶1個(gè)串口,要與2個(gè)設(shè)備通信;
解決方法1:
        按照網(wǎng)上的方法直連,經(jīng)測(cè)試,估計(jì)引腳的輸出能力偏弱,攀藤就被干掉了;失;
解決方法2:
        翻看STC的手冊(cè),這貨可以分時(shí)的方式切換串口到第二、第三組引腳;16pin的stc15引腳比較少,但也有2組可用,滿足要求。
程序主要思路:
       通過(guò)設(shè)定flag的0、1狀態(tài),同時(shí)配合切換串口位置,分時(shí)發(fā)送命令給傳感器,分時(shí)接收數(shù)據(jù)并做簡(jiǎn)單判斷、解析并在12864上作出顯示。
存在的問(wèn)題:
       未做數(shù)據(jù)的校驗(yàn)及錯(cuò)誤情況的判斷及軟件重置。反正跑死了,手動(dòng)重啟就好啦。。。

補(bǔ)充說(shuō)明:


      1,PMS5003默認(rèn)主動(dòng)發(fā)送數(shù)據(jù),掉電會(huì)自動(dòng)恢復(fù)默認(rèn)主動(dòng)的發(fā)送情形,因此程序在每次上電時(shí)主動(dòng)發(fā)送命令,使其工作在被動(dòng)模式;
甲醛傳感器貌似沒(méi)啥影響,串口切到被動(dòng)后,沒(méi)注意掉電會(huì)不會(huì)恢復(fù)主動(dòng),測(cè)試顯示數(shù)據(jù)沒(méi)發(fā)現(xiàn)異常就沒(méi)管它。發(fā)帖此時(shí)傳感器沒(méi)在手上,因此就不做測(cè)試,后續(xù)再議了。
      2,PMS5003的官網(wǎng)手冊(cè),最后一些關(guān)于校驗(yàn)的協(xié)議,像是沒(méi)寫完,沒(méi)有句號(hào),也沒(méi)明確2個(gè)校驗(yàn)字節(jié)的具體內(nèi)容,因此通過(guò)官方要來(lái)了基本協(xié)議的解釋,再次感謝熱情的攀藤小姐姐。分享以下:
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
檢測(cè)顯示: 4.jpg
2.jpg

雜亂的全家福: 3.jpg

單片機(jī)源程序如下:
  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位數(shù)據(jù),可變波特率
  15.         AUXR |= 0x01;                //串口1選擇定時(shí)器2為波特率發(fā)生器
  16.         AUXR &= 0xFB;                //定時(shí)器2時(shí)鐘為Fosc/12,即12T
  17.         T2L = 0xE8;                //設(shè)定定時(shí)初值
  18.         T2H = 0xFF;                //設(shè)定定時(shí)初值
  19.         
  20.         AUXR |= 0x10;                //啟動(dòng)定時(shí)器2
  21.         EA=1;
  22.         ES=1;
  23. }

  24. //發(fā)送一個(gè)byte;
  25. void sendonebyte(unsigned char udat)
  26. {
  27.         SBUF=udat;
  28.         while(!TI);
  29.         TI=0;
  30. }
  31. //發(fā)送字符串;
  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;  //萬(wàn)位;
  68.         b[3]=(num/1000)%10; //千位;
  69.         b[2]=(num/100)%10; //百位;
  70.         b[1]=(num/10)%10; //十位;
  71.         b[0]=(num/1)%10; //個(gè)位;
  72. }

  73. void hcho_T()   //flag=1,計(jì)算甲醛
  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 請(qǐng)求數(shù)據(jù)命令;
  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為事先定義的接收緩存,可以持續(xù)接收,直到你需要串口數(shù)據(jù)時(shí)來(lái)取為止
  289.                 RI=0;//接收中斷信號(hào)清零,表示將繼續(xù)接收
  290.                 n++;
  291.         }
  292.         
  293.         if((RI==1)&&(flag==0))
  294.         {
  295.         
  296.                 a[m]=SBUF; // a為事先定義的接收緩存,可以持續(xù)接收,直到你需要串口數(shù)據(jù)時(shí)來(lái)取為止
  297.                 RI=0;//接收中斷信號(hào)清零,表示將繼續(xù)接收
  298.                 m++;
  299.                 if(m==32)
  300.                 m=0;
  301.         }
  302.                
  303. }
  304.                
復(fù)制代碼
0.png
所有資料51hei提供下載:
12864_ser2019pm.zip (155.89 KB, 下載次數(shù): 138)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:205015 發(fā)表于 2019-1-18 13:35 | 顯示全部樓層
本帖最后由 omer 于 2019-1-25 09:27 編輯

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

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


回復(fù)

使用道具 舉報(bào)

ID:205015 發(fā)表于 2019-1-23 15:36 | 顯示全部樓層
跑了幾天發(fā)現(xiàn)顆粒物的數(shù)值會(huì)有超出正常很高的情況(數(shù)據(jù)解析出錯(cuò)),修改了主程序,避免無(wú)校驗(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;  //萬(wàn)位;
  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 請(qǐng)求數(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í)來(lái)取為止
  309.                 RI=0;//接收中斷信號(hào)清零,表示將繼續(xù)接收
  310.                 n++;
  311.         }
  312.        
  313.         if((RI==1)&&(flag==0))
  314.         {
  315.        
  316.                 a[m]=SBUF; // a為事先定義的接收緩存,可以持續(xù)接收,直到你需要串口數(shù)據(jù)時(shí)來(lái)取為止
  317.                 RI=0;//接收中斷信號(hào)清零,表示將繼續(xù)接收
  318.                 m++;
  319.                 if(m==32)
  320.                 m=0;
  321.         }
  322.                
  323. }
  324.                
復(fù)制代碼

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2019-1-25 02:47 | 顯示全部樓層
和夏普的傳感器想必哪個(gè)更好呢?
回復(fù)

使用道具 舉報(bào)

ID:446113 發(fā)表于 2019-1-25 08:12 | 顯示全部樓層
omer 發(fā)表于 2019-1-18 13:35
鏈接:https://pan.baidu.com/s/18WKYwQf4Pm848L8Imv1ZVQ
提取碼:7pbn

感謝樓主的無(wú)私奉獻(xiàn),樓主萬(wàn)歲萬(wàn)歲萬(wàn)萬(wàn)歲。
回復(fù)

使用道具 舉報(bào)

ID:446113 發(fā)表于 2019-1-25 08:18 | 顯示全部樓層
可否提供一下電器原理圖呢?
回復(fù)

使用道具 舉報(bào)

ID:205015 發(fā)表于 2019-1-25 09:14 | 顯示全部樓層
主程序pm數(shù)值的顯示有幾個(gè)錯(cuò)誤,修正一下錯(cuò)誤;調(diào)整HCHO對(duì)其左側(cè)0位置,請(qǐng)?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);
}
回復(fù)

使用道具 舉報(bào)

ID:205015 發(fā)表于 2019-1-25 09:16 | 顯示全部樓層
GodWorks 發(fā)表于 2019-1-25 08:18
可否提供一下電器原理圖呢?

IIC的12864,除了電地外2路數(shù)據(jù),2個(gè)傳感器的鏈接就是stc15w408as的2組串口引腳,沒(méi)多復(fù)雜,程序內(nèi)部有對(duì)應(yīng)的引腳定義,讀下程序就能找到了。有不懂得可以提問(wèn)。
回復(fù)

使用道具 舉報(bào)

ID:205015 發(fā)表于 2019-1-25 09:19 | 顯示全部樓層
51hei團(tuán)團(tuán) 發(fā)表于 2019-1-25 02:47
和夏普的傳感器想必哪個(gè)更好呢?

沒(méi)有夏普傳感器,同時(shí)不明確型號(hào),沒(méi)法作出比較。家里有某訊的M1,顆粒物傳感器一個(gè)廠家,數(shù)值幾乎一致;
回復(fù)

使用道具 舉報(bào)

ID:205015 發(fā)表于 2019-1-25 09:44 | 顯示全部樓層
更新集成后的圖片。 a2.png


a3.jpg


a2.jpg


回復(fù)

使用道具 舉報(bào)

ID:446113 發(fā)表于 2019-1-25 14:48 | 顯示全部樓層
omer 發(fā)表于 2019-1-25 09:19
沒(méi)有夏普傳感器,同時(shí)不明確型號(hào),沒(méi)法作出比較。家里有某訊的M1,顆粒物傳感器一個(gè)廠家,數(shù)值幾乎一致; ...

好的那我在認(rèn)真看多幾遍程序,真的太感謝了
回復(fù)

使用道具 舉報(bào)

ID:446113 發(fā)表于 2019-1-25 15:06 | 顯示全部樓層
omer 發(fā)表于 2019-1-25 09:16
IIC的12864,除了電地外2路數(shù)據(jù),2個(gè)傳感器的鏈接就是stc15w408as的2組串口引腳,沒(méi)多復(fù)雜,程序內(nèi)部有對(duì) ...

Void main()
{
   u8 x;
}
這一段出現(xiàn)警告,說(shuō)x未被引用。
回復(fù)

使用道具 舉報(bào)

ID:205015 發(fā)表于 2019-1-26 14:08 | 顯示全部樓層

沒(méi)用到的,可以干掉。應(yīng)該是做別功能的時(shí)候用到的,警告可以忽略。
回復(fù)

使用道具 舉報(bào)

ID:576501 發(fā)表于 2019-7-2 16:14 | 顯示全部樓層
樓主我想請(qǐng)教你,怎么加你呢
回復(fù)

使用道具 舉報(bào)

ID:575119 發(fā)表于 2019-7-20 20:00 | 顯示全部樓層
樓主,如果方便,麻煩你發(fā)下Proteus 的仿真DSN文件唄,謝謝
回復(fù)

使用道具 舉報(bào)

ID:136083 發(fā)表于 2019-7-22 09:54 | 顯示全部樓層
這個(gè)創(chuàng)意很好,圍觀中。
回復(fù)

使用道具 舉報(bào)

ID:421308 發(fā)表于 2019-7-22 10:56 | 顯示全部樓層
學(xué)習(xí)中
回復(fù)

使用道具 舉報(bào)

ID:589925 發(fā)表于 2019-7-24 19:57 | 顯示全部樓層
感謝樓主,準(zhǔn)備弄個(gè),可惜小白,不會(huì)
回復(fù)

使用道具 舉報(bào)

ID:342663 發(fā)表于 2019-10-26 12:28 | 顯示全部樓層
請(qǐng)問(wèn)樓主有沒(méi)有元器件清單啊
回復(fù)

使用道具 舉報(bào)

ID:526058 發(fā)表于 2019-11-10 20:43 | 顯示全部樓層
我也在做一個(gè)甲醛和PM2.5的測(cè)試儀,和你用的傳感器一模一樣。
回復(fù)

使用道具 舉報(bào)

ID:526058 發(fā)表于 2019-11-10 20:47 | 顯示全部樓層
攀縢pm7003和達(dá)特WZ-S.差不多都是70+ rmb/個(gè)。
回復(fù)

使用道具 舉報(bào)

ID:665054 發(fā)表于 2019-12-16 13:07 | 顯示全部樓層
你好, 按照您的 做出來(lái)啦。PM2.5的都能顯示但是甲醛的不顯示數(shù)據(jù)  不知道怎么回事
回復(fù)

使用道具 舉報(bào)

ID:136485 發(fā)表于 2020-3-5 12:02 | 顯示全部樓層
學(xué)習(xí)下,多謝分享
回復(fù)

使用道具 舉報(bào)

ID:626079 發(fā)表于 2020-3-10 17:03 | 顯示全部樓層
不明白為什么樓主要取消云盤分享? 怕別人學(xué)習(xí)到了?理解你,但個(gè)人覺(jué)得沒(méi)有必要,既然分享出來(lái)就大家看你的程序,對(duì)各自的學(xué)習(xí)進(jìn)行提高,不是每個(gè)人都要做出這個(gè)玩意,說(shuō)實(shí)話網(wǎng)上這也就一兩百塊的事。好點(diǎn)的也是300塊左右。 為什么我們的技術(shù)在國(guó)際上這么落后? 你既然學(xué)到,我相信也是學(xué)習(xí)了很多別人分享的東西,逛這個(gè)論壇的,我相信學(xué)生是很大部分,希望他們多學(xué)習(xí),多進(jìn)步,為國(guó)家的發(fā)展做真正的貢獻(xiàn),逛這個(gè)論壇的我相信一定比那些所謂的看啥演唱會(huì),追星的師兄要值得肯定,至少說(shuō)明他們有上進(jìn)的心。
個(gè)人所言。不喜請(qǐng)忽略。
回復(fù)

使用道具 舉報(bào)

ID:136485 發(fā)表于 2020-3-13 11:45 | 顯示全部樓層
本帖最后由 kxcuser 于 2020-3-17 16:17 編輯

請(qǐng)教一下這句能詳細(xì)講解下嗎zong=((d[2]>>4)*16+(d[2]&0x0f))*256+d[3];這是把16進(jìn)制轉(zhuǎn)換成十進(jìn)制嗎,還有傳感器計(jì)算公式嗎
回復(fù)

使用道具 舉報(bào)

ID:205015 發(fā)表于 2020-3-29 09:26 | 顯示全部樓層
kxcuser 發(fā)表于 2020-3-13 11:45
請(qǐng)教一下這句能詳細(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)換的過(guò)程。不過(guò)這個(gè)公式是否正確,我現(xiàn)在再來(lái)看,有些糊涂了。。。
傳感器的數(shù)據(jù)格式可以看官方提供的手冊(cè)。
回復(fù)

使用道具 舉報(bào)

ID:205015 發(fā)表于 2020-3-29 09:29 | 顯示全部樓層
f516411213 發(fā)表于 2019-12-16 13:07
你好, 按照您的 做出來(lái)啦。PM2.5的都能顯示但是甲醛的不顯示數(shù)據(jù)  不知道怎么回事

2個(gè)傳感器直接接在串口助手下看下數(shù)據(jù),記得有一個(gè)是需要先發(fā)數(shù)據(jù)把它改成被動(dòng)模式。
可以考慮在程序中上電時(shí)執(zhí)行一次把主動(dòng)轉(zhuǎn)被動(dòng)。
回復(fù)

使用道具 舉報(bào)

ID:205015 發(fā)表于 2020-3-29 09:30 | 顯示全部樓層
xmfjfhcel 發(fā)表于 2020-3-10 17:03
不明白為什么樓主要取消云盤分享? 怕別人學(xué)習(xí)到了?理解你,但個(gè)人覺(jué)得沒(méi)有必要,既然分享出來(lái)就大家看你 ...

估計(jì)是到期了。。。沒(méi)主動(dòng)操作過(guò)。
回復(fù)

使用道具 舉報(bào)

ID:235017 發(fā)表于 2020-4-26 19:36 | 顯示全部樓層
樓主大大,可以再發(fā)一下整個(gè)文件嗎?
回復(fù)

使用道具 舉報(bào)

ID:235017 發(fā)表于 2020-4-26 19:42 | 顯示全部樓層
樓主,我也買了個(gè)這個(gè)傳感器,請(qǐng)問(wèn)您的作品中達(dá)特傳感器只接了VCC,GND,TX,Rx嗎?期待回復(fù)
回復(fù)

使用道具 舉報(bào)

ID:205015 發(fā)表于 2020-8-12 08:53 | 顯示全部樓層
ico_葉子 發(fā)表于 2020-4-26 19:42
樓主,我也買了個(gè)這個(gè)傳感器,請(qǐng)問(wèn)您的作品中達(dá)特傳感器只接了VCC,GND,TX,Rx嗎?期待回復(fù)

是的,串口通信只需要收發(fā)電地。如果使用攀藤的休眠功能,可以接個(gè)set引接。
回復(fù)

使用道具 舉報(bào)

ID:624444 發(fā)表于 2020-8-24 11:50 | 顯示全部樓層
雖然我不玩,但是能共享資源,還為大家解答疑問(wèn),這個(gè)必須支持,贊一個(gè)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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