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

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

pvvx

Активный участник сообщества
Спасибо за быстрый ответ.
К сожалению это код WS2812, а мне нужен аналоговый (ШИМ).
Попробую разобраться и переделать.
Тогда это не пойдет.
ШИМ с использованием аппаратного delta-sigma на I/O так никто и не доделал на ESP8266... Что-то там с аппаратурой не так - похоже на баги в чипе - бьет на низкой частоте и сам выход на достаточно большой частоте зашумляет прием WiFi (попадает в кратность по гармоникам). А программный низкочастотный ШИМ на таймерах в web-свалке отключен.
 
Последнее редактирование:

ciuafm

New member
Тогда это не пойдет.
ШИМ с использованием аппаратного delta-sigma на I/O так никто и не доделал на ESP8266... Что-то там с аппаратурой не так - похоже на баги в чипе - бьет на низкой частоте и сам выход на достаточно большой частоте зашумляет прием WiFi (попадает в кратность по гармоникам). А программный низкочастотный ШИМ на таймерах в web-свалке отключен.
А можно организовать GPIO с буфером, т.е. присланый кусок данных проигрывается побитово с +- одинаковым интервалом в цикле, нужна скорость хотя бы 100 бит в секунду?
 

pvvx

Активный участник сообщества
А можно организовать GPIO с буфером, т.е. присланый кусок данных проигрывается побитово с +- одинаковым интервалом в цикле, нужна скорость хотя бы 100 бит в секунду?
Мне кажется, что Arduino это проще, если у вас одна задача - управление выводом пары ШИМ.
 

pvvx

Активный участник сообщества
Пробуйте через WebSocket. WebSocket даже в текстовом режиме успевает принять-передать более 500 переменных в секунду...
 
Уважаемый PVVX! Можете пояснить этот момент? :
Код:
/******************************************************************************
* FunctionName : internal fun: tcpsrv_int_sent_data
* Description  : передача данных (не буферизированная! только передача в tcp Lwip-у)
*                   вызывать только из call back с текущим pcb!
* Parameters   : TCP_SERV_CONN * ts_conn
*                uint8* psent - буфер с данными
*                uint16 length - кол-во передаваемых байт
* Returns      : tcp error
******************************************************************************/
err_t ICACHE_FLASH_ATTR tcpsrv_int_sent_data(TCP_SERV_CONN * ts_conn, uint8 *psent, uint16 length) {
    err_t err = ERR_ARG;
    if(ts_conn == NULL) return err;
    if(ts_conn->pcb == NULL || ts_conn->state == SRVCONN_CLOSEWAIT) return ERR_CONN;
    ts_conn->flag.busy_bufo = 1; // буфер bufo занят
    struct tcp_pcb *pcb = ts_conn->pcb;  // find_tcp_pcb(ts_conn);
    if(tcp_sndbuf(pcb) < length) {
#if DEBUGSOO > 1
        os_printf("sent_data length (%u) > sndbuf (%u)!\n", length, tcp_sndbuf(pcb));
#endif
        return err;
    }
    if (length) {
        if(ts_conn->flag.nagle_disabled) tcp_nagle_disable(pcb);
        err = tcp_write(pcb, psent, length, 0);
        if (err == ERR_OK) {
            ts_conn->ptrtx = psent + length;
            ts_conn->cntro -= length;
            ts_conn->flag.wait_sent = 1; // ожидать завершения передачи (sent_cb)
            err = tcp_output(pcb); // передать что влезло
        } else { // ts_conn->state = SRVCONN_CLOSE;
#if DEBUGSOO > 1
            os_printf("tcp_write(%p, %p, %u) = %d! pbuf = %u\n", pcb, psent, length, err, tcp_sndbuf(pcb));
#endif
            ts_conn->flag.wait_sent = 0;
            tcpsrv_server_close(ts_conn);
        };
    } else { // создать вызов tcpsrv_server_sent()
        tcp_nagle_enable(pcb);
        err = tcp_output(pcb); // передать пустое
    }
    ts_conn->flag.busy_bufo = 0; // буфер bufo свободен
    return err;
}

