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

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

pvvx

Активный участник сообщества
Пишет:
Type 'AUTH_MODE' could not be resolved wifi.h /Web_Base4/app/include line 116 Semantic Error
И правильно пишет. Данный файл включается в заголовке си текста, как [HASHTAG]#include[/HASHTAG] "wifi.h", после [HASHTAG]#include[/HASHTAG] "user_interface.h".
Нет никакого смысла, кроме создания дополнительного тормоза при компиляции, включать в каждый *.h файл все другие *.h которые он использует.
И ни один из имеющихся у меня Eclipse ничего плохого про данное дело не говорит:
1122.gif
А при запросе, от кеда растет описание AUTH_MODE (кнопочка F3 или мышкой 'Open declaration'), он открывает user_interface.h и кажет строку 125:' } AUTH_MODE;' :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
pvvx, а как собрать проект? Ошибка не очищается используя clean
Странслировать. Как - указано в теме по UDK.
Нажать пимпочку 'All':
all.gif

И проект в UDK просто копированием не вносится. Там, в теме UDK, тоже указано как включать новые проекты в среду вашего workspace:
Через File -> Import...-> Existing Progects into Workspace ->....
 
Последнее редактирование:

mcmega

Member
Странслировать. Как - указано в теме по UDK.
Нажать пимпочку 'All':
Посмотреть вложение 390

И проект в UDK просто копированием не вносится. Там, в теме UDK, тоже указано как включать новые проекты в среду вашего workspace:
Через File -> Import...-> Existing Progects into Workspace ->....
Ага, разобрался, спасибо, всё получилось)
Скажите, а можно добавить в прошивку "сброс" к заводским настройкам?
Предположим, если нечаянно переключил WiFi Mode в режим ST, а с домашней AP не соединился (ошибка или ещё чего...) получается к модулю уже не достучаться... Было бы не плохо сделать как в роутерах, нажал на кнопку в течении 5 секунд (GPIOх на "0" или "1") и вернулись "заводские установки" с включенным режимом SoftAP
 

lvm1976

New member
одно ведущее устройство, допустим датчик температуры на базе вашей "кучи", при превышении температуры отсылает гет запрос на исполнитель, реле опять же на этой базе, которое включает обогреватель.
 

mcmega

Member
pvvx, Ещё такой момент, можно ли через UART менять переменные?
Например поменять переменную wifi_ap_ssid
Это удобно, если однотипных устройств много (скажем выключателей), через TCP назначаем ID устройству (фактически контроллеру), а контроллер в свою очередь меняет переменную wifi_ap_ssid по UART на WiFi модуле.
 

pvvx

Активный участник сообщества
То то и оно, что выключать питание нужно..., а если это выключатель в стене или в подвале
Тогда вообще ни как и никаких методов нет, кроме как обесточивать район :)
В последних версиях, при рабочем интерфейсе WEB можно выборочно писать/читать произвольную область flash по стандартной загрузке файлов в HTTP... Но HTML к этому не написан.
 
Последнее редактирование:

lvm1976

New member
Код:
/******************************************************************************
* PV` FileName: user_main.c
*******************************************************************************/

[HASHTAG]#include[/HASHTAG] "user_config.h"
[HASHTAG]#include[/HASHTAG] "ets_sys.h"
[HASHTAG]#include[/HASHTAG] "os_type.h"
[HASHTAG]#include[/HASHTAG] "osapi.h"
[HASHTAG]#include[/HASHTAG] "add_func.h"
[HASHTAG]#include[/HASHTAG] "user_interface.h"
[HASHTAG]#ifdef[/HASHTAG] USE_SRV_WEB_PORT
[HASHTAG]#include[/HASHTAG] "web_srv.h"
[HASHTAG]#endif[/HASHTAG]
[HASHTAG]#include[/HASHTAG] "driver/uart.h"
[HASHTAG]#ifdef[/HASHTAG] USE_NETBIOS
[HASHTAG]#include[/HASHTAG] "netbios.h"
[HASHTAG]#endif[/HASHTAG]
[HASHTAG]#include[/HASHTAG] "tcp_srv_conn.h"
[HASHTAG]#include[/HASHTAG] "tcp_terminal.h"
[HASHTAG]#include[/HASHTAG] "flash_eep.h"
[HASHTAG]#include[/HASHTAG] "wifi.h"
[HASHTAG]#include[/HASHTAG] "driver/spi_register.h"
[HASHTAG]#include[/HASHTAG] "driver/io_pin_func.h"
[HASHTAG]#include[/HASHTAG] "driver/dht11.h"
[HASHTAG]#include[/HASHTAG] "driver/i2c_bmp180.h"
[HASHTAG]#include[/HASHTAG] "actuat.h"
[HASHTAG]#include[/HASHTAG] "sntp.h"

