• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Разработка ‘библиотеки’ малого webсервера на esp8266.

PycLan

New member
В терминале в строке отправки надо писать $A5$B5$01$01$01$01$01$01$01$07
Если, конечно, этим терминалом пользуетесь.
Да спасибо за помощь.
Именно этот терминал, я когда начал выводить вместе счетчиком uart1_put_char(curr); то увидел, что он каждый полубайт выводит отдельно. И начал грешить на терминал. Теперь понял, что нужно добавить $.

P.S.
@pvvx, извините, что понаписали тут Вам не по теме :oops:

P.S.S
@aloika, все пашет!
 
Последнее редактирование:

pvvx

Активный участник сообщества
@pvvx, извините, что понаписали тут Вам не по теме :oops:
Я сейчас сделаю версию с Modbus RTU RS-485 Slave и мне не понятны ваши страдания. :)
К любым ячейкам Modbus с ID указанным в конфиге для ESP8266 есть доступ из любого интерфейса!
В блоке переменных Modbus есть область обмена - пока назначено 100 ячеек.
Cо стороны UART имеем доступ к блоку переменных Modbus, если внешний контроллер = Master.
Cо стороны WEB есть запись и чтение ячеек как word, dword и строки символов с указанием стартового адреса ячейки.
Cо стороны Modbus TCP (порт по умолчанию 502) так-же имеем доступ к любым переменным Modbus, а так-же и мост к Modbus RTU RS-485...
Всё по классике и никаких проблем с многозадачностью и прочим, в отличии от ваших решений.
Немного протестирую и будет новый git или прошивка c данным решением. Наверно сегодня ночью... Исходники полудуплекса Modbus RTU RS-485 пока неохота публиковать, т.к. никто не принимал участие в этом и пока не оказал никакой помощи :( И у комерсантов такого решения пока нет и неохота их кормить. Но главное безусловно в том, что никто не принимает участия в реализации или отладке Modbus RTU RS-485 на ESP8266.
 
Последнее редактирование:

PycLan

New member
Но главное безусловно в том, что никто не принимает участия в реализации или отладке Modbus RTU RS-485 на ESP8266.
ИМХО Так если будут примеры, народ и будет тестить.
Любимая для всех фича - веб интерфейс для контроля и управления различными процессами.
Теоретически можно управлять и по Modbus RTU RS-485, и TCP2UART, но в такой реализации необходимо дополнительное ПО с привязкой к платформе. Куда более удобнее получить полный функционал не думая о платформе, то ли, это ПК или планшет, или смартфон...
Например, для моей задачи легко можно было бы использовать TCP2UART, пишем управляющую прогу на делфях и готово, но это как-то уныло... Чтобы управлять железкой, нужен ПК с виндой, установить написанную нашу прогу, где-то ее хранить (дистрибутив) и т.д.
Другое дело, ввел в браузере адрес железки и перед тобой сразу весь интерфейс без заморочек с софтом.
Webserver, то народ тестит, потому-что на нем можно реализовать описанное выше.
 

pvvx

Активный участник сообщества
Другое дело, ввел в браузере адрес железки и перед тобой сразу весь интерфейс без заморочек с софтом.
Оно так и есть, если ESP8266 подключен к внешнему устройству через Modbus RTU RS-485.
А то вам всё сразу готовое подавай :)
Что тестить - вот: Modbus TCP / RTU RS-485 + WEB server
 
Последнее редактирование:

PycLan

New member
Доброе утро!
pvvx, aloika, Подскажите нужно ли следить за размером кода превышения RAM и др.?
Дорабатываю код aloika под свои задачи, добавил такую конструкцию:
Код:
//===============================================================================
COND_SWING *pcsw = NULL; // указатель на структуру состояния устройства
uint8 *comm = NULL; // указатель на буфер для текущей команды
uint8 *area_fa = NULL; // список токов FA
uint8 *area_fb = NULL; // список токов FB
uint8 *area_fc = NULL; // список токов FC
uint8 curr =0;        // номер текущего байта команды