Мне надо следующее:

По нажатию на кнопку отправить 4-10 байт данных на сервер . За основу хочу взять Ваш проект , так как он идеально подходит . Как опросить кнопку - понятно . А какую функцию и в каком файле, применить для передачи простой строки. Другими словами говоря , мне надо не с юарта отправить данные а из внутренней памяти :
Код:
char data_str[]="send data srv!\r\n";
Я так понял что выше указанная функция может это выполнить? А IP и порт она берет из настроек в веб?

Код:
tcpsrv_int_sent_data(TCP_SERV_CONN , data_str, sizeof(data_str));
Так можно отправить простую строку?
Простите за такие вопросы , только начинаю вникать в ТСР и прочие вещи.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Дак я не использую оверлей, я использую соединение Modbus TCP Client, которое запускается когда мы вводим IP адрес сервера на вкладке настроек Modbus.
Если по второму вопросу в Разработка ‘библиотеки’ малого webсервера на esp8266. , то скорее всего как-то не так создали и записали web-диск
 

pvvx

Активный участник сообщества
Я так понял что выше указанная функция может это выполнить? А IP и порт она берет из настроек в веб?
Нет. Это уже передача данных, когда соединение открыто.
Код:
tcpsrv_int_sent_data(TCP_SERV_CONN , data_str, sizeof(data_str));
Так можно отправить простую строку?
Можно, но надо задать адрес, открыть соединение, а потом уже отправлять данные.
 
Вспомнил Ваш пример чтения температуры . Скажите пожалуйста , этот файл тоже компилируется ? Или его нужно подключить к проекту ??
В принципе мне подходит решение в этом файле . Поменяв сообщение и урл я смогу выполнить задачу .
Поясните пожалуйста как начинающему ..
 

pvvx

Активный участник сообщества

ciuafm

New member
Пробуйте через WebSocket. WebSocket даже в текстовом режиме успевает принять-передать более 500 переменных в секунду...
Здорово! Вот только я не могу понять как. Не могли бы вы мне привести пример?
P.S. esp8266web/ws2.htm at master · pvvx/esp8266web · GitHub - читал но не понял как присвоить значение переменной через websocket.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Здорово! Вот только я не могу понять как. Не могли бы вы мне привести пример?
P.S. esp8266web/ws2.htm at master · pvvx/esp8266web · GitHub - читал но не понял как присвоить значение переменной через websocket.
Проще чем в Ajax - esp8266web/ina219ws.htm at master · pvvx/esp8266web · GitHub
Переменные и команды описаны по центральной ссылке на первой странице самого ESP web-сервера...
Или в папке help заготовок. Запускаете в эксплорер webvars.htm...
 

pvvx

Активный участник сообщества
По поводу глюков station ESP8266. Стабильнее работает когда отключена корректировка частоты:
freq_corr_en.gif
и используется более старая SDK 1.5.4.
С включенной коррекцией вылетает даже на "протектед" при работе рядом других устройств с WiFi.
Похоже найдена дыра - определенный сигнал в эфире WiFi приводит к багам ESP8266 - вылетает или отсоединяется от AP и начинает петь песни - мешать другим модулям... Зависимость от версии SDK - мала.
 

DorianGray

New member
Последовательность использования оверлея tcp_client.ovl в проекте WEB сервера

