Как настроить устройство?

Если у вас есть устройство этой системы, необходимо сделать следующее:

1. Включить девайс и услышать звуковые сигналы.
2. Найти WiFi сетку вида ESP-cf8e5e, которую устройство создает само от безысходности и отсутствия доступа к интернету.
3. Необходимо залогиниться в эту сеть и открыть любой сайт не https, а лучше не париться (не на всей мобильниках почему-то работает dns), а сразу открывать титул чипа по адресу http://192.168.4.1
4. Чтобы стать админом, надо увидеть в верхнем правом углу экрана желтый кружок, ткнуть туда и набрать пароль. Если вы не меняли пароль (в config.txt), то по умолчанию он «gluki»
5. Далее следует кнопкой WiFIscan найти нужную сеть и залогиниться в нее. Связь при этом пропадет, но чип перезагрузится и войдет в сеть, о чем сообщит, высвистывая последние цифры IP. Если по какой-то причине (бывает из-за устаревшей версии) не получается это сделать кнопкой, откройте файл-менеджер чипа Files и там впишите логин и на следующей строчке пароль в файл /wifi_last.txt (втрой перенос строки не делайте).
6. После входа в сеть чип пойдет обновлять файлы и прошивку. Это займет какое-то время, может минут 5, не выключайте устройство! Выключение во время обновления прошивки может его убить и спасет только программатор.
7. Далее вы можете работать с устройством.

Если у вас нет устройства?

Вы можете его легко сделать. Нужен чип ESP8266 на плате с USB-слотом, например NodeMCU или D1 mini. Я использую программатор, потом из него чипы вынимаются и сразу паяются куда надо. Так или иначе, чтобы не морочиться с программными системами, можно просто соединить чип кабелем OTG со смартфоном, установить туда приложение ESP8266 Loader и залить готовый бинарник. Относительно последняя версия бинарника лежит здесь: http://lleo.me/ESP8266/last-firmware/firmware.bin Если вам интересны исходники, то относительно свежие здесь: http://lleo.me/ESP8266/CFAQ.zip

Если у вас вопросы по делу, пишите мне, с удовольствием отвечу.

Если вопросы не по делу, если вы попали сюда случайно и у вас острое недоумение, что это, и зачем вам нужно, то вам это точно не нужно. Это не публичный проект, он сделан для решения своих задач, а также по рабочим надобностям и по ТЗ, которое формулировали явно не вы и не для своей сферы применения. Вы можете использовать эту систему для личных нужд, но вас точно никто не уговаривал это делать.

Ниже подробное описание системы.

СИФАК

Задачи, решаемые при помощи чипа ESP628, имеют свои особенности. Чаще всего здесь не требуется мощное программирование, а нужно лишь отвечать на сигналы и производить несложные действия с довольно узким кругом оборудования, но по достаточно сложным сценариям, требующим многочисленных ветвлений, условий, циклов и четкого планирования событий по времени.

Концепция данной системы состоит в том, чтобы максимально облегчить работу с чипом, исключив программирование бинарника вообще. Бинарник может со временем усовершенствоваться и автоматически обновляться (эти инструменты, разумеется, есть в системе), но он всегда один для всех задач. Сами же задачи выполняются при помощи неограниченного количества текстовых файлов-скриптов, которые хранятся во флеш-памяти чипа, относительно безграничной для таких скриптов.

Также система включает в себя элементы админки: программировать чип, меняя скрипты, можно прямо в браузере на страницах, которые предоставляет сам чип, являющийся веб-сайтом.

Язык скриптов, которого потребовала эта задача, максимально прост и достаточно примитивен. На сегодняшний день, помимо обращений к внутреннему и внешнему оборудованию и различным сервисным протоколам (GET, MQTT, MODBUS/TCP), он позволяет делать разнообразные ветвления, осуществлять совсем простые математические вычисления, активно обрабатывать файлы внутренней флешки и управлять многочисленными таймерами. Он чем-то похож на C, но главная его задача — ставить системе задачи и получать ответы, поэтому я называю этот язык CFAQ.


ОСНОВЫ ЯЗЫКА СИФАК

Основой языка является строка, где через ОДИН ПРОБЕЛ (это важно) перечислены команды и операторы. Повторю: язык очень чувствителен к пробелам. В начале строки может стоять сколько угодно пробелов и табуляций. Все, что идет после знака #, считается комментарием и отбрасывается.