// UART->Parse
// parse_rx_buf() чтение fifo UART rx и распарсивание его
// Формат команды:
//
// A5                                            0
// B5                                            1
// Команда                                        2
// Параметр l                                    3
// Параметр h                                    4
// checksum 2..8                                5
//-------------------------------------------------------------------------------
void ICACHE_FLASH_ATTR parse_rx_buf(void)
{

    while ((UART0_STATUS >> UART_RXFIFO_CNT_S) & UART_RXFIFO_CNT) {
        uint8 ch=UART0_FIFO;

    //os_printf("%02x ",ch);
        //uart1_put_char(ch);


         if ((ch==0xA5)&&(curr==0)) {comm[curr]=ch; curr++;  continue;}
         else if ((ch==0xB5)&&(curr==1)) {comm[curr]=ch; curr++;  continue;}
         else if ((curr>=2)&&(curr<5)) {comm[curr]=ch; curr++;  continue;}
         else if ((curr==5)&&(ch==(uint8)(comm[2]+comm[3]+comm[4]))) {

             switch (comm[2]) {
             case 1: // вывод значения в список токов фазы А
             area_fa=(comm[4]<<8)+comm[3]+"\n";
             os_printf("%u",area_fa);
             break;

             case 2: // очистить значения списка фазы А
             area_fa=NULL;
             os_printf("%u",area_fa);
             break;
             };
             curr=0;
             continue;
                   }
         else {curr=0;}

    } //while
При отправке даже одного байта, ESP уходит на ребут...
Код:
meSDK 1.4.1
Old reset: Fatal exception (29):
epc1=0x4022f110, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

Simple WEB version: 0.1.4
OpenLoaderSDK v1.2
Found free IRAM: base: 0x40104ef0, size: 28944 bytes
System memory:
data  : 0x3ffe8000 ~ 0x3ffe8380, len: 896
rodata: 0x3ffe8380 ~ 0x3ffe89d8, len: 1624
bss   : 0x3ffe89d8 ~ 0x3ffef1f8, len: 26656
heap  : 0x3ffef1f8 ~ 0x3fffc000, len: 52744
Start 'heap' size: 52496 bytes
Set CPU CLK: 160 MHz
sleep disable

Disk init: 82 files, addr = 0x00080000
mode : sta(18:fe:34:a5:94:c9) + softAP(1a:fe:34:a5:94:c9)
add if0
add if1
 
Последнее редактирование:

aloika

Active member
PycLan, перезагрузка может происходить, например, при попытке записи в переменную, которой не выделена память. Комментируйте последовательно свой код, смотрите, где именно происходит перезагрузка.
 

PycLan

New member
PycLan, перезагрузка может происходить, например, при попытке записи в переменную, которой не выделена память. Комментируйте последовательно свой код, смотрите, где именно происходит перезагрузка.
Спасибо за ответ, проблема была в неиспользуемой структуре, которую я закоментил...
Я сперва в ней закоментил Ваши переменные, а потом добавил свои. Свои так же потом не понадобились (а саму структуру закоментить забыл), в итоге структуре выделялась память без перемененных ... :(
 

PycLan

New member
Подскажите как вывести список значений (20 word) в textarea?
Сегодня голову ломал, пока придумал так:
заводим переменную char area_fa[100] = ""; на максимальное количество символов выводимых в textarea,
при приеме, каждое значение конвертируем в строку и плюсуем к нашей переменой с добавлением перевода строки, в итоге наша переменная содержит: N1\nN2\nN3\n и т.д.

Эта задумка пашет, кому нужно обращайтесь...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Подскажите как вывести список значений (20 word) в textarea?
Сегодня голову ломал, пока придумал так:
заводим переменную char area_fa[100] = ""; на максимальное количество символов выводимых в textarea,
при приеме, каждое значение конвертируем в строку и плюсуем к нашей переменой с добавлением перевода строки, в итоге наша переменная содержит: N1\nN2\nN3\n и т.д.
Решено это в Modbus TCP / RTU RS-485 + WEB server.
Там и примеры есть ввода и символьных строк и числовых последовательностей через запятую...
Эта задумка пашет, кому нужно обращайтесь...
Но уже всё - пашет и отображение хоть 100 ячеек сразу в реал тайм на страницу с Modbus master...
 

PycLan

New member
Но уже всё - пашет и отображение хоть 100 ячеек сразу в реал тайм на страницу с Modbus master...
Речь идет не о просто выводе строк или чисел, а о именно особенностью работы с textarea.
Пример:
Есть textarea с value ~text~.
Теперь, если я буду последовательно отправлять в эту переменную по одному значению 1 потом 2 потом 3, что будет?
Правильно, в поле textarea будет последовательно отображаться сперва 1, потом она сотрется, отобразится 2 и т.д. (без наворотов со стороны джавы с хранением данных).
А нужно, чтоб эти значения накапливались, должно отобразится:
1
2
3
С отдельной командой очистить textarea.
Да, можно конечно каждый раз отправлять строку из набора значений, и когда значений станет например 100, то как-то, это каждый раз
передавать, ради одного нового добавленного значения..... имхо не фэншуй.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Речь идет не о просто выводе строк или чисел, а о именно особенностью работы с textarea.
Текстовые строки и переменные - всё работает в Modbus :) Там сейчас обменный буфер в 1000 слов (2 килобайта). Данные передаются с контролем CRC16 и блоками - по формату и времени...
"это каждый раз передавать, ради" - об этом никто никогда не думает. Сделали в своем внешнем slave контроллере область данных передачи и они всегда, несколько раз в секунду будут дублированы в том буфере обмена master (ESP). И наоборот - объявленный для передачи блок на ESP будет записан в slave. По тому какие байты, какие там строки - пофигу. Они будут в памяти обоих устройств в автоматическом, заданном заранее режиме. Передача отдельных кусков по запросу ("ручных пусков") из web к slave куда угодно доступно всегда.
 
Последнее редактирование:

vad7

Active member
Подскажите, как настроить отладку в UART?
В System Setup ставлю Debug UART BAUD = 115200, а сохраняет 115273.
Ладно, поставил 9600, сохранил 9600, однако на порту тишина.
GPIO2 debug UART TX enable = off
 

pvvx

Активный участник сообщества
Подскажите, как настроить отладку в UART?
В System Setup ставлю Debug UART BAUD = 115200, а сохраняет 115273.
115273 - это истинная скорость. Ровно 115200 сделать невозможно. Тактовая частота в 80 000 000 не делится нацело на 115200, 80000000/694=115273.
Ладно, поставил 9600, сохранил 9600, однако на порту тишина.
GPIO2 debug UART TX enable = off
И правильно - вы же выключили вывод туда.
 

vad7

Active member
Прочел все 58 страниц..... уф... по началу был какой-то энтузиазм, а под конец, видя вашу героическую борьбу с китайской воплощенной мыслью, он немного подугас...

Поставил новый ESP01 на сутки в режиме STATION.
Утром счетчик стирания сектора дошел до 50.
Это я так понимаю до 25 перезагрузок.
Иногда, после длительного бездействия на закладке debug, при переходе на main модуль перегружался.
Но то, что пока не зависал намертво это хорошо, но это, я так понимаю, мне повезло.

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

pvvx

Активный участник сообщества
Прочел все 58 страниц..... уф... по началу был какой-то энтузиазм, а под конец, видя вашу героическую борьбу с китайской воплощенной мыслью, он немного подугас...
Ну Web работает и больше ничего нового в нем не требуется. Т.е. назначенные задачи все решены и я занимаюсь не только ESP8266... :)
Поставил новый ESP01 на сутки в режиме STATION.
Утром счетчик стирания сектора дошел до 50.
Это я так понимаю до 25 перезагрузок.
По конкретнее можно, какой счетчик и какая версия прошивки использовалась... с git или готовая?
В моих испытуемых модулях перезагрузок почему-то нет... Давайте выясним конкретно что там ещё и исправим, а не общими словами - типа "ничего не работает" :)
Можно модуль запустить и поставить подтяжки в режим программирования. И если он перезагрузится, то уже никогда не стартанет. А при следующем старте, вручную, можно увидеть был ли там "протектед" или "wdt"... Примерно так и испытывал чаше всего на длительность работы...
Хотел вот сделать передачу данных с электросчетчика, висящего на улице, и теперь вот думаю, что без еще одного мк, который будет собирать данные, не обойтись. Иначе часть данных пропадет при перезагрузке esp.
Что, конешно, сильно усложняет задачу.
Это всё и упирается в "борьбу с китайской воплощенной мыслью". Таков их SDK и всё "вылечить" или обойти невозможно. По этой причине ESP8266 и ESP32 не смог занять нишу продаж, кроме как для тестов и баловства. Такова политика Espressif.
 
