工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Fire Over Wi-Fi(ESP8266、NeoPixels、Androidアプリ)で遊ぶ

コンポーネントと消耗品

ElectroPeakESP8266シリアルWIFIWittyクラウドボード
× 1
>
NeopixelsスマートLEDストリップ(60LED / mストリップ)
× 3
ElectroPeakロジックレベルコンバーター
× 1
ElectroPeak 21cm40Pオス-メスジャンパー線
× 1
PVCパイプ60cmサイズ2 "
× 1
トレーシングペーパー
× 1
ガラスシリンダー
× 1
5V電源(少なくとも9A)
× 1
Arduino Nano R3
× 1

必要なツールとマシン

>
ホットグルーガン(汎用)
はんだごて(汎用)

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

このチュートリアルやその他のすばらしいチュートリアルはで読むことができます。 ElectroPeakの公式ウェブサイト

Wi-Fiワイヤレス制御でクールファイアシミュレーション効果を作成します。見栄えの良いインターフェースを備えたモバイルアプリ(Androidスマートフォン用)をインストールして、作成したもので遊ぶ準備ができています!また、ArduinoとESP8266を使用して炎を制御します。このプロジェクトの最後に、次のことを学びます。

  • NeoPixelsの仕組み。
  • ESP8266をプログラムしてWi-Fi経由で変数を制御する方法
  • NeoPixelsでクールな火の効果を作成する方法

NeoPixelsの紹介

個別にアドレス指定可能なLEDまたはNeoPixelsと呼ばれることもあるLEDはかなり前から存在しており、おそらくご存知でしょうが、そうでない場合は、通常のRGB LEDに似ていますが、名前が示すように、それぞれの色を個別にアドレス指定できます。 、無限にクールなパターンやアニメーションを作成できます。 WS2812bの場合、必要なワイヤは3本、電源用に2本、データ用に1本です。つまり、大量のLEDを制御するために必要なのは1本の無料のArduinoピンだけです!

このプロジェクトでは、これらのスマートLEDを使用して火の効果を作成します。 LEDの制御には、すばらしいFastLEDライブラリを使用します。 MarkKriegsmanによって作成されたライブラリのFire2012スケッチ例を使用します。それぞれ30個のLED(合計180個のLED)を持つ6つのLEDストリップを使用し、このLEDをPVCパイプに貼り付けて、ガラスシリンダーに配置します(これらのガラスシリンダーは通常、花瓶として使用されます)。 LEDの光を拡散させて連続的に見えるようにする必要があります。そのためには、光を通し、光を拡散させるトレーシングペーパーを使用しました。

<図>

建設

まず、適切なガラスシリンダーを入手します。シリンダーの長さは60cm、直径は12cmです。

すりガラスのシリンダーがあればいいのですが、透明なガラスの場合はトレーシングペーパーを使ってシリンダーの表面(内面または外面)を覆うことができます。トレーシングペーパーは光をうまく拡散させ、良い結果をもたらします。

ガラスシリンダーを入手したら、その内部の長さを測定し、シリンダーの内側に収まるようにPVCパイプを切断します。ガラスシリンダーの高さは60cm(ベースを除いて内部の長さは59cm)なので、PVCパイプを59cmにカットしました。このパイプにLEDストリップを貼り付けます。直径4cmのパイプが最適です。

次に、LEDストリップを6つの等しい部分にカットする必要があります。ここでは、60LED / m密度のストリップを使用します(必要に応じて、より高い密度を使用して効果を高めることができます)。長さ50cmを6つ使用します。つまり、3メートル必要です。 PVCパイプの周りに6つの長さを均等に配置し、ストリップをパイプに貼り付けます。外観は次のとおりです。

<図> <図> <図>

<図>

<図>

LEDストリップを一緒にするには、次の図に従ってワイヤーをストリップに直接はんだ付けするか、最初にピンヘッダーをストリップにはんだ付けしてから、ブレッドボードワイヤーを使用してそれらを接続します。

<図>

すべてのLEDストリップ接続が完了したら、パイプをシリンダー内に配置する必要があります。パイプをシリンダーの内側に中央に配置するには、フォームを使用して、外径がガラスシリンダーの内径に等しく、内径がPVCパイプの外径に等しい円をカットします。パイプの両側にこれらを2つ用意します。これらの部品を両端に取り付け、パイプをシリンダーの中にそっと入れます。

コード

コーディングとESP8266へのアップロードにはArduinoIDEを使用しています。コントローラソフトウェアファイルをSPIFFSにアップロードする場合は、3MBのSPIFFSを備えたESP8266を搭載したボードを使用する必要があります。 SPIFFSは「シリアルペリフェラルインターフェイスフラッシュファイルシステム」の略で、コントローラファイルをこのメモリにアップロードして、その場所からファイルを提供できます。これを行うことで、ブラウザーを(電話またはノートブックで)開いてESPのアドレス(デフォルトは192.168.4.1)に移動でき、アプリをインストールしなくてもブラウザーでコントローラーインターフェイスを取得できます。 iPhoneまたはiPadをお持ちの場合、これが唯一の選択肢です。