Исполняемые скрипты могут приходить несколькими разными путями:

1. В строке GET-запроса: http://192.168.4.1/MOTO?pinmode%204%20OUTPUT|echo%20{gpioA0}

2. В POST-запросе AJAX на http://192.168.4.1/ Например, так работает окно консоли на титульной странице админки.

3. В тексте, переданном внешним сайтом в ответ на запроса к нему командой ping

Разумеется, запросы GET и POST сработают только при наличии авторизации в куках. Пароль устанавливается в config.txt, по умолчанию пароль «gluki»

Если строка скрипта не распознана, она считается именем файла скрипта, и этот файл вызывается на исполнение. Если и файл такой не найден, система пропускает эту строку. Ошибки при этом подавляются (почему так — отдельная долгая дискуссия, но пока нужно было именно так). Любое имя файла является скриптом, файл открывается и запускается на исполнение. В начале имени файла может для понятности стоять /, а может и нет. Например, /SCRIPT.TXT и MOTOR-START — это всё имена скриптов, лишь бы файл с таким именем был среди файлов во флеш-памяти.

Команды условных ветвлений if и else используют либо строку, либо область действия, которая заключается в фигурных скобки.

Основным скриптом, исполняемым однократно при старте, является /config.txt в нем прописываются нужные настройки, задаются циклы и отложенные задачи, необходимые на первое время. Здесь особенное значение представляет команда loopfile — она позволяет задать скрипт, который будет, в отличие от таймеров, исполняться постоянно с наивысшей скоростью и приоритетом. Хороший пример такого скрипта — «плавное дыхание» светодиода если есть интернет, или мигание, когда интернета нет.

loopfile [действия]Главный цикл, пример:
loopfile {
    if {K1} = 0 { Z1 += 20 } else { Z1 -= 20 }
    if {Z1} < 0 {
 K1 = 0
 Z1 = 0
    } else { if {Z1} > 800 K1 = 1 }

if.WIFI pwm 5 {Z1}
  else {
    if {Z1} > 400 pin 5 1
    else pin 5 0
  }
}

Теперь, когда мы уже немного понимаем, как работает язык, приступим к подробному описанию всех его команд. Начнем с самого простого:

РАБОТА С ПИНАМИ GPIO

ESP8266 имеет 15 полноценных GPIO выходов, но 6 из них заняты микросхемой flash памяти и любая попытка их использовать приведет к перезагрузке чипа, поэтому для работы есть такие:
GPIO 0,1,2,3,15 имеют ограничения при использовании: — не рекомендуется их использовать для сухого контакта, кнопок и прерываний:

GPIO 0,2 — не должны быть подтянуты к минусу при старте модуля.
GPIO 15 — в момент старта должен подтянут к минусу через резистор 10к.
GPIO 1,3 — TXD, RXD
GPIO16 — только на OUTPUT (или для пробуждения, если подключить к RESET)

pinmode [пин] [режим]Установить gpio [пин] в один из режимов: OUTPUT (выход), INPUT (вход), INPUT_PULLUP (вход, подтянутый к питанию), пример:
pinmode 5 OUTPUT ; pinmode 4 INPUT_PULLUP
blink (pin)поменять значение gpio пин pin с 0 на 1 и наоборот, если пин не указан, по умолчанию пин 2 (лампочка на корпусе, но учтите, что она обратная — 0 горит, 1 потушена), пример:
repeat 10 blink 5 ; sleep 200
pin [пин] [значение]записать в gpio пин значение 0 или 1, пример:
pin 5 0
pwm [пин] [значение]шим (analog_write) в пин, пример:
pwm 5 100
tone [пин] [значение]тон в пин, пример:
tone 5 433


ЦИКЛЫ, ЗАПУСК ЗАДАЧ И ПЛАНИРОВАНИЕ ВРЕМЕНИ

В системе можно устанавливать циклы, которые будут выполнять определенные действия через определенное количество секунд — регулярно, однократно или некоторое заданное число раз. В качестве действий указывается СТРОКА — это может быть имя файла (тогда будет исполняться он) или одна команда, или последовательность команд, разделенных ; (для команд, исполняемых по сети в GET-запросе можно также использовать разделитель |) Однако можно указать небольшой скрипт в несколько строк, разместив его в фигурных скобках, соблюдая пробелы — примерно как мы выиедли в примере выше с командой mainloop { ... }