//void eram_init(void);
#if DEBUGSOO > 1
//#define TEST_TIMER 1
//#include "driver/int_time_us.h"

//#define TEST_RTC_RTNTN 1
[HASHTAG]#endif[/HASHTAG]

LOCAL os_timer_t DebounceTimer;
LOCAL os_timer_t sensor_timer;
LOCAL void input_intr_handler(void *arg);
void ICACHE_FLASH_ATTR debounce_timer_cb(void *arg);

#if (!defined(USE_ESPCONN)) && (SDK_VERSION > 959)
uint32 ICACHE_FLASH_ATTR espconn_init(uint32 x) {
    return 1;
}
[HASHTAG]#endif[/HASHTAG]

[HASHTAG]#ifdef[/HASHTAG] USE_RESET_CFG_WIFI
void Test_ClrCFG(void);
[HASHTAG]#endif[/HASHTAG]

[HASHTAG]#ifdef[/HASHTAG] TEST_RTC_RTNTN

bool ICACHE_FLASH_ATTR test_rtc_mem(void) {
    uint32 x[128];
    uint32 i, t = 0x43545240;
    bool chg = false;
#if DEBUGSOO > 1
    os_printf("Test rtc memory retention... ");
[HASHTAG]#endif[/HASHTAG]
    if(!system_rtc_mem_read(64, x, sizeof(x))) {
#if DEBUGSOO > 1
        os_printf("read error!\n");
[HASHTAG]#endif[/HASHTAG]
        return false;
    }
    for(i = 0; i < 128; i++) {
        if(x[I] != t) {
            x[I] = t;
            chg = true;
        };
        t++;
    };
    if(chg) {
        if(!system_rtc_mem_write(64, x, sizeof(x))) {
#if DEBUGSOO > 1
            os_printf("write error!\n");
            return false;
[HASHTAG]#endif[/HASHTAG]
        };
#if DEBUGSOO > 1
        os_printf("changes, new write\n");
[HASHTAG]#endif[/HASHTAG]
        return false;
    };
#if DEBUGSOO > 1
    os_printf("Ok.\n");
[HASHTAG]#endif[/HASHTAG]
    return true;
}
[HASHTAG]#endif[/HASHTAG]

void init_done_cb(void)
{
    PIN_FUNC_DEFAULT(12);
    PIN_FUNC_DEFAULT(14);
    set_gpio_io_pin();
    os_printf("\nSDK Init - Ok\nCurrent 'heap' size: %d bytes\n", system_get_free_heap_size());
[HASHTAG]#ifdef[/HASHTAG] TEST_RTC_RTNTN
    test_rtc_mem();
[HASHTAG]#endif[/HASHTAG]
}

void BtnInit()
{
    // Set GPIO 0 to IO
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO0);
    // Enable pull up R
    PIN_PULLUP_EN(PERIPHS_IO_MUX_MTDI_U);
    // Disable interrupts
    ETS_GPIO_INTR_DISABLE();
    // Attach pin 0 to the interrupt thing
    ETS_GPIO_INTR_ATTACH(input_intr_handler, NULL);
    GPIO_DIS_OUTPUT(BTN_CONFIG_GPIO);
    // Clear gpio status
    GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(0));
    // Enable interrupt
    gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_NEGEDGE);
    // Global re-enable interrupts
    ETS_GPIO_INTR_ENABLE();
    os_timer_disarm(&DebounceTimer);
    os_timer_setfn(&DebounceTimer, &debounce_timer_cb, 0);
}

void ICACHE_FLASH_ATTR debounce_timer_cb(void *arg)
{
    ETS_GPIO_INTR_DISABLE();
    gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_NEGEDGE);
    ETS_GPIO_INTR_ENABLE();
    #if DEBUGSOO > 0
        ets_uart_printf("Button CONFMODE pressed, wiping configuration and restart in configuration mode...\r\n");
    [HASHTAG]#endif[/HASHTAG]
    uint32 wifi_set_err = Setup_WiFi_Def();
    #if DEBUGSOO > 0
    ets_uart_printf("Restarting in STATIONAP mode...\r\n");
    [HASHTAG]#endif[/HASHTAG]
    system_restart();

}

