Коллеги читайте Дата-шит, не побоюсь этого слова. Датчик сам формирует импульс длительности на ноге echo. Длительность импульса 150мкс-25мс. Т.е. максимальная дальность не более 400 см. Запускается процесс измерения импульсом 10 мкс на другой ноге. Условие отсутствия препятствия 38мс. Точность +-3 см на максимальной дальности.
Вопрос, RTOS зачем нужен? Тем более, что измерение, как я понимаю, запускается кнопкой вручную.
Вот один из примеров реализации. Причем без библиотек.
http://research.andbas.com/2011/12/hc-sr04.html
int ledPin = 9;
int trigPin = 10;
int echoPin = 11;
long distance;
int ledLevel;
void setup() {
pinMode(trigPin,OUTPUT);
pinMode(echoPin,INPUT);
}
void loop() {
distance = getDistance();
ledLevel = (int) (distance*10)‹=255?255-distance*10:0;
analogWrite(ledPin, ledLevel);
delay(50);
}
long getEchoTiming() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin,HIGH);
return duration;
}
long getDistance() {
long distacne_cm = getEchoTiming()/29/2;
return distacne_cm;
}
Определение длительности импульса производится встроенной функцией pulseIn(), а именно:
"duration = pulseIn(echoPin,HIGH);. Функция pulseIn(...) возвращает long значение в микросекундах через то время, когда на указанном входе появится логическая единица (в нашем случае это вход номер 11). Как только на входе 11 появляется логическая единица - этот метод возвращает количество микросекунд за которое сигнал вернулся."
Нужно только встроить опрос кнопки либо в цикле, либо по прерыванию по изменению состояния пина.
Управление диодом заменяется Serial.println(xxx) и LCD.print(xxx). Естественно после инициализации обоих устройств.