[filename]Исполнить скрипт filename, пример:
/MOTOR_STOP
run [filename]То же самое, но в отличие от предыдущего примера, с этой командой можно делать вызовы сложнее, пример:
if {N} < 5 N += 1 else N = 0
run /SCRIPT_{N}.TXT
loop (номер) [time] [действия]Выполнять действия с интервалом time, который задается в секундах. Все отложенные таймеры и циклы задаются в секундах, меньше нет смысла. Если указан номер для цикла, то циклу присваивается конкретный номер, чтобы его можно было изменить, остановить или посмотреть, сколько осталось до срабатывания. Цикл номер 1 изначально зарезервирован под обновление софта. Чтобы отключить обновление используйте команду loop.del 1, пример:
loop 1 0
loop 10 blink 4 ; blink 5 ; if {gpio3} = 1 exit
loop 1 84600 /UPGRADE.txt
loops [количество] (n) [time] [действия]Запустить loop на определенное количество повторов, пример:
{2}
at [time] [действия]Выполнить действия однократно через отложенное время. Это можно записать через команды loop, но так удобней и короче., пример:
at 10 /MOTOR-STOP
loop.del [n]Удалить цикл номер n, пример:
loop.del 1 # остановить запросы на обновления
loopfile [скрипт]Установить скрипт в качестве основного цикла (выполняющегося без задержек), пример:
loopfile /my_loop.txt

loopfile { if {gpio4} == 1 blink 3 }

sleep [секунды]выполнить паузу в несколько секунд. Внимание! Не рекомендуется использовать эут команду, потому что останавливаются все процессы! Лучше запустить отложенную задачу командой at., пример:
{2}
delay [миллисекунды]выполнить паузу (1000 миллисекунд = 1 секунда), также можно использовать синоним delay — usleep, пример:
delay 200
exitпрекратить сейчас выполнение этого скрипта, пример:
if {k} = 0 exit
stopпрекратить не только выполнение скрипта, но и его повторный запуск, если он циклически повторялся по таймеру, пример:
if {k} > 300 { stop } else { exit }
repeat [N] [действия]повторить N раз действия, пример:
repeat 10 echo привет!
repeat 10 {
k += 1
echo привет! k={k}
}
breakпрекратить repeat досрочно, пример:
{2}
echo [строка]Напечатать строку в Serial-консоль, пример:
{2}
settime [UnixTime] (Hour:Min:Sec)Установить время, пример:
settime 1524235234 23:01:59
ping (timeout) [url]выполнить скрипт, получив его с сервера url. Если первым аргументом указан timeout в мс (по умолчанию 3000), то использовать его, пример:
if {gpio4} = 1 ping http://lleo.me/robot?signal=была-нажата-кнопка-4


РАБОТА С ПЕРЕМЕННЫМИ

В нашем языке короткая конструкция в фигурных скобках без пробелов — это всегда кандидат на подстановку значения. Имя переменной должно состоять из латинских букв не менее 8 символов, обязательно содержать заглавные и строчные, цифру и хотя бы один специальный символ... Да шучу, шучу! Имя может быть любым, даже кириллицей, лишь бы не было пробелов. Но учтите, что память у чипа куцая, и чем короче имя, тем ему легче.

[имя] = [выражение]Присвоить переменной результат вычисления числового значения. При вычислении можно использовать операторы =, +, -, *, /, а также +=, -=, *=, /=. К сожалению, ни приоритет операций, ни обработка скобок пока не сделаны. Разбивайте на несколько переменных., пример:
LIMIT = {gpioA0} * 4 — 1024 + {MAXIMUM}
set [имя] [текст]Задать переменной текстовое значение, оно может содержать даже пробелы, пример:
set server = http://lleo.me
set


УСЛОВИЯ

