Программирование и настройка WiFi контроллера управления вентилятором

В предыдущей статье я рассказал об сборке нового контроллера управления влажностью2000. Теперь расскажу об особенностях программы, алгоритмах управления и настройках этого контроллера.

ESP8266, в отличие от Atmegи328, на которой была реализована предыдущая версия, имеет очень привлекательные характеристики:

 

 

 

 

Atmega328 ESP8266
Тактовая частота контроллера(памяти), МГц 16 80(40)
ОЗУ, Кбайт 2 80
ПЗУ (для программы), Кбайт 32 512
EEPROM, Кбайт 1 4

Это все вкупе со встроенным WiFi позволяет реализовать функции встроенного WEB-сервера, не экономя память для текстовых строк.

А вот с GPIO у ESP8266 довольно плоховато, поэтому, такая роскошь, как управления семисегментным индикатором напрямую ему не доступна. Поэтому и выбран индикатор на микросхеме TM1637, требующий для подключения всего два вывода.

Среда разработки

Так как я освоил разработку управляющей программы для ESP8266 под Arduino IDE, то много старого кода, обеспечивающего основную логику работы контроллера управления вентилятором сохранилось с предыдущей версии.

В основном интересно было перенести хорошо зарекомендовавший себя алгоритм, реализующий конечный детерменированный автомат состояний, описанный в таблице переходов состояний:

fdm

Подошли без проблем и ардуиновские библиотеки DHT для работы с датчиками влажности/температуры от Adafruit и библиотеку работы с индикатором на TM1637 DigitalTube.

Здесь можно посмотреть подробное описание использования Arduino IDE для программирования ESP8266

Реализация новых функций

Очень неудобно делать WiFi контроллеры, в которых зашиваются параметры подключения к сети. Представляете, во что выльется смена имени точки доступа или пароля при наличии десятка таких контроллеров дома?

Поэтому в данном программе реализованы функции сохранения параметров подключения в энергонезависимую память EEPROM и настройка их по сети. Структура для сохранения параметров, а также чтение и запись ее реализованы в файлах WC_EEPROM.h и WC_EEPROM.cpp моего проекта. Верификация чтения и записи производится при помощи вычисления контрольной суммы конфигурации и сравнения ее с записанной в EEPROM.

Кроме конфигурации сети в память сохраняются также все таймауты и прочие параметры алгоритма управления вентилятора, что позволяет оптимизировать и настраивать данный контроллер прямо «по воздуху».

Отображение режимов работы, настройка конфигураций контроллера, а также непосредственное управление вентилятором реализовано при помощи встроенного WEB-сервера (фалы WC_HTTP.h и WC_НTTP.cpp)

Алгоритм настройки точки доступа следующий:

  • Если ESP-шка не смогла подключиться к прописанной в конфигурации EEPROM точке доступа, то она поднимает свою точку доступа и по адресу 192.168.4.1, позволяет сконфигурировать.
  • Ну а если подключилась, то работает в штатном режиме.

Главная страница  WEB-сервера показывает основные параметры контроллера и позволяет вручную включить/выключить контроллер (аналог нажатия кнопки ручного управления)

Экран контроллера

 

Здесь же можно перейти  на страницу сетевых настроек

Экран сетевых настроек

 

И страницу настроек алгоритма работы контроллера

Экран 3

С этих двух страничек можно выполнить перезагрузку контроллера и сброс всех настроек «по умолчанию».

«Наводить красоту» на интерфейс я еще планирую в будущем, когда концепция умного дома на WiFi более менее устаканится у меня в голове.

Еще одна функция, реализованная в этой программе — часы реального времени, синхронизирующиеся по NTP протоколу в интернете. (Файлы WC_NTP.h и WC_NTP.cpp)

Описание основного алгоритма описывать не буду, логика осталось прежней и почитать про нее можно в этой статье. Основные изменения коснулись дисплея. Хочу обратить внимания на одну «фичу» — функцию DisplaySpecialChar(), которая позволяет по битовой маске вывести любой символ, который можно придумать для отображения на семисегментном индикаторе. Я придумал вот такой символ «процентов» в отображении влажности