次のスケッチをESPボードにアップロードします。 FastLEDライブラリが必要なので、まだ追加していない場合は、最初にArduino IDEに追加します(ここからダウンロードできます)。火災シミュレーションコードは、例にあるMarkKriegsmanのfire2012スケッチです。この例は、LEDの1つのストリップ用ですが、ここでは、可変数のストリップを使用するようにコードを変更しました。ストリップ/ 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 cs1Adr 3#define cs2Adr 6#define cs3Adr 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 inData; uint8_t FPS =100; // FRAMES_PER_SECONDuint8_t SPARKING =150; uint8_t COOLING =90; uint8_t BRIGHTNESS =100; uint8_t csRGB [4] [3] ={{0、0、0}、{255、0、0}、{255、127、0}、{255、255、255}}; unsigned long previousMillis =0; bool change =false; // trueの場合、EEprom.unsigned longchangeMillis =0に保存します。 // EEPROMの摩耗を避けるために、変更が適用されてから1分後に変更が保存されます。boolinitSetup=true; CRGBPalette16 gPal; ESP8266WebServer server(80); // Webサーバーオブジェクト。ポート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]));}インラインvoid setupFastLED(){delay(1000); //健全性遅延FastLED.addLeds (leds、NUM_STRIPS * NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.setBrightness(BRIGHTNESS);} void loop(){server.handleClient(); //着信リクエストの処理if(change){if(millis()-changeMillis> 60000){change =false; saveToEEPROM(); } } 火(); FastLED.show(); FastLED.delay(1000 / FPS);} void Fire2012WithPalette(int stripNo){static byte heat [NUM_STRIPS] [NUM_LEDS]; //ステップ1.すべてのセルを少し冷却しますfor(int i =0; i  =2; k-){heat [stripNo] [k] =(heat [stripNo] [k-1] + heat [stripNo] [k-2] + heat [stripNo] [k-2])/ 3; } //ステップ3.下部近くの熱の新しい「火花」をランダムに点火しますif(random8() =period * 1000){//最後にLEDを点滅させた時間を保存previousMillis =currentMillis; trueを返します。 } else {falseを返す; }} void EEPROMupdate(byte address、byte value){if(EEPROM.read(address)!=value){EEPROM.write(address、value); EEPROM.commit(); } return;} void saveToEEPROM(){EEPROMupdate(BriAdr、BRIGHTNESS); 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( "brightness")!=""){BRIGHTNESS =str2int(server.arg( "brightness")); FastLED.setBrightness(BRIGHTNESS); changeMillis =millis();変更=true; } if(server.arg( "fps")!=""){FPS =str2int(server.arg( "fps")); changeMillis =millis();変更=true; } if(server.arg( "sparking")!=""){SPARKING =str2int(server.arg( "sparking")); changeMillis =millis();変更=true; } if(server.arg( "cooling")!=""){COOLING =str2int(server.arg( "cooling")); changeMillis =millis();変更=true; } server.sendHeader( "Connection"、 "close"); server.sendHeader( "Access-Control-Allow-Origin"、 "*"); server.send(200、 "text / plain"、 ""); // HTTP応答を返します} void loadConfig(){if(EEPROM.read(EEPROMCheckAdr)==250){BRIGHTNESS =EEPROM.read(BriAdr); SPARKING =EEPROM.read(SparkingAdr); COOLING =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、BRIGHTNESS); 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]); }} EEPROMupdate(EEPROMCheckAdr、250); }} void cWiFi(){WiFi.softAP( "ElectroPeak's Flame"、 ""); //必要に応じて、ここにパスワードを設定します。つまり、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(); //サーバーを起動します}  

火の「ルックアンドフィール」を制御するには、SPARKINGとCOOLINGの2つの変数を使用します。これらは、SPIFFSにアップロードされたコントローラーソフトウェアまたはダウンロード可能なAndroidアプリで動的に制御できます。ここでFPSを制御することもできます。

<図>

火の色はカラーパレットで制御されます。カラーパレットは、コントローラーソフトウェアからも変更できます(4つのカラーストップを使用)。カラーストップを表す各カラーサークルをクリック/タップするだけで、カラーを設定できます。カラーヒットを設定した後、ダイアログを閉じて変更を確認します。

<図>

SPIFFSにアップロードする方法は?

Arduino IDEを使用してファイルをSPIFFSメモリにアップロードするには、最初にスケッチのフォルダ内に「data」というフォルダを作成し、アップロードするすべてのファイルをそのフォルダに配置する必要があります。ここにアップロードされたファイルには、スケッチとこのフォルダの両方が含まれています。

次に、Arduino用のArduinoESP8266ファイルシステムアップローダープラグインが必要です。 Githubページの指示に従って、プラグインをインストールします。インストールすると、 ESP8266スケッチデータのアップロードが見つかります ツールの下 メニュー。 ESPをプログラミングモードにして、それをクリックします。しばらくお待ちください。ファイルをアップロードしてください。少し時間がかかる場合があります。注:「アップロード速度」を921600に設定すると、高速になります。

