Почему if не всё выполняет?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Написал простой проектик управления некоторыми приборами в доме (кухне) голосом.

Всё вроде отлично ... даже прикольно. Не понятно работает только функция условия 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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Муж_Долговой пишет:

Почему if не всё выполняет?

А с чего он должен всё выполнять?

----------

- Странные у Вас часы!
- Чем?
- Показывают день недели, а который час не показывают.
- С какой стати часы обязаны всё показывать?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Там нет часов!!!!

И даже если бы и были. Всё что в if должно же выполняться. Всё что в фигурных скобках. Все строчки.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, ладно Вам! Про часы это цитата из Джерома. Просто про то, что никто не обязан ВСЁ делать :)

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Так что сне теперь ... последовательно три if писать?

sadman41
Offline
Зарегистрирован: 19.10.2016

С чего вы решили, что они не выполняются?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Так вижу выполнение (невыаолнение) на экране смартфона

PS Русские буквы стёрлись на клаве ноута. Почти наугад пишу. Извините за опечатки

sadman41
Offline
Зарегистрирован: 19.10.2016

Хорошо, задам вопрос иначе. С чего вы решили, что не выполняется какой-то if() , а не, скажем, BLYNK_WRITE(V7)() ?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

V - это виртуальные порты. Их состояние видно на экране смартфона. На мнемосхеме.

Так часть строк выполняется же. Первая после  delay выполняется отлично. А следующие всё позже и позже.

bwn
Offline
Зарегистрирован: 25.08.2014

Не знаю как делают профессиональные программисты, как Евгений, но я поступаю просто, особенно если много условий. Вместо штатной функции, возвращающей живые данные (греть термометр до 110гр или охлаждать до -30гр, согласитесь, идиотизм), подсовываю программе функцию эмулятор, которая генерит данные понуждающие выполняться все ветки ифов и смотрю на их реакцию. Если не соответствует ожиданиям, начинаем мониторить сериалпринтом и вдумчиво рыться. Программа выполняет только то, что мы написали, а не наше видение ее работы.

sadman41
Offline
Зарегистрирован: 19.10.2016

Суньте под if() : Serial.print("I'm checkpoint @ "); Serial.println(millis()); и убедитесь, что if работает всегда.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Мне не нужно мониторить. На экране мгновенно всё видно. Не получается картинки вставить. А то бы скрин этого экрана показал.

Меняю строки местами ... порядок выполнения не меняется.

*******

if (a|=0) {

b = 3;

c = 5;

d = 6;}

***

Так if не работает?

sadman41
Offline
Зарегистрирован: 19.10.2016

Работает.  Добавьте к нему else и убедитесь, что он работает лучше, чем автомат Калашникова.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Работает это так:

Говорю в телефон "установить таймер на 2 минуты". На экране виртуальный движок (valyeT) поворачивается до цифры 2. Потом говорю "включить свет". releT становится равно 1023. Реальный пин ESP ... LED4 становится HIGH. Срабатывает этот if. Отрабатывает delay(). Потом кнопка releT должна обнулиться. Движок виртуального резистора обнулиться. На реальном пине ESP LED4 обнулиться. Все состояния вижу на экране и внатуре.

delay на millis заменю потом.

Так понятно рассказал?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Пока процессы неторопливые ... эти полуглюки особо не мешают. А если надо что то быстродействующее - тогда проблемы

sadman41
Offline
Зарегистрирован: 19.10.2016

Т.е. я так понимаю, что опять виноват Си, а не криворукий пейсатель.

Ну, ОК. Вернитесь в 1972-й и скажите его разработчикам, что они совершают историческую ошибку, вводя в язык оператор if(), который в 2019-м году перестанет работать.

ВН
Offline
Зарегистрирован: 25.02.2016

там в 73 строке у valueT тип int , а у параметра  delay д.б. тип  unsigned long попробуйте разобраться сначала с этим.

Муж_Долговой пишет:
delay на millis заменю потом.

с millis аналогичная ситуация

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

опять виноват Си, а не криворукий пейсатель.

А что, когда-то было по-другому?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Ясно. Ответ не знаете. И что бы не потерять лица ... плавно переходите к оскорблениям.

***

Я вот думаю ... мои виртуальные порты переключаются через удалённый сервер. Может он с задержкой реагирует. Попробую небольшие задержки после каждой строчки  73 ... 75 вставить.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Муж_Долговой пишет:

Я вот думаю ... мои виртуальные порты переключаются через удалённый сервер. Может он с задержкой реагирует. 

О! Начали появляться разумные мысли. Только лучше бы вы Serial.print вставили, как вам Sadman уже советовал.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Sadman уже передумал. У меня на экране смартфона видно всё и сразу.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Муж_Долговой пишет:

Sadman уже передумал. У меня на экране смартфона видно всё и сразу.

Ну вот, разумные мысли опять пропали....

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Это мой третий прикладной сайт. На первом я два с половиной года раскидывал на атомы и собирал в родню ГАЗ-69 (что на авке). На втором гидравлический домашний пресс на 400 тонн. Теперь вот здесь.

И везде были троли. Не давая советов, пиарились с умным видом над новичками.

sadman41
Offline
Зарегистрирован: 19.10.2016

Завязывайте с веществами.  Совет вам дан. Если вы его понимать не желаете - дело ваше. Но не надо слюнями тут брызгать.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Да пробовал оба совета. На мониторе то же, что и на телефоне. Замена переменной в delay на число 2000 ... тоже ничего не дало. Делать паузы ожидая ответ сервера ещё не пробовал. Паутину смотрел по НТВ.

***

Не я первый начал

RG22EM
Offline
Зарегистрирован: 27.08.2016