if [ARG1] [условие] [ARG2] [действия]сравнить два аргумента, допустимы условия =, ==, !=, >, >=, <, <= Учтите, что = и == не различаются. В качестве аргумента может быть что-то в фигурных скобках — имя переменной, служебная константа, системные данные., пример:
if {gpioA0} >= 300 {
  echo Ток превышен, насос перегружен!
  if {gpioA0} > 800 echo Возможно, он заржавел и его вообще заело?
} else {
  if {gpioA0} < 100 echo Слабая нагрузка, возможно, в колодце кончилась вода?
  else echo Насос работает в штатном режиме...
}
else [действия]если не выполнилось условие предыдущего if, пример:
{2}
if.empty [arg] [действия]выполнить действия если аргумент равен пустой строке, пример:
{2}
if.!empty [arg] [действия]выполнить действия если аргумент не равен пустой строке, пример:
{2}
ifrand [N] [действия]выполнить действия если случайно выпал 1 шанс из N, пример:
ifrand 100 echo Вы попали в 1% счастливчиков!
if.WIFI [действия]выполнить действия если установлено соединение с местным WiFi, пример:
ifwifi ping http://myserver.ru?say=WiFi_connected
if.!WIFI [действия]выполнить действия если подключиться к WiFi не удалось, пример:
ifnowifi pin 4 1 # зажечь сигнальный светодиод gpio4


РАБОТА С ФАЙЛОВОЙ СИСТЕМОЙ

Здесь почти все самые необходимые команды для работы не только с файлами, а также с файлами-списками и файлами-данными. В качестве данных удобно использовать формат файла, где каждая строка записана через пробел как «КЛЮЧ ЗНАЧЕНИЕ». Так можно делать небольшие ьбазы данных, например, список бесконтактных карт с именами владельцев.

if.FILE [filename] [command]Если файл существует, выполнить команду, пример:
{2}
if.!FILE [filename] [command]Если файл не существует, выполнить команду, пример:
if.!FILE 1.txt FILE.save 1.txt 123
FILE.save [filename] [text]Записать файл, состоящий из строки или текста в фигурных скобках, пример:
FILE.save 1.txt {
0001 товары и услуги
0002 объекты и кредиты
}
FILE.add [filename] [text]Дописать к файлу текст, пример:
FILE.add /1.txt 0003 реклама и рассылки
FILE.add.ln [filename] [string]Дописать строку к файлу, заменив в ней \n на перевод строки FILE.add /1.txt 0004 недвижимость\n0005 ремонт, пример:
{2}
FILE.save.text [filename] [string]Записать файл, состоящий из строки, заменив в ней \n на перевод строки, пример:
{2}
FILE.add.text [filename] [string]Дописать к файлу строку, заменив в ней \n на перевод строки, пример:
{2}
FILE.del [filename]удалить файл, пример:
{2}
FILE.rename [from] [to]переименовать файл, пример:
FILE.rename /1.txt /2.txt
FILE.string.del [filename] [string]удалить из файла строку по началу до пробела, если такая была, пример:
FILE.string.del /1.txt 0002 объекты и кредиты
FILE.string.add [filename] [string]добавить в файл строку, если такого начала (до пробела) не было, пример:
FILE.string.add /1.txt 0002 объекты и кредиты
FILE.key.add [filename] [key] [value]Обновить в файле значение value для ключа key (формат файла — в каждой строке первое слово — ключ, через пробел — его значение), если строки с таким ключом (первым словом) не существует, то добавить ее в конец файла, пример:
FILE.key.add /1.txt 0001 товары и продукты
FILE.key.del [filename] [key]Удалить из файла запись о ключе key, пример:
FILE.key.del /1.txt 0001
{KEY:[filename] [key]}Напомним, что так можно получить value по значению key из файла, пример:
echo Цена для «морковь» = {KEY:/baza-cen.txt морковь} руб.


РАБОТА С ESP

ESP.restartвыполнить ESP.restart();
ESP.resetвыполнить ESP.reset();
SPIFFS.formatотформатировать карту памяти, удалив все файлы

РАБОТА С WIFI

