Добрый день!
Прошу помочь найти ошибки или подсказать, как правильно написать код для следующей задачи:
Есть аналоговый датчик приближения, по которому должен подаваться сигнал на выход контроллера. Датчик приближения, в случае отсутствия препятствия выдает значение неких единиц в диапазоне от 0 до 100. По мере приближения препятствия значение, выдаваемое датчиком, стремится к 1000. Необходимо уже на 200-300 единицах подавать сигнал на выход и держать его, пока препятствие не пропадет + 5 секунд.
Есть нюанс - у датчика приближения бывают помехи или наводки и иногда он ни с того ни сего выдает значение выше или ниже реального состояния дел. То есть если препятствия нет, может в один момент всё равно выдать, например, ~600 единиц, но потом сразу же возвращается к норм значениям.
Поэтому в коде пытаюсь нивелировать ошибку и при наборе нужного значения по датчику включить выход на 5 секунд. Но по факту выход работает самопроизвольно независимо от суммы показаний датчика:
const int relPin1 = 2; // Назначаю переменную на второй DI\DO
unsigned long int timing1; // Переменная для хранения точки отсчета
int Sensor1 = 0; // Добавляю переменную для датчика 1
void setup() {
Serial.begin(9600);
pinMode(relPin1, OUTPUT); // Назначаю второй DI\DO выходом
}
void loop() {
Sensor1 = Sensor1 + analogRead(A1); // Т.к. показания датчика приблиения скачут, суммирую его показания, чтобы уменьшить ошибки
delay(100);
Sensor1 = Sensor1 + analogRead(A1);
delay(100);
Sensor1 = Sensor1 + analogRead(A1);
delay(100);
Sensor1 = Sensor1 + analogRead(A1);
delay(100);
Sensor1 = Sensor1 + analogRead(A1);
if (4000 > Sensor1 > 1600) {
timing1 = millis(); // Присваиваю переменной "Таймер" значение времени на пройденного с момента запуска контроллера.
}
if (millis() - timing1 < 5000) {
digitalWrite(relPin1, HIGH); // Включить выход 1 на 5 секунд
}
else {
digitalWrite(relPin1, LOW);
}
Sensor1 = 0;
delay(10);
}
Почему нет? Формально здесь никаких ошибок нет, вполне нормальная конструкция. Предупреждение, конечно, выдаст (только потому, что тут вероятна ошибка), но вполне себе скомпилируется и будет правильно работать, только не так, как ТС ожидает.
if (4000 > Sensor1 > 1600) {
timing1 = millis(); // Присваиваю переменной “Таймер” значение времени на пройденного с момента запуска контроллера.
}
if (millis() - timing1 < 5000) {
digitalWrite(relPin1, HIGH); // Включить выход 1 на 5 секунд
}
Это предупреждение на всякий случай, но всё компилируется правильно.
Кстати, этого предупреждения не будет, если, например, написать:
if (4000 > Sensor1 > 0) {
Будет, правда, другое, которое я бы перевёл как: “это не то, что ты, возможно, думаешь” (оригинал: “comparisons like ‘X<=Y<=Z’ do not have their mathematical meaning”).
Но, повторяю, это предупреждения на всякий случай. Так-то, это вполне легальная конструкция, она будет правильно скомпилирована и будет правильно исполняться.