• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

vad7

Active member
Потом определяете функцию таймера и сам таймер, пишите функцию входа в вашу программу, и функцию-обработчик таймера. Всё.
Я до сих пор мыслю такими положениями, что таймер должен быть как выстрел пули. :)
И ощущаю дискомфорт, когда таймер прерывает, к примеру, передачу tcp пакета, и начинает медленно читать i2c.
И чтобы не заглючить и без того глючный девайс, нужно городить очереди и все такое, чтобы за раз на долго в прерывании не задерживаться.
И зачем мне это нужно?
ets_run позволяет обходится без этого, а работала бы ets_run_new, было бы еще лучше, можно тогда защититься от китайских сбросов idle функции.
 

pvvx

Активный участник сообщества
Добавлен оверлей по теме Подключение датчиков типа 10-DOF - акселерометр, гироскоп, магнитометр, температура, давление...
10dof.ovl esp8266web/ovls/10dof at master · pvvx/esp8266web · GitHub

Передача данных по UDP от 10-DOF GY-91
(акселерометр, гироскоп, магнитометр, температура, давление)
Опрос по SPI 100 замеров x,y,z (через FIFO) в секунду,
вывод 10 UDP пакетов в секунду, в каждом 10 замеров.
HSPI CLK = 1000000 Hz
22:41:20.428> Init BMP280...
22:41:20.428> BMP280 id: 58
22:41:20.428> Dig BMP280: 7f 6b cf 67 18 fc d6 8f 34 d6 d0 0b 2b 08 5b 01 f9 ff 8c 3c f8 c6 70 17
22:41:20.428> Init MPU9250...
22:41:20.428> Mag: 48 9a 00 8c 00 06 01 16 00 10 12 00 00 48 9a af b0 a4 00
22:41:20.428> srv[80] 192.168.4.2:3626 [1] listen
22:41:20.428> srv[80] 192.168.4.2:3626 [1] read: 169 of1[disk_ok.htm] GET f[/disk_ok.htm] head[201]:200 send: of2[timer.inc] cf2 of2[footer.inc] cf2 cf1 721 dis
22:41:20.678> srv[80] 192.168.4.2:3626 [1] disconnect
22:41:21.548> F(100): 2251,100122,M(162,299,9),A(-3572,-11136,10432),G(-57,13,205)
22:41:22.618> F(210): 2251,100120,M(159,296,8),A(-3476,-11160,10312),G(-53,21,190)
22:41:23.738> F(320): 2251,100119,M(159,296,6),A(-3504,-11172,10428),G(-65,28,196)
22:41:24.798> F(430): 2251,100119,M(157,302,9),A(-3544,-11200,10356),G(-53,2,232)
22:41:25.918> F(540): 2252,100119,M(163,301,9),A(-3520,-11152,10448),G(-59,21,195)
22:41:27.048> F(650): 2251,100120,M(153,288,12),A(-3596,-11204,10420),G(-71,13,222)
22:41:28.108> F(760): 2251,100122,M(157,293,11),A(-3552,-11132,10420),G(-58,27,195)
22:41:29.228> F(870): 2251,100121,M(149,296,11),A(-3532,-11156,10408),G(-76,23,175)
22:41:30.348> F(980): 2251,100121,M(160,299,9),A(-3520,-11156,10436),G(-46,17,232)
22:41:31.408> F(1090): 2251,100123,M(163,287,6),A(-3512,-11092,10484),G(-59,29,163)
22:41:32.538> F(1200): 2251,100124,M(169,286,13),A(-3532,-11160,10460),G(-58,18,220)
22:41:33.598> F(1310): 2250,100124,M(156,294,7),A(-3584,-11168,10396),G(-61,15,185)
22:41:34.718> F(1420): 2250,100122,M(154,296,11),A(-3516,-11200,10344),G(-64,6,235)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Я до сих пор мыслю такими положениями, что таймер должен быть как выстрел пули. :)
И ощущаю дискомфорт, когда таймер прерывает, к примеру, передачу tcp пакета, и начинает медленно читать i2c.
И чтобы не заглючить и без того глючный девайс, нужно городить очереди и все такое, чтобы за раз на долго в прерывании не задерживаться.
И зачем мне это нужно?
ets_run позволяет обходится без этого, а работала бы ets_run_new, было бы еще лучше, можно тогда защититься от китайских сбросов idle функции.
Вы не изучили систему. Таймер ничего не прерывает.
Вот выше пример - оверлея, он читает десятки регистров датчиков и передает и всё по таймеру...
А вам нужна многозадачная система с семафорами и "светофорами", т.к. в мультизадачке по другому не бывает. Берите RTOS и переделывайте всё на неё. Там можно сделать main_loop - примеры там, в RTOS, даны. Она сама будет прерывать вашу задачу по таймеру, на неизвестное время :), и большая часть прошивки будет заниматься разбором с семафорами и "светофорами" с дикими ограничениями глубины стека на задачи в ESP8266. Стек там и так мал, точный размер стека описан в моем eagle.rom.addr.v6.ld: 0x3FFFEB30..0x3FFFFFFF 0x14D0 = 5328 bytes. RTOS поделит его на кол-во задач.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Просто ESP управляется допустим другой железкой, питается от общего питания, вот тогда просто через меню этой железки и не сбросить,
а только вскрывать железку, чтобы передергивать питание ESP с замкнутым RX.
Или вешать управление питанием ESP.
Исходники же даны(!).
Если внешняя микруха у вас виснет и лажает, то как она пересбросит ESP?
Ставьте геркон и магнитом, если корпус не разобрать :)
 

