Перейти к публикации
iT4iT.CLUB

Kitsum

Пользователи
  • Публикации

    424
  • Зарегистрирован

  • Посещение

  • Дней в лидерах

    234

Сообщения, опубликованные пользователем Kitsum


  1. Друзья, всем доброго времени суток. Сообщение будет немного не по теме.

    Мы запустили в тестовом режиме MQTT сервер

    • Адрес: mqtt.it4it.club
    • Порт: 1883

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

    • Thanks 1

  2. Друзья, в очередной раз приветствую Вас. Появилась возможность вернуться к метеостанции, а значит, сделаем маленькое обновление по Вашим замечаниям.

    1. В первую очередь были исправлены опечатки и орфографические ошибки. К сожалению, без этого никуда.
    2. Небольшие изменения в html и css разметке чтобы убрать редкие, но все равно присутствующие, смещения слоев.
    3. Исправлен баг с отправкой данных MQTT брокеру
    4. И главное нововведение, это проверка контрольной суммы, заливаемой через web интерфейс прошивки. Огромное спасибо @Alex_DIY за то, что указал на отсутствие данного функционала в предыдущих версиях.
    5. Также, если во время обновления, на стороне контроллера произойдет сбой, в web интерфейс будет возвращен код ошибки и выведено его описание.

    Немного о контроле md5 хэша.

    Для выполнения этой процедуры Ваш браузер должен поддерживать работу с FileAPI, что позволит получить доступ к загружаемой прошивке еще до того, как она будет передана микроконтроллеру. Подробнее можно почитать тут https://developer.mozilla.org/ru/docs/Web/API/FileReader А вот реализация самого md5 алгоритма была позаимствована у SparkMD5, ссылка как всегда прилагается https://github.com/satazor/js-spark-md5 К сожалению штатных средств расчета контрольной суммы с помощью данного алгоритма мне найти не удалось, возможно плохо искал. Вся поддержка md5 описана в отдельном файле md5.js.gz в корне web сервера, поместить его непосредственно в index.htm не представляется возможным из-за веса библиотеки в не сжатом виде.

    Алгоритм загрузки прошивки через web интерфейс на esp8266 немного изменился, но по-прежнему прост. В момент перехода в раздел обновления программы происходит проверка, поддерживает ли Ваш браузер необходимый функционал и загрузилась ли библиотека. Если эти условия НЕ выполнены, то будет отображено соответствующее предупреждение, но возможность загрузить программу по-прежнему имеется, но уже без проверки хэш-суммы. Если же все прошло успешно, то при передаче файла прошивки место его имени будет передан наш md5 хэш. Это связано с особенностями работы метода arg библиотеки web сервера. Досконально разбираться не вижу смысла т.к использование имени файла в качестве транспорта мне кажется вполне жизнеспособным решением учитывая, что само имя файла не несет никакой смысловой нагрузки и практической цели.

    Если у Вас появятся еще замечания, предложения или свои наработки, обязательно делитесь ими!

    PS: Все исходники опубликованы в первом сообщении данной темы.


  3. @Shaman59rus Пока такую задачу никто не ставил, но всегда можно договориться. Напишите в приват, что конкретно вы хотите получить, поподробнее про 4 электромагнита и в какую сумму необходимо уложиться. Попробуем реализовать Вашу задумку.


  4. Заметка о создании само подписанного сертификата для Apache под Linux Ubuntu сроком на 100 лет.

    Само подписанный сертификат "не есть плохо", учитывая, что со своими задачами он справляется также хорошо, как и его платные братья. Конечно, если использовать его в публичных проектах, то доверие пользователей к ресурсу начинает катастрофически падать, но если речь идет о внутренних ресурсах, организованных для небольшой группы лиц, то это решение выглядит очень аппетитно.

    Выбираем самый короткий путь, логинимся на сервере под пользователем root

    Создаем сертификат сроком на 100 лет. Почему на такой долгий? Да потому, что через год никто не вспомнит о том, что его надо пересоздать, да и важность ресурса далеко не банковского уровня.

    openssl req -x509 -nodes -days 36500 -newkey rsa:1024 -keyout /etc/ssl/private/apache.key -out /etc/ssl/certs/apache.pem

    Таким образом, сертификат стандарта X509 и сроком на 100 лет будет записан в файл /etc/ssl/private/apache.key, а его 1024 битный ключ в файл /etc/ssl/certs/apache.pem

    В процессе создания сертификата будут сыпаться различные вопросы от утилиты, можно пропускать все (прожимаем <ENTER>), кроме имени домена для которого этот сертификат и предназначается. Отметим, что пароль к сертификату запрашиваться не будет, об этом мы позаботились с помощью параметра -nodes. Да и пароль нам и не нужен, в противном случае его придется вводить при каждом запуске Apache.

    Теперь необходимо поправить ssl профиль для Apache.

    nano /etc/apache2/sites-available/default-ssl.conf

    Нам необходимо отключить поддержку SSLv2 и SSLv3 из-за проблем с безопасностью. Добавляем, а если он уже есть, то правим следующий параметр

    SSLProtocol all -SSLv2 -SSLv3

    Указываем откуда подтянуть сертификат с ключом и сохраняем профиль

    SSLCertificateFile /etc/ssl/certs/apache.pem
    SSLCertificateKeyFile /etc/ssl/private/apache.key

    Выбираемся обратно в консоль и подключаем модуль SSL к Apache, а заодно подключаем наш обновленный профиль

    a2enmod ssl
    a2ensite default-ssl.conf

    Финалом торжества станет перезапуск сервера

    /etc/init.d/apache2 restart

    Если понадобится принудительно перенаправлять потребителей трафика с http на https протокол, то самым простым способом будет использование mod_rewrite

    a2enmod rewrite
    /etc/init.d/apache2 restart

    После идем в нужный каталог Apache и создаем там конфигурационный файл .htaccess со следующим содержимым

    RewriteEngine On
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

    Если не отрабатывает ни одно из правил, описанных в .htaccess, то вероятнее всего, в конфигурации Apache стоит запрет на его чтение. Идем в файл конфигурации

    nano /etc/apache2/apache2.conf

    Ищем описание настроек безопасности для корневого каталога Вашего web сервера

    <Directory /var/www/>
            Options Indexes FollowSymLinks
            AllowOverride None
            Require all granted
    </Directory>

    И разрешаем всем описанным в фале .htaccess директивам отмену ранее установленных правил доступа

    AllowOverride All

    И снова перезапускаем Apache.

    Не забудьте обновить сертификат после окончания срока его действия, если здоровье еще будет позволять. ^_^

    • Like 2

  5. @Anykey дело в том, что снимаемые показания будут напрямую зависеть от качества проработки и исполнения устройства. Чем они хуже, тем больше мы будем получать устройство измеряющее частоту собственного вращения, никак не связанную с реальными показаниями скорости ветра, да и про линейность можно забыть. В итоге, на выходе может получиться устройство, которое дает только моральное удовлетворение от его же наличия и немного каких-то показаний которым, возможно, можно доверять только для фактического определения наличия ветра или других факторов заставляющих эти самые показания изменяться.

    На мой взгляд, необходимо учитывать все, начиная от радиуса окружности описывающей траекторию движения "чашек", заканчивая сопротивлением подшипника или другого устройства скольжения и силой которую необходимо приложить для того, чтобы эти самые чашки заставить сдвинуться с места. Опять же под вопросом, сохраниться ли линейность при разбросе температуры эксплуатации ±30 градусов Цельсия. И многое другое.

    PS: это мое личное мнение и оно ни в коем случае не претендует на истину в последней инстанции.

    • Like 1
    • Thanks 1

  6. @Alex_DIY Вы правы, стоит добавить проверку контрольной суммы прошивки. Я не сталкивался с этой проблемой т.к использую контроллеры с flash памятью объемом 4Mb. Сам принцип загрузки и обновления прошивки заимствован из стандартного примера WebUpdate для контроллера esp8266, но все необходимое для реализации проверки контрольной суммы на стороне контроллера уже реализовано "из коробки" и описано в файлах

    %homepath%\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\Updater.h
    %homepath%\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\Updater.cpp
    bool UpdaterClass::setMD5(const char * expected_md5){
      if(strlen(expected_md5) != 32)
      {
        return false;
      }
      _target_md5 = expected_md5;
      return true;
    }

    Останется только правильно вычислить md5-хеш при выборе файла прошивки в web интерфейсе и передать его контроллеру в описанную выше функцию. Возможно, Вам будет интересно содержимое файла Updater.ccp как и других файлов из его каталога. Что касаемо расчета места под прошивку, то возможно, самый простой вариант является и самым эффективным, и правильнее просто указать конкретное значение в зависимости от используемой памяти.

    На данный момент web интерфейс отслеживает только передачу файла и подсчитывает количество переданных байт, отсюда и сообщение об удачном завершении операции, поскольку фактическая передача файла завершилась успешно.

    @alexd6969 По моему мнению, в измерении скорости ветра нет ничего сложного с программной точки зрения. Принцип снятия показаний обсуждался в начале темы. Самой большой трудностью является физическое исполнение сенсора. Даже если это классический анемометр, конструкция должна быть легко повторяемой и иметь высокую стойкость к погодным причудам, будь то банальная коррозия металлических элементов или обмерзание в зимнее время суток.

    Модели механических анемометров

    1. https://www.thingiverse.com/thing:41367
    2. https://www.thingiverse.com/thing:144665
    3. https://www.thingiverse.com/thing:364660

    Ультразвуковой анемометр

    1. http://blog.regimov.net/ультразвуковой-анемометр-прототип/
    2. http://blog.regimov.net/ультразвуковой-анемометр-на-двух-hc-sr04/

    В общем, все упирается в надежность конструкции.

    • Like 2

  7. Обновление от 12.08.2017

    Доброго всем времени суток друзья. Проект метеостанции на контроллере ESP8266 близится к своему завершению. Я хотел опубликовать это обновление раньше, но жизненные обстоятельства связывали руки. Все последующие обновления будут выходить только по просьбе трудящихся на благо домашней автоматизации, то есть Вас. Поэтому предлагайте свои идеи, высказывайте пожелания и делитель своими наработками.

    ВАЖНО: Друзья, перед тем как приступить к обзору обновления, я хочу обратить Ваше внимание на крайне важный момент. Бывают случаи, когда контролер зависает, например при выполнении функций esp.reset() и esp.restart(). Это не связано с реализацией программы метеостанции, проблема идет от разработчиков микроконтроллера. Чтобы не расписывать возможные причины происхождения данной проблемы, я оставлю ссылку на тему в которой эта ситуация обсуждается https://github.com/esp8266/Arduino/issues/1017

    Чтобы избавиться от проблемы Вам необходимо, перед тем как устанавливать метеостанцию на постоянное место жительства, подтянуть GPIO-0 (пин D3 на плате NodeMCU) к питанию 3.3V. Во время данной процедуры, питание на контроллере должно отсутствовать, это на тот случай если вы захотите сделать это на "горячую". Суть в том, чтобы при запуске, микроконтроллер увидел логическую единицу на GPIO-0.

    IMG_0018.pngIMG_0019.JPG

    И так, что нас ждет в этом обновлении:

    1. Все, что связано с логикой работы функций конфигурации вынесено в файл config.h Ранее, кусок отвечающий за обновление конфигурации через web интерфейс еще маячила в .ino файле, но теперь переехал на свое законное место.
    2. Добавлена возможность полного удаления файла конфигурации Hard Reset. Найти соответствующую кнопку можно в web интерфейсе, в разделе "Система".
      Скрытый текст

      screencapture-espws-local-1502450338921.png

       
    3. Добавлена система логирования показаний датчиков. В логе хранятся показания за последние 24 часа, интервал снятия данные составляет 10 минут. Иконка для вызова графика находится на главной странице и доступна всем устройствам, ширина разрешающей способности дисплея которых превышает 600 пикселей. ВАЖНО: алгоритм построен таким образом, что лог не привязан ко времени, а сам контроллер следит только за временем, прошедшим с момента последней записи в лог. При передаче журнала в web интерфейс также передается это значение в виде параметра timeAdjustment, именно относительно него начнется построение графика в обратную сторону с использования времени на устройстве, которое Вы используете (пк, планшет, телефон). "Зачем это нужно?", спросите Вы, а все на самом деле очень просто. Для логирования показаний с одного датчика с описанным выше интервалом времени требуется 144 элемента типа Float в массиве. Если добавить к каждой точке еще переменную для хранения времени снятия показаний, то объем занимаемой памяти вырастит минимум в 2 раза, в зависимости от типа этой самой переменной. Умножим все это на количество используемых датчиков, и затраты ресурсов будут слишком высоки. Плюс ко всему необходимо поднимать собственный NTP клиент, хоть это и не проблема, но гарантировать точность времени будет проблематично т.к я не знаю где вы можете использовать метеостанцию, а как показала практика, некоторые желают её применять в теплице баз связи с внешним миром. А большинство устройств, используемых для работы с метеостанцией уже имеют на борту синхронизированное время и от него отталкиваться значительно проще.
      Скрытый текст

      espws.local-(iPad).png

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

      screencapture-espws-local-1502450226853.pngscreencapture-espws-local-1502471975625.png

      За возможность реализовать данный функционал отвечает программный комплекс от highcharts.com, там же Вы можете найти описание API модуля и все, что с ним связано.
    4. Исправлен баг с авторизацией на MQTT сервере.
    5. Исправлен баг с пропаданием индикации состояния микроконтроллера через штатный светодиод.
    6. Теперь, при программной "перезагрузки" микроконтроллера штатный светодиод горит постоянно.
    7. Теперь данные с датчиков хранящиеся в структуре sensors имеют тип Float. Это убирает ряд неудобств, с которыми мы с Вами сталкивались ранее и упрощает, для понимания, часть кода. В связи с этим на MQTT сервер теперь улетают данные с плавающей запятой, примите это во внимание если используете данный функционал.
    8. Внутренняя начинка web интерфейса претерпела ряд изменений, не связанных с визуальной составляющей, но они были необходимы для более корректной, на мой взгляд, работы java.
    9. По Вашим замечаниям были внесены поправки в паттерны отвечающие за проверку корректности вводимых данных в формы web интерфейса. Например, в SSID точки доступа разрешена точка, а в именах хостов разрешено использовать домены "ниже" второго уровня.
    10. Раздел "Система" в web интерфейсе немного поправился и отображает дополнительную информацию.
    11. Раздел "Устройства на I2C шине" теперь не сообщает о модели датчика на конкретном адресе, т.к это определить не возможно (если только сам датчик не располагает этой информацией), а просто отображает предполагаемый тип устройства на шине.screencapture-espws-local-1502450399472.png
    12. В разделе "Народный мониторинг" появилась кнопка, позволяющая устанавливать MAC адрес устройства в качестве идентификатора для данного устройства в одноименной системе.screencapture-espws-local-1502450462737.png
    13. Доработан внешний вид интерфейса, внесены мелкие корректировки, для более насыщенной картинки добавлены тени, некоторые элементы теперь плавно появляются и исчезают.
    14. Изменена система оповещений, стандартная java функция Alert покинула нас, а её место по праву заняла отдельная система оповещения использующая собственный html шаблон.
    15. Также из исходников удалены почти все не запакованные файлы web интерфейса. Как показала практика, в них нет нужды.

    На этом все. Надеюсь было интересно и данные наработки пригодятся Вам в будущем. Если у Вас имеется желание помочь нам финансово, то сделать это возможно следующими способами:

    screencapture-espws-local-1502471616991.pngscreencapture-espws-local-1502471693419.pngscreencapture-espws-local-1502450317827.pngscreencapture-espws-local-1502450328591.pngscreencapture-espws-local-1502450386417.pngscreencapture-espws-local-1502450352382.pngscreencapture-espws-local-1502450410003.pngscreencapture-espws-local-1502450462737.pngscreencapture-file-D-Documents-Arduino-ESP8266_WS_iT4iT-CLUB-data-index-htm-1502471801658.png

    PS: По традиции, все исходники опубликованы в первом сообщении данной темы.

    • Like 1

  8. @Alex_DIY доброе время суток.

    В 30.07.2017 в 18:40, Alex_DIY сказал:

    1) через вэб интерфейс с помощью IE 11 не удается обновить прошивку - на опознает бинарник за файл прошивки.

    IE 11 считается устаревшим браузером и не имеет необходимой поддержки для корректной работы web интерфейса. Ему на смену пришел Microsoft Edge, большую часть функционала он уже должен поддерживать. Под продукты Microsoft необходимо подстраиваться отдельно. Я, по большей части, использую Google Chrome и Safari, но все должно также корректно работать в FireFox и во всех браузерах на движке Blink.

    В 30.07.2017 в 18:40, Alex_DIY сказал:

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

    Процессы прошивки микроконтроллера напрямую и по "воздуху" различаются. Если память не подводит то, в последнем случае, прошивка заливается в специальную область на flash и после начинается процесс прошивки. Возможно Вам будет интересна эта тема https://github.com/esp8266/Arduino/issues/2438 но я все же склоняюсь к недостаточному объему flash для нормальной поддержки OTA.

    Осмелюсь предложить произвести замену flash памяти на W25Q32BVSSIG (25Q32BVSIG) SO-8, 32Мбит, 4МБ. Это копеечная память, да и замена не займет много времени. 

    Datasheet: DOC001081512.pdf

    • Like 1

  9. Хочу оставить небольшую заметку по поводу гигрометра.

    По умолчанию использовался датчик SI7021, сам по себе датчик очень хороший, но мой имел физический дефект в виде деформированной полимерной пленки поверх датчика. Деформация была получена в ходе моей неосторожности. Сама пленка представляет собой белую "ткань" и легко может быть удалена с сенсора, но если это сделать, то показания влажности, естественно, будут искажены. Опытным путем было выявлено, что без пленки показания будут завышены примерно на 20%. Но самое печальное, что при высокой влажности гигрометр переставал отдавать адекватные данные, и доверять можно было только его показаниям температуры. Пытаться восстановить пленку я считаю бессмысленным, проще заказать новый датчик. Тем более, что производитель предупреждает о том, что пленка должна быть в чистоте, не говоря уже о том, что она должна быть без повреждений. Имейте это в виду, если столкнетесь с похожей проблемой.

    На данный момент решено было произвести замену на новый HDC1080, он имеет схожие характеристики, но нижний придел температуры, при которой рекомендовано эксплуатировать гигрометр, составляет всего -20 градусов Цельсия. А вот встроенный датчик температуры способен адекватно работать в пределах от -40 до 125 градусов Цельсия. Посмотрим, как он себя покажет, а осенью задумаемся о замене всего парка датчиков.

    HDC1080_1.JPGHDC1080_2.JPG

    Очень хорошо, что предусмотрел возможность отсоединять будку от базового блока, не пришлось разбирать всю конструкцию и свешиваться с ключами из окна. Также отмечу, что белый PLA-пластик за полгода эксплуатации в уличных условиях начал желтеть, но на "ходовых" характеристиках это не отразилось. Будка по-прежнему довольно крепкая и справляется со своей задачей - защита датчиков.

    HDC1080_INSTALL.JPG

    Теперь о том, какие изменения необходимо произвести в программе, чтобы датчик прижился. Аналогичные процедуры необходимо проводить и для любых других датчиков.

    Избавляемся от старой библиотеки

    /*
       датчик температуры
       https://github.com/LowPowerLab/SI7021
    */
    #include <SI7021.h>
    SI7021 SI7021;

    и добавляем новую

    /*
       датчик влажности и температуры
       https://github.com/closedcube/ClosedCube_HDC1080_Arduino
    */
    #include "ClosedCube_HDC1080.h"
    ClosedCube_HDC1080 HDC1080;

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

    /*
       структура и переменные для хранения показаний датчиков
    */
    struct sensor {
      float data = 0;
      bool  status = false;
    };

    В функции Setup находим, где происходит инициализация старого датчика SI7021

    Wire.beginTransmission(64);
    if (Wire.endTransmission() == 0) {
      temperature.status = humidity.status = SI7021.begin(pin_sda, pin_scl);
    }

    и меняем на инициализацию нового датчика HDC1080.

    Wire.beginTransmission(64);
    if (Wire.endTransmission() == 0) {
      HDC1080.begin(0x40);
      temperature.status = humidity.status = true;
    }

    Находим в функции readSensors две строки, отвечающие за получение показаний температуры и влажности с датчика SI7021

    if (temperature.status) temperature.data = SI7021.getCelsiusHundredths();
    if (humidity.status) humidity.data = SI7021.getHumidityPercent();

    и меняем их на запросы тех же самых показаний, но с датчика HDC1080

    if (temperature.status) temperature.data = HDC1080.readTemperature();
    if (humidity.status) humidity.data = HDC1080.readHumidity();

    Теперь остается дело за малым. Необходимо избавиться от всех преобразований, которые делались перед передачей показаний. Начнем с API, это функция web_api_sensors. Необходимо найти в ней формирование json объекта

    sensor["light"] = light.data;
    sensor["temperature"] = temperature.data * 0.01;
    sensor["humidity"] = humidity.data;
    sensor["pressure"] = pressure.data / 133.3;

    и привести к следующему виду т.к для хранения данных мы теперь используем тип Float

    sensor["light"] = light.data;
    sensor["temperature"] = temperature.data;
    sensor["humidity"] = humidity.data;
    sensor["pressure"] = pressure.data;

    Ну и финальная часть. Необходимо убрать те же самые корректировки, но используемые в функции loop при построении запроса к ресурсу "Народный мониторинг".

    query += "&L1=" + String(light.data);
    query += "&T1=" + String(temperature.data * 0.01);
    query += "&H1=" + String(humidity.data);
    query += "&P1=" + String(pressure.data / 133.3);

    меняем на

    query += "&L1=" + String(light.data);
    query += "&T1=" + String(temperature.data);
    query += "&H1=" + String(humidity.data);
    query += "&P1=" + String(pressure.data);

    На этом все преобразования закончены. Компилируем и заливаем прошивку в микроконтроллер. Аналогичным образом заменяются любые датчики или добавляются новые.
    Обращу только внимание на инициализацию датчиков. Она происходит по принципу - если на используемом адресе шины i2c что-то есть, то условно, датчик считается обнаруженным, происходит вызов соответствующей функции инициализации датчика и изменение его статуса на true. Чтобы определить фактическое наличие датчика, используется функция, которой в качестве параметра address необходимо передать адрес используемый устройством, но в десятичной системе счисления (DEC). Таким образом, гигрометр с адресом в шестнадцатеричной (HEX) системе счисления 0x40, в десятичной (DEC), будет иметь адрес 64.

    Wire.beginTransmission(address)

     

    • Like 1

  10. @Cadil доброе время суток. Скорее всего, готовые библиотеки есть, лично я сталкивался с различными реализациями, но в виде модулей или набросков кода. Идеи у всех одинаковые и реализации в принципе тоже:

    1. Хранить информацию (в нашем случае настройки) в удобном виде во Flash памяти, обычно один файл с удобной разметкой (json и т.п)
    2. Ограничить доступ к этому файлу

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

     

    • Like 1

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


  12. @Securbond Не хотят заливаться через Arduino IDE? Какой объем Flash памяти у Вашего микроконтроллера?

    Перепроверьте все пункты в настройке среды для загрузки файлов через неё. В оставленном ранее комментарии имеется ссылка на инструкцию. Кстати, если открыт Serial монитор, то загрузка файлов не будет работать.


  13. @slava_573 На мой взгляд, часы в замке это излишне. Кроме того, что конструкция усложняется, мы получаем дополнительное слабое звено.

    Добавьте в таблицу два поля time_start и time_end с типом int, в них мы будет хранить часы (в формате 24) начала и конца рабочего времени. Желательно выставить этим полям значения по умолчанию, скажет 7 и 18 соответственно. Далее в программе микроконтроллера необходимо реализовать дополнительный запрос.

    const char QUERY_ST[] = "SELECT type FROM test.rc522 WHERE uid = %s and time_start <= (select HOUR(NOW())) and time_end > (select HOUR(NOW()));";

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

    Находим

    sprintf(query, QUERY_S, toQuery);

    Меняем на

    sprintf(query, (mode? QUERY_S : QUERY_ST), toQuery);

    После этого необходимо убедиться в точности часов Вашего MySQL сервера. В целом этого будет достаточно для организации доступа по времени для каждого ключа.

    PS: на практике не проверял, но Вам должно хватить этой информации для дальнейшей реализации.

    • Like 1

  14. @slava_573 доброе время суток.

    15 часов назад, slava_573 сказал:

    подскажите пожалуйста в иснии есть тип карты 0,1,2. доступ разрешен или нет и мастер.

    рабтает ли ета функция?

    Да, работает. Вот та часть кода, из оригинальной программы которая отвечает за это

        if(typeKey == F("1") or typeKey == F("2")) {
          if(!mode) {
            Serial.println(F("access allow"));
            // Доступ разрешен
            if(modeLock) {
              openTimer = millis()/1000;
              digitalWrite(PIN_RELAY, LOW); 
            }
            else digitalWrite(PIN_RELAY, !digitalRead(PIN_RELAY));
            squeaker(2, 2200, 200, 200);
          }
          else {
            if(typeKey != F("1")) {
              Serial.println(F("error: key elrady exists in eeprom"));
              squeaker(2, 500, 300);
            }
          }
        }

    По поводу Ваших потребностей с доработкой замка. Думаю, что это возможно и сходу вижу два варианта

    1. Кардинально переработать SQL запрос и проводить все необходимые проверки на уровне сервера базы данных.
    2. Использовать между контроллером и сервером базы данных посредника, например, PHP скрипт, который будет проводить все необходимые проверки и принимать соответствующие решения. На контроллере останется только задача управления замком, а вся логика переляжет на плечи PHP и даст возможность модифицировать систему под будущие потребности.

  15. @EndWar проверьте, что по факту передается при запросе показаний с датчиков. Откройте в браузере "Инструменты разработчика", вкладка Network и выберите запрос /api/sensors В его описании будет разбор json строки с показаниями.

    Скорее всего, в Вашем варианте метеостанции проблема кроется в типе передаваемых данных с датчика BME280. Это float, а в описании структуры для хранения этих самых показаний используется integer, т.к оригинальный вариант программы рассчитан на работу с датчиком BMP085 который передает данные только в целочисленном виде.

    /*
       структура и переменные для хранения показаний датчиков
    */
    struct sensor {
      int   data = 0;
      bool  status = false;
    };

    Измените int на float в описании структуры и проверьте результат.

    • Like 1

  16. @EndWar Рад, что у Вас все получилось и заработало без каких-либо проблем.

    По поводу измерения напряжения питания. Используется встроенный АЦП переключенный на измерения напряжения питания средствами самого микроконтроллера. Не отрицаю, что он может нам приврать, есть множество причин, которые способствуют этому. Но, на мой взгляд, это самый простой способ и избавляет от колхоза с внешним делителем, что ухудшает повторяемость проекта. Хотя резистивный делитель тоже вещь не надежная. Думаю, что для точного измерения напряжения лучше использовать внешний АЦП.


  17. @Alex_DIY Давайте разбираться. Данной Вами информации недостаточно чтобы понять в какую сторону копать. Потребуется произвести ряд действий. Я использую Google Chrome и часть действий описывается именно под него. Для других браузеров нужно действовать аналогично.

    Необходимо открыть Наcтройки управления -> Дополнительные инструменты -> Инструменты разработчика (Ctrl + Shift + I) и произвести удаление какого-либо файла.

    Ashampoo_Snap_2017.06.17_16h29m50s_005_espws2-local - Google Chrome.png

    Проверить состояние удаления (ответ микроконтроллера)

    Ashampoo_Snap_2017.06.17_16h30m32s_007_espws2-local - Google Chrome.png

    Также в Serial мониторе можно увидеть запрос на удаление.

    Из-за особенностей работы контроллера с памятью стоит проверить следующее

    • Возможность загрузки файлов через Web интерфейс (можно даже не нужные для работы)
    • Обновить прошивку через Web интерфейс

     

     

     


  18. @alexd6969 Вы проверили скомпилированную мною прошивку?

    Я думаю, что ошибки по всем адресам на i2c указывают на проблемы физического характера.

    • Не качественный монтаж линии или устройств на ней
    • Слишком длинная линия
    • Наводки на лини
    • Неисправность одного из устройств на линии

    Я сталкивался с таким один раз, при выходе из строя барометра BMP085, в причины выходя из строя я не углублялся т.к отсутствует какое либо специализированное оборудование вроде осциллографа, но думаю, что он начал шумел на шине.

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

  19. @Alex_DIY Попробуйте удалить  все оригинальные .js и .css, оставьте только их архивные копии (.gz). Все распространенные браузеры поддерживают работу с жатыми данными. Возможно, этого хватит, чтобы вместить все на flash объемом 1мб.

    По поводу библиотеки для барометра. Используемая в проекте библиотека от Adafruit может снимать показания со встроенного датчика температуры. Достаточно внести следующие изменения.

    Инициализация датчиков

    Скрытый текст
    
      /*
         Инициализация сенсоров на шине i2c
         BH1750, SI7021, BMP085
      */
      Wire.beginTransmission(35);
      if(Wire.endTransmission() == 0) {
        BH1750.begin();
        light.status = true;
      }
    
      Wire.beginTransmission(64);
      if(Wire.endTransmission() == 0) {
        temperature.status = humidity.status = SI7021.begin(pin_sda, pin_scl);
      }
      
      Wire.beginTransmission(119);
      if(Wire.endTransmission() == 0) {
        pressure.status = BMP085.begin();
      }

     

    Заменить на

    Скрытый текст
    
      /*
         Инициализация сенсоров на шине i2c
         BH1750, SI7021, BMP085
      */
      Wire.beginTransmission(35);
      if(Wire.endTransmission() == 0) {
        BH1750.begin();
        light.status = true;
      }
    
      Wire.beginTransmission(64);
      if(Wire.endTransmission() == 0) {
        humidity.status = SI7021.begin(pin_sda, pin_scl);
      }
      
      Wire.beginTransmission(119);
      if(Wire.endTransmission() == 0) {
        temperature.status = pressure.status = BMP085.begin();
      }

     

    Найти функцию отвечающую за получение показаний с датчиков

    Скрытый текст
    
    /*
       Функция считывающая показания сенсоров через установленный интервал времени
    */
    void readSensors() {
      timerReadSensors = millis();
    
      if (light.status) light.data = BH1750.readLightLevel();
      if (temperature.status) temperature.data = SI7021.getCelsiusHundredths();
      if (humidity.status) humidity.data = SI7021.getHumidityPercent();
      if (pressure.status) pressure.data = BMP085.readPressure();
    }

     

    Заменить на

    Скрытый текст
    
    /*
       Функция считывающая показания сенсоров через установленный интервал времени
    */
    void readSensors() {
      timerReadSensors = millis();
    
      if (light.status) light.data = BH1750.readLightLevel();
      if (humidity.status) humidity.data = SI7021.getHumidityPercent();
      if (temperature.status) temperature.data = BMP085.readTemperature();
      if (pressure.status) pressure.data = BMP085.readPressure();
    }

     

    И спасибо, что указали на недоработку с шаблоном имени точки доступа. В ближайшее время внесу изменения.


  20. @alexd6969 очень настораживаем момент с компиляцией скетча, а точнее то, что Вам пришлось вносить изменения и комментировать часть кода. Такого быть не должно. Задумка всего проекта в том, чтобы просто залить программу со всеми сопутствующими файлами web сервера не внося никаких поправок в неё и все заработает.

    Я предлагаю следующее - убедиться в актуальности всего парка используемого программного обеспечения, а именно:

    • последняя версия Arduino IDE (на момент публикации этого поста я проверил на 1.8.1 и 1.8.3)
    • последняя версия ПО для поддержки ESP8266 (на момент публикации этого поста версия была 2.3.0)
    • последние версии всех используемых библиотек, указанных в программе микроконтроллера (ссылки в описании самой программы)

    На всякий случай я опубликовываю собранную программу. Можете залить через web интерфейс и проверить как поведет себя метеостанция.

    ESP8266_WS_iT4iT.CLUB.bin.7z

×
×
  • Создать...