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

pvvx

Активный участник сообщества
С диммированием сложнее, придется через оптрон ловить пересечение нуля в сети и от этого осчитывать момент включения вывода,
Там ещё немного сложнее для правильной реализации. Требуется создание подобия ФАПЧ c фильтрацией на 50 или 60Гц +- нормативы сети с малым запасом. А от него уже плясать задержками включениями (+логика проверки сбоев, выпадений и искажения фазы) и ещё с пересчетом для линейности управления мощностью или по другой характеристике нагрузки... А т.к. это разовая задача, то проще решить поставив спец.чип управления и не маяться. Но ради спорта можно и этим заняться.
Подключение опроса SPI и I2C к web делаются просто - примеры и исходники есть во многих местах...
 
Последнее редактирование:
  • Like
Реакции: Lstt

amatron

New member
Подскажите, пожалуйста, как при помощи переменных, например >~sys.gpio14~ изменить состояние пина (на 0 или 1)?
 

pvvx

Активный участник сообщества
Не могу найти где устанавливается ограничение уровня передатчика WiFi...
Пока искал, добавил от WiFi:
<noisefloor>-95</noisefloor>
<power>2137</power>
Подскажите, пожалуйста, как при помощи переменных, например >~sys.gpio14~ изменить состояние пина (на 0 или 1)?
Путем непосредственной записи в регистры ~ram0x60000304=0x10000~ :)
Описание регистров и адресов I/O дано в ESP8266_GPIO_Register_141105.xls и ESP8266_Pin_List_141105.xlsx. Они находятся в разделе документации на сайте.
Но лучше написать в СИ что требуется, т.к. регистры I/O имеют множественные варианты управления и установки - входы/выходы/подтяжки, переключения на входы-выходы другой внутренней аппаратуры....
 

Andy Korg

Moderator
Команда форума
Че-то не получается забабахать клиента udp . Не вызывается callback-функция udp_rcv, помогите пожалуйста понять в чем я не прав.
Код:
#include "lwip/udp.h"
#include "lwip/ip_addr.h"
#include "lwip/err.h"
#include "user_interface.h"

struct udp_pcb* udp_nat;

uint32 TimeInet = 0;

void ICACHE_FLASH_ATTR udp_rcv(void *arg, struct udp_pcb *pcb, struct pbuf *p,
    ip_addr_t *addr, u16_t port){

    TimeInet = 0xfffffff0;

    if (p->len != 4){
        TimeInet = 0xffffffff;
    }
    else{
        memcpy(&TimeInet, p->payload, 4);
    }
    pbuf_free(p);
}

err_t ICACHE_FLASH_ATTR natInit(void){

    err_t err = ERR_OK;
    struct ip_addr natIP;

    struct pbuf* p = pbuf_alloc(PBUF_TRANSPORT, 1, PBUF_RAM);

    struct ip_info wifi_info;

    udp_nat = udp_new();
    if (udp_nat != NULL){
        if (wifi_get_ip_info(STATION_IF, &wifi_info)){
            udp_nat->local_ip = wifi_info.ip;
            udp_nat->local_port = 6234;
        }
        udp_recv(udp_nat, udp_rcv, NULL);
        IP4_ADDR(&natIP, 128, 138, 141, 172);
        udp_sendto(udp_nat, p, &natIP, 37);
        pbuf_free(p);
    }
    else {
        err = ERR_MEM;
    }
}
 

pvvx

Активный участник сообщества
Че-то не получается забабахать клиента udp . Не вызывается callback-функция udp_rcv, помогите пожалуйста понять в чем я не прав.
Возьмите примеры у LwIP http://download.savannah.gnu.org/releases/lwip/
UDP используется в contrib-1.4.0\apps\netbios\netbios.c и contrib-1.4.0\apps\sntp\sntp.c
И кто вам сказал, что в текущем pbuf будут данные по payload ? Вы их размер и наличие проверили :) pbuf_copy_partial(...) и т.д.

В текущем SDK версия LwIP 1.4.0 c некоторыми "патчами", не совсем правильными... Но это уже не относится к вашему коду, а к тому что китай-программер впихнул их неверно сначала уничтожает pcb, а потом лезет в него :). Для одно-задачки и без C++ пойдет, если таймер в это время не сработает и никто память не перераспределит... :)

Кто подскажет, куда идет байт из OTP области [0x3ff00052] :
ESP-01: 3ff00050: 00 00 82 0e ad 99 00 02 00 a0 00 00 00 00 00 00
chip_id = 0x0099ad0e, mac = 1a:fe:34:99:ad:0e
ESP-12: 3ff00050: 00 00 83 bf c0 9f 00 02 00 a0 00 00 00 00 00 00
chip_id = 0x009fc0bf, mac = 1a:fe:34:9f:c0:bf
(помечены все имеющиеся различия в OTP, ROM код идентичен)
Разбираюсь с различием старых чипов ESP8266 с новыми (почему уровень SAR питания показывает разный).
 
Последнее редактирование:

Andy Korg

Moderator
Команда форума
Возьмите примеры у LwIP http://download.savannah.gnu.org/releases/lwip/
UDP используется в contrib-1.4.0\apps\netbios\netbios.c и contrib-1.4.0\apps\sntp\sntp.c

В текущем SDK версия LwIP 1.4.0 c некоторыми "патчами", не совсем правильными... Но это уже не относится к вашему коду, а к тому что китай-программер впихнул их неверно сначала уничтожает pcb, а потом лезет в него :). Для одно-задачки и без C++ пойдет, если таймер в это время не сработает и никто память не перераспределит... :)
Спасибо за подсказку. Посмотрел примеры, вроде все делаю как тама. А не выходит каменный цветок. Может еще у кого мысли есть?
 

pvvx

