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