Последнее редактирование:

vad7

Active member
Скачал готовый образ и залил - WEB ver: 0.1.4, SDK ver: 1.4.1..

Чего-то теперь не падает. Провода, что ли, так легли.
Пару раз от статики ресетнулась (температуру пощупал), но это нормально.
Продолжим наблюдения...
 

pvvx

Активный участник сообщества
Чего-то теперь не падает. Провода, что ли, так легли.
Пару раз от статики ресетнулась (температуру пощупал), но это нормально.
Продолжим наблюдения...
Прочитайте внимательнее ссылку из первого сообщения темы: Скорость реакции ножки RESET по просыпанию от ноги GPIO16 (deep-sleep).
Если кондера на Reset нет - будет реагировать на каждый чих. Так-же, если на вход ADC подано более 1.x В - тоже перезагруз...
 

vad7

Active member
Ага, ну вот перезагрузилась, произошло так - кликнул на Main, высветилась "не могу отобразить страницу", потом нажал обновить и страница вывелась.
Модуль при такой ситуации загрузился нормально, не смотря на подтянутый GPIO0 к земле.
Тоже самое было, когда искра от статики пробивала.
Вывод поймать не удалось - комп был выключен.
В принципе, в прошлые разы когда статика пробивала, вывод был вроде как обычный при загрузке, что-то типа этого:
load 0x40100000, len 108, room 16
tail 12
chksum 0x83
csum 0x83

