Код для включения света по датчику приближения

Добрый день!
Прошу помочь найти ошибки или подсказать, как правильно написать код для следующей задачи:
Есть аналоговый датчик приближения, по которому должен подаваться сигнал на выход контроллера. Датчик приближения, в случае отсутствия препятствия выдает значение неких единиц в диапазоне от 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 секунд
}

при 1 строка 4 всегда сработает

Спасибо @anonimSimen , что исправил кавычки на апострофы!

Спасибо за ответы!

Т.е. надо поправить 21ю строку так:
if (Sensor1 > 1600 && Sensor1 < 4000) {
?

… и 24 тоже ))

а если вот так

if (4000 < Sensor1 > 1600) {

А вот интересно, в каких языках поддерживается подобная конструкция?

так С и поддерживает, только получим не то, что задумывали

warning: comparison of constant '1600' with boolean expression is always false [-Wbool-compare]

Объясните, в чем смысл верхнего предела в этом выражении?
Если датчик выдаст пять раз подряд слишком высокие значения - это ошибка?

А если попробовать самому?

Во многих, например, с С и С++

так уже )))

Это предупреждение на всякий случай, но всё компилируется правильно.

Кстати, этого предупреждения не будет, если, например, написать:

	if (4000 > Sensor1 > 0) {

Будет, правда, другое, которое я бы перевёл как: “это не то, что ты, возможно, думаешь” (оригинал: “comparisons like ‘X<=Y<=Z’ do not have their mathematical meaning”).

Но, повторяю, это предупреждения на всякий случай. Так-то, это вполне легальная конструкция, она будет правильно скомпилирована и будет правильно исполняться.

1 лайк

не могу придумать где это могло бы понадобиться

int Sensor1 = 3000;

void setup() {
 Serial.begin(115200);
}

void loop() {
if((4000 > Sensor1) == (Sensor1 > 1600))
Serial.println("в диапазоне от 1600 до 4000");
delay(1000);
}

Синтаксис то поддерживает, но я имел ввиду что бы подобной конструкцией проверялся диапазон от и до.

Бэйсик?

вы как маленькие прям…
Вроде все давно прожевано с этой конструкцией.
Используйте два отдельных сравнения и не сношайте мозг себе и другим…

Это спортивный интерес ))

Именно, спортивный интерес.)