vad7

Active member
Подскажите какую-нибудь маленькую бесплатную библиотеку для обычных графиков в линию?
Что-то мне попадаются только монстры с js по 200 кило.
Нашел одну Chart.js | Open source HTML5 Charts for your website - 56KB, но в ней, количество меток должно совпадать с количеством данных, что мне не подходит.
 

pvvx

Активный участник сообщества
Подскажите какую-нибудь маленькую бесплатную библиотеку для обычных графиков в линию?
Что-то мне попадаются только монстры с js по 200 кило.
Нашел одну Chart.js | Open source HTML5 Charts for your website - 56KB, но в ней, количество меток должно совпадать с количеством данных, что мне не подходит.
JavaScript Charts for Web and Mobile | FusionCharts
Multi-Series Line Chart
А бесплатных нет.
 

vad7

Active member
@pvvx, после обновления при компиляции ругается:
make[4]: Leaving directory `.../ovls/10dof/main'
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':

Ни оверлеи, ни modus пока не использую.
 

pvvx

Активный участник сообщества
Там даже в примере используется fusioncharts/js/fusioncharts.js в 700к.
всего 70 кило. Графики только с плюшками и анимашкой, но всё отключается.
На js там простой загрузчик с определением какая у вас операционка, браузер и прочее, чтобы указать где скачать поддержку swf.
 

Вложения

pvvx

Активный участник сообщества
@pvvx, после обновления при компиляции ругается:
make[4]: Leaving directory `.../ovls/10dof/main'
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':

Ни оверлеи, ни modus пока не использую.
Ну и не используйте - поменяйте makefile на свой личный проект - отключите вызов трансляции оверлеев.
Без таблицы modbus нет доступа к данным управления.
 

aloika

Active member
Что-то изменилось после добавления оверлеев в свалку в плане трансляции проекта. Не могу прикрутить к новой версии свалки свой проект. А именно:
- Добавляю два своих файла app\user\swingbed.c и app\include\swingbed.h
- Вписываю в init_done_cb(void) запуск своей функции swbd_start(), которая определена в app\user\swingbed.c и заголовок в app\include\swingbed.h
- компилирую, всё нормально, прошиваю модуль. Дойдя до этой swbd_start(), модуль перезагружается.

Комментирую:
// swbd_start();
компилирую, прошиваю - работает модуль. Ага, думаю, в этой функции дело.

Делаю функцию пустой, т.е.
Код:
void ICACHE_FLASH_ATTR swbd_start(void)
{
}
Раскомментирую, прошиваю - перезагружается...
Это похоже, как на AVR бывает, если прерывание не определить. Т.е. при компиляции всё нормально, а как только исполнение доходит до этой функции, контроллер перегружается.

Pvvx, не подскажете какие-нибудь идеи, что это может быть? Пока не было оверлеев, все работало.

Код:
meSDK 1.5.2
Old reset: Fatal exception (0):
epc1=0x40230f38, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

Simple WEB version: 0.1.4
Found free IRAM: base: 0x40105360, size: 11424 bytes
System memory:
data  : 0x3ffe8000 ~ 0x3ffe838c, len: 908
rodata: 0x3ffe838c ~ 0x3ffe8bec, len: 2144
bss   : 0x3ffe8bf0 ~ 0x3ffeec10, len: 24608
heap  : 0x3ffeec10 ~ 0x3fffc000, len: 54256
bssi  : 0x40105360 ~ 0x40105fb8, len: 3160
free  : 0x40105fb8 ~ 0x40108000, len: 8264
Start 'heap' size: 54008 bytes
Set CPU CLK: 160 MHz
sleep disable

