那我手邊會有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歸零。這樣就可以正常運作啦...
沒有留言:
張貼留言