Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Играйте с Fire через Wi-Fi (ESP8266, NeoPixels и приложение для Android)

Компоненты и расходные материалы

ElectroPeak ESP8266 Serial WIFI Witty Cloud Board
× 1
Умная светодиодная лента Neopixels (полоса 60 светодиодов / м)
× 3
Конвертер логического уровня ElectroPeak
× 1
ElectroPeak, 21 см, 40 полюсов, перемычка между мужчинами и женщинами
× 1
Труба ПВХ 60 см, размер 2 ”
× 1
Калька
× 1
Стеклянный цилиндр
× 1
Источник питания 5 В (минимум 9 А)
× 1
Arduino Nano R3
× 1

Необходимые инструменты и машины

Пистолет для горячего клея (общий)
Паяльник (универсальный)

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Вы можете прочитать это и другие замечательные руководства на Официальный сайт ElectroPeak

Создайте крутой эффект имитации огня с помощью беспроводного управления Wi-Fi. Мобильное приложение (для смартфонов Android) с красивым интерфейсом готово к установке, чтобы поиграть с вашим творением! Мы также будем использовать Arduino и ESP8266 для управления пламенем. В конце этого проекта вы узнаете:

  • Как работают NeoPixels.
  • Как программировать ESP8266 и управлять переменными через Wi-Fi
  • Как создать крутой эффект огня с помощью NeoPixels

Введение в NeoPixels

Индивидуально адресуемые светодиоды или часто называемые NeoPixels существуют уже довольно давно, и вы, вероятно, их знаете, но, если вы этого не сделаете, они похожи на обычные светодиоды RGB, но, как следует из названия, цвет каждого из них можно адресовать индивидуально. , позволяя создавать бесконечно крутые узоры и анимации. Для WS2812b вам нужно всего 3 провода:2 для питания и 1 для данных. Это означает, что вам понадобится всего один свободный вывод Arduino для управления множеством светодиодов!

В этом проекте мы собираемся использовать эти умные светодиоды для создания эффекта огня. Для управления светодиодами мы воспользуемся замечательной библиотекой FastLED. Мы будем использовать скетч-пример библиотеки Fire2012, написанный Марком Кригсманом. Мы используем 6 полос светодиодов, каждая по 30 светодиодов (всего 180 светодиодов), мы наклеиваем эти светодиоды на кусок трубы из ПВХ и помещаем их в стеклянный цилиндр (эти стеклянные цилиндры обычно используются как вазы). Мы должны рассеять свет светодиодов, чтобы они выглядели непрерывно. Для этого мы использовали кальку, которая пропускает свет и рассеивает свет.

Строительство

Прежде всего, приобретите правильный стеклянный цилиндр. Наш цилиндр имеет длину 60 см и диаметр 12 см.

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

Получив стеклянный цилиндр, измерьте его внутреннюю длину, а затем отрежьте трубу из ПВХ так, чтобы она вошла внутрь цилиндра. Наш стеклянный цилиндр имеет высоту 60 см (без учета основания он имеет внутреннюю длину 59 см), поэтому мы разрезаем нашу трубу из ПВХ до 59 см. На эту трубу наклеишь светодиодные ленты, идеально подойдет труба диаметром 4 см.

Затем мы должны разрезать нашу светодиодную ленту на 6 равных частей, здесь мы используем полосу с плотностью 60 светодиодов / м (вы можете использовать более высокую плотность для лучших эффектов, если хотите), мы используем шесть длин по 50 см, это означает, что нам нужно 3 метра. Равномерно распределите шесть отрезков длины вокруг трубы из ПВХ и приклейте полосы к трубе. Вот как это должно выглядеть.

К светодиодным лентам вместе вы можете либо непосредственно припаять провода к ленте в соответствии со следующим рисунком, либо сначала припаять к полоскам контактные выводы, а затем соединить их с помощью макетных проводов.

Когда все соединения светодиодной ленты готовы, вам нужно поместить трубку внутрь цилиндра. Чтобы центрировать трубу внутри цилиндра, вы можете использовать пену, чтобы вырезать круг, внешний диаметр которого равен внутреннему диаметру стеклянного цилиндра, а внутренний диаметр равен внешнему диаметру трубы из ПВХ. Подготовьте по две штуки для каждой стороны трубы. Присоедините эти детали к концам и аккуратно вставьте трубу внутрь цилиндра.

Код

Мы используем Arduino IDE для кодирования и загрузки в ESP8266. Вы должны использовать плату с ESP8266 с 3 МБ SPIFFS, если вы хотите загрузить файлы программного обеспечения контроллера на SPIFFS. SPIFFS - это сокращение от «Флэш-файловая система последовательного периферийного интерфейса». Вы можете загружать файлы контроллера в эту память, чтобы обслуживать файлы из этого места. Сделав это, вы можете открыть свой браузер (на телефоне или ноутбуке) и перейти по адресу вашего ESP (по умолчанию 192.168.4.1), и вы получите интерфейс контроллера в своем браузере без необходимости установки приложения, если вы иметь iPhone или iPad, это ваш единственный выбор.

Загрузите следующий набросок на свою доску ESP. Нам нужна библиотека FastLED, поэтому сначала добавьте ее в свою Arduino IDE, если вы еще этого не сделали (вы можете скачать ее здесь). Код моделирования пожара - это набросок Марка Кригсмана fire2012, который вы можете найти в примерах. Этот пример относится к одной полосе светодиода, но здесь мы изменили код, чтобы использовать переменное количество полосок. Чем больше будет полос / светодиодов, тем сильнее будет эффект.

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

  #include  #include  #include «FastLED.h» #include «EEPROM.h» #include «FS.h» // требуется для SPIFFS # define DATA_PIN 5 #define LED_TYPE WS2811 #define COLOR_ORDER GRB #define NUM_LEDS 30 # define NUM_STRIPS 6 # define CHIPSET WS2812B // адреса для сохранения данных в EEPROM для сохранения состояния имитации пожара #define cs0Adr 0 # define cs1Adr 3 # define cs2Adr 6 #define cs3Adr 9 # определить BriAdr 15 # определить FpsAdr 16 # определить SparkingAdr 17 # определить CoolingAdr 18 # определить EEPROMCheckAdr 20 // если это значение равно 250, мы предполагаем, что мы ранее сохранили в EEPROM и загружаем данные из этого светодиода CRGB [NUM_STRIPS * NUM_LEDS]; String inData; uint8_t FPS =100; // FRAMES_PER_SECONDuint8_t SPARKING =150; uint8_t COOLING =90; uint8_t ЯРКОСТЬ =100; uint8_t csRGB [4] [3] ={{0, 0, 0}, {255, 0, 0}, {255, 127, 0}, {255, 255, 255}}; беззнаковое длинное previousMillis =0; bool change =false; // если true переходим к сохранению в EEprom. unsigned long changeMillis =0; // изменения будут сохранены через 1 минуту после того, как изменения не будут применены, чтобы избежать износа EEPROM. bool initSetup =true; CRGBPalette16 gPal; ESP8266WebServer server (80); // Объект веб-сервера. Будет прослушивать порт 80 (по умолчанию для HTTP) void setup () {EEPROM.begin (200); cWiFi (); setupFastLED (); loadConfig (); gPal =CRGBPalette16 (CRGB (csRGB [0] [0], csRGB [0] [1], csRGB [0] [2]), CRGB (csRGB [1] [0], csRGB [1] [1], csRGB) [1] [2]), CRGB (csRGB [2] [0], csRGB [2] [1], csRGB [2] [2]]), CRGB (csRGB [3] [0], csRGB [3] [ 1], csRGB [3] [2]));} inline void setupFastLED () {delay (1000); // задержка работоспособности FastLED.addLeds  (светодиоды, NUM_STRIPS * NUM_LEDS) .setCorrection (TypicalLEDStrip); FastLED.setBrightness (ЯРКОСТЬ);} void loop () {server.handleClient (); // Обработка входящих запросов if (change) {if (millis () - changeMillis> 60000) {change =false; saveToEEPROM (); } } Пожар(); FastLED.show (); FastLED.delay (1000 / FPS);} void Fire2012WithPalette (int stripNo) {статический байт тепла [NUM_STRIPS] [NUM_LEDS]; // Шаг 1. Немного охладим каждую ячейку в течение (int i =0; i  =2; k--) {heat [stripNo] [k] =(heat [stripNo] [k - 1] + тепло [номер полосы] [k - 2] + тепло [номер полосы] [k - 2]) / 3; } // Шаг 3. Случайным образом зажигать новые «искры» тепла около дна if (random8 ()  =period * 1000) {// сохраняем время последнего мигания светодиода previousMillis =currentMillis; вернуть истину; } else {вернуть ложь; }} void EEPROMupdate (адрес байта, значение байта) {if (EEPROM.read (адрес)! =значение) {EEPROM.write (адрес, значение); EEPROM.commit (); } return;} void saveToEEPROM () {EEPROMupdate (BriAdr, ЯРКОСТЬ); EEPROMupdate (FpsAdr, FPS); EEPROMupdate (SparkingAdr, SPARKING); EEPROMupdate (CoolingAdr, COOLING); for (uint8_t i =0; i <4; i ++) {for (uint8_t j =0; j <3; j ++) {EEPROMupdate ((i * 3 + j), csRGB [i] [j]); }}} void handleCS0Change () {csRGB [0] [0] =str2int (server.arg ("R")); csRGB [0] [1] =str2int (server.arg ("G")); csRGB [0] [2] =str2int (server.arg ("B")); gPal =CRGBPalette16 (CRGB (csRGB [0] [0], csRGB [0] [1], csRGB [0] [2]), CRGB (csRGB [1] [0], csRGB [1] [1], csRGB) [1] [2]), CRGB (csRGB [2] [0], csRGB [2] [1], csRGB [2] [2]]), CRGB (csRGB [3] [0], csRGB [3] [ 1], csRGB [3] [2])); changeMillis =millis (); change =true;} void handleCS1Change () {csRGB [1] [0] =str2int (server.arg ("R")); csRGB [1] [1] =str2int (server.arg ("G")); csRGB [1] [2] =str2int (server.arg ("B")); gPal =CRGBPalette16 (CRGB (csRGB [0] [0], csRGB [0] [1], csRGB [0] [2]), CRGB (csRGB [1] [0], csRGB [1] [1], csRGB) [1] [2]), CRGB (csRGB [2] [0], csRGB [2] [1], csRGB [2] [2]]), CRGB (csRGB [3] [0], csRGB [3] [ 1], csRGB [3] [2])); changeMillis =millis (); change =true;} void handleCS2Change () {csRGB [2] [0] =str2int (server.arg ("R")); csRGB [2] [1] =str2int (server.arg ("G")); csRGB [2] [2] =str2int (server.arg ("B")); gPal =CRGBPalette16 (CRGB (csRGB [0] [0], csRGB [0] [1], csRGB [0] [2]), CRGB (csRGB [1] [0], csRGB [1] [1], csRGB) [1] [2]), CRGB (csRGB [2] [0], csRGB [2] [1], csRGB [2] [2]]), CRGB (csRGB [3] [0], csRGB [3] [ 1], csRGB [3] [2])); changeMillis =millis (); change =true;} void handleCS3Change () {csRGB [3] [0] =str2int (server.arg ("R")); csRGB [3] [1] =str2int (server.arg ("G")); csRGB [3] [2] =str2int (server.arg ("B")); gPal =CRGBPalette16 (CRGB (csRGB [0] [0], csRGB [0] [1], csRGB [0] [2]), CRGB (csRGB [1] [0], csRGB [1] [1], csRGB) [1] [2]), CRGB (csRGB [2] [0], csRGB [2] [1], csRGB [2] [2]]), CRGB (csRGB [3] [0], csRGB [3] [ 1], csRGB [3] [2])); changeMillis =millis (); change =true;} void handleConf () {if (server.arg ("яркость")! ="") {ЯРКОСТЬ =str2int (server.arg ("яркость")); FastLED.setBrightness (ЯРКОСТЬ); changeMillis =millis (); изменить =истина; } если (server.arg ("fps")! ="") {FPS =str2int (server.arg ("fps")); changeMillis =millis (); изменить =истина; } if (server.arg ("искрение")! ="") {SPARKING =str2int (server.arg ("искрение")); changeMillis =millis (); изменить =истина; } if (server.arg ("охлаждение")! ="") {COOLING =str2int (server.arg ("охлаждение")); changeMillis =millis (); изменить =истина; } server.sendHeader ("Соединение", "закрыть"); server.sendHeader ("Контроль доступа-Разрешить-Происхождение", "*"); server.send (200, "текст / обычный", ""); // Возвращает HTTP-ответ} void loadConfig () {if (EEPROM.read (EEPROMCheckAdr) ==250) {BRIGHTNESS =EEPROM.read (BriAdr); SPARKING =EEPROM.read (SparkingAdr); ОХЛАЖДЕНИЕ =EEPROM.read (CoolingAdr); FPS =EEPROM.read (FpsAdr); если (FPS ==0) FPS =100; for (uint8_t i =0; i <4; i ++) {for (uint8_t j =0; j <3; j ++) {csRGB [i] [j] =EEPROM.read (i * 3 + j); }}} else {EEPROMupdate (BriAdr, ЯРКОСТЬ); EEPROMupdate (FpsAdr, FPS); EEPROMupdate (CoolingAdr, COOLING); EEPROMupdate (SparkingAdr, SPARKING); for (uint8_t i =0; i <4; i ++) {for (uint8_t j =0; j <3; j ++) {EEPROMupdate ((i * 3 + j), csRGB [i] [j]); }} Обновление EEPROM (EEPROMCheckAdr, 250); }} void cWiFi () {WiFi.softAP ("Пламя ElectroPeak", ""); // задайте здесь пароль, если хотите, например, WiFi.softAP ("ElectroPeak's Flame", "12345678"); IP-адрес myIP =WiFi.softAPIP (); server.on ("/ cs0", handleCS0Change); server.on ("/ cs1", handleCS1Change); server.on ("/ cs2", handleCS2Change); server.on ("/ cs3", handleCS3Change); server.on ("/ conf", handleConf); server.serveStatic («/», SPIFFS, «/», «max-age =86400»); server.begin (); // Запускаем сервер}  

Чтобы контролировать «внешний вид» огня, есть две переменные, с которыми можно поиграть:ИГРЕНИЕ и ОХЛАЖДЕНИЕ, которыми вы можете динамически управлять в программном обеспечении контроллера, загруженном в SPIFFS, или в приложении для Android, которое вы можете загрузить. Вы также можете контролировать FPS здесь.

Цвет огня регулируется с помощью цветовой палитры, которую также можно изменить с помощью программного обеспечения контроллера (с помощью 4-х ступеней цвета). Просто щелкните / коснитесь каждого цветового круга, представляющего собой цветовую границу, чтобы установить цвет, после установки цвета нажмите близко, чтобы закрыть диалоговое окно и увидеть изменение.

Как загрузить в SPIFFS?

Чтобы загрузить файлы в память SPIFFS с помощью Arduino IDE, сначала вам нужно создать папку с именем «data» внутри папки скетча и поместить в нее все файлы, которые вы хотите загрузить. Загруженный сюда файл содержит эскиз и эту папку.

Затем вам понадобится плагин для загрузки файловой системы Arduino ESP8266 для Arduino. Следуйте инструкциям на его странице Github и установите плагин. После установки вы найдете ESP8266 Sketch Data Upload в разделе инструменты меню. Переведите ESP в режим программирования и щелкните по нему. Наберитесь терпения и позвольте файлам загрузиться, это может занять некоторое время. Примечание. Установите «скорость загрузки» на 921600, чтобы ускорить загрузку.

Как это работает?

Скетч, загруженный на плату ESP8266, создает на ней веб-сервер, который отвечает на запросы, отправленные из приложения. Приложение просто отправляет GET-запросы на сервер (ESP8266). Данные цвета для создания палитры отправляются в качестве аргументов в запросе на получение, то же самое верно и для других параметров, таких как параметры Sparking и Cooling.

Например, чтобы установить яркость, приложение отправляет следующий запрос

http://192.168.4.1/conf?brightness=224

в скетче есть обработчик этого запроса, который при получении этого запроса устанавливает яркость. Просмотрите код, чтобы узнать больше.

Приложение для Android

Приложение для Android создается с помощью Phonegap. Это технология, позволяющая создавать кроссплатформенные мобильные приложения с использованием веб-технологий (HTML, CSS, Javascript). Вы можете получить исходный код, посетив эту страницу

Вы можете прочитать это и другие замечательные руководства на Официальный сайт ElectroPeak

Код

  • Код эффекта огня
  • Папка "Эскиз и данные"
Код эффекта огня Arduino
 #include #include #include "FastLED.h" #include "EEPROM.h" #include "FS.h" // требуется для SPIFFS # define DATA_PIN 5 # define LED_TYPE WS2811 # define COLOR_ORDER GRB # define NUM_LEDS 30 # define NUM_STRIPS 6 # define CHIPSET WS2812B // адреса для сохранения данных в EEPROM для сохранения состояния имитации пожара #define CoolingAdr 18 # define EEPROMCheckAdr 20 // если это значение равно 250, мы предполагаем, что мы ранее сохранили в EEPROM и загружаем данные с этих светодиодов CRGB [NUM_STRIPS * NUM_LEDS]; String inData; uint8_t FPS =100; // FRAMES_PER_SECONDuint8_t SPARKING =150; uint8_t COOLING =90; uint8_t ЯРКОСТЬ =100; uint8_t csRGB [4] [3] ={{0, 0, 0}, {255, 0, 0}, {255, 127, 0}, {255, 255, 255}}; беззнаковое длинное previousMillis =0; bool change =false; // если true переходим к сохранению в EEprom. unsigned long changeMillis =0; // изменения будут сохранены через 1 минуту после того, как изменения не будут применены, чтобы избежать износа EEPROM. bool initSetup =true; CRGBPalette16 gPal; ESP8266WebServer server (80); // Объект веб-сервера. Будет прослушивать порт 80 (по умолчанию для HTTP) void setup () {EEPROM.begin (200); cWiFi (); setupFastLED (); loadConfig (); gPal =CRGBPalette16 (CRGB (csRGB [0] [0], csRGB [0] [1], csRGB [0] [2]), CRGB (csRGB [1] [0], csRGB [1] [1], csRGB) [1] [2]), CRGB (csRGB [2] [0], csRGB [2] [1], csRGB [2] [2]]), CRGB (csRGB [3] [0], csRGB [3] [ 1], csRGB [3] [2])); } inline void setupFastLED () {задержка (1000); // задержка работоспособности FastLED.addLeds  (светодиоды, NUM_STRIPS * NUM_LEDS) .setCorrection (TypicalLEDStrip); FastLED.setBrightness (ЯРКОСТЬ);} void loop () {server.handleClient (); // Обработка входящих запросов if (change) {if (millis () - changeMillis> 60000) {change =false; saveToEEPROM (); } } Пожар(); FastLED.show (); FastLED.delay (1000 / FPS);} void Fire2012WithPalette (int stripNo) {статический байт тепла [NUM_STRIPS] [NUM_LEDS]; // Шаг 1. Немного охладим каждую ячейку в течение (int i =0; i  =2; k--) {heat [stripNo] [k] =(heat [stripNo] [k - 1] + тепло [номер полосы] [k - 2] + тепло [номер полосы] [k - 2]) / 3; } // Шаг 3. Случайным образом зажигать новые «искры» тепла около дна if (random8 ()  =period * 1000) {// сохраняем время последнего мигания светодиода previousMillis =currentMillis; вернуть истину; } else {вернуть ложь; }} void EEPROMupdate (адрес байта, значение байта) {if (EEPROM.read (адрес)! =значение) {EEPROM.write (адрес, значение); EEPROM.commit (); } return;} void saveToEEPROM () {EEPROMupdate (BriAdr, ЯРКОСТЬ); EEPROMupdate (FpsAdr, FPS); EEPROMupdate (SparkingAdr, SPARKING); EEPROMupdate (CoolingAdr, COOLING); for (uint8_t i =0; i <4; i ++) {for (uint8_t j =0; j <3; j ++) {EEPROMupdate ((i * 3 + j), csRGB [i] [j]); }}} void handleCS0Change () {csRGB [0] [0] =str2int (server.arg ("R")); csRGB [0] [1] =str2int (server.arg ("G")); csRGB [0] [2] =str2int (server.arg ("B")); gPal =CRGBPalette16 (CRGB (csRGB [0] [0], csRGB [0] [1], csRGB [0] [2]), CRGB (csRGB [1] [0], csRGB [1] [1], csRGB) [1] [2]), CRGB (csRGB [2] [0], csRGB [2] [1], csRGB [2] [2]]), CRGB (csRGB [3] [0], csRGB [3] [ 1], csRGB [3] [2])); changeMillis =millis (); change =true;} void handleCS1Change () {csRGB [1] [0] =str2int (server.arg ("R")); csRGB [1] [1] =str2int (server.arg ("G")); csRGB [1] [2] =str2int (server.arg ("B")); gPal =CRGBPalette16 (CRGB (csRGB [0] [0], csRGB [0] [1], csRGB [0] [2]), CRGB (csRGB [1] [0], csRGB [1] [1], csRGB) [1] [2]), CRGB (csRGB [2] [0], csRGB [2] [1], csRGB [2] [2]]), CRGB (csRGB [3] [0], csRGB [3] [ 1], csRGB [3] [2])); changeMillis =millis (); change =true;} void handleCS2Change () {csRGB [2] [0] =str2int (server.arg ("R")); csRGB [2] [1] =str2int (server.arg ("G")); csRGB [2] [2] =str2int (server.arg ("B")); gPal =CRGBPalette16 (CRGB (csRGB [0] [0], csRGB [0] [1], csRGB [0] [2]), CRGB (csRGB [1] [0], csRGB [1] [1], csRGB) [1] [2]), CRGB (csRGB [2] [0], csRGB [2] [1], csRGB [2] [2]]), CRGB (csRGB [3] [0], csRGB [3] [ 1], csRGB [3] [2])); changeMillis =millis (); change =true;} void handleCS3Change () {csRGB [3] [0] =str2int (server.arg ("R")); csRGB [3] [1] =str2int (server.arg ("G")); csRGB [3] [2] =str2int (server.arg ("B")); gPal =CRGBPalette16 (CRGB (csRGB [0] [0], csRGB [0] [1], csRGB [0] [2]), CRGB (csRGB [1] [0], csRGB [1] [1], csRGB) [1] [2]), CRGB (csRGB [2] [0], csRGB [2] [1], csRGB [2] [2]]), CRGB (csRGB [3] [0], csRGB [3] [ 1], csRGB [3] [2])); changeMillis =millis (); change =true;} void handleConf () {if (server.arg ("яркость")! ="") {ЯРКОСТЬ =str2int (server.arg ("яркость")); FastLED.setBrightness (ЯРКОСТЬ); changeMillis =millis (); изменить =истина; } если (server.arg ("fps")! ="") {FPS =str2int (server.arg ("fps")); changeMillis =millis (); изменить =истина; } if (server.arg ("искрение")! ="") {SPARKING =str2int (server.arg ("искрение")); changeMillis =millis (); изменить =истина; } if (server.arg ("охлаждение")! ="") {COOLING =str2int (server.arg ("охлаждение")); changeMillis =millis (); изменить =истина; } server.sendHeader ("Соединение", "закрыть"); server.sendHeader ("Контроль доступа-Разрешить-Происхождение", "*"); server.send (200, "текст / обычный", ""); // Возвращает HTTP-ответ} void loadConfig () {if (EEPROM.read (EEPROMCheckAdr) ==250) {BRIGHTNESS =EEPROM.read (BriAdr); SPARKING =EEPROM.read (SparkingAdr); ОХЛАЖДЕНИЕ =EEPROM.read (CoolingAdr); FPS =EEPROM.read (FpsAdr); если (FPS ==0) FPS =100; for (uint8_t i =0; i <4; i ++) {for (uint8_t j =0; j <3; j ++) {csRGB [i] [j] =EEPROM.read (i * 3 + j); }}} else {EEPROMupdate (BriAdr, ЯРКОСТЬ); EEPROMupdate (FpsAdr, FPS); EEPROMupdate (CoolingAdr, COOLING); EEPROMupdate (SparkingAdr, SPARKING); for (uint8_t i =0; i <4; i ++) {for (uint8_t j =0; j <3; j ++) {EEPROMupdate ((i * 3 + j), csRGB [i] [j]); }} Обновление EEPROM (EEPROMCheckAdr, 250); }} void cWiFi () {WiFi.softAP ("Пламя ElectroPeak", ""); // задайте здесь пароль, если хотите, например, WiFi.softAP ("ElectroPeak's Flame", "12345678"); IP-адрес myIP =WiFi.softAPIP (); server.on ("/ cs0", handleCS0Change); server.on ("/ cs1", handleCS1Change); server.on ("/ cs2", handleCS2Change); server.on ("/ cs3", handleCS3Change); server.on ("/ conf", handleConf); server.serveStatic («/», SPIFFS, «/», «max-age =86400»); server.begin (); // Запускаем сервер} 
Папка Sketch and Data Arduino
Этот zip-файл содержит как файл эскиза, так и папку данных (загрузка SPIFFS)
 Без предварительного просмотра (только загрузка). 

Изготовленные на заказ детали и корпуса

eps_flame_android_u5Zy5Bksvp.apk

Производственный процесс

  1. Борьба с лесными пожарами с помощью Интернета вещей
  2. Создайте пожарный извещатель за считанные минуты с помощью Samsung SAMIIO, Arduino UNO и Raspberry Pi
  3. Простой детектор детского плача своими руками с Raspberry Pi
  4. Ущерб от огня и предотвращение
  5. Тушение пожара с помощью Интернета вещей
  6. Дизайн корпоративного приложения:работает ли iOS с Android с точки зрения безопасности?
  7. Функция Python String strip() с ПРИМЕРОМ
  8. Axiom Equipment Group, вместе с другими спонсорами, пожертвуйте более 11 000 долларов США отделу пожарной охраны Оксбоу
  9. Создание счетчика посетителей, управляемого приложением для Android
  10. Емкостной датчик отпечатков пальцев с Arduino или ESP8266