0. Скачиваем проект с репозитория. По умолчанию там был выбран проект TCP2UART (#define PROGECT_NUMBER 0)
1. Выбираем тип проекта - пустой WEB сервер. #define PROGECT_NUMBER 2
2. Делаем Clean
3. Компилируем (цель all). - скомпилилось с ошибкой =(. Если все скомпилилось - идем дальше.
На данном этапе мы имеем скомпилированные оверлеи и основной проект.
4. Загружаем прошивку - "flashAll"
5. Копируем оверлей (изначально файл берем в папке ovls\bin\tcp_client.ovl) в папку WEBFiles - ложим в корень этой папки
6. Загружаем WEB диск с помощью "Upload Web". Перед загрузкой файл веб диска
собираеться из файлов в каталоге "WEBFiles" в бинарный файл "webbin\WEBFiles.bin"
7. На данном этапе должна быть загружена прошивка и файл Web диска с нужным оверлеем
8. Заходим на точку доступа ESP8266 и настраиваем подключение к WIFI точке доступа. получаем IP: 10.10.10.67/
9. Выбираем оверлей: 10.10.10.67/?ovl=tcp_client.ovl
10. Запускаем оверлей: 10.10.10.67/?ovl$=1
11. Нужно ли на данном этапе закрывать все WEB подключения к ESP8266 ?
"Инициализация оверлея ovl_init(1) производится по закрытию Web-HTTP соединения для возможности передачи настроек инициализации в любом порядке, а в случае запроса из websocket – сразу после загрузки."

Получилось запустить данный оверлей на проекте TCP2UART, так как простой WEB сервер не компилился =(

Вопросы:
1) за что отвечает цель "clobber"
2) что размещается в секциях 0x00000 и 0x07000
3) в строчке Makefile - UPLOADOVL = ./ovls/bin/tcp_client.ovl - выбираеться оверлей из папки
скомпилированых оверлев, который будет загружаться во време цели "UPLOAD OVL" ?
4) в папках WEBFiles, WEBFilesRS485, WEBFilesTCP2UART лежат уже файлы оверлеев. После компиляции эти файлынужно заменить, я так понимаю ?
или их просто удалить, и загрузить только тот, который нужно с помощью цели "UPLOAD OVL"

