• Система автоматизации с открытым исходным кодом на базе 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~.
 
Сверху Снизу