2002

 

И символ «градусов» при отображении температуры

2004

Биты в битовой маске соответствуют сегментам индикатора.

Ну и последняя из новых функций — сохранение параметров на сервер в интернете для отображения и последующего анализа. Сохраняются значения влажности, температуры, аналогового порта с фоторезистором для подстройки порога срабатывания освещения, время работы вентилятора, время горения света и UPTIME-время работы контроллера от последней перезагрузки.

Запись на сервер происходит в двух режимах. С большей периодичностью записываются параметры, когда в ванной «что-то происходит», в это время либо горит свет, либо работает вентилятор. Все тайминги настраиваются через WEB-интерфейс.

Сохраняются данные на мой сервер в интернете. Адрес сервера можно настроить, а вот формат записи пока зашит в программу. Опять до лучших времен устаканивании концепции ))). Сейчас параметры сохраняются простейших PHP-скриптом в таблицу с простейшей структурой.

Экран MySQL

Довольно просто перенастроить сохранения параметров на тот же «народный мониторинг». Лично меня это сервер не устраивает ограничениями в периодичности сохранения данных и глубине архива.

Оптимизация настроек контроллера

После «опытной эксплуатации» можно определить, правильно ли установлены пороги срабатывания освещения и влажности, а также таймауты различных событий. В прошлой реализации я установил время срабатывания 20 минут, сидя в ванной с секундомером. Понаблюдав за графиком параметров во время нескольких принятий душа я увидел следующее:

Анализ контроллера

 

  • Влажность в зимнее время меняется на 35-40%
  • Время нормализации влажности при естественной вентиляции 20-25 минут
  • Время нормализации влажности с работающим вентилятором 10-12 мин
  • Вентилятор повышает эффективность проветривания вдвое

Исходя из этого можно смело снизить время работы вентилятора до 12 мин, тем самым продлив время его службы и чуточку сэкономив электроэнергию. Подобный анализ можно провести для других времен года, когда влажность в квартире совсем другая.

Теперь, после проведения анализа можно увеличить период записи параметров на сервер.

 Выводы

  • Контроллер работает стабильно, функции свои выполняет.
  • Функциональность его расширилась, теперь им легко управлять и он нормально интегрируется в систему Умного дома/
  • Некоторые вещи требуют доработки, например, WEB-интерфейс, авторизация доступа, серверная часть и некоторые неточности в расчете времени работы вентилятора и света. Может быть выявятся и другие хотелки по улучшению.
  • Пилотный проект по Умному дому на WiFi можно признать успешным 😉

Скетч можно скачать здесь. Буду очень признателен, если сообщите о найденных ошибках.

Скетч контроллера вентилятора на WiFi

А мы с Тимофеем отдохнем от трудов праведных 😉

2005

 

Скетч контроллера вентилятора на ESP8266
12.3 KiB
1499 Downloads
Детали
Вы можете оставить отзыв или трекбек со своего сайта.

