經過搜尋網路上別人的經驗後, 發現這一篇討論串也提到相同的問題, 解決方法就是將 Arduino 原本用來讀取 HC-SR04 的 echo 訊號的腳位先故意設為輸出模式, 並且輸出低電位後一小段時間, 再重新設定回輸入模式, 就可以喚醒 HC-SR04, 或者說是 echo 的功能。
我自己把上述作法寫成以下的程式, 只要 pulseIn() 傳回 0, 我就採取前述對策:
const int echoPin = 11; const int triggerPin = 12; unsigned long ping1() { unsigned long pulse; digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); pulse = pulseIn(echoPin, HIGH, 50000); if(pulse == 0) { pinMode(echoPin, OUTPUT); digitalWrite(echoPin, LOW); delay(100); pinMode(echoPin, INPUT); } return pulse; }
另外, HC-SR04 似乎對供電非常敏感, 我使用的有些 Arduino UNO 板如果只靠 USB 供電, 即使套用上述作法, 仍然無效, 必須外加電源供電, 才會正常, 也提供給大家參考。