산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Fire with Wi-Fi(ESP8266, NeoPixels 및 Android 앱)

구성품 및 소모품

ElectroPeak ESP8266 직렬 WIFI Witty 클라우드 보드
× 1
네오픽셀 스마트 LED 스트립(60LED/m 스트립)
× 3
ElectroPeak 논리 레벨 변환기
× 1
ElectroPeak 21cm 40P 남성 대 여성 점퍼 와이어
× 1
PVC 파이프 60cm 크기 2"
× 1
트레이싱 페이퍼
× 1
유리 실린더
× 1
5V 전원 공급 장치(최소 9A)
× 1
Arduino Nano R3
× 1

필요한 도구 및 기계

뜨거운 글루건(일반)
납땜 인두(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

이 튜토리얼과 다른 놀라운 튜토리얼은 에서 읽을 수 있습니다. ElectroPeak의 공식 웹사이트

Wi-Fi 무선 제어로 멋진 화재 시뮬레이션 효과를 만드십시오. 멋진 인터페이스를 갖춘 모바일 앱(Android 스마트폰용)을 설치하여 창작물과 함께 플레이할 준비가 되었습니다! 또한 Arduino와 ESP8266을 사용하여 화염을 제어합니다. 이 프로젝트가 끝나면 다음을 배우게 됩니다.

<울>
  • NeoPixels 작동 방식
  • Wi-Fi를 통해 ESP8266을 프로그래밍하고 변수를 제어하는 ​​방법
  • NeoPixels로 멋진 불 효과를 만드는 방법
  • NeoPixels 소개

    개별적으로 주소를 지정할 수 있는 LED 또는 종종 NeoPixels라고 하는 것은 꽤 오랜 시간 동안 사용되어 왔으며 아마도 알고 있을 것입니다. , 무한히 멋진 패턴과 애니메이션을 만들 수 있습니다. WS2812b의 경우 3개의 와이어만 필요합니다. 2개는 전원용, 1개는 데이터용입니다. 즉, 수많은 LED를 제어하려면 하나의 무료 Arduino 핀만 있으면 됩니다!

    이 프로젝트에서는 이러한 스마트 LED를 사용하여 화재 효과를 만들 것입니다. LED 제어를 위해 우리는 멋진 FastLED 라이브러리를 사용할 것입니다. Mark Kriegsman이 작성한 라이브러리의 Fire2012 스케치 예제를 사용합니다. 우리는 각각 30개의 LED(총 180개의 LED)가 있는 6개의 LED 스트립을 사용합니다. 이 LED를 PVC 파이프 조각에 붙이고 유리 실린더에 넣습니다(이 유리 실린더는 일반적으로 꽃병으로 사용됨). LED의 빛을 확산시켜 연속적으로 보이도록 해야 합니다. 그렇게 하려면 빛을 통과시키고 확산시키는 트레이싱 페이퍼를 사용했습니다.

    건설

    먼저 적절한 유리 실린더를 얻으십시오. 실린더의 길이는 60cm, 지름은 12cm입니다.

    좋은 젖빛 유리 실린더를 찾을 수 있지만 투명 유리인 경우 트레이싱 페이퍼를 사용하여 실린더 표면(내부 또는 외부 표면)을 덮을 수 있습니다. 트레이싱 페이퍼는 빛을 잘 분산시키고 좋은 결과를 산출합니다.

    유리 실린더를 얻은 후 내부 길이를 측정한 다음 실린더 내부에 맞도록 PVC 파이프를 자릅니다. 유리 실린더의 높이가 60cm(베이스 제외, 내부 길이 59cm)이므로 PVC 파이프를 59cm로 자릅니다. 이 파이프에 LED 스트립을 붙이면 직경 4cm의 파이프가 완벽할 것입니다.

    다음으로 우리는 led 스트립을 6개의 동일한 부분으로 잘라야 합니다. 여기서 60LED/m 밀도 스트립을 사용합니다(원하는 경우 더 나은 효과를 위해 더 높은 밀도를 사용할 수 있음). 6개의 50cm 길이를 사용합니다. 즉, 3미터가 필요합니다. PVC 파이프 주위에 6개의 길이를 균등하게 두고 스트립을 파이프에 붙입니다. 다음과 같이 표시됩니다.

    함께 LED 스트립에 다음 그림에 따라 스트립에 와이어를 직접 납땜하거나 먼저 스트립에 핀 헤더를 납땜한 다음 브레드보드 와이어를 사용하여 연결할 수 있습니다.

    모든 LED 스트립 연결이 완료되면 파이프를 실린더 내부에 배치해야 합니다. 실린더 내부의 파이프를 중앙에 배치하기 위해 폼을 사용하여 유리 실린더의 내부 직경과 동일한 외부 직경 및 PVC 파이프의 외부 직경과 동일한 내부 직경을 갖는 원을 절단할 수 있습니다. 파이프의 각 측면에 대해 2개를 준비합니다. 이 부품을 끝에 부착하고 파이프를 실린더 내부에 부드럽게 넣습니다.

    코드

    ESP8266에 코딩 및 업로드를 위해 Arduino IDE를 사용합니다. SPIFFS에 컨트롤러 소프트웨어 파일을 업로드하려면 3MB SPIFFS가 포함된 ESP8266이 있는 보드를 사용해야 합니다. SPIFFS는 "Serial Peripheral Interface Flash File System"의 약자입니다. 컨트롤러 파일을 이 메모리에 업로드하여 해당 위치에서 파일을 제공할 수 있습니다. 이렇게 하면 휴대전화나 노트북에서 브라우저를 열고 ESP 주소(기본값은 192.168.4.1)로 이동하면 앱을 설치할 필요 없이 브라우저에서 컨트롤러 인터페이스를 얻을 수 있습니다. iPhone 또는 iPad가 있는 경우 이것이 유일한 선택입니다.

    ESP 보드에 다음 스케치를 업로드합니다. FastLED 라이브러리가 필요하므로 아직 추가하지 않았다면 먼저 Arduino IDE에 추가하십시오(여기에서 다운로드할 수 있음). 화재 시뮬레이션 코드는 예제에서 찾을 수 있는 Mark Kriegsman의 fire2012 스케치입니다. 그 예는 하나의 led 스트립에 대한 것이지만 여기에서는 다양한 수의 스트립을 사용하도록 코드를 수정했습니다. 스트립/LED의 수가 많을수록 효과가 커집니다.

    화재 시뮬레이션의 논리는 예제 파일에 명확하게 설명되어 있습니다. 어떻게 작동하는지 알고 싶다면 예제의 소스 코드를 읽어보세요.

    #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 cs1Adr23# 9#define BriAdr 15#define FpsAdr 16#define SparkingAdr 17#define CoolingAdr 18#define EEPROMCheckAdr 20 //이 값이 250이면 이전에 EEPROM에 저장하고 해당CRGB leds에서 데이터를 로드했다고 가정합니다.[NUM_STRIPS * NUM_LEDS];String in Data;uint8_t FPS =100; //FRAMES_PER_SECONDuint8_t 스파크 =150;uint8_t 냉각 =90; uint8_t 밝기 =100;uint8_t csRGB[4][3] ={{0, 0, 0}, {255, 0, 0}, {255, 127, 0}, {255, 255, 255}}; unsigned long 이전Millis =0; 부울 변경 =거짓; // true이면 EEprom.unsigned에 저장합니다. long changeMillis =0; // EEPROM을 피하기 위해 변경 사항이 적용되지 않은 후 1분 후에 변경 사항이 저장됩니다. wear.bool initSetup =true;CRGBPalette16 gPal;ESP8266WebServer server(80); //웹 서버 객체. 포트 80에서 수신 대기합니다(HTTP의 경우 기본값)void setup(){ EEPROM.begin(200); c와이파이(); setupFastLED(); 로드 구성(); 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]));}인라인 무효 setupFastLED(){지연(1000); // 온전한 지연 FastLED.addLeds(leds, NUM_STRIPS * NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.setBrightness(밝기);} 무효 루프(){ 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단계. 모든 셀을 약간 식힙니다. for( int i =0; i =2; k--) { heat[stripNo][k] =(heat[stripNo] [k - 1] + 열[stripNo][k - 2] + 열[stripNo][k - 2] ) / 3; } // 3단계. 바닥 근처에서 새로운 '불꽃'을 무작위로 점화합니다. if( random8() =period * 1000) { // 마지막으로 LED를 깜박인 시간을 저장합니다. previousMillis =currentMillis; true를 반환합니다. } else { false를 반환합니다. }}무효 EEPROMupdate(바이트 주소, 바이트 값){ if (EEPROM.read(주소) !=값) { EEPROM.write(주소, 값); EEPROM.commit(); } 반환;} 무효 saveToEEPROM(){ EEPROMupdate(BriAdr, BRIGHTNESS); EEPROM 업데이트(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]); } }} 무효 핸들CS0Change(){ csRGB[0][0] =str2int(server.arg("R")); csRGB[0][1] =str2int(서버.arg("G")); csRGB[0][2] =str2int(서버.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 =밀리(); 변경 =true;} 무효 핸들CS1Change(){ csRGB[1][0] =str2int(server.arg("R")); csRGB[1][1] =str2int(서버.arg("G")); csRGB[1][2] =str2int(서버.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 =밀리(); 변경 =true;} 무효 핸들CS2Change(){ csRGB[2][0] =str2int(server.arg("R")); csRGB[2][1] =str2int(서버.arg("G")); csRGB[2][2] =str2int(서버.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 =밀리(); 변경 =true;} 무효 핸들CS3Change(){ csRGB[3][0] =str2int(server.arg("R")); csRGB[3][1] =str2int(서버.arg("G")); csRGB[3][2] =str2int(서버.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 =밀리(); 변경 =true;} 무효 handleConf(){ if (server.arg("밝기") !="") { 밝기 =str2int(server.arg("밝기")); FastLED.setBrightness(밝기); changeMillis =밀리(); 변경 =사실; } if (server.arg("fps") !="") { FPS =str2int(server.arg("fps")); changeMillis =밀리(); 변경 =사실; } if (server.arg("sparking") !="") { SPARKING =str2int(server.arg("sparking")); changeMillis =밀리(); 변경 =사실; } if (server.arg("냉각") !="") { 냉각 =str2int(server.arg("냉각")); changeMillis =밀리(); 변경 =사실; } server.sendHeader("연결", "닫기"); server.sendHeader("접근 제어 허용 원본", "*"); server.send(200, "텍스트/일반", ""); //HTTP 응답 반환}void loadConfig(){ if (EEPROM.read(EEPROMCheckAdr) ==250) { BRIGHTNESS =EEPROM.read(BriAdr); 스파크 =EEPROM.read(SparkingAdr); 냉각 =EEPROM.read(CoolingAdr); FPS =EEPROM.read(FpsAdr); if (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,밝기); EEPROM 업데이트(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, "/", "최대 연령=86400"); server.begin(); //서버 시작} 

    화재의 "모양과 느낌"을 제어하기 위해 두 가지 변수를 사용할 수 있습니다. SPARKING 및 COOLING, SPIFFS에 업로드된 컨트롤러 소프트웨어 또는 다운로드할 수 있는 Android 앱에서 동적으로 제어할 수 있습니다. 여기에서 FPS를 제어할 수도 있습니다.

    불의 색상은 컨트롤러 소프트웨어를 통해 변경할 수 있는 색상 팔레트로 제어됩니다(4가지 색상 정지를 통해). 색상을 설정하려면 색상 정지점을 나타내는 각 색상 원을 클릭/탭하기만 하면 됩니다. 색상을 설정한 후 닫기를 눌러 대화 상자를 닫고 변경 사항을 확인하십시오.

    SPIFFS에 업로드하는 방법

    Arduino IDE를 사용하여 파일을 SPIFFS 메모리에 업로드하려면 먼저 스케치 폴더 안에 "data"라는 폴더를 만들고 업로드하려는 모든 파일을 해당 폴더에 넣어야 합니다. 여기에 업로드된 파일에는 스케치와 이 폴더가 모두 포함되어 있습니다.

    다음으로 Arduino용 Arduino ESP8266 파일 시스템 업로더 플러그인이 필요합니다. Github 페이지의 지침에 따라 플러그인을 설치합니다. 설치하면 ESP8266 Sketch Data Upload가 표시됩니다. 도구 아래 메뉴. ESP를 프로그래밍 모드로 전환하고 클릭합니다. 인내심을 갖고 파일이 업로드되도록 하십시오. 시간이 조금 걸릴 수 있습니다. 참고:"업로드 속도"를 921600으로 설정하면 더 빨라집니다.

    어떻게 작동합니까?

    ESP8266 보드에 업로드된 스케치는 그 위에 웹 서버를 만들고 앱에서 보낸 요청에 응답합니다. 앱은 단순히 GET 요청을 서버(ESP8266)로 보냅니다. 팔레트를 생성하기 위한 색상 데이터는 get 요청의 인수로 전송되며 Sparking 및 Cooling 매개변수와 같은 다른 매개변수도 마찬가지입니다.

    예를 들어 밝기를 설정하려면 앱에서 다음 요청을 보냅니다.

    http://192.168.4.1/conf?brightness=224

    이 요청을 받으면 밝기를 설정하는 이 요청에 대한 처리기가 스케치에 있습니다. 코드를 검토하여 자세히 알아보세요.

    안드로이드 앱

    Android 앱은 Phonegap을 사용하여 만듭니다. 웹 기술(HTML, CSS, Javascript)을 사용하여 크로스 플랫폼 모바일 앱을 만들 수 있는 기술입니다. 이 페이지를 방문하여 소스 코드를 얻을 수 있습니다.

    이 튜토리얼과 다른 놀라운 튜토리얼은 에서 읽을 수 있습니다. ElectroPeak의 공식 웹사이트

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 화염 효과 코드
  • 스케치 및 데이터 폴더
  • 화재 효과 코드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# NUM_STRIPS 6#define CHIPSET WS2812B//주소를 정의하여 화재 시뮬레이션의 상태를 보존하기 위해 EEPROM에 데이터를 저장합니다. #define CoolingAdr 18#define EEPROMCheckAdr 20 //이 값이 250이면 이전에 EEPROM에 저장하고 해당CRGB에서 데이터를 로드했다고 가정합니다. leds[NUM_STRIPS * NUM_LEDS];String inData;uint8_t FPS =100; //FRAMES_PER_SECONDuint8_t 스파크 =150;uint8_t 냉각 =90; uint8_t 밝기 =100;uint8_t csRGB[4][3] ={{0, 0, 0}, {255, 0, 0}, {255, 127, 0}, {255, 255, 255}}; unsigned long 이전Millis =0; 부울 변경 =거짓; // true이면 EEprom.unsigned에 저장합니다. long changeMillis =0; // EEPROM을 피하기 위해 변경 사항이 적용되지 않은 후 1분 후에 변경 사항이 저장됩니다. wear.bool initSetup =true;CRGBPalette16 gPal;ESP8266WebServer server(80); //웹 서버 객체. 포트 80에서 수신 대기합니다(HTTP의 경우 기본값)void setup(){ EEPROM.begin(200); c와이파이(); setupFastLED(); 로드 구성(); 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])); }인라인 무효 setupFastLED(){ 지연(1000); // 온전한 지연 FastLED.addLeds(leds, NUM_STRIPS * NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.setBrightness(밝기);} 무효 루프(){ 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단계. 모든 셀을 약간 식힙니다. for( int i =0; i =2; k--) { heat[stripNo][k] =(heat[stripNo] [k - 1] + 열[stripNo][k - 2] + 열[stripNo][k - 2] ) / 3; } // 3단계. 바닥 근처에서 새로운 '불꽃'을 무작위로 점화합니다. if( random8() =period * 1000) { // 마지막으로 LED를 깜박인 시간을 저장합니다. previousMillis =currentMillis; true를 반환합니다. } else { false를 반환합니다. }}무효 EEPROMupdate(바이트 주소, 바이트 값){ if (EEPROM.read(주소) !=값) { EEPROM.write(주소, 값); EEPROM.commit(); } 반환;} 무효 saveToEEPROM(){ EEPROMupdate(BriAdr, BRIGHTNESS); EEPROM 업데이트(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]); } }} 무효 핸들CS0Change(){ csRGB[0][0] =str2int(server.arg("R")); csRGB[0][1] =str2int(서버.arg("G")); csRGB[0][2] =str2int(서버.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 =밀리(); 변경 =true;} 무효 핸들CS1Change(){ csRGB[1][0] =str2int(server.arg("R")); csRGB[1][1] =str2int(서버.arg("G")); csRGB[1][2] =str2int(서버.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 =밀리(); 변경 =true;} 무효 핸들CS2Change(){ csRGB[2][0] =str2int(server.arg("R")); csRGB[2][1] =str2int(서버.arg("G")); csRGB[2][2] =str2int(서버.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 =밀리(); 변경 =true;} 무효 핸들CS3Change(){ csRGB[3][0] =str2int(server.arg("R")); csRGB[3][1] =str2int(서버.arg("G")); csRGB[3][2] =str2int(서버.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 =밀리(); 변경 =true;} 무효 handleConf(){ if (server.arg("밝기") !="") { 밝기 =str2int(server.arg("밝기")); FastLED.setBrightness(밝기); changeMillis =밀리(); 변경 =사실; } if (server.arg("fps") !="") { FPS =str2int(server.arg("fps")); changeMillis =밀리(); 변경 =사실; } if (server.arg("sparking") !="") { SPARKING =str2int(server.arg("sparking")); changeMillis =밀리(); 변경 =사실; } if (server.arg("냉각") !="") { 냉각 =str2int(server.arg("냉각")); changeMillis =밀리(); 변경 =사실; } server.sendHeader("연결", "닫기"); server.sendHeader("접근 제어 허용 원본", "*"); server.send(200, "텍스트/일반", ""); //HTTP 응답 반환}void loadConfig(){ if (EEPROM.read(EEPROMCheckAdr) ==250) { BRIGHTNESS =EEPROM.read(BriAdr); 스파크 =EEPROM.read(SparkingAdr); 냉각 =EEPROM.read(CoolingAdr); FPS =EEPROM.read(FpsAdr); if (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,밝기); EEPROM 업데이트(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, "/", "최대 연령=86400"); server.begin(); //서버 시작}
    스케치 및 데이터 폴더Arduino
    이 zip 파일에는 스케치 파일과 데이터 폴더(SPIFFS 업로드)가 모두 포함되어 있습니다.
    미리보기 없음(다운로드만 가능).

    맞춤형 부품 및 인클로저

    eps_flame_android_u5Zy5Bksvp.apk

    제조공정

    1. IoT로 산불 진압
    2. Samsung SAMIIO, Arduino UNO 및 Raspberry Pi로 몇 분 만에 화재 감지기 만들기
    3. 라즈베리 파이를 사용한 손쉬운 DIY 아기 울음 감지기
    4. 화재 피해 및 예방
    5. IoT를 사용한 소방
    6. 엔터프라이즈 앱 디자인:iOS는 보안 면에서 Android와 비슷한가요?
    7. EXAMPLE이 있는 Python String strip() 함수
    8. Axiom Equipment Group, 다른 후원자들과 함께 Oxbow 소방서에 11,000달러 이상 기부
    9. Android 앱으로 제어되는 인원 계수기 만들기
    10. Arduino 또는 ESP8266이 있는 정전 용량 지문 센서