• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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

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