// Define NTP properties #define NTP_OFFSET 60 * 60 // In seconds #define NTP_INTERVAL 60 * 1000 // In miliseconds #define NTP_ADDRESS "ua.pool.ntp.org" // change this to whatever pool is closest (see ntp.org)
void timerIsr() { if (epdStopmode){ epdStopmodeCount++; if (epdStopmodeCount > 1){ epdStopmodeCount = 0; epdStopmode = false; epd_enter_stopmode(); } } ss++; // Seconds if (ss > 59){ ss = 0; mm++; // Minutes DisplayUpdate = true; if (mm > 59){ mm = 0; hh++; // Hours if (hh > 23){ hh = 0; d1++; // Day of week d2++; // Day of month //d3++; // Month if (d1 > 6) d1 = 0; if (d2 > 31) d2 = 0; if (d3 > 11) d3 = 0; } tu++; if (tu > 20){ // Pause update via WiFi (*hours) tu = 0; WIFITimeUpdate = true; } } } }
void callback(const MQTT::Publish& pub) // Функция получения данных от сервера { Serial.print(pub.topic()); // выводим в сериал порт название топика Serial.print(" => "); Serial.println(pub.payload_string()); // выводим в сериал порт значение полученных данных String payload = pub.payload_string();
if(String(pub.topic()) == "WStation/Battery") // получаем данные из топика о напряжении аккумулятора { WStationVoltage = payload.toFloat(); // преобразуем полученные данные в тип integer }
if(String(pub.topic()) == "WStation/Date") // получаем данные из топика Даты { payload.toCharArray(DateString, 11); }
if(String(pub.topic()) == "WStation/Time") // получаем данные из топика Времени { //TimeString = payload; payload.toCharArray(TimeString, 9); } }
myNum = String(TimeString[3]).toInt(); if (myNum > 0){ //_el[3] =""; strncpy(_el,&TimeString[3],2); printf("%s",_el); mm = String(_el).toInt(); }else{ mm = String(TimeString[4]).toInt(); } }
void WiFiupd(){ if (WiFi.status() != WL_CONNECTED) // attempt to connect to wifi again if disconnected { Serial.print("Connecting to "); Serial.print(ssid); Serial.println("..."); WiFi.begin(ssid, pass); WiFiConected = false; } if (WiFi.status() == WL_CONNECTED) //Check WiFi connection status { WiFiConected = true; if (!client.connected()) { yield(); Serial.println("Connecting to MQTT server"); if (client.connect(MQTT::Connect("WStationDisplay") .set_auth(mqtt_user, mqtt_pass))) { Serial.println("Connected to MQTT server"); client.set_callback(callback); client.subscribe("WStation/Time"); // подписывааемся по топик времени client.subscribe("WStation/Battery"); // подписывааемся по топик с данными аккумулятора client.subscribe("WStation/Date"); // подписывааемся по топик даты
MQTTConected = true; } else { Serial.println("Could not connect to MQTT server"); MQTTConected = false; } } if (client.connected()){ MQTTConected = true; yield(); client.loop(); } } }
В целом, код работает, но бывают странные глюки. К ЕСП подключен E-Paper дисплей и датчик температуры и влажности DHT22. Больше никакой электроники нет. Устройство подключается по WiFi к MQTT серверу и получает оттуда данные. В коде серьезных изменений не делал, удалил ненужный вывод в сериал... И появились очень странные глюки: 1) При запуске программы идет подключение а WiFi, только после этого программа идет дальше:
Код:
WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); d31++; if (d31 > 100){ break; }
}
то есть, подключение установлено. Дальше, в основном цикле программы первым вызывается функция на проверку подключения: WiFiupd(); Иногда это впадает в бесконечный цикл повторного подключения. Попробую пояснить. Подключение установлено (это видно на роутере), но все равно происходит бесконечная попытка подключения, которое, естественно, будет неудачным. Почему срабатывает условие if (WiFi.status() != WL_CONNECTED) для меня не понятно, ведь подключение уже есть....
второе: При старте программа ловит ошибку и уходит в "вечный" ребут. После 5-20 перезагрузок программа все таки стартует, и работает как обычно. Пробовал на другой ESP - результат тот же. Проблема точно не в питании, так как я пробовал на "голой" ESP. с хорошим питанием. Да и осциллографом смотрел - стабильное и без пульсаций Вот лог: СпойлерException (9): epc1=0x372e3835 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000005 depc=0x00000000
Добавлено after 3 hours 52 minutes 10 seconds: Нашел одну странность. У меня есть еще одна ESP, которая шлет данные на MQTT сервер. Если код приемника (приведенный выше) запустить раньше чем передатчика (вторая ESP, которая шлет данные), то приемник уходит в вечный ребут, и выходит из него как только начинают приходить данные с MQTT сервера... Такое чувство, что в коде идет попытка чтения несуществующих данных от MQTT... Может вы увидите где ошибка?
Добавлено after 1 hour 8 minutes 12 seconds: Код делает что хочет... И ведет себя совершенно странно. я сделал условие на вызов функции только 1 раз:
Код:
if (GetNewDateTimeData){ GetNewDateTimeData = false; Date_Time(); }
Но каждый раз, как только код доходит до этого участка, переменная GetNewDateTimeData оказывается "True", и опять вызывается функция Date_Time();.... Жаль нет смайлика бьющегося головой об стену.... Разрешение происходит телько при получении данных от MQTT:
Код:
void callback(const MQTT::Publish& pub) // Функция получения данных от сервера { Serial.print(pub.topic()); // выводим в сериал порт название топика Serial.print(" => "); Serial.println(pub.payload_string()); // выводим в сериал порт значение полученных данных String payload = pub.payload_string();
if(String(pub.topic()) == "WStation/Battery") // получаем данные из топика о напряжении аккумулятора { WStationVoltage = payload.toFloat(); // преобразуем полученные данные в тип integer }
if(String(pub.topic()) == "WStation/Date") // получаем данные из топика Даты { payload.toCharArray(DateString, 11); GetNewDateTimeData = true; Serial.println("-3-"); }
if(String(pub.topic()) == "WStation/Time") // получаем данные из топика Времени { //TimeString = payload; payload.toCharArray(TimeString, 9); GetNewDateTimeData = true; Serial.println("-2-"); } }
Но в сериал ничего не выводится, а значит переменная значения "True" не принимает... ТО КАКИМ ЖЕ ОБРАЗОМ ОНА СТАНОВИТСЯ "True" ПОСЛЕ ОБНУЛЕНИЯ????? Пол дня эти глюки вылавливаю... То вообще программа вылетала просто при обращении к конкретной переменной.... Не смог это победить, пришлось переменную напрочь убрать
И памяти вроде хватает Компилятор выдает следующее: СпойлерExecutable segment sizes:
IROM : 260592 - code in flash (default or ICACHE_FLASH_ATTR) IRAM : 27720 / 32768 - code in IRAM (ICACHE_RAM_ATTR, ISRs...) DATA : 1296 ) - initialized variables (global, static) in RAM/HEAP RODATA : 1272 ) / 81920 - constants (global, static) in RAM/HEAP BSS : 25880 ) - zeroed variables (global, static) in RAM/HEAP
Скетч использует 290880 байт (27%) памяти устройства. Всего доступно 1044464 байт. Глобальные переменные используют 28448 байт (34%) динамической памяти, оставляя 53472 байт для локальных переменных. Максимум: 81920 байт. esptool.py v2.8 Serial port COM35 Connecting.... Chip is ESP8266EX Features: WiFi Crystal is 26MHz MAC: b4:e6:2d:23:37:0a Uploading stub... Running stub... Stub running... Configuring flash size... Auto-detected Flash size: 4MB Compressed 295040 bytes to 213055...
Writing at 0x00000000... (7 %) ... Writing at 0x00034000... (100 %) Wrote 295040 bytes (213055 compressed) at 0x00000000 in 19.0 seconds (effective 124.4 kbit/s)... Hash of data verified.
Leaving... Hard resetting via RTS pin...
_________________ Сделать своими руками всегда интересней чем просто купить и пользоваться
Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Вс дек 30, 2012 00:32:06 Сообщений: 545 Откуда: Николаев / Украина
Рейтинг сообщения:0
Вот один из примеров (Картинка кликабельна):
Это лог старта программы. "Кракозюбры" - это команды для дисплея, он работает через Сериал, не обращайте на них внимания. Красным обведена переменная GetNewDateTimeData, которая объявляется в начале программы:
Код:
volatile boolean GetNewDateTimeData = 0;
Но в сериал видно что переменная равна сначала 54, а при повторном цикле - 50, хотя оба раза переменная обнулялась в цикле...
Второе: Синим обведена переменная WStationVoltage, которая тоже объявлена в начале программы:
Код:
float WStationVoltage = 0.0;
Но, как видно, вначале эта переменная равна ХЗ чему... а точнее: 18465454836807817073918158.71. Потом, по ходу программы "исправляется".... Вот что это за глюки???
_________________ Сделать своими руками всегда интересней чем просто купить и пользоваться
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
У меня какая-то фигня с ESP8266-01. ESP обменивается данными с МК по UART. Если нагрузить линию Tx ESP 5кОм (просто в цепи оно есть,), то при включении ESP не запускается, на линии TX устанавливается уровень около 0.2-0.3В.
Если убрать нагрузку, то ESP запускается и идет нормальный обмен.
Если подключить этот резистор на TX уже на запущенный ESP, то сигнал остается нормальной амплитуды и обмен идет.
Другого ESP у меня нет. Может кто-то что-то прокомментировать по этому поводу или проверить такое на своем. Спасибо.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Z_h_e, почитайте процедуру запуска ESP, выбор источника загрузки и роль GPIO2 (TX) в этом. Хотя по картинке всё понятно (внимание в нижний правый угол, где комментарии):
Добавлено after 11 minutes 17 seconds: Для ТС ответы с запозданием:
Цитата:
для меня не понятно, ведь подключение уже есть....
Нет, значит его нет. То, что вы видите подключенное ус-во на роутере - мало о чем говорит. Роутер не может знать, если ус-во пропало из сети. Или если установка соединения не была завершена до конца. Раз ЕСП висит в этом цикле, значит она считает, что она не подключена. А по остальному - среди этой кучи мусора никто не разберется. Как вам уже ответили на другом форуме - разбивайте программу на простые участки и проверяйте их.
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
ESP передает данные по MQTT, что то сляпал побыстрому. Так не хочется глубоко изучать и видимо придется . GPIO2 у меня в воздухе (на нем светодиод распаянный на плате), а TX используется на GPIO01.
Цитата:
By default, UART0 outputs some printed information when the device is powered on and booting up. The baud rate of the printed information is relevant to the frequency of the external crystal oscillator. If the frequency of the crystal oscillator is 40 MHz, then the baud rate for printing is 115200; if the frequency of the crystal oscillator is 26 MHz, then the baud rate for printing is 74880. If the printed information exerts any influence on the functionality of the device, it is suggested to block the printing during the power-on period by changing (U0TXD, U0RXD) to (MTDO, MTCK)
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Z_h_e, хмм... почему-то подумал что GPIO2 для TX используете, прям симптомы как если его к нулю притянуть - не грузится ESPшка тогда с флэшки как надо. А GPIO0 где у вас? Его тоже надо к Vcc притянуть или в воздухе оставить.
RST, CHIP_EN попробуйте также подтянуть к 3.3В подтяжкой. Емнип на ESP-01 они не подтянуты на платке, а внутренняя подтяжка очень слабенькая.
У меня нечто подобное с wemos D1 mini при питании исключительно от USB шнурка происходит. Постоянный перезапуск - даже драйвер для СН340 определиться не успевает. Лечение оказалось достаточно простым - подцепил акумулятор к питанию 3,3 вольта... Собственно при передаче там довольно большой пиковый ток - возможно стабилизатор или чего еще не справляются с задачей...
Если по схеме на общей платке имеется стабилизатор и/или многоразовый предохранитель в СМД исполнении - вполне возможно... Надо в инете схемку достать на Вашу зверюгу - тогда чего и прояснится. На моей d1mini стоит железна коробушка в качестве ESP - остальное как на той схемке, что я выше положил. И страшно не любит дерганья лапок кои для спецнужд выделяются. Уже нарвался при простейшем блинке на сработку собаки!
А если попробовать GPIO0 и 2 притянуть внешней подтяжкой 4.7-10К к Vcc и проверить аналогичное подключение на TX0 - также будет вести себя или нормально начнет работать? Где-то у меня китайский флюс проводил сильнее внутренней подтяжки... ) Может дело и не в этом конечно, но так направление понятно будет - входит ли он в режим другой или нет, т.к. этими пинами это регулируется.
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Я наверное так и не займусь сегодня. Флюс отмыл (явно в глаза бросался), подтяжку делал , но без резистора, напрямую. Даже пробовал прошить в этом странном режиме , проошиваться тоже не захотело.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Сегодня еще потыкался. Приложу картинки, авось когда-нибудь выяснится в чем дело, может кто в какой документ тыкнет.
В общем то вот такая схема. ESP шлет данные через делитель R1R2, хотя для ESP он не нужен, делитель был для другого.
Как я говорил, если так запускать, ESP не стартует, уровень на его TX 0.2В где-то.
Если выкинуть R2, то вот осциллограмма старта (сделал на телефон, потому что осцилл с большой флешкой отказался работать). Восстанавливаю R2, добавляю R3 и опытным путем устанавливаю что запуск происходит когда R3<3к. Запускаю и глядю. Желтый луч - это питание.
Делаю вывод такой. В момент старта TX запускается подтянутым к верху, затем в режиме push pull отправляет свое стартовое приветсвие и уходит в плавающий вход. И видимо до привествия проверяет состояние пина. Может какая защита, чтобы приветствие свое не закоротить?
Я выше приводил цитату, повторю ее в укороченном виде.
Цитата:
If the printed information exerts any influence on the functionality of the device, it is suggested to block the printing during the power-on period by changing (U0TXD, U0RXD) to (MTDO, MTCK).
Надо почитать что это за MTDO такое .
З.Ы. Питание не идеально, не думая что проблемы из-за него, все равно проверил на лабораторнике, эффект тот же.
Я выше приводил цитату, повторю ее в укороченном виде. Надо почитать что это за MTDO такое .
Другие пины, GPIO13, GPIO15. Но цитата о другом. Это они говорят, что если дерганье UART на пинах (U0TXD, U0RXD) при старте будет мешать другим ус-вам к ним подрубленных, то предлагают просто UART заремаппить на другие пины.
Besides, U0TXD is also a strapping pin for chip_test_mode(1: normal mode; 0: chip_test_mode). Thus, U0TXD can't be pulled down just when the system is powered on.
Это ответ сотрудника Espressif. Т.е. не только GPIO0 и 2 влияют на режим загрузки, но и GPIO1. Странно, мало где об этом пишут, но если он притянут к 0 во время старта МК, то МК переходит в некий chip_test_mode и прошивка ес-но не работает. Как вариант обойти - сгородить решение, чтобы на время strapping (17-19.5 мс где-то по-идее, вот попутно интересная картинка таймингов загрузки: https://raw.githubusercontent.com/pvvx/ ... ignals.gif) подержать высокий уровень на этом пине, а потом отпустить.
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Да, я уже пробую переключить функцию, пока не получилось. Пробовал напрямую писать в регистр 0x60000818 и нашел функции system_uart_swap(); и system_uart_de_swap(); Ща почитаю что-нибудь в просторах инета еще.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Сейчас этот форум просматривают: Google [Bot] и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения