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

Kitsum

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

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

  • Посещение

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

    234

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


  1. 24.01.2019 в 15:54, olegkaras сказал:

    Поделитесь прошивкой на несколько DS18B20 ,  мне нужно что бы обращение к датчику происходило по серийному номеру (если какой нибудь датчик отсоединить то нумерация списка датчиков не менялась).  

    Вы можете воспользоваться решением указанным несколько постов ранее, только внесите одно изменение.

    Замените запрос температуры по индексному номеру датчика

    sensors.add(T, device::in, "ds18b20_s0", [&](){ return ds18b20.getTempCByIndex(0); });

    на запрос по уникальному серийному номеру

    sensors.add(T, device::in, "ds18b20_s0", [&](){ return ds18b20.getTempC({ 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 }); });

    После этих изменений датчику c идентификатором ds18b20_s0 будет соответствовать DS18B20 с адресом 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0


  2. 16.01.2019 в 21:23, alex0127 сказал:

    Ошибки идут иногда с DS18, с BME ни разу не замечал, а с DS18 раз в 5 мин проскакивает значение -127, хотя все соединения хорошие и кабель родной короткий прямо в ESP вставлен...

    • Попробуйте провести эксперимент используя только один из двух датчиков по очереди чтобы попытаться исключить неисправность датчиков. Или временно замените датчики на другие.
    • Убедитесь, что сама линия имеет надежные контактные соединения с контроллером и датчиками.
    • Проверьте исправность подтягивающего резистора на шине 1 wire.
    • Попробуйте подключать датчики без использования паразитного питания если конечно последнее используется.
    • Воспользуйтесь одним из стандартных примеров библиотеки DallasTemperature для 10-15 минутного теста.

     


  3. Доброе время суток.

    14.01.2019 в 20:33, alex0127 сказал:

    можно ли написать краткую инструкцию по подключению 2-х ds18b20,  к имеющимся 2 BME280

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

    В первую очередь Вам понадобятся следующие библиотеки:

    1. OneWire https://github.com/PaulStoffregen/OneWire
    2. DallasTemperature https://github.com/milesburton/Arduino-Temperature-Control-Library

    Скачиваем и добавляем их в Arduino IDE. Первая необходима для реализации обмена данными через шину 1 wire, а вторая представляет из себя всю необходимую реализацию для работы с датчиками серии DS18.

    Теперь необходимо определиться с тем, какой порт мы задействуем под шину 1 wire, это важно т.к в проекте уже задействовано много портов, а ESP8266 очень в них ограничена. Из свободных и безопасных остался только GPIO16 (D0 на платах NodeMCU) но с ним могут быть проблемы, в любом случае это стоит проверить. Если вдруг не получится, то придется задействовать один из портов, используемых для управления нагрузкой, например, GPIO14 (D5 на платах NodeNCU). Ранее мы использовали его для управления нагрузкой по разности показаний между двумя датчиками BME280.

    ВАЖНО: если с GPIO16 не получится и придется использовать GPIO14, то в основном файле программы закомментируйте вызов функции инициализации данного порта

    // gpio_14();

    Все необходимое для работы с DS18B20 будем описывать в файле users_bme280_x2.h т.к по всей видимости именно им Вы и пользуетесь в работе с двумя датчиками BME280.

    Подключаем дополнительные библиотеки.

    #include <OneWire.h>
    #include <DallasTemperature.h>

    Следом можно объявить все необходимые объекты для работы с шиной и датчиками. Я сразу укажу варианты для разных портов.

    DallasTemperature ds18b20(new OneWire(16)); // GPIO16 (D0)
    // DallasTemperature ds18b20(new OneWire(14)); // GPIO14 (D5)

    Теперь доработаем функцию sensors_config так, чтобы в ней появились следующие дополнительные строки

    void sensors_config() {
      /* тут описан код других датчиков */
    
      ds18b20.begin();  
      cron.add(cron::time_5s, [&](){ ds18b20.requestTemperatures(); }, true);
      sensors.add(T, device::in, "ds18b20_s0", [&](){ return ds18b20.getTempCByIndex(0); });
      sensors.add(T, device::in, "ds18b20_s1", [&](){ return ds18b20.getTempCByIndex(1); });
    }

    Пару слов о том, что мы добавили в эту функцию.

    Инициализация шины 1 wire

    ds18b20.begin();

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

    cron.add(cron::time_5s, [&](){ ds18b20.requestTemperatures(); }, true);

    Далее описываем каким способом собирать данные с датчиков

    sensors.add(T, device::in, "ds18b20_s0", [&](){ return ds18b20.getTempCByIndex(0); });
    sensors.add(T, device::in, "ds18b20_s1", [&](){ return ds18b20.getTempCByIndex(1); });

    В данном представлении датчики объявлены как внутренние - device::in (можете объявить их как внешние device::out), и имеют идентификаторы в системе ds18b20_sX, где X это индекс датчика найденного библиотекой DallasTemperature. Эта информация будет полезна если появится необходимость вывода данных с этих датчиков на общий график.

    В теории все должно заработать. Отпишитесь пожалуйста о своих результатах.


  4. @Сергій Артеменко доброе время суток.

    Это возможно. Один из вариантов, это добавить в планировщик задач новое задание, которое будет, например, раз в час перезаписывать определенный файл во Flash памяти и сохранять туда данные по всем точкам графика. Сами данные хранить в формате JSON. При старте микроконтроллера читать этот файл, разбирать JSON и заполнять массив в оперативной памяти. В принципе это не сложная задача, практически все необходимое уже реализовано в коде.

    Из минусов можно отметить следующее:

    1. При перезагрузке точки на графике могут сдвинуться на время равное тому интервалу времени пока контроллер был выключен. Чем дольше не было питания, тем больше будет рассогласование. Это связано с тем, что контроллер не хранит отметки времени для точек на графике, отсчет идет от последней сохраненной точки с известными интервалами времени опираясь на время устройства с которого просматривается график. Это сделано для того, чтобы отказаться от учета реального времени на микроконтроллере.
    2. Любая Flash память имеет ограничение на количество циклов перезаписи, ESP8266 не исключение и число циклов составляет примерно 100000. Если перезаписывать Flash раз в час, то срок жизни будет составлять примерно чуть более 11 лет.
    • Thanks 1

  5. [esp8266] Библиотека smartBlink, реализует умное управление штатным светодиодом, что позволяет добавить индикацию состояния вашей программы или микроконтроллера.


    Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер.

    Подключение библиотеки

    #include <smartBlink.h>

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

    smartBlink::smartBlink(byte gpio, bool on = LOW);

    Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода.

    Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом.

    #define led2_pin 2
    #define led2_on_signal LOW
    
    smartBlink led2(led2_pin, led2_on_signal);

    Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать.

    smartBlink::setMode(mode_t mode);

    Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду.

    led2.setMode(smartBlink::mode_flash1);

    Режимов работы может быть несколько.

    led2.setMode(smartBlink::mode_off);
    led2.setMode(smartBlink::mode_flash1);
    led2.setMode(smartBlink::mode_flash2);
    led2.setMode(smartBlink::mode_flash3);
    led2.setMode(smartBlink::mode_flash4);
    led2.setMode(smartBlink::mode_burn);
    led2.setMode(smartBlink::mode_inhalf);

    Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод

    led2.previous();

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

    С библиотекой идут несколько примеров.


     


  6. [esp8266] Библиотека Cron, реализует планировщик задач для периодического выполнения пользовательских функций.


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

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

    Данная библиотека предоставляет следующий функционал

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

    Подключение библиотеки

    #include <cron.h>

    Пример добавление задачи, которая вызывает функцию blink_f каждую секунду

    cron.add(1000, blink_f);

    Добавление этой же задачи в режиме холодного старта

    cron.add(1000, blink_f, true);

    Добавление задачи и присвоение ей человек понятного идентификатора

    cron.add(1000, blink_f, "Blink");

    Добавление задачи с холодным стартом и присвоением ей человек понятного идентификатора

    cron.add(1000, blink_f, "Blink", true);

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

    Фундаментальные константы

    • cron::second
    • cron::minute
    • cron::hour
    • cron::day

    Самые распространенные значения

    • cron::time_1s
    • cron::time_5s
    • cron::time_10s
    • cron::time_15s
    • cron::time_30s
    • cron::time_1m
    • cron::time_5m
    • cron::time_10m
    • cron::time_15m
    • cron::time_30m
    • cron::time_1h
    • cron::time_5h
    • cron::time_10h
    • cron::time_12h
    • cron::time_1d

    С константами можно производить арифметические операции чтобы получить необходимые временные интервалы.

    cron.update("Blink", cron::time_1s);
    cron.update("Blink", cron::time_1s * 12);
    cron.update("Blink", cron::time_30s + 500);

    и т.д

    В функции loop должна находится команда вызова обработчика.

    void loop() {
      cron.handleEvents();
    }

    Поиск задачи по установленному ранее идентификатору

    cron.find("Blink");

    В ответ возвращается объект типа cronEvent который содержит все данные задачи или 0 если задача не была найдена. Можно использовать в качестве простой проверки.

    if (cron.find("Blink")) {
      /* … */
    }

    Следующий метод позволяет получить время последнего вызова задачи

    uint32_t time = cron.lastRun("Blink");

    В качестве параметра можно передать идентификатор с типом cronEvent полученный с помощью метода поиска задачи.

    Перезапуск таймера задачи производится следующим образом

    cron.update("Blink");

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

    cron.update("Blink", cron::time_10m);

    Остановка выполнения задачи

    cron.stop("Blink");

    Проверка активности задачи

    bool active = cron.isActive("Blink");

    С библиотекой идут несколько примеров.


     


  7. [esp8266] Библиотека CMD, реализует настройку микроконтроллера и управление вашей программой через терминал.


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

    Данная библиотека позволяет реализовать:

    • Управление микроконтроллером
    • Любую настройку, будь то WiFi, другие библиотеки или часть Вашей программы
    • Вызывать Ваши задачи (функции) из терминала по команде и передавать им требуемые параметры
    • Использовать контроллер в качестве шлюза между датчиками и программами на PC

    Внимание: любая команда, передаваемая в терминал обязана заканчиваться символом перевода строки "\n".

    Подключение библиотеки

    #include <cmd.h>

    Инициализация объекта, к которому мы будем обращаться для добавления команд. В качестве параметра объекту необходимо передать указатель на объект Serial или любой другой схожий по типу интерфейс.

    cmd command(&Serial);

    В функции Setup описываем какие команды требуется обрабатывать. Например, по команде "test" вызывать пользовательскую функцию с именем "myFunctionName". Имя пользовательской функции может быть абсолютно любым.

    void Setup() {
      Serial.begin(115200);
      
      command.add("test", myFunctionName);
    }

    Пользовательская функция будет вызываться каждый раз, когда по интерфейсу Serial поступит команда "test". Если команда будет передана с параметрами, то эти параметры будут переданы в качестве аргументов пользовательской функции.

    В функции loop должна находится команда вызова обработчика.

    void loop() {
      command.handleEvents();
    }

    Пользовательская функция обязана соответствовать ряду требований:

    • Не возвращать никакого результата (быть объявленной с типом void)
    • Принимать в качестве первого аргумента переменную с типом byte в которой будет храниться число равное количеству переданных параметров
    • Принимать в качестве второго параметра переменную с типом char** в которой будет храниться указатель на массив со всеми указателями (char*) на переданные параметры
    void myFunctionName(byte argc, char** argv) {
    	/* ... */
    }

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

    Чтобы перебрать все переданные параметры и вывести их в консоль, можно воспользоваться следующим примером

    void myFunctionName(byte argc, char** argv) {
      if (0 < argc) {
        for (uint8_t i = 0; i < argc; i++) {
          Serial.printf("%i. %s\n", i, argv[i]);
        }
      }
    }

    Пример вызова пользовательской функции без параметров и с ними

    # test
    No parameter was passed
    # test p1 p2 p3 p4 p5
    0. p1
    1. p2
    2. p3
    3. p4
    4. p5

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

    Чтобы сравнить два значения, например, параметр под индексом 0 (идет первым в списке) с каким-либо значением в программе, воспользуйтесь функцией strcmp, которая возвращает целочисленное значение, указывающее на лексическое расхождение строк. Если строки равны, то возвращаемое значение равно 0.

    if (!strcmp(argv[0], "wifi")) {
      Serial.println(F("Первый аргумент WiFi"));
    } else {
      Serial.println(F("Первый аргумент НЕ WiFi!!!"));
    }

    Для копирования значения указателя в другую переменную с типом char можно воспользоваться функцией strcpy

    char myVar[20];
    strcpy(myVar, argv[0]);
    
    if (myVar == "123456") {
      Serial.prinln(F("ok"));
    }

    Также можно обернуть указатель объектом String и получить весь функционал этого объекта, который будет содержать значение параметра

    String param1(argv[0]); // String param1 = argv[0];
    
    Serial.printf("argv[0] length: %i\n", param1.length());
    Serial.printf("argv[0] is integer?: %s\n", param1.toInt() ? "YES" : "NO");
    
    if (param1 == "qwerty") {
      Serial.println(F("Hello QWERTY!"));
    }

    С библиотекой идут несколько примеров, в том числе и пример конфигурации WiFi в режиме STA.


     


  8. Все доброго времени суток.

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

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

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

    1. Учет показаний по двум канал (горячая, холодная) с счетчиков, обладающих импульсным выходом, работающим по принципу сухого контакта.
    2. Подключение (переподключение) к домашней точке доступа
    3. Передача показаний счетчиков на удаленный MQTT сервер
    4. Корректировка показаний счетчиков через публикацию сообщений в специализированных топиках на MQTT сервера
    5. Корректировка количества импульсов на единицу значения счетчика через специализированный топик на MQTT сервере
    6. Хранение показаний в энергонезависимой памяти на случай пропажи питающего напряжения

    Теперь немного по программе.

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

    Программа контроллера не использует спящий режим или другие энергосберегающие приемы, что подразумевает питание от внешнего источника, например, блока питания от старого телефона. Но можно взять у наших братьев с востока контроллер с DC-DC преобразователем и картриджем для литиевого аккумулятора 18650.

    IMG_3338.JPG IMG_3339.JPG

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

    В первую очередь для реализации Вам понадобится дополнительная библиотека PubSubClient использующаяся для связи с MQTT сервером. Она доступна в каталоге библиотек среды разработки Arduino IDE.

    Что касаемо настроек, то в первой версии оставим их в самом коде.

    Сетевые настройки

    /* Настройки подключения */
    String ssid   = "AP_Name";          // Имя домашней точки доступа
    String pass   = "AP_Pass";          // Пароль к домашней точки доступа
    String server = "mqtt.it4it.club";  // Адрес MQTT сервера
    String device = "waterCounter";     // Обязательно уникальное имя для каждого MQTT клиента

    Если вы пользуетесь собственным MQTT сервером, то имя устройства можно не менять, в противном случае укажите иное имя или оставьте его пустым и в таком случае будет использован WiFi идентификатор устройства, содержащий два последний байта MAC адреса устройства.

    Настройки используемых портов

    /* Порты для подключения импульсного выхода с счетчиков */
    byte HPort = 12;
    byte CPort = 14;

    Таблица соответствия портов ESP, плат WeMos и NodeMCU указана в комментариях в самом коде.

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

    /*
      Устанавливаем какое количество импульсов требуется для сохранения данных и отправки их на сервер.
      1 импульс = 0,01 куб.м (10 литров), 100 импульсов = 1 куб.м (1000 литров) оптимальное значение.
    */
    uint16_t ppuv = 10;

    Обычно на счетчиках указано какое количество литров расхода соответствует одному импульсу и в большинстве случаев это 10 литров на 1 импульс. По умолчанию в программе используется значение в 10 импульсов, что равняется 100 литрам расхода воды. Это означает, что за 1 куб.м. расхода контроллер 10 раз передаст показания на сервер. Это также означает, что переданные значения будут содержать не только целое количество израсходованных кубов, но и десятую нового куба. (00000.1), по сути точность показаний при ppuv равным 10 будет 0.1 куба. Подправьте это значение под Ваш счетчик.

    Программа сохраняет показания в энергонезависимую память одновременно с передачей показаний на внешний сервер, важно это помнить т.к если использовать малое значение ppuv, например 1, то Flash память микроконтроллера будет очень часто перезаписываться, что приведет к быстрому выходу её из строя. В большинстве модулей ESP используется Flash память с минимальным количеством циклов перезаписи равным 100000. Это не мало, но вопрос в том, как расходовать. При ppuv равном 10 и средним расходом воды 10 куб.м. по каждому из каналов в месяц, микросхема выработает первые свои 100000 циклов через 4 года. В принципе мы легко повысим срок службы Flash памяти в следующих версиях, но на данный момент имеем эти показания.

    Если я где-то ошибся в математике при расчетах, то прошу меня ссаными тряпками не бить.

    Передача показаний на удаленный MQTT сервер

    Данные передаются в топик начинающийся с имени устройства указанного в конфигурации или WiFi идентификатора если имя не используется. Далее идут субтопики с именами hot и cold для обозначения горячей и холодной воды соответственно. Данные публикуются в виде целых чисел, и на самом деле может не быть целым числом т.к зависит от переменной ppuv. Просто имейте это в виду и отбрасывайте десятичную и т.п часть в голове. В будущей версии все это будет учтено.

    1. waterCounter/hot
    2. waterCounter/cold

    Корректировка показаний

    При подключении микроконтроллера к сети происходит подписка на топик MQTT сервера через который можно производить изменение текущих показаний и не только.

    1. waterCounter/settings/#

    По сути подписка оформляется на все субтопики родителем которых является субтопик settings. Это означает, что чтобы изменить показания горячей, холодной воды или значения ppuv можно опубликовать нужное значение в следующих топиках:

    1. waterCounter/settings/hot
    2. waterCounter/settings/cold
    3. waterCounter/settings/ppuv

    Значения должны быть целым числом и учитывать конфигурацию ppuv, а значит иметь дополнительные значения для чисел после запятой. То есть при значении счетчика в 555 кубов и ppuv равным 10 для стандартного счетчика, публикуемое значение для настроек должно быть 5550.

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

    Скачать исходник можно тут

     


  9. @Devilisimo доброе время суток.

    21.11.2018 в 12:09, Devilisimo сказал:

    D5 и D3 кнопки, при подтяжке программно кнопки не работают, у них есть некое сопротивление.

    Порт D3 (GPIO0) используется микроконтроллером для выбора режима работы при старте. Схема платы NodeMCU уже приводилась в теме и также она общедоступна в сети, естественно, что от ревизии к ревизии она может меняться, но фундаментальных изменений там быть не может.

    NodeMCU-schematic-diagram.jpg

    Как видно из разных частей схемы, порт GPIO0 подключен к USB TTL конвертеру через транзистор S8050 и параллельно с этим подключен через токоограничивающий резистор и кнопку, разомкнутую в не нажатом состоянии, к земле. Транзистор отвечает за смену режима в автоматическом режиме при загрузке программы, кнопка делает тоже самое, но в ручном режиме. Также об этом есть упоминание в виде отдельной сноски.

    Цитата

    GPIO0 HIGHT -> RUN MIDE, LOW -> FLASH MODE

    Что касательно порта D5 (GPIO14), то он свободен. Единственное, что Вы могли упустить, это удалить в основном файле вызов функции управления нагрузкой при расхождении показаний абсолютной влажности между двумя датчиками BME280.

    gpio_14(); // Расхождение расчетной абсолютной влажности между показаниями с двух датчиков, например, BME280

    Но мне кажется, что Вы не могли пропустить её и она уже удалена. Если это так, то внимательно пересмотрите схемотехнику Вашего проекта и код обслуживающий порт GPIO14. Все должно работать.

    Теперь, что касательно предоставленного кода.

    Я посоветую Вам использовать прерывания для фиксации изменений на портах т.к в момент нажатия кнопки контроллер может заниматься, например, отгрузкой данных для web интерфейса или передачей показаний на сторонние сервера и т.к микроконтроллер ESP8266 подразумевает однопоточное выполнение кода, то все процессы протекают друг за другом. В свою очередь это говорит нам, что все задачи равны и выполняются друг за другом, независимо от того, сколько времени займет выполнение той или иной задачи.

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

    1. В общей цепочки кода настало время для ЦП выполнить код обработчика планировщика задач.
    2. Планировщик задач оценивает настало ли время каким то Вашим функция запуститься и вызывает их.

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

    Также при нажатии кнопки неизбежно происходит дребезг контактов, от него можно уйти двумя способами - программно и аппаратно. Аппаратный способ представляет из себя RC цепочку, об этом есть много информации в интернете, но т.к вы используете внутреннюю подтяжку, то останется только добавить конденсатор последовательно с кнопкой. Программный способ более сложный и подразумевает, что вводится время игнорирования сигнала, например, с момента первого нажатия кнопки, устанавливается интервал, пусть это будет 100 мс, в течении которых все последующие нажатия игнорируются. Это идеальный способ для большого и многозадачного, в плане количества выполняемых задач, проекта.

    Есть еще ПЛОХОЙ способ борьбы с дребезгом, обычно используется без прерываний, но с прерываниями он был бы еще хуже и приносил бы только вред, это использование sleep в коде после фиксации нажатия. Я не буду договаривать или намекать как это реализуется, т.к это вредный совет, но знайте, что такой подход имеет право на жизнь, исключительно в программах малонагруженных и обычно обслуживающих что-то связанное с наблюдением да парой контактов, обычно это кодовые замки и сигнализации, где время нажатия, по меркам контроллера, очень долгое или контакт вовсе не восстанавливается.

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


  10. @Devilisimo Объект общего графика не строится автоматически, все правится руками в коде. Данные освещенности отображены т.к совпали с одним из свойств метода самого графика. Я указал на два варианта решения задачи - править все каждый раз руками или дополнить интерфейс панели управления. В данном случае первый вариант будет самым простым и быстрым, для этого ознакомьтесь с функцией обработки нажатия кнопки графика.

    $("#graph").click(function() {
    	/* ... */
    });

     


  11. 31 минуту назад, Devilisimo сказал:

    На суточном графике нет отображения всех параметров. Что на это влияет?

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

    Есть два варианта, как выйти из этой ситуации:

    1. В файле index.htm самостоятельно правите в нескольких местах код и приводите оформление к желаемому виду.
    2. Реализовать в панели управления раздел, позволяющий править оформление графика для всех сенсоров и там каждый кастомизируется как хочет.

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

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

    Если сообщество будет заинтересованно, то появится третья версия, но скорее всего на контроллере ESP32.


  12. @Devilisimo доброе время суток. Рад, что у все получилось, но не затруднит ли Вас описать точное количество и типы датчиков на i2c шине в те моменты, когда вылетала ошибка? Не совсем ясно, сколько датчиков BME использовалось по факту до того момента, когда была добавлена конфигурация "для двух датчиков". На Nano проверяли путем подключения одного датчика и запуска одного из стандартных примеров?


  13. @Devilisimo Порт GPIO-2 уже занят штатным светодиодом ESP (по крайней мере для ESP-12X) и объектом blink, описанным в файле tools.h, который и управляет этим светодиодом. Вы выбрали порт, который не висит "свободно в воздухе". Я указал на это в сообщении выше, а также на то, что нужно сделать. Но даже после исправления в коде на порту GPIO-2 останется висеть распаянный на фабрике светодиод, который еще и управляется низким логическим уровнем, что в свою очередь говорит о наличие на порту (со второго "конца" светодиода) напряжения 3.3V которые оказываются на ноге Data вашего датчика. Все эти моменты в комплексе и дают Вам тот результат, который имеется на данный момент. Я вообще удивлен, что датчик испытывает трудности только иногда, а не в течении всего времени, пока на плату подано напряжение. В любом случае, воспользуйтесь одним из двух советов о которых я Вам писал выше, и если не поможет, то выпаивайте штатный светодиод, но перед этой операцией обратитесь к актуальной схеме Вашего модуля, кстати в ней Вы найдете ответ почему кнопка на GPIO-15 не заработала, скорее всего этот порт подтянут к земле.

     


  14. 09.11.2018 в 09:27, Devilisimo сказал:

    Не совсем понимаю для чего это делать нужно.

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

    Как проверить баг

    1. Оставьте порт GPIO-0 висеть в воздухе
    2. Подайте питание на микроконтроллер
    3. Попробуйте обновить прошивку через web интерфейс, на последнем этапе этой процедуры происходит перезапуск контроллера

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

    При этом, если оставить GPIO-0 висеть в воздухе, а после подачи питания на микроконтроллер сбросить его через Reset порт (кнопкой) и повторить процедуру загрузки программы через web интерфейс, то все прекрасно отработает. Вот такой феномен.

    09.11.2018 в 09:27, Devilisimo сказал:

    Функционал станции: датчики наружные BME280 и BH1750, показания буду отправлять на народный мониторинг; внутри датчик DHT22 и CCS811

    Я бы рекомендовал отказаться от датчиков DHT серии в пользу второго датчика BME280, благо их можно держать два на линии, как и некоторые другие датчики температуры и влажности и т.д

    09.11.2018 в 09:27, Devilisimo сказал:

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

    Естественно, что на одном порту мигать светодиодом и общаться с датчиком просто так не получится, но без паники, ничего не решаемого нет.

    Есть два варианта

    1. Вырезать в коде все упоминание о smartBlink, можно оставить само описание класса, но все вызовы методов этого класса в основном коде должны быть закомментированы.
    2. Более интересный вариант подразумевает доработку вашего кода, а точнее той его части где происходит опрос датчика на порту GPIO-2

    Первый вариант

    Найдите в файле tools.h строку окончания описания класса smartBlink и инициализации объекта этого класса с именем blink.

    } blink;

    и приведите её к такому виду

    };

    Теперь найдите в проекте все вызовы методов объекта blink по такому шаблону

    blink.

    И закомментируйте их. Таких строк не много, думаю меньше одного десятка и все должны быть в файле webserver.h

    Второй вариант

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

    Нам стоит присмотреться к методам самого класса smartBlink среди которых есть два очень полезных.

    void smartBlink::setMode(mode_t mode);
    void smartBlink::previous();

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

    Модифицируйте свой код таким образом, чтобы до начала работы с общим портом (сбора данных с датчика DHT) происходил выбор режима, при котором светодиод выключен, а после окончания работы с портом возвращался предыдущий режим индикации.

    blink.setMode(smartBlink::mode_off);
    /*
        Ваш код должен находиться в этой части
    */
    blink.previous();

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

     


  15. @Devilisimo порт 2 задействован для индикации состояния микроконтроллера (режим AP, STA и ход выполнения различных задач). На этом порту по умолчанию сидит светодиод практически на всех модулях ESP, я просто воспользовался его наличием.

    Что касаемо типа port_t

    typedef enum {
      gpio0 = 0,
      gpio2 = 2, // NodeMCU
    } port_t;

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

    07.11.2018 в 15:47, Devilisimo сказал:

    Какие еще пины задействованы "неявно"?

    Мне кажется это не совсем корректное определение, все порты заданы явно, плюс об этом я должен был упоминать в статье. Порт 2 используется для индикации состояния и описан в файле tools.h. Порты: 12, 13 и 14 для управления нагрузкой и описаны в файле gpio.h. Порты 4 и 5 для работы с i2c шиной и описаны в файлах с примерами, это файлы, название которых начинается с users_ и имеющие расширение .h. Если не считать системные порты, занятые под собственные нужды ESP, то все остальное свободно.

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


  16. 11 минут назад, Dmitry Moshalkov сказал:

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

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

    if(file.type !== "application/octet-stream") {
        showAlert("Неверный формат файла");
        return false;
    }

    приведя его к такому виду

    if(file.type !== "application/octet-stream") {
        showAlert("Неверный формат файла: " + file.type);
        return false;
    }

     


  17. @Dmitry Moshalkov доброе время суток. Проблема явно связана с расхождением mime типов. Необходимо узнать, что получается у вас при компиляции.

    Т.к Вы пользуетесь MacOS, а она имеет родство с UNIX системами, то Вам должна быть доступна консольная утилита File, по крайней мере я буду на это надеяться. Вызовите контекстное меню действий над объектом (правой кнопкой мыши или два пальца touchpad), после этого нажмите клавишу ⌥Option (Alt) и в меню Вам станет доступен пункт копирования полного пути к файлу.

    Откройте консоль и введите

    file -b --mime-type

    через пробел дополните команду вставив из буфера (⌘Cmd + V) скопированный ранее путь и отправьте это все на выполнение. На выходе Вы должны получить mime тип указанного файла. Например, такой.

    application/octet-stream
    

    Я смогу проверить, что получается при компиляции под MacOS только сегодня вечером.


  18. Доброе время суток.

    02.11.2018 в 13:12, pasha413 сказал:

    Здравствуйте. снова добрался до ESP-01, решил подключить BME280 к выводам 0 и 2, показаний нет, при сканировании датчик то появляется то пропадает. так же происходит и с другими датчиками i2c. в чем может быть проблема? DHT22 работал нормально

    Давайте начнем с самого главного - DHT22 не работает с i2c шиной, для него требуется отдельный порт микроконтроллера, поэтому работа с ним НЕ может быть такой же, как работа с BME280. По моему субъективному мнению, их не стоит ставить на одном уровне, BME280 более выгодный и надежный вариант.

    Теперь о проблеме, причин может быть несколько:

    1. Порт микроконтроллера уже используется чем-то
    2. Ошибка в коде
    3. Плохой контакт i2c шины с микроконтроллером
    4. Плохой контакт i2c шины с одним из датчиков
    5. Один из датчиков вносит хаос в работу всей шины

    Меня очень настораживает перевод одного из стандартных портов i2c шины на другую "ногу" микроконтроллера, т.к это не даст совершенно ничего кроме физического переезда на другую группу контактов, но это было сделано, значит для чего то было нужно. Начните по порядку, возьмите оригинальную программу и оставьте только i2c шину с датчиками на оригинальных портах, проверьте работоспособность. Так станет ясно имеется ли проблема в самих датчиках или шине. Если проблема ушла, то пробуйте сменить порты шины (программно и аппаратно), если проблема не проявляется, то добавляйте поэтапно все используемые модули, сенсоры и т.п с поэтапным изменением в коде.

    02.11.2018 в 16:46, Devilisimo сказал:

    @Kitsum Прошу помощь советом. Данный код для опроса управления GPIO. При планомерной работе все хорошо. Если включить подряд несколько выходов, подать команду. Происходит срабатывание только последнего выхода в списке команд. Может чем-то поможете

    Что явно бросается в глаза так это массовый вызов callswitch в callback с последующим присвоением ошибочных значений для переменных. Функция callback вызывается каждый раз, когда приходит сообщение и этот факт ставит нас в строгие рамки.

    Например, пришло сообщение для субтопика switch0, что при этом произойдет? А произойдет следующее, всем переменным, кроме одной будет присвоено неопределенное логическое значение, возвращаемое функцией callswitch т.к проверки описанные в этой функции предусматривают совпадение только с одним топиком, в противном случае переменная sw остается явно не заданной, то есть нам вообще неизвестно её значение. Аналогичная ситуация должна прослеживаться в случае поступления в любой топик, на который оформлена подписка, значения отличного от тех, что участвуют в проверках. И также она будет воссоздана для всех топиков в случае если во время работы программы был удален конфигурационный параметр отвечающий за корневой топик.

    Что сразу можно сказать по данному фрагменту кода

    sw_on_0  = callswitch(top, msg,  0);
    sw_on_12 = callswitch(top, msg, 12);
    sw_on_13 = callswitch(top, msg, 13);
    sw_on_14 = callswitch(top, msg, 14);
    sw_on_15 = callswitch(top, msg, 15);

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

    Позвольте дать Вам еще пару советов по поводу кода, это поможет не наступить на грабли в будущем.

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

    /* вырезка из кода */
    connect_OK = true;

    К сожалению, я не увидел, когда происходит определение обрыва соединения и ее значение меняется на false. Взамен этой переменной воспользуйтесь уже готовым методом объекта mqttAPI

    mqttAPI.connected()

    Он возвращает логическое значение, соответствующее наличию или отсутствию соединения с MQTT брокером.

    Вы можете оптимизировать описанную ниже конструкцию

    //gpio 0 D3 нежелательно
    if (sw_on_0 == true and digitalRead(0) == !gpio_enable)
    { digitalWrite(0, gpio_enable); mqttPublish("switch/on","gpio_0_is_ON"); }
    else if (sw_on_0 == false and digitalRead(0) == gpio_enable) digitalWrite(0, !gpio_enable);

    до такого вида

    if (digitalRead(0) != sw_on_0) {
        digitalWrite(0, !digitalRead(0));
        mqttPublish("switch/on", sw_on_0 ? "gpio_0_is_ON" : "gpio_0_is_OFF");
    }

    Теперь о главном.

    Я бы поставил под сомнение стоит ли использовать в функции callswitch ответ в виде вызова mqttPublish. На эту операцию тратится очень много времени, тем более, что ответ отправляется, когда планировщик задач вызывает функцию проверки соответствия состояния портов. Функция callswitch вызывается в функции callback, что не очень хорошо из-за описанной ситуации.

    В функции callswitch объявлена переменная sw использующаяся с оператором return.

    boolean sw;

    Остается не ясным, что вернет функция callswitch в случае если конфигурационная переменная mqtt_path не была задана, по сути не указан корневой топик в web интерфейсе. Или поступило любое сообщение отличное от ON или OFF в различных регистровых вариациях, например, "BlaBlaBla". Переменная sw должна иметь определенное начальное значение или это значение должно явно определяться в ходе выполнения функции, особенно когда функция должна вернуть результат в случае несовпадения топиков и этот результат должен быть в различных ситуациях разный, как true так и false (опять отсылка к массовому вызову callswitch в callback).

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

     


  19. @PulFred график метеостанции, это опорная точка. Нам наверняка известно, что график начинает строиться через 10 минут после старта микроконтроллера. Я могу сделать вывод, что примерно в 9 часов вечера микроконтроллер начал выполнять свою работу. Также может быть так, что у контроллера сработал сторожевой таймер, что привело к перезапуску и сбросу всех данных в памяти, в том числе и графика.

    Куда стоит обратить внимание:

    1. В первую очередь проверьте качество питания.
    2. Все модификации должны корректно отрабатывать в любом режиме работы микроконтроллера AP/STA, особенно если они контактируют с внешним миром.
    3. Убедитесь, что в коде нет утечки памяти. Эта проблема проявляется в версии 2.4.1 ядра ESP8266. Также эта проблема может быть вызвана модификациями.
    4. Если к метеостанции есть доступ из интернета, его необходимо закрыть т.к web сервер микроконтроллера не предназначен для массового наплыва клиентов, а ходить на веб сервер буду 100%. Среди клиентов сразу появятся различные сканеры и т.п программы.

    Зайдите в Настройки, раздел Система. Убедитесь, что объем свободной памяти сразу после запуска микроконтроллера примерно совпадает с объемом через, допустим, час или два после запуска. Заодно проверьте версию ядра (2.4.0 или 2.4.2).

    image.png 

    В самом конце этого раздела проверьте время беспрерывной работы. В моем случае таймер указывает на 9 дней и 4 часа, но на самом деле, через каждые 40 с лишним дней происходит переполнение millis и таймер начинает отсчет с нуля. Но для понимания происходящего этого вполне достаточно.

    image.png

    По своему варианту метеостанции (опубликованный исходник с выбранными датчиками + один программный датчик) с отправкой данных на три разные площадки в интернете, я делаю вывод, что в течении последних 9-и дней нет проблем с питанием и переполнением памяти.

    image.png image.png

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

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


  20. Доброе время суток.

    23.10.2018 в 10:10, Devilisimo сказал:

    Kitsum  подскажите пожалуйста. Прошил модуль nodemcu_integer_0.9.5_20150318 через nodemcu firmware programmer.

    Скетч заливается успешно и даже как-то работает. Но залить файлы в память не удается, ошибка SPIFFS Create Failed! 

    В чем может быть причина? Прошивки AT20SDK93 и подобные не работают, сыпятся ошибки.

    К сожалению, мне довольно сложно ответить на данный вопрос т.к я не сторонник загрузки данных через данную программу. Знаю, что необходимо указать несколько скомпилированных файлов с указанием соответствующих им адресов. Адреса могут меняться в зависимости от используемой микросхемы флеш памяти. Обратитесь к официальной документации или используйте Arduino IDE для загрузки данных. В пользу среды разработки в качестве программы загрузки могу сказать, что она дает простой способ произвести тонкие настройки для ESP8266 благодаря которым, начиная с версии ядра 2.4.2 можно разогнать скорость работы с сетевым трафиком в несколько раз. У меня получилось добиться загрузки самого тяжелого файла проекта (css файл с изображениями облаков) за 1.4 секунды внутри локальной сети.

    18 часов назад, PulFred сказал:

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

    Полагаю, что график взять с "Народного мониторинга". Эти пробелы наблюдаются на собственном графике метеостанции?


  21. @Devilisimo доброе время суток.

    Если мы говорим о переменном токе, то можно собрать собственную схему на симисторе и подобрать его по требуемым характеристикам. Вот вполне полное видео по данной теме.

    А вот для постоянного тока.

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

    PS: соблюдайте предельную осторожность при работе с абсолютно любой нагрузкой, даже не большие токи могут привести к летальному исходу!


  22. Всем доброе время суток. Допустил опечатку при указании версий ядра ESP8266 для Arduino IDE. Поправил свой пост.

    Теперь еще раз и о главном - в ядре версии 2.4.1 имеется баг с утечкой памяти при работе с объектом WiFiClient. В версии 2.4.2 данный баг исправлен, по крайней мере об этом гласит ветка на GitHub. Обновитесь до 2.4.2 или откатывайтесь до 2.4.0 в зависимости от Ваших изменений в проекте.


  23. 17.10.2018 в 10:54, Devilisimo сказал:

    Все супер, заработало.

    Еще нужна небольшая подсказка. Хочу сделать универсальную подписку:

    
                switch2 = "switch/" + conf.param("mqtt_path") + "sw2";
                mqttAPI.subscribe(switch2);

    Ругается: no matching function for call to 'PubSubClient::subscribe(String&)'

    Какого типа должна быть переменная?

    Вы всегда можете изучить возможности библиотеки, никакой магии там нет, просто откройте в Arduino IDE любой пример идущий в комплекте с библиотекой. Далее в меню "Скетч" выберите пункт "Показать папку скетча" и в открывшемся каталоге достаточно перейти в корень библиотеки, обычно не более двух переходов на каталог выше. Там Вы увидите список файлов и каталогов среди которых будет каталог src с исходными кодами библиотеки. Нас интересуют файлы заголовков, в данном случае файл PubSubClient.h

    Открываем его любым удобным текстовым редактором, желательно с поддержкой перевода строки по ASCII 0x0A (в народе просто '\n'). И нам станет доступно описание всех методов интересующего класса.

    image.png

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

    В нашем случаем метод subscribe принимает в качестве первого аргумента указатель на переменную с типом const char

    17.10.2018 в 14:22, Devilisimo сказал:

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

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

    Также при удачном подключении контроллер запомнит MAC адрес домашней точки доступа. В последствии он будет использован для сравнения MAC адресов у скрытых точке доступа в поиске "дома". Этот механизм нуждается в доработке из-за некоторых специфических ситуаций, но вполне работоспособен и на данный момент.

    17.10.2018 в 23:44, post125 сказал:

    с сегодняшнего дня решил начать пробовать программировать ESP, взял Вашу стандартную прошивку, подсоединил поддержку ESP в Arduino IDE, выделил 3Мб под SPIFFS. залил "ESP8266 Sketch Data Upload". а воот надо ли нажимать кнопку обычной загрузки скетча?

    В первую очередь необходимо загрузить программу в микроконтроллер, делается этот как и всегда через зугрузку программы. После этого необходимо залить файлы web сервера на flash через "ESP8266 Sketch Data Upload". При этом консоль (Serial монитор) должна быть закрыта т.к занимает порт.

    17.10.2018 в 23:44, post125 сказал:

    у меня выдает ошибку - с этим разобрался, а вот теперь пишет другие ошибки:

    Ваша ошибка связана с использованием одной из Beta версий библиотеки ArduinoJson. Возьмите любую версию из 5.13.x, это упоминалось в инструкции. Также хочу напомнить, что не каждая версия ядра ESP8266 для Arduino IDE подойдет нам, я использую 2.4.0, а вот в версии 2.4.1 есть баг с утечкой памяти который приведет к серьезным проблемам! Будьте очень внимательны и следуйте рекомендациям.

    17.10.2018 в 23:44, post125 сказал:

    2 второй вопрос по плате ATmega 2560 с 32Мб - там встроен ESP8266, всё равно надо внешний подключать?

    Если Вы говорите о плате от RobotDyn с двумя контроллерами на борту, то её хватит для решения большинства задач и подключения кучи датчиков, дисплеев и т.д и т.п, тут только фантазия может стать ограничивающим фактором. Но я бы отказался от встроенного способа связи между ними через UART в пользу I2C или SPI.

    17.10.2018 в 23:44, post125 сказал:

    ATmega 2560 с 32Мб больше нет в наличии, может использовать обычную Мегу с SD-картой?

    Значение 32 относится к ESP8266, а к ATmega2560 можно подключить все, что Вам нравится. Но я не сторонник SD карт из-за их низкой надежности и возможных проблемах при выходе карты из строя. Для ведения журналов есть множество других способов, один из которых, это сторонний скрипт на домашнем сервере в роли которого может выступить подготовленный домашний маршрутизатор.

    17.10.2018 в 23:44, post125 сказал:

    На Алиэкспрессе некоторые продавцы пишут, что это 32 Мбита=4Мбайта, что , скорее всего так и есть, тем более, что в даташите указано на максимальный теоретический объём памяти в 16Мбайт.

    Оно так и есть на самом деле,  8bit = 1byte. Вопрос только в том, как эффективно использовать эту память чтобы быстро не сократить её срок службы.

    17.10.2018 в 23:44, post125 сказал:

    Может, к ESP8266 прикрутить SD-карту или, если общаться с датчиками будет Мега, на долю ESP останется свой сервер и передача данных на удаленный сервер. В таком случае может и 3МБ хватит?

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

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