Но вот если нажать reset или оттянуть CH_PD, c подтянутым GPIO0, то вечный вывод:
Fatal exception (0):
epc1=0x401000d6, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
Fatal exception (0):
epc1=0x401000d6, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
....
 

pvvx

Активный участник сообщества
Ага, ну вот перезагрузилась, произошло так - кликнул на Main, высветилась "не могу отобразить страницу", потом нажал обновить и страница вывелась.
А кто сказал, что это модуль перезагрузился, а не потеря связи по WiFi?
Но вот если нажать reset или оттянуть CH_PD, c подтянутым GPIO0, то вечный вывод:
Fatal exception (0):
epc1=0x401000d6, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
Fatal exception (0):
epc1=0x401000d6, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000
....
А если поставить ножки в режим загрузки SDIO то тоже что-то будет нет так :)
Ножками при старте можно получить и сообщение "waiting for host\n" :)
Нормальный старт у модуля (работает ROM-BIOS) обеспечивается только если ножки GPIO0,1,2 подтянуты к +3.3V, а GPIO15 к нулю.
 
Последнее редактирование:

vad7

Active member
А кто сказал, что это модуль перезагрузился, а не потеря связи по WiFi?
Счетчик последнего сектора тоже должен тикать?
Только вот это происходит в момент перехода на другую закладку (например, "Main").
То есть, вечером открываю закладку "Debug and Tests" на планшете и оставляю до утра, далее утром просто кликаю на "Main" и получаю "страница недоступна", тут же жму обновить и она появляется.
Счетчик при этом увеличивается на 2 от вечернего значения.
Счетчика uptime случайно нет в прошивке?
В UART0 (74880) в момент нажатия вываливается:
@ЉZ-nPбM'МНG %Y)Q гExгКI T )n@ 5Y

Надо бы скорость порта подобрать...
 
Сверху Снизу