LOCAL void input_intr_handler(void *arg)
{
  // Not that sure what this does yet and where the register is used for
  uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
  // Сlear interrupt status
  GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
  // Disable interrupt
  ETS_GPIO_INTR_DISABLE();
  gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_DISABLE);
  // Enable interrupt
  ETS_GPIO_INTR_ENABLE();
  os_timer_arm(&DebounceTimer, 200, FALSE);
}

LOCAL void ICACHE_FLASH_ATTR sensor_timer_cb(void *arg)
{
    Read_sensor_vol();
}

/******************************************************************************
* FunctionName : user_init
* Description  : entry of user application, init user function here
* Parameters   : none
* Returns      : none
*******************************************************************************/
void ICACHE_FLASH_ATTR user_init(void) {
//  PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);
//    PIN_PULLUP_DIS(PERIPHS_IO_MUX_GPIO2_U);
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
    uart_init(BIT_RATE_115200, BIT_RATE_230400);
[HASHTAG]#ifdef[/HASHTAG] USE_US_TIMER
    system_timer_reinit();
[HASHTAG]#endif[/HASHTAG]
    DHTInit();
    i2c_init();
    BMP180_Init();
    BtnInit();
    os_timer_disarm(&sensor_timer);
    os_timer_setfn(&sensor_timer, (os_timer_func_t *)sensor_timer_cb, (void *)0);
    os_timer_arm(&sensor_timer, 1000, 1);
#if DEBUGSOO > 0
    os_printf("\nSimple WEB version: " WEB_SVERSION "\nSDK version: %s\n", system_get_sdk_version());
[HASHTAG]#else[/HASHTAG]
[HASHTAG]#endif[/HASHTAG]
    sys_read_cfg();
[HASHTAG]#ifdef[/HASHTAG] USE_ESPCONN
    if (espconn_tcp_get_max_con() != 5) {
        espconn_tcp_set_max_con(5);
        system_restart();
    }
[HASHTAG]#endif[/HASHTAG]
[HASHTAG]#ifdef[/HASHTAG] USE_RESET_CFG_WIFI
    if(syscfg.cfg.b.pin_clear_cfg_enable) Test_ClrCFG();
[HASHTAG]#endif[/HASHTAG]
    if(syscfg.cfg.b.hi_speed_enable) {
        ets_intr_lock();
        REG_SET_BIT(0x3ff00014, BIT(0));
        os_update_cpu_frequency(160);
        ets_intr_unlock();
//        CLEAR_PERI_REG_MASK(SPI_CTRL1(0), SPI_CS_DELAY_OFF << SPI_CS_DELAY_OFF_S); // убрать задержку CS у Flash
    }
    else {
        //    REG_CLR_BIT(0x3ff00014, BIT(0));
        //    os_update_cpu_frequency(80);
    }
    set_gpio_io_pin();
    if(!syscfg.cfg.b.debug_print_enable) system_set_os_print(0);
    eram_init();
#if DEBUGSOO > 0
    os_printf("System memory:\n");
    system_print_meminfo();
    os_printf("Current 'heap' size: %d bytes\n", system_get_free_heap_size());
[HASHTAG]#endif[/HASHTAG]
#if DEBUGSOO > 0
    os_printf("Set CPU CLK: %u MHz\n", ets_get_cpu_frequency());
[HASHTAG]#endif[/HASHTAG]
    Setup_WiFi();
[HASHTAG]#ifdef[/HASHTAG] USE_NETBIOS
    if(syscfg.cfg.b.netbios_ena) netbios_init();
[HASHTAG]#endif[/HASHTAG]
[HASHTAG]#ifdef[/HASHTAG] USE_SNTP
    if(syscfg.cfg.b.sntp_ena) sntp_init();
[HASHTAG]#endif[/HASHTAG]
[HASHTAG]#ifdef[/HASHTAG] UDP_TEST_PORT
    if(syscfg.udp_port) udp_test_port_init(syscfg.udp_port);
[HASHTAG]#endif[/HASHTAG]
    // инициализация и запуск tcp серверa(ов)
[HASHTAG]#ifdef[/HASHTAG] USE_SRV_WEB_PORT
    if(syscfg.web_port) webserver_init(syscfg.web_port);
[HASHTAG]#endif[/HASHTAG]
    if(syscfg.term_port) tcp_term_init(syscfg.term_port);
    system_deep_sleep_set_option(0);
    system_init_done_cb(init_done_cb);
}
/*
int main(void)
{
    return 0;
}
*/
 