WIFI [network] [password]{1}
WIFI.reconnectЧип отключается от точки доступа и делает повторное подключение.
WIFI.disconnect (true)SSID и пароль на null, отключить станцию от точки доступа. Если добавлен аргумен «true», это выключит режим станции.
WIFI.APdisconnect (true)Выставляет SSID и пароль на null, отключает станцию от точки доступа. Если true, это выключит режим станции.
if.WIFI [команда]Выполнить, если установлено соединение с интернетом
if.!WIFI [команда]Выполнить, если не установлено соединение с интернетом
WIFI.persistent (false)сохранять ли на флеш-память каждый раз пароль, по умолчанию false — не сохранять
WIFI.autoconnect (true)Чтобы при включении питания автоматически подключался к последней использованной точке доступа. Если false, автоматическое подключение будет деактивировано, иначе активировано
if.WIFI.autoconnect [команда]выполняет команду, если у модуля активировано автоматическое подключение
WIFI.autoreconnect (true)Если параметр true, модуль делает повторное подключение, а если false, то нет
WIFI.waitconnectЖдет, когда модуль подключится к точке доступа, очень нужная функция сразу после WIFI
WIFI.diagWiFi.printDiag(Serial)
WIFI.hostname [name]Устанавливает WiFi.hostname
WIFI.mode [mode]устанавливает WiFi.mode: STA — станция, AP — точка доступа, AP_STA — и то и другое
WIFI.config [ip] [gateway] [mask] (dns1) (dns2)Ручная установка параметров
WIFI.AP [name] [password] (channel) (hidden)поднять свою точку доступа WIFI.AP: логин, пароль, также можно указать номер канала и флаг true — скрывать
WIFI.APconfig[ip] [gateway] [mask]
WIFI.dns (flag)поднять свой DNS-сервис если флаг true (по умолчанию) и отключить если falce

РАБОТА С MDNS

MDNS.begin [name]Запустить сервис https://[name].local или остановить если указано пустое имя. Скажем прямо — бессмысленная вещь в реальной жизни.

РАБОТА СО ЗВУКОМ

play (pin) [music]сыграть ноты music на пине pin (если не указан, берется по умолчанию soundpin), музыка кодируется в формате гаммы: DRMFSLCdrmfslc Точка и запятая обозначают паузы длинную и короткую. Если pin не указан (в нормально написанных скриптах его не надо указывать), то используется ранее установленная переменная {sound.pin}. Важно заметить, что переменная {sound.pin.0} указывает, в какое состояние вернуть pin по окончании звучания — по умолчанию это 0, но для устройств, которые используют, например, инвертер для звука, это важно., пример:
play 4 M,d,d,d,d,dd.C,C,r,r,d,C,CC.L,L,L,LS,F,MM.d,dCCC.drddd...M,d,d,d,d,dd.C,C,r,r,d,C,CC.L,L,L,LS,F,MM.d,M,M,L,CCCCC
playip (пин)высвистеть последние три цифры полученного IP в местной сети в пине (если не указан, то soundpin)"), например для 10.9.0.203 это эквивалентно цепочке команд: repeat 2 play 4 M, ; play 4 .. ; repeat 0 play 4 L, ; play 4 .. ; repeat 3 play 4 d,, пример:
{2}
mp3 [файл.mp3]Воспроизвести в эмулированном пине RX файл mp3. Увы, только очень короткие файлы можно, иначе катастрофически не хватает памяти., пример:
mp3 /pes.mp3
mp3stopОстановить воспроизведение mp3, пример:
mp3stop
mp3web [урл]Отключено, потому что чип, скомпилированный в Ардуине, да еще со всем остальным фреймфорком, висящим в памяти, банально не тянет., пример:
mp3web http://radio.4duk.ru/4duk128.mp3


РАБОТА С СЕРВО

attach [номер серво] [пин]подключить сервопривод к gpio [пин], пример:
attach 1 5
detach [номер серво]отключить сервопривод к gpio [пин], пример:
detach 1
go [номер серво] [градус]повернуть сервопривод в нужное положение, пример:
go 1 180


РАБОТА С NFC-СКАНЕРОМ БЕСКОНТАКТНЫХ КАРТ RFID-RC522

RC522.initАктивировать сканер карт RC522, подключенный как RST=GPIO5, SDA(SS)=GPIO4, MOSI=GPIO13, MISO=GPIO12, SCK=GPIO14, GND=GND, 3.3V=3.3V, пример:
RC522.init
{RC522.ver}чтение байта версии в 16-ричном коде (обычно 91 или 92), пример:
if {RC522.ver} != 91 {
  echo Кажется, наш сканер подвис, тихонько перезапустим его
  RC522.init
}
{RC522.card}чтение карты: возвращает пустое знаечние, если карта еще не была поднесена, или ее номер, если недавно была поднесена, пример:
set CARD = {RC522.card}
if.!empty {CARD} echo Введена карта, ее номер: "{CARD}"!
{KEY:[filename] [key]}Простой способ организовать элементарные базы данных (и не только для NFC-сканнера). Если в файле filename найдется строка, первое слово которой — ключ key, то вернуть значение (остальную часть строки), иначе вернуть пустое значение. ВАЖНО: при извлечении даже цифровых переменных всегда используйте оператор set. set X = {KEY:...}, а не просто X = {KEY:...}, пример:
set CARD = {RC522.card}
if.!empty {CARD} {
  echo Поднесли карту номер: "{CARD}"
  set NAME = {KEY:/keybasa.txt {CARD}}
  if.empty {NAME} echo Ключа нет в списке доступа!
  else {
      echo Добро пожаловать, уважаемый {NAME}!
      /DOOR_OPEN_ENGINE
  }
}

