Почему if не всё выполняет?
- Войдите на сайт для отправки комментариев
Написал простой проектик управления некоторыми приборами в доме (кухне) голосом.
Всё вроде отлично ... даже прикольно. Не понятно работает только функция условия if.
То что в фигурных скобках три строки кода №73, 74, 75 выполняются своеобразно:
74 выполнется отлично
75 через 2...3 секунды после 73
76 не всегда выполняется.
Когда переставляю содержимое местами всё так и остаётся.
Пока подобрал такую расстановку, что устраивает. Но хотелось бы на будущее понимать.
Почему if не выполняет всё? может глюки компилятора?
На delay () не обращайте внимания. Это на время отладки, чтобы успеть увидеть процесс.
Стаж 2 месяца. Поэтому прошу очень узкоспециальных терминов избегать или разъяснять.
[code] /*Программa My home. * Обеспечивает двустороннюю связь с мобильным телефоном без WiFi * Назначение виртуальных портов в приложении Blynk: * А0 (V14) - визуализация аналогового фотосопротивления; * V0 - задатчик автоматического порога освещённости; * V1 - светодиод автоматич. включения реле освещения; * V2 - светодиод принудительного включения освещения; * V3 - кнопка включения/выключения освещения; * ****************************** * V4 - кнопка принудительного включения полива; * V5 - визуализация датчика влажности; * V6 - визуализация датчика температуры; * V7 - кнопка принудительного включения обогревателя; * V8 - задатчик порога влажности; * V9 - задатчик порога температуры; * V10 - светодиод принудительного включения обогрева; * V11 - светодиод автоматического включения обогрева; * V12 - светодиод автоматического включения полива; * V13 - светодиод принудительного включения полива. * xxxxF - переменные для работы с освещением * xxxxH - переменные для работы с влажностью * xxxxT - переменные для работы с температурой */ #define DHTPIN D2// Выход от датчика DHT22 #define LED D3 // светодиод подключен к пину Реле освещения автоматичю #define LED2 D4 // светодиод подключен к пину Реле освещения ручное #define PHOTO A0 // фоторезистор подключен к пину A0 #define LED3 D5 // светодиод подключен к пину Реле нагрева автоматичю #define LED4 D6 // светодиод подключен к пину Реле нагрева ручное #define LED5 D7 // светодиод подключен к пину Реле полива автоматичю #define LED6 D8 // светодиод подключен к пину Реле полива ручное #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include "DHT.h" #define DHTTYPE DHT22 int releF, releT, valueT, releH, sensorF, valueF, sensorH, valueH; float sensorT; char auth[] = "675441d696a47c384808aeb2b552c41"; char ssid[] = "ZTE46508"; char pass[] = "04112008"; DHT dht(DHTPIN, DHTTYPE); void setup(){ Blynk.begin(auth, ssid, pass); pinMode(LED2, OUTPUT); pinMode(LED, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED5, OUTPUT); pinMode(LED6, OUTPUT); } BLYNK_CONNECTED(){ Blynk.syncAll();} BLYNK_WRITE(V0){valueF = param.asInt();} BLYNK_WRITE(V8){valueH = param.asInt();} BLYNK_WRITE(V9){valueT = param.asInt();} BLYNK_WRITE(V3){ releF = param.asInt(); digitalWrite (LED2, releF); if (releF == 0){ Blynk.virtualWrite(V2, 0); } if (releF != 0){ Blynk.virtualWrite(V2, 1023); } } BLYNK_WRITE(V4){ releH = param.asInt(); digitalWrite (LED6, releH); if (releH == 0){ Blynk.virtualWrite(V13, 0); } if (releH != 0){ Blynk.virtualWrite(V13, 1023); } } BLYNK_WRITE(V7){ releT = param.asInt(); digitalWrite (LED4, releT); if (releT == 0){ Blynk.virtualWrite(V10, 0); } if (releT != 0) { Blynk.virtualWrite(V10, 1023); delay (valueT*300); Blynk.virtualWrite(V15, 0); Blynk.virtualWrite(V10, 0); digitalWrite (LED4, LOW);} } void loop() { // delay(500); Blynk.run(); sensorF = analogRead(PHOTO); if (sensorF <= valueF - 1) {digitalWrite(LED, HIGH); Blynk.virtualWrite(V1, 1023);} if (sensorF > valueF + 1) {digitalWrite(LED, LOW); Blynk.virtualWrite(V1, 0);} sensorH = dht.readHumidity(); if (sensorH < valueH - 1) {digitalWrite(LED5, HIGH); Blynk.virtualWrite(V12, 1023);} if (sensorH >= valueH + 1) {digitalWrite(LED5, LOW); Blynk.virtualWrite(V12, 0);} Blynk.virtualWrite(V5, sensorH); sensorT = dht.readTemperature(); if (sensorT < valueT - 0.5) {digitalWrite(LED3, HIGH); Blynk.virtualWrite(V11, 1023);} if (sensorT >= valueT + 0.5) {digitalWrite(LED3, LOW); Blynk.virtualWrite(V11, 0);} Blynk.virtualWrite(V6, sensorT); Blynk.virtualWrite(V14, sensorF); } [/code]
Плата ESP 8266. IDE 1.8.8
Почему if не всё выполняет?
А с чего он должен всё выполнять?
----------
- Странные у Вас часы!
- Чем?
- Показывают день недели, а который час не показывают.
- С какой стати часы обязаны всё показывать?
Там нет часов!!!!
И даже если бы и были. Всё что в if должно же выполняться. Всё что в фигурных скобках. Все строчки.
Да, ладно Вам! Про часы это цитата из Джерома. Просто про то, что никто не обязан ВСЁ делать :)
Так что сне теперь ... последовательно три if писать?
С чего вы решили, что они не выполняются?
Так вижу выполнение (невыаолнение) на экране смартфона
PS Русские буквы стёрлись на клаве ноута. Почти наугад пишу. Извините за опечатки
Хорошо, задам вопрос иначе. С чего вы решили, что не выполняется какой-то if() , а не, скажем, BLYNK_WRITE(V7)() ?
V - это виртуальные порты. Их состояние видно на экране смартфона. На мнемосхеме.
Так часть строк выполняется же. Первая после delay выполняется отлично. А следующие всё позже и позже.
Не знаю как делают профессиональные программисты, как Евгений, но я поступаю просто, особенно если много условий. Вместо штатной функции, возвращающей живые данные (греть термометр до 110гр или охлаждать до -30гр, согласитесь, идиотизм), подсовываю программе функцию эмулятор, которая генерит данные понуждающие выполняться все ветки ифов и смотрю на их реакцию. Если не соответствует ожиданиям, начинаем мониторить сериалпринтом и вдумчиво рыться. Программа выполняет только то, что мы написали, а не наше видение ее работы.
Суньте под if() : Serial.print("I'm checkpoint @ "); Serial.println(millis()); и убедитесь, что if работает всегда.
Мне не нужно мониторить. На экране мгновенно всё видно. Не получается картинки вставить. А то бы скрин этого экрана показал.
Меняю строки местами ... порядок выполнения не меняется.
*******
if (a|=0) {
b = 3;
c = 5;
d = 6;}
***
Так if не работает?
Работает. Добавьте к нему else и убедитесь, что он работает лучше, чем автомат Калашникова.
Работает это так:
Говорю в телефон "установить таймер на 2 минуты". На экране виртуальный движок (valyeT) поворачивается до цифры 2. Потом говорю "включить свет". releT становится равно 1023. Реальный пин ESP ... LED4 становится HIGH. Срабатывает этот if. Отрабатывает delay(). Потом кнопка releT должна обнулиться. Движок виртуального резистора обнулиться. На реальном пине ESP LED4 обнулиться. Все состояния вижу на экране и внатуре.
delay на millis заменю потом.
Так понятно рассказал?
Пока процессы неторопливые ... эти полуглюки особо не мешают. А если надо что то быстродействующее - тогда проблемы
Т.е. я так понимаю, что опять виноват Си, а не криворукий пейсатель.
Ну, ОК. Вернитесь в 1972-й и скажите его разработчикам, что они совершают историческую ошибку, вводя в язык оператор if(), который в 2019-м году перестанет работать.
там в 73 строке у valueT тип int , а у параметра delay д.б. тип unsigned long попробуйте разобраться сначала с этим.
с millis аналогичная ситуация
опять виноват Си, а не криворукий пейсатель.
А что, когда-то было по-другому?
Ясно. Ответ не знаете. И что бы не потерять лица ... плавно переходите к оскорблениям.
***
Я вот думаю ... мои виртуальные порты переключаются через удалённый сервер. Может он с задержкой реагирует. Попробую небольшие задержки после каждой строчки 73 ... 75 вставить.
Я вот думаю ... мои виртуальные порты переключаются через удалённый сервер. Может он с задержкой реагирует.
О! Начали появляться разумные мысли. Только лучше бы вы Serial.print вставили, как вам Sadman уже советовал.
Sadman уже передумал. У меня на экране смартфона видно всё и сразу.
Sadman уже передумал. У меня на экране смартфона видно всё и сразу.
Ну вот, разумные мысли опять пропали....
Это мой третий прикладной сайт. На первом я два с половиной года раскидывал на атомы и собирал в родню ГАЗ-69 (что на авке). На втором гидравлический домашний пресс на 400 тонн. Теперь вот здесь.
И везде были троли. Не давая советов, пиарились с умным видом над новичками.
Завязывайте с веществами. Совет вам дан. Если вы его понимать не желаете - дело ваше. Но не надо слюнями тут брызгать.
Да пробовал оба совета. На мониторе то же, что и на телефоне. Замена переменной в delay на число 2000 ... тоже ничего не дало. Делать паузы ожидая ответ сервера ещё не пробовал. Паутину смотрел по НТВ.
***
Не я первый начал
На втором гидравлический домашний пресс на 400 тонн. Теперь вот здесь.
точно тонн?
Да. Там и фото есть.
Послушайте. Муж долговой! Если вы чей-то там муж - значит вам не 13 лет.
Подумайте, неужели вам не понятно, что IF-ы в скетче не могут отрабатывают по частям. Это просто смешно.
Если у вас такое происходит - значит у вас или скетч кривой. или тот сайт, на котором вы это проверяете.
Стаж 2 месяца. Поэтому прошу очень узкоспециальных терминов избегать или разъяснять.
"Бить нельзя их, а не вникнут - обьяснять..." (с)
Жалка.
К слову - этот странный if там бесполезен более чем полностью и заменяется на else для предыдущего. А вот с Int-ом в delay() приключений найти на задницу себе можно легко - это верно.
и убедитесь, что if работает всегда.
поверь глючная Arduino IDE работает не всегда. Может в принципе условия пропускать - проверено
Да пробовал оба совета. На мониторе то же, что и на телефоне.
надо так сделать и выложить результат из монитора
и убедитесь, что if работает всегда.
поверь глючная Arduino IDE работает не всегда. Может в принципе условия пропускать - проверено
Пруфы? Номер решения суда по делу о мошеннических действиях Arduino IDE? ЕвгенийП, наверно, сейчас чаем подавился от таких заявлений.
Я и сам получал по сусалам от компилятора, когда в if() совал не то, что полагается. Однако это была моя вина, а не подсудимого.
и убедитесь, что if работает всегда.
поверь глючная Arduino IDE работает не всегда. Может в принципе условия пропускать - проверено
if (криворукость==полная)
{пропустить условие,
не отработать эту строчку}
else
{ выполнить условие}
Пруфы? Номер решения суда по делу о мошеннических действиях Arduino IDE?
очень долго искать и там скетч громадный на 4000 строк
но по памяти пишешь через if не работает, пишешь через switch работает
причем не работало даже если ты внутри if просто значение глобальной пременно меняешь. Для отлавливания стоял Serial перед условием, внутри и после и в разных комбинациях. Во всех случаях компилятор просто игнорировал все что внутри условия. пробовал не только с переменно а в принципе разный код внутрь пихать - бесполезно. полный игнор. а условие было (1) и тоже разные подставлял чтобы истинность была
Я и сам получал по сусалам от компилятора, когда в if() совал не то, что полагается.
Я и сам получал по сусалам от компилятора, когда в if() совал не то, что полагается.
Это, например, сунуть в if() неинициализированную переменную. Тогда компилятор считает, что раз так - то на результат программисту пофиг и выкидывает код для этого if() целиком из объектного кода. Не по частям, а целиком.
Ну, глючная ли Arduino IDE или нет, можно обсуждать. Но компиляцией кода не она занимается. Так что ее, возможная, глючность к обрабоке if-ов никак не относится.
Ну, глючная ли Arduino IDE или нет, можно обсуждать. Но компиляцией кода не она занимается. Так что ее, возможная, глючность к обрабоке if-ов никак не относится.
я имею ввиду целиком связка среда + компилятор. Опать же, может это глюки редактора Arduino IDE. Я не знаю как она работает вообще
Это, например, сунуть в if() неинициализированную переменную.
в большинстве случаев ошибки выкидывает, по крайне мере с обычными переменными.
Не ошибки, а предупреждения. Но кому интересно мнение компилятора...
Я не знаю как она работает вообще
оно и видно. А виноват, как всегда - компилятор.
"Я ничего не делал - оно само" (с)
Смешная тема.
поверь глючная Arduino IDE работает не всегда. Может в принципе условия пропускать - проверено
Простите, Вы всегда оставляли впечатление разбирающегося человека, но ляпнуть такое ... Вы выпили или покурили чего-то?
ЕвгенийП, наверно, сейчас чаем подавился от таких заявлений.
Если бы чаем! Задолбался клавиатуру от кефира отмывать! :(
Есть на этот счет решение.