58 комментариев на «Программирование и настройка WiFi контроллера управления вентилятором»

  1. Владимир:

    При компиляции выдает ошибки

    D:\WiFi_SmartHome_cooler1\WiFi_SmartHome_cooler1.ino: In function ‘void loop()’:

    WiFi_SmartHome_cooler1:182: error: ‘DisplaySpecialChar’ was not declared in this scope

    DisplaySpecialChar(3,0×24);

    ^

    WiFi_SmartHome_cooler1:217: error: ‘SetStatusFSM’ was not declared in this scope

    SetStatusFSM();

    ^

    exit status 1
    ‘DisplaySpecialChar’ was not declared in this scope

    • Alexey Alexey:

      Какая версия IDE? Я собираю на 1.6.5?
      ESP8266 core стабильная установлена?
      Тип контроллера какой выбран?

      Попробуйте функции DisplaySpecialChar() и SetStatusFSM() перенести перед setup()

  2. Владимир:

    я использовал 1.6.7,сейчас поставил 1.6.5 стало все нормально,спасибо!

    • Alexey Alexey:

      Обновите скетч с сайта
      Исправил одну ошибочку и добавил значок «градуса» при отображении температуры

  3. Олег:

    Алексей, добрый день!
    А как ведут себя компоненты в такой влажной среде? Или герметичности корпуса хватает?

    • Alexey Alexey:

      На первом фото состояние старого контроллера после 2-х лет эксплуатации. Не так уж там и влажно.
      70-80% на короткое время не более 15 минут после принятия душа. А потом влажность восстанавливается до среднеквартирной 32-40%
      Поэтому в корпусе контроллера обычные отверстия под провода, не обеспечивающие никакой влаглзащиты

  4. Александр:

    Дайте ссылку на библиотеку: #include
    На гидхабе много всего, но нет того что подходит

  5. Александр:

    #include TM1637.h

  6. Александр:

    Ещё вопрос насчёт базы данных. Непонятно куда пишутся данные и как.
    Если можно поясните как настроить передачу данных в базу

    • Alexey Alexey:

      Я пишу примерно так.

      // Соединяемся, выбираем базу данных
      $link = mysql_connect($server, $user, $password) or die('Не удалось соединиться: ' . mysql_error());
      // Формируем запрос
      $query = 'INSERT INTO sav_bathroom_c03(dt,t,h,a,tm_vent,tm_light,uptime) VALUES(now(),\''.
      $_GET['t'].'\',\''.$_GET['h'].'\',\''.$_GET['a'].'\',\''.$_GET['tm1'].'\',\''.$cnt02.'\',\''.$_GET['tm2'].'\')';
      $result = mysql_query($query) or die('Сохранение в БД не удалось: ' . mysql_error());
      // Закрываем базу
      mysql_close($link);

  7. Александр:

    Наверно я непонятно выразился. Этот код, как я понимаю, принимает данные на ПК с вебсервером и заносит в базу.
    Мне непонятно как идёт отправка этих данных с контроллера.
    Я смотрел код, но там так наворочено что мне не разобраться.
    Мне нужно просто данные с датчика отправить на сервер и записать их СУБД.
    Прошу помощи.

    • Alexey Alexey:

      Обращением к вашей странице в формате GET запроса:
      http://адрес/страница?t=20&h=33 и и т.д.
      Легким движением руки можно все это перенастроить на тот же «народный мониторинг»

      • Александр:

        Не нужен мне народный мониторинг. У меня свой локальный сервер с базой данных. Не могу прикрутить ваш проект к своей базе, это печаль.
        Мучаюсь уже неделю с гет отправкой. Что делать?

        • Alexey Alexey:

          Для начала взять пример из ESP core и попробовать в нем добиться отправки с ESP

          Иногда не хватает переносов строк в GET запросе, иного файервол режет

          • Александр:

            Спасибо, буду пробовать!

          • Александр:

            Спасибо разобрался!

            String url = «/add.php/»;
            url += «?t=»;
            url += t;
            url += «&h=»;
            url += h;
            // This will send the request to the server
            client.print(String(«GET «) + url + » HTTP/1.1\r\n» +
            «Host: » + host + «\r\n» +
            «Connection: close\r\n\r\n»);

  8. Александр:

    На странице контроллера прописал в настройках URL servera http://192.168.83.80/site1.ru/www/
    В прошивке контролера нечего не менял. Установил, создал базу и таблицу с такими же именами. Добавил скрипт в index.php

    Выдаёт ошибку:

    Notice: Undefined index: t in C:\webserver\www\site1.ru\www\index.php on line 52 Notice: Undefined index: h in C:\webserver\www\site1.ru\www\index.php on line 52 Сохранение в БД не удалось: No database selected

    // Соединяемся, выбираем базу данных
    $link = mysql_connect(‘localhost’, ‘root’, ‘root’) or die(‘Не удалось соединиться: ‘ . mysql_error());
    // Формируем запрос
    $query = ‘INSERT INTO sav_bathroom_c03(t,h) VALUES(now(),\».
    $_GET[‘t’].’\’,\».$_GET[‘h’].’\’)’;
    $result = mysql_query($query) or die(‘Сохранение в БД не удалось: ‘ . mysql_error());
    // Закрываем базу
    mysql_close($link);

    В чём может быть проблема?

    Что может быть

  9. Дмитрий:

    Алексей, не могу запустить проект. Пока прошивку не загрузил web интерфейс работает и в сети видится, после прошивки все пропадает и ничего не работает. Что посмотреть?

    • Alexey Alexey:

      После правильной прошивки в эфире должна появится новая точка доступа

      Все отладочные сообщения выводятся в консоль. Хорошо бы посмотреть, что там на коносоли. Возможно, не опознается какая нибудь периферия и ESP уходит в циклическую перезагрузку по WDT

  10. Дмитрий:

    Нет дисплея. Можно как нибудь с вами связаться для консультации?

  11. Дмитрий:

    Точка появляется До прошивки, после перепрошивки на ESP-link.

  12. Александр:

    Есть вопрос по поводу метео станции, которою я пытаюсь запустить. Это проект был выложен в группе в вк.
    Можно спросить?

    • Александр:

      Вы спрашивайте, чего время тянуть. Не захо…
      Не сможет — не ответит. 🙂

  13. Петр:

    Вгружаю скетч и ничего не происходит…
    плата правда не такая как тут а бутерброд

    • Alexey Alexey:

      А скетч загружается?

      • Петр:

        загружается…
        у меня 3 одинаковых «бутерброда».пробовал на всех 3х.
        но ни на одном не завелась и даже точка доступа не появилась.
        До этого стояла прошка с https://wifi-iot.com/.

        может подскажете )

        • Alexey Alexey:

          Там отладка в консоль выдается. Что пишет?

          • Петр:

            пишет все ок) я сейчас не дома..проверить не могу.
            дайте почту я вам скину.

          • Alexey Alexey:

            А у вас дисплей подключен на TM1637 ?
            Похоже подвисает на его инициализации, после чего систему ресетит злобный WDT от ESP, который не любит, когда пользовательские программы долго что-то делают. Закомментарьте строчку с инициализацией этого дисплея

          • Петр:

            Soft WDT reset

            ctx: cont
            sp: 3fff2b60 end: 3fff2d90 offset: 01b0

            >>>stack>>>
            3fff2d10: 3fff2d50 3fff2d20 00000008 000039f5
            3fff2d20: 6000001c 0000002b 60000000 3fff1d5c
            3fff2d30: 00000000 00000000 3fff1bd0 40208a2e
            3fff2d40: 3fffdad0 3fff1bd0 3fff1bd0 40208a91
            3fff2d50: 3fffdad0 3fff10c8 3fff2dd4 40208ac4
            3fff2d60: 3fffdad0 00000000 3fff2dd4 402038c4
            3fff2d70: feefeffe 00000000 3fff1d54 4020905c
            3fff2d80: feefeffe feefeffe 3fff1d70 40100718
            <<<stack<<<

            ets Jan 8 2013,rst cause:2, boot mode:(3,6)

            load 0x4010f000, len 1264, room 16
            tail 0
            chksum 0x0f
            csum 0x0f
            ~ld

            Free memory 35376
            EEPROM init. Size = 332
            SCR=14837
            EEPROM Config is correct
            Display TM1637 init

          • Петр:

            Закомментарьте строчку с инициализацией этого дисплея

            скажите как и где..
            я только учус)

          • Петр:

            // Инициализация дисплея
            //Serial.printf(«Display TM1637 init\n»);
            //tm1637.init();
            эту? вот так?

          • Петр:

            забыл упомянуть что дисплея такого пока нет..есть такой MTC-S16204XF..но как я понял его сюда не прицепить.

          • Петр:

            теперь вот такое
            Soft WDT reset

            ctx: cont
            sp: 3fff2af0 end: 3fff2d40 offset: 01b0

            >>>stack>>>
            3fff2ca0: 00000900 00000001 3ffea6a9 4020a284
            3fff2cb0: 00000009 0000000b 3ffea24f 00000000
            3fff2cc0: 00000000 00000000 3fff1b80 402089de
            3fff2cd0: 3fff1078 00000967 3fff1b80 40208a41
            3fff2ce0: 3ffea244 3fff1b04 3fff1b80 40203c13
            3fff2cf0: 3fffdad0 3fff1b04 3fff2d84 40209640
            3fff2d00: 00000000 00000000 3fff2d84 402036ac
            3fff2d10: 3fffdad0 00000000 3fff2d84 3fff1d0c
            3fff2d20: 3fffdad0 00000000 3fff1d04 40209004
            3fff2d30: feefeffe feefeffe 3fff1d20 40100718
            <<<stack<<<

            ets Jan 8 2013,rst cause:2, boot mode:(3,6)

            load 0x4010f000, len 1264, room 16
            tail 0
            chksum 0x0f
            csum 0x0f
            ~ld

            Free memory 33960
            EEPROM init. Size = 332
            SCR=12583
            EEPROM Config is correct
            Init DHT11on 14 pin …
            Init button 12 pin …
            Init relay cooler 13 pin …
            WiFi is not config …
            Start AP SmartHome_Cooler1
            Open http://192.168.4.1 in your browser
            Or by name: http://SmartHome_Cooler1.local
            HTTP server started …
            Starting UDP
            Local port: 2390

            Soft WDT reset

  14. Петр:

    полскажите где копать

    • Alexey Alexey:

      1. Попробовать все же собрать схему полностью. Проверить правильнось подключения всех устройств к ESP
      2. Проверить интернет и подключение к нему
      3. Использовать «метод научного тыка» — последовательно комментировать строчки пока не получите нормальную работу.

      • Петр:

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

      • Петр:

        в любом случае спасибо)

  15. Петр:

    Known Issues

    As explained above, the connection drops every now and then
    Websocket connection doesn’t work with mDNS or location.hostname for some reason
    Cannot handle multiple clients
    http://adityatannu.com/blog/post/2016/01/31/ESP8266-Witty-Cloud-Board-Demo.html

    • Петр:

      может как раз изза mDNS ?

      • Alexey Alexey:

        Может и так. Хотя у меня ни разу из за него не перезагружалась. Проверить ведь не долго?

        • Петр:

          еще одна беда.. меняю значения в скетче сохраняю, и заливаю в еспшку .Но вот после окончания заливки смотрю монитором сом порта а значения не изменяются .

          • Петр:

            то есть меняю имя точки доступа и пароль а они не изменяются.
            и как стереть полностью все данные с еспшки?

          • Петр:

            ets Jan 8 2013,rst cause:2, boot mode:(3,6)

            load 0x4010f000, len 1384, room 16
            tail 8
            chksum 0x2d
            csum 0x2d
            v3de0c112
            ~ld
            ь

            Free memory 35248
            EEPROM init. Size = 332
            SCR=14837
            EEPROM Config is correct
            HTTP server started …
            Starting UDP
            Local port: 2390
            Send NTP server 1.ru.pool.ntp.org 195.3.254.2
            Sending NTP packet…
            NTP received, length=48
            NTP time = 1473421853
            Get NTP time. Error = 0

            Soft WDT reset

            ctx: cont
            sp: 3fff23f0 end: 3fff2640 offset: 01b0

            >>>stack>>>
            3fff25a0: 40105814 000f2dcc 3fff1560 00000000
            3fff25b0: 3fff03a0 3fff1560 3fff1620 0000000b
            3fff25c0: 00000000 00000000 3fff1478 40207202
            3fff25d0: 3fff0970 00000c8d 3fff1478 40207265
            3fff25e0: 3fff0970 00000106 3fff1478 4020396b
            3fff25f0: 3fffdad0 3fff13fc 3fff2684 40207e48
            3fff2600: 00000032 00000000 3fff2684 40203458
            3fff2610: 00000000 00000000 00000001 3fff160c
            3fff2620: 3fffdad0 00000000 3fff1604 40207804
            3fff2630: feefeffe feefeffe 3fff1620 40100718
            <<<stack<<<

            все подключилось! Попадаю даже в вэбку! но отваливается от сети а потом снова соеденяется даже дает изменить некоторые значения. Или так и должно быть?

          • Петр:

            // Подключаемся к WiFi
            // WiFi_begin();
            // delay(2000);

            закоментил эти строки
            и получил вывод постом выше если разкоментить то не соединяется сосвсем.
            Soft WDT reset вот это почему вылазит понять не могу .
            даже датчики не успевают инициализироватся

  16. Петр:

    в схеме контроллера не указаны номиналы резисторов
    между Vcc и CH_PD
    И GND,GPIO15 — GPIO2.
    Насколько они необходимы в моем случае?
    Напомню у меня «бутерброд» «Witty Cloud».

    простите за такие вопросы но очень хочется разобраться )
    Возможно и Soft WDT reset происходит из-за недостающих вышеупомянутых резисторов.

  17. Игорь:

    Большое спасибо за данный проект. Все сделано в точности. Результат порадовал!!! Да к тому же это мое первое учебное пособие. Но к сожалению на третий день обнулились показания влажности и температуры. Попробую заменить датчик DHT11. Но «кнопка» всегда работает — по крайней мере это лучше, чем каждый раз бегать включать и выключать вентилятор !!! Правда вентилятор иногда как бы жил своей жизнью — короткими пульсациями включался.

  18. Михаил:

    Алексей, если можно на примере подскажите как реализовать в данном проекте возможность отправки значения переменной из умного дома (или строкой из браузера)в WEB сервер (ESP8266). К примеру изменить порог освещенности (был 900, выставить 800),время отправки на сервер и т.п. Собственных знаний увы не хватает…

  19. Михаил:

    Всё, разобрался, помощь не нужна.

  20. Евгений:

    Здравствуйте. Очень заинтересовал ваш проект, будучи глубоко начинающим, пытаюсь его повторить)При компиляции скетча:

    WiFi_SmartHome_cooler1:302: error: within this context within this context.

    Ругается на содержимое функции DisplaySpecialChar, закоментировал содержание функции код откомпилировался, залил, теперь не происходит соединения с NTP сервером и время не отображается.

    Connecting to: TP-LINK_/……
    663
    WiFi connect: 192.168.0.100/255.255.255.0/192.168.0.1
    Open http://192.168.1.4 in your browser
    Or by name: http://SmartHome_Cooler1.local
    HTTP server started …
    Starting UDP
    Local port: 2390
    Send NTP server 1.ru.pool.ntp.org 1.0.0.0
    Sending NTP packet…
    NTP server error
    Get NTP time. Error = 1

    Что делаю не правильно? подскажите если возможно. Заранее благодарен.

  21. Евгений:

    Хорошо, посмотрю, что с роутером. А что может быть по поводу отображения спецсимволов?

    WiFi_SmartHome_cooler1:302: error: within this context within this context.

    Это сообщение появляется при компиляции на каждую строку функции DisplaySpecialChar. Большое спасибо за оперативный ответ.

    • Alexey Alexey:

      Попробуйте в начале программы добавить объявление функции

      void DisplaySpecialChar(uint8_t BitAddr,int8_t SpecChar);

  22. Евгений:

    С подключением разобрался, спасибо. А функция DisplaySpecialChar работать так и не хочет( Поскажите, где скачать библиотеку TM1637, которая использована у вас (может быть дело в библиотеке). Спасибо.

  23. Евгений:

    Разобрался, спасибо огромное)

Ваш отзыв