Активный участник сообщества
Спасибо за подсказку. Посмотрел примеры, вроде все делаю как тама. А не выходит каменный цветок. Может еще у кого мысли есть?
Вы не написали что не работает. Отправка или прием? С какого IP отсылаете на какой IP ESP8266? У ESP8266 2 IP - st/ap. Внутреннего роуминга между ними нет :)
----
Сменил свалку на соответствие Unofficial Development Kit for Espressif ESP8266 v1.0.9 (c) by CHERTS
Поправил Make, изменил пример udp_test_port.c для Andy Korg на прямую работу с LwIP:
udp.gif
Никаких IP от WiFi в UDP не приматывал, отвечает и AP и ST.
 
Последнее редактирование:

Andy Korg

Moderator
Команда форума
Вы не написали что не работает. Отправка или прием? С какого IP отсылаете на какой IP ESP8266? У ESP8266 2 IP - st/ap. Внутреннего роуминга между ними нет :)
Я-то по простоте душевной думал, что вот этот код указывает с какого IP отправлять
Код:
        if (wifi_get_ip_info(STATION_IF, &wifi_info)){
            udp_nat->local_ip = wifi_info.ip;
            udp_nat->local_port = 6234;
        }
Но потом поковырял функцию udp_sendto и оказалось, что умные люди уже все сделали и написали
Код:
  netif = ip_route(dst_ip);
Т.е. сетевой интерфейс выбираться на основе destantion ip и мои потуги выглядеть умным провалились :)
----
Сменил свалку на соответствие Unofficial Development Kit for Espressif ESP8266 v1.0.9 (c) by CHERTS
Поправил Make, изменил пример udp_test_port.c для Andy Korg на прямую работу с LwIP:
Посмотреть вложение 146
Никаких IP от WiFi в UDP не приматывал, отвечает и AP и ST.
Огромное спасибо! Cкачал и посмотрел.
Один мааленький вопросик: Обязательно делать "err_t err = udp_bind(pcb, IP_ADDR_ANY, portn);" если мне нужен только клиент?
 
Последнее редактирование:

pvvx

Активный участник сообщества
Нашлось, почему процедура readvdd33() на модулях показывает разное напряжение. Всё оказалось банальнее - у неё внутренняя связь с ножкой входа ADC.
Меняю напряжение на входе ADC (переменным резиcтором) - меняются показания readvdd33:
ADC_vs_VDD.gif
Это на ESP-01. На ESP-12 ещё не пробовал... там у меня не прикручен переменный резистор :)
---------
readvdd33() включает "подтяжку" на VCC и измеряет напряжение на подключенном внешнем сопротивлении на вход ADC ножки чипа и GND:
ReadVdd.gif

Процедура uint16 system_adc_read(void) на время измерения выключает WiFi
(видимо он дает помеху). Перенаправляет к uint16 test_tout(0), в котором измерение происходит между pm_set_sleep_mode(4) .... pm_wakeup_init(4,0).
 
Последнее редактирование:

elAlex

New member
Читаю постоянно этот форум ( сам пока ничего для других не сделал ) и думаю что буду не одинок если выскажу pvvx уважение и благодарность. Спасибо.
 

Algis

New member
... про разводку и емкости в питании мне не понравилось...
Кстати. модуль ESP-03 тоже "болен" кривой разводкой хотя и не греется,
при интенсивном использовании TCP2UART (запрос через каждые 3 сек.) виснет раз в сутки, один раз видимо даже прошивка полетела, так как ожил только после перепрошивки.
Дополнительный конденсатор с обратной стороны, близко к выводам питания процессора, убрал проблему.
 

pvvx

Активный участник сообщества
Кстати. модуль ESP-03 тоже "болен" кривой разводкой хотя и не греется,
при интенсивном использовании TCP2UART (запрос через каждые 3 сек.) виснет раз в сутки, один раз видимо даже прошивка полетела, так как ожил только после перепрошивки.
Дополнительный конденсатор с обратной стороны, близко к выводам питания процессора, убрал проблему.
Китайцы сделали уже ESP-201 и опять не вывели ножку питания RTC, для продолжения покупки новых модулей. :)
"ожил только после перепрошивки" - это может быть связано именно с RTC. Там сохраняется конфигурация для рестарта по deep_sleep и т.д. Если нога reset не соединена с pd (не помню какой, описано в PDF-SDK), то рестарта нет и происходит путаница с рестартом... После переключение питания и режимов загрузки - перевод в режим программирования и другие пляски с выводами, решает проблему - оно загружается без перепрошивки.
 
Последнее редактирование:

elAlex

New member
По большому счёту - ничего не мешает сделать свой модуль. Выбросить наружу всё что можно и нужно. Этот будет проще чем CC2530 например. Балун на борту ( после TI это доставило ). Всё что необходимо есть на Али. Себестоимость выше будет, это да ( с китайцами спорить тяжело ). Но мне кажется не критично.
 

pvvx

Активный участник сообщества
По большому счёту - ничего не мешает сделать свой модуль. Выбросить наружу всё что можно и нужно. Этот будет проще чем CC2530 например. Балун на борту ( после TI это доставило ). Всё что необходимо есть на Али. Себестоимость выше будет, это да ( с китайцами спорить тяжело ). Но мне кажется не критично.
Я то припаять смогу, а народ? Так не решается.
Для экспериментов можно и так:
IMG_5532.jpg
ADC вывод выводил на ESP-01...
 
Последнее редактирование:

elAlex

New member
Собственно и паять-то не обязательно. Плату развести, отдать китайцам ( Seeed Studio, ets ) в работу. Им-же сборку заказать. У Cherts ( попутно так-же поблагодарю хозяина площадки, спасибо ) магазин есть. Там организовать продажу. Маржу не загонять и спрос будет.
 
Сверху Снизу