Последнее редактирование модератором:

Victor

Administrator
Команда форума
pvvx, не смотрели вот этот проект? wiki github
может есть там какие-то решения, которые нам бы пригодились?
 

aloika

Active member
Как-то это не очень - всем сразу открытым соединениям? А управляет одно или сразу все? Uart не многопользовательский. Прикидываю - будут беды и переполнения. Безусловно, при нормировании со стороны запрошающего (клиента) проблем не будет, но если вдруг на uart накинутся все соединения? Да даже одно - оно заполнит буфер передачи в uart и websocket умрет (не сможет отвечать). А значит надо городить спец.протокол и просто стандартными передачами бинарных данных для websocket тут не обойтись. Этих протоколов (Subprotocol) у websocket уже мульоны... Не охота городить ещё один. - может через него сделать транспорт HTTP :)
Надо выдумать как вписаться в простые стандартные рамки....
Конечно, если делать все, что называется, "в общем виде", то надо или использовать готовый, или разрабатывать свой протокол (не подозревал, что столько уже разработано, надо будет когда-нибудь попробовать использование wamp, а то я, оказывается, велосипед тут как-то изобрел... с квадратными колесами... :) )
Но я-то о том, что просто бы пока транспортный уровень запустить на модуле...
 

Andy Korg

Moderator
Команда форума
сброс через дергание GEPIO0
Че-то не въезжаю в смысел - если МК завис он как сам себя перезагрузит? Кроме того вроде в esp есть китайская собака (хотя то же вроде та еще зверюга - не лает, не кусает и чип не перегружает)
 

PostLast

Member
Добрый день! Разбираюсь с проблемой на модуле ESP-01
Модуль подключен как STATIONAP. режим 802.11.g шифрование WPA прошивка сервер 10.04 и более ранний. Пока компьютер подключен к сети через WiFi все летает. Но если подключение идет в той же точке через Ethernet - в браузере получаю, что соединение сброшено сервером. При этом к сокету 12345 подключается , пинг ходит, при подключение сокетом к 80 порту получаю ответ 505 ( естественно, я ответ не отправляю) браузер - лисица и IE. Проверил на нескольких точках и разных компах - эффект повторяется. Единственное что заметил ответ на первый запрос может приходит через 2000 мс что странно но и в WiFi сети могут быть задержки 900 мс. Потом задержки в ping 1..3 мс. Как исправить?
 

pvvx

Активный участник сообщества
pvvx, не смотрели вот этот проект? wiki github
может есть там какие-то решения, которые нам бы пригодились?
Уже давал ссылку туда:
... сено к лошади не идет: createInputForAp - Не хотят рисовать HTML...
Там исходники написаны быстро и есть много недочетов. NetBios отсылает все запросы на WEB модуля, ... :)
И там до 4-х соединений по TCP, что мало для многих задач.
 

pvvx

Активный участник сообщества
Че-то не въезжаю в смысел - если МК завис он как сам себя перезагрузит? Кроме того вроде в esp есть китайская собака (хотя то же вроде та еще зверюга - не лает, не кусает и чип не перегружает)
Работает WDT, но не всегда. С этим надо бороться путем выноса Espressif. Шаг они сделали в SDK 1.0.1(b2), надо ещё десяток изменений от них вытребовать - тогда WDT будет работать... Но это не реально. Китайцы не шарят и им объяснить ничего не выходит.
WDT будет работать правильно только когда начну доделывать ревеср SDK и исключу китай-код в libmain.a. Но на это надо желание, время и настроение :) А детям надо счас готовые решения, а не нормальную базовую функциональность и этим никто не заморочен... Время спортивного втыкания новых модулей только для галочки у многих авторов в ESP8266 ещё не прошло и толпа не желает стабильности базовой функциональности.
---
Свалка переехала на SDK 1.0.1 (b2).
 
Последнее редактирование:
Сверху Снизу