2018年11月12日 星期一

DHTxx時脈相衝問題

當要用DHTxx溫濕度計和其他有pulseIn這種指令的程式共用的時候,就會發現機器會當掉。測試很多次之後,發現是DHTxx的濕度程式應該會用到arduino裡面的某個timer,然後會跟pulseIn這種東西衝突。



溫度沒問題,濕度就不行了。

那我手邊會有PulseIn這種程式的,有超音波感測和MH-Z14a CO2感測器這些。所以如果要讓CO2感測器和DHTxx濕度同時出現的話,就會衝突當掉...MH-Z14a這個CO2感測器還不錯。有PWM, TX-RX腳位,還有analog輸出(不過這個我搞不定)。我喜歡用PWM腳位,因為這樣可以少接一條線(對,就是這種原因而已)。我買的版本,左邊還幫焊接上了排針接腳,但是要連接排線其實也不容易直接給arduino用,我就自己在上面焊接針腳了。

咦?我以前就把這兩個放在一起過,沒有當掉啊。這是因為CO2的程式是這樣寫的...

  do {
    th = pulseIn(CO2Pin, HIGH, 1004000) / 1000;
    tl = 1004 - th;
    ppm = 5000 * (th-2)/(th+tl-4);
      } while (th ==0);


這段是do while迴圈

意思是,只要th是0,就在這個迴圈裡面跑,直到th不等於0的時候,才跳出迴圈。

如果是if,就不是這樣。if的程式是會一直往下掃過去的。if條件成立,就執行;不成立就不執行。但不管有沒有執行,都會往下走。while迴圈則是只要條件還成立,就會在迴圈裡面一直跑。

所以這個pulseIn不會和DHTxx的濕度那邊執行的時候相衝。

啊那不就好了?

BUT...就是這個 BUT....如果用這個程式的話,假設沒有接上MH-Z14a,程式就會在迴圈裡面卡住出不來了。

如果這樣寫:

    th = pulseIn(CO2Pin, HIGH, 1004000) / 1000;
    tl = 1004 - th;
    ppm = 5000 * (th-2)/(th+tl-4);

也就是把那個while條件拿掉,就讓它跑數據出來的話,就會跟DHTxx 衝突了。


所以怎麼辦呢?我希望如果有裝CO2 sensor的時候,機器正常運作。沒有裝的時候也不要當掉的話,我就幹了一件事情,把程式改成這樣

  do {
    th = pulseIn(CO2Pin, HIGH, 1004000) / 1000;
    tl = 1004 - th;
    ppm = 5000 * (th-2)/(th+tl-4);
    count=count+1;                          
    if (count > 7){                     
      th =2;
      count =0;
    }
      } while (th ==0);

我加了一段count去計數,如果從1數到7,th還是等於0的話(通常這就表示沒有接機器啦),那就強迫th=2讓ppm=0,然後就可以跳出迴圈了,然後順便把count歸零。這樣就可以正常運作啦...


沒有留言: