attachInterrupt() Function
To set an interrupt in the Arduino IDE, you use the attachInterrupt() function, that accepts as arguments: the GPIO interrupt pin, the name of the function to be executed, and mode:
GPIO interrupt pin
The first argument is a GPIO interrupt. You should use digitalPinToInterrupt(GPIO) to set the actual GPIO as an interrupt pin. For example, if you want to use GPIO 14 as an interrupt, use:
The ESP8266 supports interrupts in any GPIO, except GPIO16.
ISR
The second argument of the attachInterrupt() function is the name of the function that will be called every time the interrupt is triggered – the interrupt service routine (ISR).
The ISR function should be as simple as possible, so the processor gets back to the execution of the main program quickly.
The best approach is to signal the main code that the interrupt has happened by using a global variable and within the loop() check and clear that flag, and execute code.
ISRs need to have ICACHE_RAM_ATTR before the function definition to run the interrupt code in RAM.
Interrupt modes
The third argument is the mode and there are 3 different modes:
- CHANGE: to trigger the interrupt whenever the pin changes value – for example from HIGH to LOW or LOW to HIGH;
- FALLING: for when the pin goes from HIGH to LOW;
- RISING: to trigger when the pin goes from LOW to HIGH.
For our example, will be using the RISING mode, because when the PIR motion sensor detects motion, the GPIO it is connected to goes from LOW to HIGH.
Распиновка ESP8266 NodeMCU
С внешним миром ESP8266 NodeMCU соединяют всего 30 выводов. Ниже показана распиновка отладочной платы.
Рисунок 6 – Распиновка ESP8266 NodeMCU
Для простоты мы сгруппируем выводы с аналогичными функциями.
Выводы питания – на плате расположено четыре вывода питания, а именно: один вывод VIN и три вывода 3.3V. Если у вас есть стабилизированный источник напряжения 5 В, вывод VIN можно использовать для непосредственного питания ESP8266 и его периферии. Выводы 3.3V – это выходы встроенного стабилизатора напряжения. Эти выводы могут использоваться для подачи питания на внешние компоненты.
GND – это вывод земли отладочной платы ESP8266 NodeMCU.
Выводы I2C используются для подключения всех видов датчиков и периферийных устройств на шине I2C в вашем проекте. Поддерживаются и I2C Master, и I2C Slave. Работа интерфейса I2C может быть реализована программно, а тактовая частота составляет максимум 100 кГц. Следует отметить, что тактовая частота I2C должна быть выше самой низкой тактовой частоты из ведомых устройств.
Выводы GPIO На ESP8266 NodeMCU имеется 17 выводов GPIO, которые можно назначать программно на различные функции, такие как I2C, I2S, UART, PWM, дистанционное инфракрасное управление, светодиодный индикатор и кнопка. Каждый включенный вывод GPIO может быть настроен либо на внутреннюю подтяжку к земле или к шине питания, либо установлен на высокоимпедансное состояние. При конфигурировании на вход для генерирования прерываний процессора он может быть настроен на срабатывание либо по фронту, либо по спаду.
Вывод ADC подает сигнал на имеющийся в NodeMCU, встроенный 10-разрядный прецизионный аналого-цифровой преобразователь последовательного приближения (SAR ADC). С помощью этого АЦП могут быть реализованы две функции: проверка напряжения питания на выводе VDD3P3 и проверка входного напряжения на выводе TOUT (но не одновременно).
Выводы UART ESP8266 NodeMCU имеет 2 интерфейса UART, то есть UART0 и UART1, которые обеспечивают асинхронную связь (RS232 и RS485) и могут обмениваться данными со скоростью до 4,5 Мбит/с. Для связи можно использовать UART0 (выводы TXD0, RXD0, RST0 и CTS0), который поддерживает управление потоком. UART1 (вывод TXD1) поддерживает только сигнал передачи данных, поэтому он обычно используется для печати журнала событий.
Выводы SPI ESP8266 имеет два интерфейса SPI (SPI и HSPI), поддерживающих и ведомый (slave), и ведущий (master) режимы. Эти интерфейсы SPI также поддерживают следующие функции SPI:
- 4 режима синхронизации передачи SPI;
- до 80 МГц и тактовые частоты, полученные делением 80 МГц;
- до 64 байт FIFO.
Выводы SDIO ESP8266 имеет защищенный цифровой интерфейс ввода/вывода (SDIO, Secure Digital Input/Output Interface), который используется для прямого подключения карт SD. Поддерживаются 4-битный 25 МГц SDIO v1.1 и 4-битный 50 МГц SDIO v2.0.
Выводы PWM На плате имеется 4 канала широтно-импульсной модуляции (PWM). Выход ШИМ может быть реализован программно и использован для управления двигателями и светодиодами. Частотный диапазон ШИМ регулируется от 1000 мкс до 10000 мкс, то есть от 100 Гц до 1 кГц.
Выводы управления используются, как ни странно, для управления ESP8266. Эти выводы включают в себя вывод включения микросхемы EN, вывод сброса RST и вывод пробуждения WAKE.
- Вывод EN – микросхема ESP8266 включена, когда на вывод EN подается высокий логический уровень. При низком логическом уровне микросхема работает на минимальной мощности.
- Вывод RST используется для сброса микросхемы ESP8266.
- Вывод WAKE используется для вывода чипа из глубокого сна.
Последние штрихи
Итак, смотрим что получилось:
https://example.com/ — это ваш сайт заглушка, можно разместить что-то полезное, положив html файлы в conf/nginx/www
https://example.com/manager/rabbit/ — интерфейс управления RabbitMQ, доступ по умолчанию guest пароль guest — пароль нужно сразу же сменить — помните про китайцев! Создание новых пользователей MQTT на вкладке Admin. Если укажете TAG administrator, то этот пользователь сможет логиниться в WEB интерфейс RabbitMQ и управлять другими пользователями. Если нужно только подключение по MQTT то задавайте TAG None. Создайте нового пользователя, которого прописали в конфиге Telegraf, перезапустите Telegraf. Каждому пользователю после создания нужно дать права на доступ к Virtual host (это внутренний термин RabbitMQ, наш единственный Virtual host это «/»), жмите Set permission.
https://example.com/manager/grafana/ — самое интересное — Grafana. По умолчанию там только один источник данных — Prometheus. Из него берутся данные для мониторинга RabbitMQ и VPS. Нужно создать еще один источник данных InfluxDB — туда Telegraf будет складывать данные из всех топиков, полученные по MQTT. Вообще, в Grafana все интуитивно понятно да и в интернете множество инструкций. Смотрите готовые dashboards, импортируйте чужие и создавайте свои.
https://example.com/manager/portainer/ — WEB интерфейс для управления контейнерами. Тоже нужно задать нормальный пароль после первого входа (admin admin). Можно останавливать/перезапускать контейнеры, смотреть логи каждого контейнера и многое другое — смотрите, изучайте. Именно здесь найдете причину в логах, если что-то не работает.
Install USB To Serial Drivers
The first step in setting up the ESP8266 Arduino IDE is to plug in
the NODEMCU and check the Windows device Manager for an entry in the
Ports section.
If you don’t see the NodeMCU showing up as shown below then you will
need to install drivers. The other possibility is that the NodeMCU is
using too much power — I found it would not work from a powered hub but
only from direct connection to the PC USB port. It needs 400mA!
External Power Source
Note: You can add an external power source to the Vin connection on
the board with voltage >5V. Also connect ground labelled ‘G’ to complete the circuit.
Warning: The AMS1117 absolute maximum input voltage is 15V — do not go above this i.e. do not supply a voltage to ‘Vin’ above 15V.
Что делать дальше
Если у вас новый модуль, то, скорее всего, в нем прошита одна из старых кастомных AT прошивок. Скорее всего это какой-нибудь AI-THINKER AT v0.16 SDK v0.9.2. Проверить версию прошивку вы можете командой «AT+GMR», т.е. прямо в терминальной программе набираете AT+GMR без кавычек и жмете Enter. Модуль должен ответить «OK» и выдать версию прошивки (например, «0016000092» — в разных версиях AT прошивок формат вывода версии отличается). Управление модулем ESP8266 AT командами заслуживает отдельной статьи, однако вы легко сможете разобраться с этим и сами, воспользовавшись одним из наших справочников по AT командам:
Разбивка flash-памяти
Хотя файловая система, как и программа, хранится во flash-памяти чипа, запись нового скетча не затрагивает содержимое файловой системы. Благодаря этому в файловой системе можно хранить, к примеру, данные скетча, конфигурационные файлы и содержимое веб-сервера.
Схема ниже показывает, какую разбивку flash-памяти использует IDE Arduino:
|--------------|-------|---------------|--|--|--|--|--| ^ ^ ^ ^ ^ Скетч OTA-апдейт Файл. система EEPROM Конфиг для WiFi (SDK)
Размер файловой системы зависит от flash-памяти на плате, выбранной в IDE Arduino:
Плата | Размер flash-памяти | Размер файловой системы |
---|---|---|
Generic module | 512 Кб | 64 Кб, 128 Кб |
Generic module | 1 Мб | 64 Кб, 128 Кб, 256 Кб, 512 Кб |
Generic module | 2 Мб | 1 Мб |
Generic module | 4 Мб | 3 Мб |
Adafruit HUZZAH | 4 Мб | 1 Мб, 3 Мб |
ESPresso Lite 1.0 | 4 Мб | 1 Мб, 3 Мб |
ESPressp Lite 2.0 | 4 Мб | 1 Мб, 3 Мб |
NodeMCU 0.9 | 4 Мб | 1 Мб, 3 Мб |
NodeMCU 1.0 | 4 Мб | 1 Мб, 3 Мб |
Olimex MOD-WIFI-ESP8266(-DEV) | 2 Мб | 1 Мб |
SparkFun Thing | 512 Кб | 64 Кб |
SweetTea ESP-210 | 4 Мб | 1 Мб, 3 Мб |
WeMos D1 & D1 mini | 4 Мб | 1 Мб, 3 Мб |
ESPDuino | 4 Мб | 1 Мб, 3 Мб |
Примечание: Чтобы использовать в скетче функции для работы с файловой системой, в начале скетча нужно добавить следующее:
#include "FS.h"
Libraries — softserial
- Maintenance release 6.12.3: better dependency declarations for Platformio ()
- EspSoftwareSerial 6.12.2: Inlining push() functions that must be in IRAM for calling from ISRs ()
- Bug-fix release 6.12.1: a documentation error was reported by a user; dropped bit-patterns that masked the stop-bit fixed. ()
- EspSoftwareSerial minor release 6.12.0 completes adaptation to new Stream::send() ()
- Minor EspSoftwareSerial release 6.11.7, for deprecated ICACHE_RAM_ATTR in upcoming ESP8266 Arduino core 3.0.0. ()
- EspSoftwareSerial, bump up Arduino library manager related files 6.11.6 ()
- Update to EspSoftwareSerial 6.11.5 ()
- EspSoftwareSerial bug-fix release 6.11.4 ()
- Update to EspSoftwareSerial 6.11.3: prepares for ESP8266 Arduino core PR 6979. ()
- EspSoftwareSerial 6.11.2: Delegate<> assign operators added. ()
- Minor EspSoftwareSerial release 6.11.1 ()
- Minor EspSoftwareSerial release 6.11.0 ()
- EspSoftwareSerial bug fix release 6.10.1: preciseDelay() could delay() for extremely long time, if period duration was exceeded on entry. ()
- EspSoftwareSerial 6.10.0: override keyword for recent Print::availableForWrite() addition ()
- EspSoftwareSerial 6.9.0: data/strings in flash alignment handling fix. Yielding during write() improvement. ()
A Simple Timer Example for the ESP8266
We spent quite a bit of time looking for an example of how to use os_timer in the Arduino IDE. Here is our test program. Our pulse monitor is now running on os_timer correctly. Note there is another set of os_timer functions that allow microsecond resolution. Using them will increase your jitter as above.
// // ESP8266 Timer Example // SwitchDoc Labs October 2015 // extern "C" { #include "user_interface.h" } os_timer_t myTimer; bool tickOccured; // start of timerCallback void timerCallback(void *pArg) { tickOccured = true; } // End of timerCallback void user_init(void) { /* os_timer_setfn - Define a function to be called when the timer fires void os_timer_setfn( os_timer_t *pTimer, os_timer_func_t *pFunction, void *pArg) Define the callback function that will be called when the timer reaches zero. The pTimer parameters is a pointer to the timer control structure. The pFunction parameters is a pointer to the callback function. The pArg parameter is a value that will be passed into the called back function. The callback function should have the signature: void (*functionName)(void *pArg) The pArg parameter is the value registered with the callback function. */ os_timer_setfn(&myTimer, timerCallback, NULL); /* os_timer_arm - Enable a millisecond granularity timer. void os_timer_arm( os_timer_t *pTimer, uint32_t milliseconds, bool repeat) Arm a timer such that is starts ticking and fires when the clock reaches zero. The pTimer parameter is a pointed to a timer control structure. The milliseconds parameter is the duration of the timer measured in milliseconds. The repeat parameter is whether or not the timer will restart once it has reached zero. */ os_timer_arm(&myTimer, 1000, true); } // End of user_init void setup() { Serial.begin(115200); Serial.println(); Serial.println(); Serial.println(""); Serial.println("--------------------------"); Serial.println("ESP8266 Timer Test"); Serial.println("--------------------------"); tickOccured = false; user_init(); } void loop() { if (tickOccured == true) { Serial.println("Tick Occurred"); tickOccured = false; } yield(); // or delay(0); }
Compile the code, run it and you will see “Tick Occurred” printed to your serial console on the Arduino IDE every second.
Шаг 7. Подключитесь с мобильного приложения.
Установите мобильное приложение на ваш смартфон/планшет.
Примечание: В приложении для iOS перед подключением необходимо вручную подключить смартфон к точке доступа, используя системные настройки операционной системы. Приложение для Android умеет самостоятельно переключить систему на точку доступа устройства и вернуть предыдущую точку доступа после отключения.
В приложении нажмите кнопку нового подключения «+» в верхней панели. В открывшемся окне выберите подключение «WiFi точка доступа».
В приложении для iOS предварительно зайдите в системные настройки и подключитесь к точке доступа «RemoteXY» с паролем «12345678». Подключенная точка доступа должна отображаться в открывшемся окне. Нажмите кнопку «Connect».
В приложении для Android включите WiFi и нажмите кнопку обновления списка доступных точек доступа. Выберите точку доступа RemoteXY. В открывшемся окне введите пароль точки доступа «12345678», нажмите кнопку «Подключиться».
Если не подключается…
Вы можете проверить наличие связи между Arduino и ESP8266 используя Serial Monitor, который можно открыть во вкладке Tools в Arduino IDE.
Откройте Serial Monitor и установите скорость 115200. Нажмите кнопку сброса на плате Arduino.
Проверьте наличие правильно загруженной программы
Если после сброса Arduino в Serial Monitor нет никаких сообщений, это скорее всего означает, что Arduino не выполнят вашу программу. Возможно:
- нужный скетч не был загружен;
- ваша Arduino не включена;
- Serial Monitor не подключился к Arduino;
- с вашей Arduino что то не так.
- внесены недопустимые изменения в код, например откорректирована структура RemoteXY или массив RemoteXY_CONF, удалены вызовы функций RemoteXY_Init() или RemoteXY_Handler().
Если вы уже добавили в проект какой либо код вашей задачи, попробуйте протестировать RemoteXY без этого кода, используя только тот код который генерирует редактор.
Проверьте связь между Arduino и ESP8266
Если после сброса Arduino в Serial Monitor вы видите следующую последовательность команд, это означает, что инициализация ESP8266 проходит успешно и связь между Arduino и ESP8266 есть:
Если вы видите только повторяющиеся команды «AT», это означает что нет связи между Arduino и ESP8266.
Связь может отсутствовать по разным причинам. Ниже перечислены основные:
- контакты RX и TX подключены не верно, перепутаны контакты, или подключены не к тем контактам, или не подключены совсем;
- скорость передачи данных не совпадает, ESP8266 по умолчанию использует скорость 115200;
- нет питания на ESP8266, при подаче питания на ESP8266 должен светиться красный светодиод;
- не хватает мощности источника питания 3.3 В для ESP8266;
- модуль ESP8266 неисправен.
Проверьте прошивку ESP8266
Если после сброса Arduino в Serial Monitor вы видите только начало последовательности команд, но нет завершающей команды AT+CIPSERVER=1,6377 это означает, что модуль ESP8266 имеет устаревшую прошивку. Требуется обновление прошивки.
Если инициализация проходит успешно и вы видите последнюю команду AT+CIPSERVER=1,6377, но при попытке подключения с мобильного приложения возникает ошибка, возможно, что модуль ESP8266 имеет устаревшую прошивку.
Проверьте объем памяти вашего ESP8266. Это можно сделать так же посмотрев маркировку чипа памяти, который находится на плате рядом с чипом ESP8266. Если размер памяти составляет 4 Mbit и меньше (установлен чип 25Q40), скорее всего этот модуль не будет работать как точка доступа для RemoteXY.
Проверьте питание ESP8266
Так же возможно, что вашей ESP8266 не хватает мощности источника питания. Некоторые платы Arduino имеют слабый стабилизатор напряжения 3.3 В, который не способен выдавать 200-300 мА в пиковых режимах. В этом случае в Serial Monitor вы так же увидите обрыв последовательности команд.
Проверьте особенности вашего смартфона
Некоторые модели смартфонов на Android имеют особенности подключения точек доступа WiFi, и возможно точка доступа не включается автоматически. Попробуйте подключиться к точке доступа предварительно в ручную, используя системные настройки. После этого попробуйте соединиться с устройством из приложения RemoteXY. Если в этом случае соединение устанавливается, значит ваш смартфон имеет такую особенность. Сообщите нам об этом.
ESP8266: Getting Board MAC Address
To communicate via ESP-NOW, you need to know the MAC Address of the ESP8266 receiver. That’s how you know to which device you’ll send the information to.
Each ESP8266 has a unique MAC Address and that’s how we identify each board to send data to it using ESP-NOW (learn how to Get and Change the ESP8266 MAC Address).
To get your board’s MAC Address, upload the following code.
After uploading the code, open the Serial Monitor at a baud rate of 115200 and press the ESP8266 RESET button. The MAC address should be printed as follows:
Save your board MAC address because you’ll need it to send data to the right board via ESP-NOW.
ESP8266 NodeMCU with PIR Motion Sensor
In this section, you’ll learn how to detect motion with a PIR motion sensor using interrupts and timers in your code.
Parts Required
Here’s a list of the parts required to complete this tutorial:
- ESP8266 (read Best ESP8266 development boards)
- PIR motion sensor (AM312)
- 5mm LED
- 330 Ohm resistor
- Breadboard
- Jumper wires
You can use the preceding links or go directly to MakerAdvisor.com/tools to find all the parts for your projects at the best price!
Schematic Diagram
Assemble the PIR motion sensor and an LED to your ESP8266. We’ll connect the LED to GPIO 12 (D6) and the PIR motion sensor data pin to GPIO 14 (D5).
Recommended reading: ESP8266 Pinout Reference Guide
Important: the Mini AM312 PIR Motion Sensor used in this project operates at 3.3V. However, if you’re using another PIR motion sensor like the HC-SR501, it operates at 5V. You can either modify it to operate at 3.3V or simply power it using the Vin pin.
The following figure shows the AM312 PIR motion sensor pinout.
Code
After wiring the circuit as shown in the schematic diagram, copy the code provided to your Arduino IDE.
You can upload the code as it is, or you can modify the number of seconds the LED is lit after detecting motion. Simply change the timeSeconds variable with the number of seconds you want.
How the Code Works
Let’s take a look at the code.
Start by assigning two GPIO pins to the led and motionSensor variables.
Then, create variables that will allow you set a timer to turn the LED off after motion is detected.
The now variable holds the current time. The lastTrigger variable holds the time when the PIR sensor detects motion. The startTimer is a boolean variable that starts the timer when motion is detected.
setup()
In the setup(), start by initializing the serial port at 115200 baud rate.
Set the PIR Motion sensor as an INPUT_PULLUP.
To set the PIR sensor pin as an interrupt, use the attachInterrupt() function as described earlier.
The pin that will detect motion is GPIO 14 and it will call the function detectsMovement() on RISING mode.
The LED is an OUTPUT whose state starts at LOW.
loop()
The loop() function is constantly running over and over again. In every loop, the now variable is updated with the current time.
Nothing else is done in the loop(). But, when motion is detected, the detectsMovement() function is called because we’ve set an interrupt previously in the setup().
The detectsMovement() function prints a message in the Serial Monitor, turns the LED on, sets the startTimer boolean variable to true and updates the lastTrigger variable with the current time.
After this step, the code goes back to the loop(). This time, the startTimer variable is true. So, when the time defined in seconds has passed (since motion was detected), the following if statement will be true.
The “Motion stopped…” message will be printed in the Serial Monitor, the LED is turned off, and the startTimer variable is set to false.
Код прошивки
Для прошивки всех используемых ниже модулей используем один и тот же код.
Основные функции:
-
Установка Wi-Fi соединения
-
Подключение к объекту на платформе Rightech IoT Cloud по протоколу MQTT
-
Отправка рандомных значений по температуре («base/state/temperature») и влажности («base/state/humidity») каждые 5 секунд (PUB_DELAY)
-
Получение сообщений о переключении света («base/relay/led1»)
Работоспособность кода будем проверять на платформе Rightech IoT Cloud, именно поэтому в качестве адреса MQTT-брокера указан dev.rightech.io. Идентификаторами клиентов служат идентификаторы объектов, созданных на платформе. Под каждую проверку я завела на платформе отдельный объект, именно поэтому во всех скринах кодов, которые будут далее представлены, отличается только строка <ric-mqtt-client-id>.
Прим. — Можно подключаться и к одному и тому же объекту, тогда можно использовать один и тот же код для прошивки всех плат без изменений, однако следите, чтобы в таком случае платы не подключались к одному и тому же объекту одновременно, иначе случится коллизия.
Как быстро подключить ESP8266
В минимальный набор для подключения и прошивки модуля ESP8266 входит:
2. Убедиться два раза, что питающее напряжение для модуля составляет 3,3 вольта.
Внимание! Допустимый диапазон напряжения питания модуля ESP8266 от 3,0 до 3,6 вольт. Подача повышенного напряжения питания на модуль гарантированно приведет к выходу ESP8266 из строя
Питающее напряжение может быть и существенно ниже 3 вольт, заявленных в документации
Внимание!
Внимание!
ESP8266 — подключение
Красный — питание 3,3в
Черный — GND
Желтый — на стороне ESP8266 — RX, на стороне USB-TTL — TX
Зеленый — на стороне ESP8266 — TX, на стороне USB-TTL — RX
Оранжевый — CH_PD (CHIP ENABLE) — должен быть всегда подтянут к питанию
Синий — GPIO0 — подключен через выключатель к земле для включения режима перепрошивки модуля. Для обычного старта модуля GPIO0 можно оставить никуда не подключенным.
Розовый на правой схеме — нестабилизированное питание 5-8 вольт
4. Для старта модуля разорвите цепь GPIO0 — GND и можете подавать питание (причем именно в таком порядке: сначала убеждаемся, что GPIO0 «висит в воздухе», затем подаем питание на VCC и CH_PD)
Внимание! В вышеприведенных, реально работающих, примерах подключения ESP8266 используется подключение выводов ESP8266 «напрямую» к земле и питанию, либо «висячее в воздухе», как у нас никуда не подключен RESET, что является абсолютно неправильным и пригодно только для пары первых экспериментов, хотя и вполне работоспособно на подавляющем большинстве модулей. «Напрямую» к питанию подключается только вывод VCC, остальные выводы: CH_PD, RESET, GPIO0, GPIO2, должны быть подтянуты (pullup) к питанию (VCC) через резистор от 4,7 до 50 кОм
«Напрямую», к минусу (общему проводу) питания подключаем только GND, а GPIO0 подтягиваем (pulldown) тоже через резистор до 10k к GND для перевода модуль в режим загрузки прошивки. Если вы планируете и дальше экспериментировать с ESP8266, то сделайте , впрочем так же как и для любых других микроконтроллеров. Детальное описание pullup и pulldown выходит за рамки данной статьи, но вы сможете легко нагуглить описание правильного подключения портов ввода-вывода. «» подключение позволит вам избежать множества «чудес» и проблем и будет неизбежно необходимым при возникновении затруднений с запуском или перепрошивкой модуля ESP8266.
Ограничения файловой системы
Во-первых, SPIFFS не поддерживает папки. Она просто хранит список файлов. В отличие от традиционных файловых систем, в файловых именах SPIFFS можно указывать слэши («/»), поэтому функции, которые работают с списками папок – например, openDir(«/website») – просто фильтруют файловые имена в поисках тех, что начинаются с запрошенного префикса. Например, с того же «/website».
Во-вторых, максимальный размер для файлового имени – 32 символа. Более того, символ «\0» отведен под завершение строки, поэтому в итоге у нас остается даже не 32, а 31 символ.
Таким образом, файловые имена SPIFFS должны быть короткими, из чего вытекает другое ограничение – файловые имена не должны быть слишком многоуровневыми. Потому что, опять же, полный размер пути к каждому файлу (включая папки, символы «/», само название, точку и расширение) не должен превышать 31 символ. К примеру, файловое имя /website/images/bird_thumbnail.jpg состоит из 34 символов, и это может повлечь проблемы, к примеру, при использовании функции exists() или если имя другого файла будет иметь тот же 31 символ.
Внимание: Пропустить это ограничение очень просто. Если его проигнорировать, проблема может пройти незамеченной, потому что никаких сообщений об ошибках показано не будет – ни во время компиляции, ни во время работы скетча.