Муж_Долговой пишет:

 На втором гидравлический домашний пресс на 400 тонн. Теперь вот здесь.

точно тонн?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Да. Там и фото есть.

b707
Offline
Зарегистрирован: 26.05.2017

Послушайте. Муж долговой! Если вы чей-то там муж - значит вам не 13 лет.

Подумайте, неужели вам не понятно, что IF-ы в скетче не могут отрабатывают по частям. Это просто смешно.

Если у вас такое происходит - значит у вас или скетч кривой. или тот сайт, на котором вы это проверяете.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Муж_Долговой пишет:

Стаж 2 месяца. Поэтому прошу очень узкоспециальных терминов избегать или разъяснять.

"Бить нельзя их, а не вникнут - обьяснять..." (с)

Жалка.

sadman41
Offline
Зарегистрирован: 19.10.2016

К слову - этот странный if там бесполезен более чем полностью и заменяется на else для предыдущего. А вот с Int-ом в delay() приключений найти на задницу себе можно легко - это верно.

releyshic
Offline
Зарегистрирован: 20.11.2015

sadman41 пишет:

и убедитесь, что if работает всегда.

поверь глючная Arduino IDE работает не всегда. Может в принципе условия пропускать - проверено

 

releyshic
Offline
Зарегистрирован: 20.11.2015

Муж_Долговой пишет:

Да пробовал оба совета. На мониторе то же, что и на телефоне.

надо так сделать и выложить результат из монитора

Serial.print("releT =  "); Serial.println(releT);
releT = param.asInt();
Serial.print("releT =  "); Serial.println(releT);
//069
digitalWrite (LED4, releT);

if (releT == 0){ Blynk.virtualWrite(V10, 0);  }

if (releT != 0)

{ 
Serial.print("releT != 0"); 
   Blynk.virtualWrite(V10, 1023); 
Serial.print("valueT =  "); Serial.println(valueT);
   delay (valueT*300);
Serial.print("valueT*300 =  "); Serial.println(valueT*300);
   Blynk.virtualWrite(V15, 0);
   Blynk.virtualWrite(V10, 0);
   digitalWrite (LED4, LOW);
}
//077

 

 

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

releyshic пишет:

sadman41 пишет:

и убедитесь, что if работает всегда.

поверь глючная Arduino IDE работает не всегда. Может в принципе условия пропускать - проверено

 

Пруфы? Номер решения суда по делу о мошеннических действиях Arduino IDE?  ЕвгенийП, наверно, сейчас чаем подавился от таких заявлений. 

Я и сам получал по сусалам от компилятора, когда в if() совал не то, что полагается. Однако это была моя вина, а не подсудимого.

KindMan
Offline
Зарегистрирован: 19.12.2018

releyshic пишет:

sadman41 пишет:

и убедитесь, что if работает всегда.

поверь глючная Arduino IDE работает не всегда. Может в принципе условия пропускать - проверено

 

if (криворукость==полная)
{пропустить условие,
не отработать эту строчку}
else
{ выполнить условие}

releyshic
Offline
Зарегистрирован: 20.11.2015

sadman41 пишет:

Пруфы? Номер решения суда по делу о мошеннических действиях Arduino IDE? 

очень долго искать и там скетч громадный на 4000 строк

но по памяти пишешь через if не работает, пишешь через switch работает

причем не работало даже если ты внутри if просто значение глобальной пременно меняешь. Для отлавливания стоял Serial перед условием, внутри и после и в разных комбинациях. Во всех случаях компилятор просто игнорировал все что внутри условия. пробовал не только с переменно а в принципе разный код внутрь пихать - бесполезно. полный игнор. а условие было (1) и тоже разные подставлял чтобы истинность была

sadman41 пишет:

Я и сам получал по сусалам от компилятора, когда в if() совал не то, что полагается.

это что например?

sadman41
Offline
Зарегистрирован: 19.10.2016

releyshic пишет:

sadman41 пишет:

Я и сам получал по сусалам от компилятора, когда в if() совал не то, что полагается.

это что например?

Это, например, сунуть в if() неинициализированную переменную. Тогда компилятор считает, что раз так - то на результат программисту пофиг и выкидывает код для этого if() целиком из объектного кода. Не по частям, а целиком.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

releyshic пишет:
поверь глючная Arduino IDE работает не всегда. Может в принципе условия пропускать - проверено

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

 

releyshic
Offline
Зарегистрирован: 20.11.2015

asam пишет:

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

я имею ввиду целиком связка среда + компилятор. Опать же, может это глюки редактора Arduino IDE. Я не знаю как она работает вообще

 

releyshic
Offline
Зарегистрирован: 20.11.2015

sadman41 пишет:

Это, например, сунуть в if() неинициализированную переменную.

в большинстве случаев ошибки выкидывает, по крайне мере с обычными переменными.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Не ошибки, а предупреждения. Но кому интересно мнение компилятора... 

b707
Offline
Зарегистрирован: 26.05.2017

releyshic пишет:

Я не знаю как она работает вообще

 

оно и видно. А виноват, как всегда - компилятор.

"Я ничего не делал - оно само" (с)

Смешная тема.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

releyshic пишет:

поверь глючная Arduino IDE работает не всегда. Может в принципе условия пропускать - проверено

Простите, Вы всегда оставляли впечатление разбирающегося человека, но ляпнуть такое ... Вы выпили или покурили чего-то?

sadman41 пишет:

ЕвгенийП, наверно, сейчас чаем подавился от таких заявлений. 

Если бы чаем! Задолбался клавиатуру от кефира отмывать! :(

sadman41
Offline
Зарегистрирован: 19.10.2016

Есть на этот счет решение.