Disk init: 78 files, addr = 0x00080000
mode : sta(18:fe:34:d6:e8:56) + softAP(1a:fe:34:d6:e8:56)
add if0
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100

SDK Init - Ok
Current 'heap' size: 51328 bytes
Run ini file: protect/init.ini
of1[protect/init.ini] [mdbfini=protect/mdbini.bin]
of255[protect/mdbini.bin] protect/mdbini.bin - not found.
[sys_ram0x60000f00=0x48]
H[sys_ram0x60000f00=0x65]
e[sys_ram0x60000f00=0x6c]
l[sys_ram0x60000f00=0x6c]
l[sys_ram0x60000f00=0x6f]
o[sys_ram0x60000f00=0x21]
![ovl=tcp_client.ovl]
ld:0x40106300[1180] ld:0x3fffdf60[84] ld:0x3fffdfb4[108] run:0x4010669c [ovl$=1]
TC: Start
cf1 TC: Start
WiFi_set(0x0000ffff)=0x00000200
WiFi mode:3 phy:3 dhcp:1/1
AP:SWBD[4] hiden(0) psw:[0123456789] au:0 chl:1 maxcon:4 beacon:100
ip:192.168.4.1 gw:192.168.4.1 msk:255.255.255.0 mac:1a:fe:34:d6:e8:56
DHCP ip:192.168.4.2..192.168.4.10
ST:[HOMEAP] psw:[0123456789] b:0 ff:ff:ff:ff:ff:ff ac:0
ip:192.168.1.50 gw:192.168.1.1 msk:255.255.255.0 mac:18:fe:34:d6:e8:56
sleep:0, rect:30, maxtpw:82, sthn:[ESP_D6E856]
怘Ђ<0>˜†~†f†ћ<0>x<0>˜а˜xа†жш~<0>˜аff~fx˜˜а†<0>ажћюћ`˜ћжћ`fx˜††x˜˜˜˜ЂжЂ˜Ђаћюћx<0><0>˜а†<0>ћf†ћ<0>˜шxа†<0>шжћюћжћ<0>˜а<0>˜˜Ђ`ffћаћ<0>˜аx怘Ђћћћf~жћ<0>˜ж˜˜Ђжшf~жћ<0>˜ж˜˜Ђ

meSDK 1.5.2
Old reset: Fatal exception (0):
epc1=0x40230f38, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

Simple WEB version: 0.1.4
Found free IRAM: base: 0x40105360, size: 11424 bytes
System memory:
 
Последнее редактирование:

pvvx

Активный участник сообщества
Что-то изменилось после добавления оверлеев в свалку в плане трансляции проекта.
Сменился makefile в плане добавления вызова [inline] @make -C ../ovls[/inline]
На этом все.
По логу у вас нарывается а оверлее. Он наверно не странслирован к той версии - не верны сслыки и адреса на главный проект.
После трансляции web-свалки создается файл ld/labels.ld - он используется для доступа к переменным и функциям проекта из оверлеев (в нем указаны их адреса). Затем транслируются оверлеи. Если что-то сменили в web-свалке - надо перетранслировать оверлеи.
 
Последнее редактирование:

vad7

Active member
@pvvx, в "protect/init.ini" поддерживаются вычисляемые значения справа от "="?
Типа так: sys_ram0x60000f00=~adc~
 
Последнее редактирование:

pvvx

Активный участник сообщества
@pvvx, в "protect/init.ini" поддерживаются вычисляемые значения справа от "="?
Типа так: sys_ram0x60000f00=~adc~
Да. Как и в любом другом отправляемом тексте (HTM и т.д.), websocket, передаваемых в GET, POST переменных и ...
Или вы под вычисляемые имеет в виду арифметические действия (x=1+1)? - тогда - нет.
 

pvvx

Активный участник сообщества
@pvvx, этот файл не отправляется - это настройки для web_fini();
Ответил уже. Там эмуляция "отправки" и проходит через те-же процедуры и обработку - строки передаются web_int_callback().
Ограничение в том, что вывод никуда не идет.
 
Последнее редактирование:

vad7

Active member
@pvvx, ну не знаю, может я и слепой, но вот в упор не вижу, где в функции web_fini() идет разбор переменных ~xxx~.
 
Сверху Снизу