5) При компиляции #define PROGECT_NUMBER 2 появляеться ошибка. В других режимах компилируеться нормально
main/.output/eagle/lib/libmain.a(main.o):(.text+0x4): undefined reference to `mdb_buf'
main/.output/eagle/lib/libmain.a(main.o): In function `drv_recv':
main.c:(.text+0x174): undefined reference to `mdb_buf'

6) немножко непонятно с адресацией в оверлее:
секция text оверлея накладывается по адресам с секцией lit4 для основной прошивки - это так и должно быть ?

Основная прошивка
Entry Point : 4010013C call_user_start()
------------------------------------------------------------------------------
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE838C| 908
rodata| ReadOnly Data (RAM)| 3FFE838C| 3FFE8E6C| 2784
bss| Uninitialized Data (RAM)| 3FFE8E70| 3FFEFAB8| 27720
lit4| Uninitialized Data (IRAM)| 40105BBC| 401067CC| 3088
text| Uncached Code (IRAM)| 40100000| 40105BBC| 23484
irom0_text| Cached Code (SPI)| 40207000| 40241933| 239923
------------------------------------------------------------------------------

Оверлей:
Entry Point : 40106ABC ovl_init()
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFFDF60| 3FFFDFD1| 113
rodata| ReadOnly Data (RAM)| 3FFFDFD4| 3FFFE014| 64
bss| Uninitialized Data (RAM)| 3FFFE018| 3FFFE020| 8
lit4| Uninitialized Data (IRAM)| 40106BBC| 40106BBC| 0
text| Uncached Code (IRAM)| 40106600| 40106BBC| 1468
irom0_text| Cached Code (SPI)| 40210000| 40210000| 0
------------------------------------------------------------------------------
 

pvvx

Активный участник сообщества
6. Загружаем WEB диск с помощью "Upload Web". Перед загрузкой файл веб диска
собираеться из файлов в каталоге "WEBFiles" в бинарный файл "webbin\WEBFiles.bin"
Туда-же и пишутся новые версии бинарных оверлеев - {в каталоге "WEBFiles"}.
11. Нужно ли на данном этапе закрывать все WEB подключения к ESP8266 ?
"Инициализация оверлея ovl_init(1) производится по закрытию Web-HTTP соединения для возможности передачи настроек инициализации в любом порядке, а в случае запроса из websocket – сразу после загрузки."
Имеется в виду HTTP-TCP соединение в котором был вызов загрузки оверлея. Экслорер по умолчанию открывает около пяти HTTP-TCP соединений на страницу. Существуют проблемы в последовательности приема и обработки поступающих данных в AJAX. Websocket от это избавлен.
1) за что отвечает цель "clobber"
Более полная очистка от временных файлов и итогов компиляции...

2) что размещается в секциях 0x00000 и 0x07000

Общий вопрос по ESP.

3) в строчке Makefile - UPLOADOVL = ./ovls/bin/tcp_client.ovl - выбираеться оверлей из папки
скомпилированых оверлев, который будет загружаться во време цели "UPLOAD OVL" ?

Да. Так удобнее отлаживать ovl. Основная прошивка при изменении оверлеев не меняется и не требует перезаписи...

4) в папках WEBFiles, WEBFilesRS485, WEBFilesTCP2UART лежат уже файлы оверлеев. После компиляции эти файлынужно заменить, я так понимаю ?
или их просто удалить, и загрузить только тот, который нужно с помощью цели "UPLOAD OVL"


Зависит от варианта проекта. Это папки с примерами для разных проектов. Makefile отрабатывает только на {в каталоге "WEBFiles"}.

5) При компиляции #define PROGECT_NUMBER 2 появляеться ошибка.

Та и пусть. Зачем голая система? Всё равно будете что-то менять... Мне сложно синхронизировать текущую у меня версию с данной "свалкой", т.к. многое что добавлено у меня не нужно другим, а "свалка" ещё распухнет. Предполагается, что для сборки своего проекта вы удалите большую часть ненужного (помечается сереньким в Eclipse по условиям #if :) ) , выбрав часть опций.

6) немножко непонятно с адресацией в оверлее:
секция text оверлея накладывается по адресам с секцией lit4 для основной прошивки - это так и должно быть ?


Да. Оверлеи грузятся в остаток IRAM. Её можно увеличить пожертвовав частью 'кэша' Flash, т.е. прибавить +16 кило. Опция в meSDK...
На производительность в данном проекте это не влияет - доли процента...
 
Последнее редактирование:

ciuafm

New member
Проще чем в Ajax - esp8266web/ina219ws.htm at master · pvvx/esp8266web · GitHub
Переменные и команды описаны по центральной ссылке на первой странице самого ESP web-сервера...
Или в папке help заготовок. Запускаете в эксплорер webvars.htm...
Правильно ли я понял, что страничка, которуя я привел ниже поднимет 12,13 и 14 ноги на 2 секунды по нажатию кнопки?
HTML:
<!DOCTYPE html>
<html><head>
<meta charset="charset=windows-1251" />
<title>Blink</title></head>
<body>
<form name="publish">
   <input type="button" id="Test" value="Test" onclick="Blink()">
</form>
</div></body>
<script type="text/javascript">
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}
funcion Blink() {
var wsUri = "ws://sesp8266/web.cgi";
websocket = new WebSocket(wsUri);
websocket.send("gpio_out=28672");
await sleep(2000);
websocket.send("gpio_out=0");
}
</script>
 

pvvx

Активный участник сообщества
Правильно ли я понял, что страничка, которуя я привел ниже поднимет 12,13 и 14 ноги на 2 секунды по нажатию кнопки?
gpio_out=28672 === gpio_out=0x7000 -> 12,13,14 биты

PS: В первом сообщении темы описано про обучение HTML/Javascript и азов программирования... На это есть темы Раздел для начинающих :)
 
Сверху Снизу