РАБОТА MQTT

MQTT.connect [url:port] [login] [password]соединиться с сервером MQTT, если порт не указан, то 1883. Параметры при вызове этой процедуры также запоминаются в системных переменных
MQTT_server, MQTT_port, MQTT_login, MQTT_password (для последующего реконнекта), password, а также login могут отсутствовать{1}
MQTT.reconnectвыполнить пересоединение с MQTT
MQTT.publish [topic] [string]Публикация в топике
MQTT.subscribe [topic]подписка на топик
MQTT.unsubscribe [topic]отдписка от топика


РАБОТА MODBUS/TCP SLAVE

MODBUS.beginзапустить иницилизацию
MODBUS.add [reg] (value)создать регистр (номер от 1 до 9999), можно указать ему сразу значение для инициализации
MODBUS.save [reg] (value)записано новое значение в созданный ранее регистр


РАБОТА C ДАТЧИКАМИ

DS18B20.beginзапустить инициализацию датчика температуры DS18B20

РАБОТА C АНАЛОГОВЫМ ВХОДОМ A0

calibrate [пин] [N] [имя]Проести калибровку: рассчитать среднее арифметическое от N измерений пина (конечно он всегда A0) каждые 10 мс и сохроанить в переменную с указанным именем
MOTORSTOP [N]Установить значение внутренней переменной для срабатывания для системы контроля мгновенной остановки мотора
TIMER.start (ms)Запустить таймер кольцевой записи параметров всех пинов. Это сложная процедура, которая проводит очень частые (можно указать время в ms, по умолчанию 50) проверки состояния пинов. При этом проводится вычисление Z-фильтра на появление пиков, а также обработка некоторых случаев с вызовом соответствующих процедур.
TIMER.stopОстановить кольцевую запись пинов
setflt [lag] [TOL] [THRESHOLD] [INFLUENCE]Установить параметры сглаживающего фильтра измерений
echobuf [N]Выдать содержимое кольцевого буфера измерений, начиная с N


Операции текстовых строк

{GET:[url] [timeout]}загрузить страницу из сети (очень короткую! памяти не хватит!) по адресу url и с таймаутом timeout, который указан через пробел в мс (еслине указан, то по умолчанию 5000мс).
{FILE:[файл]}Загрузить (с внутренней флешки) содержимое файла с именем «файл»
{PARSE:[переменная] [шаблон]}ищет в строковой переменой данные по шаблону, где нужный кусок обозначен * Также понимает обозначения: \n \r
{TAKE:[name] [num] [sep]}Разобрать текстовую переменную с именем [name] на аргументы по сепаратору [sep] (если не указан, то разделить по пробелам) и взять аргумент номер [num]
{SET}вывести дамп всех переменных в формате «имя = [значение]\
{INFO}вывести полное инфо, как /info
{dir}дать список всех файлов на внутренней флешке в формате «[имя] [размер]\
{WIFI.scan}дать список WiFi-сетей вокруг в формате «[доступ] [имя сети]\n», где доступ «free» для открытых и «pass» для закрытых

Служебные переменные