<図>

どのように機能しますか?

ESP8266ボードにアップロードされたスケッチは、アプリから送信されたリクエストに応答するWebサーバーをその上に作成します。アプリは、GETリクエストをサーバー(ESP8266)に送信するだけです。パレットを作成するための色のデータは、getリクエストの引数として送信されます。これは、SparkingパラメータやCoolingパラメータなどの他のパラメータにも当てはまります。

たとえば、明るさを設定するには、アプリから次のリクエストが送信されます

http://192.168.4.1/conf?brightness=224

スケッチにはこのリクエストのハンドラーがあり、このリクエストを取得すると明るさが設定されます。詳細については、コードを確認してください。

Androidアプリ

AndroidアプリはPhonegapを使用して作成されます。これは、Webテクノロジ(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# 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 SPARKING =150; uint8_t COOLING =90; uint8_t BRIGHTNESS =100; uint8_t csRGB [4] [3] ={{0、0、0}、{255、0、0}、{255、127、0}、{255、255、255}}; unsigned long previousMillis =0; bool change =false; // trueの場合、EEprom.unsigned longchangeMillis =0に保存します。 // EEPROMの摩耗を避けるために、変更が適用されてから1分後に変更が保存されます。boolinitSetup=true; CRGBPalette16 gPal; ESP8266WebServer server(80); // Webサーバーオブジェクト。ポート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 (leds、NUM_STRIPS * NUM_LEDS).setCorrection(TypicalLEDStrip); FastLED.setBrightness(BRIGHTNESS);} void loop(){server.handleClient(); //着信リクエストの処理if(change){if(millis()-changeMillis> 60000){change =false; saveToEEPROM(); } } 火(); FastLED.show(); FastLED.delay(1000 / FPS);} void Fire2012WithPalette(int stripNo){static byte heat [NUM_STRIPS] [NUM_LEDS]; //ステップ1.すべてのセルを少し冷却しますfor(int i =0; i  =2; k-){heat [stripNo] [k] =(heat [stripNo] [k-1] + heat [stripNo] [k-2] + heat [stripNo] [k-2])/ 3; } //ステップ3.下部近くの熱の新しい「火花」をランダムに点火しますif(random8() =period * 1000){//最後にLEDを点滅させた時間を保存previousMillis =currentMillis; trueを返します。 } else {falseを返す; }} void EEPROMupdate(byte address、byte value){if(EEPROM.read(address)!=value){EEPROM.write(address、value); EEPROM.commit(); } return;} void saveToEEPROM(){EEPROMupdate(BriAdr、BRIGHTNESS); 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( "brightness")!=""){BRIGHTNESS =str2int(server.arg( "brightness")); FastLED.setBrightness(BRIGHTNESS); changeMillis =millis();変更=true; } if(server.arg( "fps")!=""){FPS =str2int(server.arg( "fps")); changeMillis =millis();変更=true; } if(server.arg( "sparking")!=""){SPARKING =str2int(server.arg( "sparking")); changeMillis =millis();変更=true; } if(server.arg( "cooling")!=""){COOLING =str2int(server.arg( "cooling")); changeMillis =millis();変更=true; } server.sendHeader( "Connection"、 "close"); server.sendHeader( "Access-Control-Allow-Origin"、 "*"); server.send(200、 "text / plain"、 ""); // HTTP応答を返します} void loadConfig(){if(EEPROM.read(EEPROMCheckAdr)==250){BRIGHTNESS =EEPROM.read(BriAdr); SPARKING =EEPROM.read(SparkingAdr); COOLING =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、BRIGHTNESS); 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]); }} EEPROMupdate(EEPROMCheckAdr、250); }} void cWiFi(){WiFi.softAP( "ElectroPeak's Flame"、 ""); //必要に応じて、ここにパスワードを設定します。つまり、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(); //サーバーを起動します} 
スケッチとデータフォルダ Arduino
このzipファイルには、スケッチファイルとデータフォルダの両方が含まれています(SPIFFSアップロード)
プレビューなし(ダウンロードのみ)。

カスタムパーツとエンクロージャー

eps_flame_android_u5Zy5Bksvp.apk

製造プロセス

  1. IoTで山火事と戦う
  2. Samsung SAMIIO、Arduino UNO、RaspberryPiで数分で火災探知機を作る
  3. RaspberryPiを使用した簡単なDIY赤ちゃん泣き検出器
  4. 火災による損傷と予防
  5. IoTによる消火
  6. エンタープライズアプリの設計:セキュリティの観点から、iOSはAndroidと相性がいいですか?
  7. 例を使用した Python 文字列 strip() 関数
  8. Axiom Equipment Groupは、他のスポンサーとともに、11,000ドル以上をOxbow消防署に寄付します
  9. Androidアプリで制御されるピープルカウンターを作成する
  10. ArduinoまたはESP8266を搭載した静電容量式指紋センサー
  11. ArduinoとAndroidデバイスでルンバロボットを制御する