{имя}значение переменной с именем «имя»
{gpio[N]}прочесть значение gpio 1,2,3,4,5,12,13,14,15,16 и A0
{ip}полученные IP WiFi.localIP().toString()
{ip_mask}WiFi.subnetMask()
{ip_gateway}WiFi.gatewayIP()
{macAddress}WiFi.macAddress()
{ip_connected}1 или 0 WiFi.isConnected() ? 1 : 0
{ip_autoconnect}1 или 0 WiFi.getAutoConnect() ? 1 : 0
{ip_dns}WiFi.dnsIP(0) + WiFi.dnsIP(1)
{ip_hostname}WiFi.hostname()
{ip_status}WiFi.status()
{ip_ssid}WiFi.SSID()
{ip_psk}WiFi.psk()
{ip_bssid}WiFi.BSSIDstr()
{ip_rssi}WiFi.RSSI()
{softAPIP}WiFi.softAPIP()
{softAPmacAddress}WiFi.softAPmacAddress()
{softAPgetStationNum}WiFi.softAPgetStationNum()
{FreeHeap}ESP.getFreeHeap()
{FreeSketchSpace}ESP.getFreeSketchSpace()
{SketchSize}ESP.getSketchSize()
{chip}ESP.getChipId() HEX
{FlashChipId}ESP.getFlashChipId()
{FlashChipSize}ESP.getFlashChipSize()
{FlashChipRealSize}ESP.getFlashChipRealSize()
{FlashChipSpeed}ESP.getFlashChipSpeed()
{cycles}ESP.getCycleCount()
{CoreVersion}ESP.getCoreVersion()
{FullVersion}ESP.getFullVersion()
{BootVersion}ESP.getBootMode()
{BootMode}ESP.getCycleCount()
{CpuFreq}ESP.getCpuFreqMHz()
{FlashChipSizeByChipId}ESP.getFlashChipSizeByChipId()
{getSketchMD5}ESP.getSketchMD5()
{ResetReason}ESP.getResetReason()
{ResetInfo}ESP.getResetInfo()
{flashmode}ESP.getFlashChipMode() — возвращает QIO, QOUT, DIO, DOUT, UNKNOWN
{vcc}ESP.getVcc()
{Files}Список всех файлов внутренней флешки в формате " [имя]"
{Files_count}число файлов внутренней флешки
{VER}номер версии прошивки (число)
{VERNAME}имя версии прошивки
{MQTT}если сервис MQTT поднят, то 1, иначе 0
{MOTORSTOP}флаг остановки мотора
{NBUF}константа — размер буфера
{NLOOP}константа — максимальное количество циклов
{NSET}константа — максимальное количество переменных
{NSERV}константа — максимальное количество серв
{UnixTime}текущее время UnixTime (начинает тикать с 0 в момент старта, нопозже можно записать настоящее время)
{Hour}текущие часы
{Minute}текущие минуты
{Second}текущие секунды
{DS18B20}считать показания температурного датчика Dallas
{MODBUS.started}если сервис ModBus уже был инициализирован, то 1, иначе 0
{MODBUS.last}показать дамп последнего запроса
{MODBUS:[reg]}значение регистра reg
{LOOP:[N]}Число оставшихся секунд до срабатывания цикла по его номеру, пример:
echo До обновления сфота осталось {LOOP:1} секунд
{LOOP:[действия]}Возвращает число оставшихся секунд до срабатывания цикла по его исполняемой команде (если ее помним или это было имя файла, неудобная команда), пример:
echo {LOOP:/MOTOR_STOP.txt}
{LOOP}вывести дамп всех циклов в формате «Loop #[N] [count] of [value] [тело] ONE\n» ONE добавляется — если цикл однократный, пример:
{LOOP}
{1}

Системная часть — edge

Также есть системная веб-часть по обращению к веб-сайту чипа, например http://192.168.4.1/info

/infoстраница всей полной информации о чипе и системе (только для админа)
/dirсписок файлов на флешке (только для админа)
/uploadзагрузка файлов на флешку методом POST (только для админа)
/FM?a=loginлогиниться админом, туда мы передаем «password»
/FM?a=loop&n=3показать сколько осталось секунд до выполнения цикла номер (например 1) — работает для всех, не только для админа
/FM?a=WIFIconn1переконнектиться по WiFI если сеть была «ESP-HELP», передает «net»+«pass», записывает их в «wifi_last.txt», устарело
/FM?a=WIFIconn?net=[сеть]&pass=[пароль]попытка логина (для админа)
/FM?a=WiFiсканирование сетей (для админа)
/FM?a=Restartвыполняет ESP.restart(); (для админа)
/FM?a=Upgradeвыполнить апгрейд всего (для админа)
/FM?a=upgradeобновить прошивку с сервера «file».bin (для админа)
/FM?a=uploadобновить файл с «server_update» (для админа)

 


    посещений 582