製作モジュール一覧

ラベル ESP-WROOM-02 の投稿を表示しています。 すべての投稿を表示
ラベル ESP-WROOM-02 の投稿を表示しています。 すべての投稿を表示

2018年8月16日木曜日

ESP WROOM 02(ESP8266)でBME280とSSD1306 OLED(I2C)を使う。

ESP WROOM 02(ESP8266)で、気温、湿度、気圧センサーのBME280とSSD1306 OLEDを同時に使用しました。

SSD1306はI2C接続のものとSPI接続のものがありますが、ESP8266のSPIは使ったことがないので、とりあえずI2C接続のものを使用しました。

I2Cは信号線をプルアップして使うので、I2CとSPIで信号線を共有するのは難しそうです。ESP8266はIOで使えるピンが少ないので、SPIとI2Cを同時使用するにはちゃんと検証する必要がありそうです。

ESP8266のI2Cの使い方もよくわかっていないので、ライブラリ等ありものを使わせていただいてとりあえず動作させるのを優先しました。

ブレッドボード配線図


運用時(USB-UART変換モジュールなし)

I2Cの信号線はBME280モジュールでもSSD1306モジュールでもオンボードでプルアップされているので、理屈としてはそれぞれの抵抗を並列した値になります。
10kΩ // 4.7kΩ ≒ 3.2kΩ
Lの時に (3.3V / 3.2kΩ) ≒ 1mA 程度流れます。SCLとSDAがあるので無視できない消費量ですね。

Arduinoのスケッチ


BME280のライブラリは「SparkFun BME280 Arduino Library」を使用していましたが、問題がありました。

I2CのピンがデフォルトでハードウェアI2Cのものを使うようになっていて、自由にピンを割り当てられるソフトウェアI2Cを使うのが少しめんどうです。

スケッチ例に「Example9_SoftwareI2C.ino」があって、Arduino IDEのライブラリマネージャから「SoftwareWire by Testato」をインストールして使うようになってます。

他にI2CのピンをアサインできるBME280のライブラリを探してみると「Arduino-ESP8266-BME280」がありました。(Ambientさんでした)

exampleもAmbientに送るようになっているのでそのまま使わせていただくことにしました。

SSD1306のライブラリはu8g2を使いました。

参考
HiLetogo 0.9" I2C OLED 128X32をu8g2で使ってみる。
u8g2のFull BufferとPage Buffer

BME280、SSD1306のどちらのライブラリもArduinoのI2C制御クラスのWireオブジェクトをクラス内で初期化(begin())していて同時に使用するのは怖いんですが、ArduinoのI2C制御クラスのWireはSingletonになっているとおもうので(←確証なしです)、SCLとSDAに使うPINを合わせておけばだいじょうぶかな~と半分やけくそで使いました。

結果としては動作しているように見えます。

WiFiでAmbientにデータを送信するようにして、DeepSleepをかけました。

<Ambient_ESP8266_BME280_u8g2.ino>

#include <ESP8266WiFi.h>
#include <Wire.h>
#include "BME280.h"
#include "Ambient.h"
#include "U8g2lib.h"
#include "etc/config.h"

extern "C" {
#include "user_interface.h"
}

#define UART_TRACE (1)
#define PIN_CHECK  (1)
#define USE_OLED   (1)

#define TITLE_STR1  ("ESP8266 BME280 Thermo")
#define TITLE_STR2  ("2018.08.13")

#define LED 4
#define SDA 14
#define SCL 13

#define PERIOD 60

/*
  const char* ssid = "ssid";
  const char* password = "password";
  unsigned int channelId = 100;
  const char* writeKey = "...writeKey...";
*/

WiFiClient client;
Ambient ambient;
BME280 bme280;
#if (USE_OLED)
U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);
#endif

float calcDiscomfort(float temperature, float humidity) {
  return 0.81 * temperature + 0.01 * humidity * (0.99 * temperature - 14.3) + 46.3;
}

void setup()
{
  int t = millis();
  //wifi_set_sleep_type(LIGHT_SLEEP_T);

  struct rst_info* p_reset_info = ESP.getResetInfoPtr();

#if (UART_TRACE)
  Serial.begin(115200);
  delay(10);
  Serial.println("");
  Serial.println("");
  Serial.println(TITLE_STR1);
  Serial.println(TITLE_STR2);
  Serial.print(ESP.getResetReason());
  Serial.print("\t");
  Serial.println(p_reset_info->reason);
  Serial.print("Start");
#endif
#if (PIN_CHECK)
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);
#endif

  // BME280
  bme280.begin(SDA, SCL);
  // 電源投入直後の値は不安定なので、読み捨てる
  bme280.readTemperature();
  bme280.readHumidity();
  bme280.readPressure();

  double temperature = 0.0;
  double humidity = 0.0;
  double pressure = 0.0;
  float discomfort = 0.0;

  temperature = bme280.readTemperature();
  humidity = bme280.readHumidity();
  pressure = bme280.readPressure();
  discomfort = calcDiscomfort(temperature, humidity);

#if (UART_TRACE)
  Serial.print("temp: ");
  Serial.print(temperature);
  Serial.print(" DegC,  humid: ");
  Serial.print(humidity);
  Serial.print(" %, pressure: ");
  Serial.print(pressure);
  Serial.print(" hPa ");
  Serial.print(discomfort);
  Serial.println("");
#endif

#if (USE_OLED)
  u8g2.begin();
  if (p_reset_info->reason != REASON_DEEP_SLEEP_AWAKE) {
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_7x14_tf);
    u8g2.drawStr(0, 16, TITLE_STR1);
    u8g2.drawStr(0, 32, TITLE_STR2);
    u8g2.sendBuffer();
    delay(3000);
  }

  char strBuffer1[16];
  char strBuffer2[16];
  
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_logisoso20_tf);
  sprintf(strBuffer2, "%s%cC", dtostrf(temperature, 2, 1, strBuffer1), 0xb0);
  u8g2.drawStr(0, 32, strBuffer2);
  u8g2.setFont( u8g2_font_helvR14_tr);
  sprintf(strBuffer2, "%s%%", dtostrf(humidity, 2, 1, strBuffer1));
  u8g2.drawStr(78, 16, strBuffer2);
  u8g2.drawStr(78, 32, dtostrf(discomfort, 2, 1, strBuffer1));
  u8g2.sendBuffer();
#endif

  // WiFi
  WiFi.begin(ssid, password);

  int i = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);

#if (PIN_CHECK)
    digitalWrite(LED, i++ % 2);
#endif
#if (UART_TRACE)
    Serial.print(".");
#endif
  }
#if (PIN_CHECK)
  digitalWrite(LED, LOW);
#endif

#if (UART_TRACE)
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.print(WiFi.localIP());
  Serial.println("");
#endif

  ambient.begin(channelId, writeKey, &client);
  ambient.set(1, temperature);
  ambient.set(2, humidity);
  ambient.set(3, pressure);
  ambient.set(4, discomfort);
  ambient.send();

  t = millis() - t;
  t = (t < PERIOD * 1000) ? (PERIOD * 1000 - t) : 1;

  ESP.deepSleep(t * 1000, RF_DEFAULT);
  delay(1000);
}

void loop()
{
}

スケッチ冒頭の

struct rst_info* p_reset_info = ESP.getResetInfoPtr();

でResetの理由を保持するreset_infoを取得して、起動時にタイトル画面をOLEDに表示する処理を、Sleep復帰時には

if (p_reset_info->reason != REASON_DEEP_SLEEP_AWAKE) {
...
}

としてバイパスするようにしています。

ESP.getResetReason()

で、整数値ではなくString型でResetの理由も取得できます。

Sleep中もOLEDに電源を供給しておけば表示され続けますが、Sleepからの復帰時にOLEDが初期化されるので一瞬OLEDの表示が消えます。

電池ももったいないし、OLEDは動作確認用として、長期運用する場合は外しておくつもりです。

もっと細かい周期で環境を測定するためには、例えばArduino Nanoを使ってUSB経由でロギングするものを作ればいい?

Ambientのグラフ


電源電流


電源に0.1ΩのRを直列に入れOWON B35(DC/mV)で測定(1mV→10mA換算)。1秒周期

OLED、LEDあり

Avg 1.2414 mV
Min 0.59 mV
Max 12.83 mV

WakeUp時に80mA~130mA程度、Sleep時に6mA程度

OLED、LEDをブレッドボードから抜いた

Avg 0.614133333 mV
Min 0 mV
Max 12.35 mV

WakeUp時に70mA~125mA程度、Sleep時に0mA程度

OLED、LEDがあると常時6mA程度消費します。

I2C信号


ch1:SDA ch2:SCL

IC2クロックは多少揺れがあり、100kHzより少し遅いぐらいです。←Standard Modeぐらい。

と、なんとか不快指数計をWiFi対応させたところで、猛暑のピークは過ぎたようです(@@;

2018年8月4日土曜日

ESP WROOM 02(ESP8266)でDeep Sleep(メモ)

以下のサイトを参考にしました。

@asusa9さんの「ESP8266の真骨頂Deep-Sleepモードの使い方
@anaptfoxさんの「MAKING THE ESP8266 LOW-POWERED WITH DEEP SLEEP
「じわじわ進む」さんの「ESP単体で30分のデータをまとめて送信
「電子工作と治具ツールの備忘録」さんの「ESP-WROOM-02のメモ(11):3つのSleepの使い分け
@exabugsさんの「ESP8266 (ESP-WROOM-02) で消費電力を抑えるには (スリープモードまとめ)

配線図


Deep Sleepモードを使うときは、IO16ピンとRSTピンを接続します。WakeUp時にIO16がLoになるのでResetがかかって最初から実行する仕組みです。

したがってスケッチはSetup()内に書いて、起動時に1回だけ実行されるようにします。

また、Arduino IDEからIO0を書き込みモード(GNDに接続)で書き込んだあと、プログラムが1回だけ実行されて、Sleep後WakeUpしても書き込みモードのためにプログラムが実行されません。一旦電源を切ってIO0を書き込みモード(3.3Vに接続)にして電源を再投入します。

Deep Sleepモードのテスト


Arduinoのスケッチ <ESP_WROOM_02_DeepSleep.ino>
/*
 * ESP8266 DeepSleep Test
 *
 * 2018.08.02
 *
 */
#include <ESP8266WiFi.h>

extern "C" {
#include "user_interface.h"
}

#define PERIOD 10

WiFiClient client;

const char* ssid = "WiFi APのssid";
const char* password = "WiFi APのpassword";

void setup()
{
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);
       
    int t = millis();

    Serial.begin(115200);
    delay(10);

    Serial.println("\r\nStart");

    WiFi.begin(ssid, password);  //  Wi-Fi APに接続
    while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち
        delay(100);
    }

    Serial.print("WiFi connected\r\nIP address: ");
    Serial.println(WiFi.localIP());

    digitalWrite(LED_BUILTIN, LOW);
    
    t = millis() - t;
    t = (t < PERIOD * 1000) ? (PERIOD * 1000 - t) : 1;
    ESP.deepSleep(t * 1000, RF_DEFAULT);
    delay(1000);
}

void loop()
{
}

Amibientのサンプルスケッチ[スケッチ例]-[Ambient ESP8266 lib]-[ESP8266]-[Ambient_ESP_BME280_ds]をもとにしました。このスケッチはWiFi接続のみでAmbientには接続しません。

前回と同じようにOWON B35で電源電流を測定しました。1mV→10mA換算です。サンプリング周期は1sです。


Avg 2.285633333 mV
Max 13.37 mV
Min 0 mV

10秒毎にWakeUpし、動作時には70mA程度、スリープ時には0mAで推移しています。平均値は23mA程度ですが、Sleepの間隔を長くすれば消費電力は抑えられます。

単3電池を使うとModem Sleepだと1日程度しか持たないので(概算で2000mAh / 50mA = 40h)電池駆動する場合はDeep Sleepは必須かもしれません。

Ambientに送信するテスト


HDC1000を使うようにサンプルスケッチを改変しました。

HDC1000.hとHDC1000.cppをインクルードする必要があります。

Arduinoのスケッチ <Ambient_ESP8266_HDC1000_DeepSleep.ino>

/*
   ESP8266 & HDC1000 DeepSleep

   2018.08.02

*/
#include <ESP8266WiFi.h>
#include <Wire.h>
#include "Ambient.h"
#include "HDC1000.h"

#define TITLE_STR1  ("Ambient ESP8266 HDC1000 DeepSleep Test")
#define TITLE_STR2  ("2018.08.04")

#define PERIOD (60) // Sec

extern "C" {
#include "user_interface.h"
}

// Pin Assign (I2C)
#define SDA 14
#define SCL 13
#define RDY 12

// WiFi
const char* ssid = "WiFi APのssid";
const char* password = "WiFi APのpassword";

// Ambient
const unsigned int channelId = <Ambientchannel id>;
const char* writeKey = "Ambientのwarite key";

WiFiClient client;
Ambient ambient;

HDC1000 hdc1000;

void setup()
{
  float temp, humid;
  char humidbuf[12];

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);

  int t = millis();
  //wifi_set_sleep_type(LIGHT_SLEEP_T);

  Serial.begin(115200);
  delay(100);

  Serial.println("\r\nStart");
  Serial.println(TITLE_STR1);
  Serial.println(TITLE_STR2);

  // WiFi
  WiFi.begin(ssid, password);  //  Wi-Fi APに接続
  while (WiFi.status() != WL_CONNECTED) {  //  Wi-Fi AP接続待ち
    delay(100);
  }

  Serial.print("WiFi connected\r\nIP address: ");
  Serial.println(WiFi.localIP());

  hdc1000.begin(SDA, SCL, RDY);
  ambient.begin(channelId, writeKey, &client);
  
  // HDC1000
  Serial.print("Manufacture ID: ");
  Serial.println(hdc1000.readId(), HEX);

  temp = hdc1000.readTemperature();
  humid = hdc1000.readHumidity();

  Serial.print("temp: ");
  Serial.print(temp);
  Serial.print(" DegC,  humid: ");
  Serial.println(humid);

  // Ambient
  ambient.set(1, temp);                // データーがint型かfloat型であれば、直接セットすることができます。
  dtostrf(humid, 3, 1, humidbuf);      // データーの桁数などを制御したければ自分で文字列形式に変換し、
  ambient.set(2, humidbuf);            // セットします。

  ambient.send();

  digitalWrite(LED_BUILTIN, LOW);
  
  t = millis() - t;
  t = (t < PERIOD * 1000) ? (PERIOD * 1000 - t) : 1;
  ESP.deepSleep(t * 1000, RF_DEFAULT);
  delay(1000);
}

void loop()
{
}

こちらも動作しているように見えるのですが、Ambientのデータにときどき欠損が見られます。



Ambient.cppのDebugモードを有効にして

#define AMBIENT_DEBUG 1

Arduinoのシリアルモニタに表示させてみましたが、データ送信は行われている感じです。


Ambientの「諸元/制限」があるので何か制限に引っかかっているのかもしれません。

ともかく、データを送れば時刻付きでグラフ化してもらえる便利なサービスだと思います。

「じわじわ進む」さんの「ESP単体で30分のデータをまとめて送信」で紹介されているThingSpeak.com(Math Works運営(@@;)も試してみようと思います。

Light Sleepモード


ESP8266のドキュメント「ESP8266 Low Power Solutions」の「3. Light Sleep」に以下のように書いてありました。



素直に読めば「Light Sleep」では「ペリフェラルからの信号、割り込みには反応しない」ので「GPIOに信号(LまたはH)を受け取る必要があります」ということになります。やはり外部割り込みが必要そうです。

Deep SleepモードでWakeUpに使うIO16(信号出力)はLight SleepモードのWakeUp(信号入力)には使えないようです。

HDC1000が壊れているっぽい(読み取り値がおかしい)のでAliExpressでBME280モジュールを発注してありそろそろ届く頃です。

健康のためにも、なんとかこの猛暑中に対応したい(@@;


2018年8月1日水曜日

ESP WROOM 02(ESP8266)でWiFi(メモ)

メモです。

ESP WROOM 02にArduinoのスケッチを書き込むとATコマンドを受け付けなくなります。これ知らなくてしばらく格闘していました。

オリジナルのファームウェアを書き戻すとATコマンドが使えるようになるそうです。手順が少しめんどくさいので未確認です。

参考
ArduinoのESP8266をATコマンドが使えるように戻す
wakaba-1027さんの「https://ameblo.jp/wakaba-1027/entry-12326885810.html
ラジオペンチさんの「ESP-WROOM-02をATコマンドで動かす

Wifiのサンプルプログラム(Arduino 1.8.5 / esp8266 2.4.1)


[ファイル]-[スケッチ例]-[ESP8266WiFi]-[WiFiClientBasic]

    WiFiMulti.addAP("SSID", "passpasspass");

の[SSID]、[passpasspass]を利用するWiFiアクセスポイントのものに書き換え。IPアドレスはWiFiアクセスポイントのDHCPサーバーから割り当てられます。

    const char * host = "192.168.1.1"; // ip or dns

の部分はESP8266自身のIPアドレスではなくてTCPの接続先で、書き換えなくてもWiFiがつながったかどうかは確認できます。

Arduinoのシリアルモニタの出力


Ambientのサンプルプログラム

WiFiがつながったらサーバーに接続と行きたいところですが、WindowsでHTTPサーバーを立てるのは少しめんどうです。こういうときはMacやLinuxマシンがあると楽なんですが。(全然触っていないラズパイがあった・・・)

Ambientという便利なサービスが公開されいるので利用させていただきました。

手順はAmbientのサイトで詳しく紹介されていますが、一応メモです。

●Ambientのユーザー登録

●チャンネルを作る

●Arduino IDEにAmbientのライブラリをインストール https://github.com/AmbientDataInc/Ambient_ESP8266_lib

●ライブラリにESP8266(ESP WROOM 02)用のサンプルプログラムが用意されています。[ファイル]-[スケッチ例]-[Ambient ESP8266 lib]-[ESP8266]-[Ambient ESP8266]

これは、気温・湿度センサーのHDC1000を使ったサンプルプログラムです。HDC1000のモジュールを持っているので使ってみました。

ブレッドボード配線図


●ssid, password, channelId, writekeyを書き換え

●Light Sleepモードをコメントアウト

//wifi_set_sleep_type(LIGHT_SLEEP_T);

なぜだかわかりませんが、私の環境ではLight Sleepモードを指定すると、WiFiのネゴシエーション中にSleepモードに入ってしまってWakeUpしません。setup()内の最後に移動すればWiFi接続は確立しますが、やはりSleepしたあとWakeUpせず。スリープモードを指定しないか、以下のようにModem Sleepモードを指定すれば動作しました。

wifi_set_sleep_type(MODEM_SLEEP_T);

wifi_set_sleep_typeでスリープモードを指定すると自動的にSleepモードに入るそうですが(参考「ESP8266 (ESP-WROOM-02) で消費電力を抑えるには (スリープモードまとめ) 」)Light Sleepモードでは、なんらかの割り込みをかけないとWakeUpしないのでしょうか?

Sleep無効とModem Sleepモードの電源電流


電源電流を測定するために、電源ラインに直列に0.1ΩのRを入れ、OWON B35 のDC/mVモードでRの電圧降下を測定してロギングしました。(1mV = 10mAで換算)

ESP8266のIO0は3.3Vに接続(実行モード)、OWON B35のサンプリング周期は1秒で測定しましたが、なにか間違えている感じです。


wifi_set_sleep_type()なし

Avg 5.708966667 mV
Min 2.2 mV
Max 7.37 mV

wifi_set_sleep_type(MODEM_SLEEP_T)

Avg 5.591466667 mV
Min 1.75 mV
Max 7.86 mV

<追記:2018.08.02>

WiFi接続を行うと、デフォルトで「Modem Sleep」になるそうです。

wifi_set_sleep_type(NONE_SLEEP_T);

と明示的にSleep Modeを無効にして電源電流を測定しました。

wifi_set_sleep_type(NONE_SLEEP_T)

Avg 7.1394 mV
Min 7.1 mV
Max 9.53 mV

</追記>

Deep Sleepモードも含めてもう少し試してみようと思います。

ambientのグラフ

メモ:


ESP8266 ArduinoのAPI他ドキュメント
「Welcome to ESP8266 Arduino Core’s documentation! https://arduino-esp8266.readthedocs.io/en/latest/

esp8266 libraryのインストール先(Windows10)
<ユーザーフォルダ>\AppData\Local\Arduino15\packages\esp8266

ESP8266 Low Power Solutions
https://www.espressif.com/sites/default/files/9b-esp8266-low_power_solutions_en_0.pdf

2018年7月27日金曜日

ESP WROOM 02でLチカ(メモ)

配線


ESP-WROOM-02には、FT232モジュールから電源を供給せず、安定化電源で3.3Vを供給しています。

書き込みモード

実行モード

Arduino 1.8.5


Arduinoのバージョンは、以前やったときは1.6.4でしたが、今は1.8.5です。

OSもWindows10で再インストールしているので、さらの状態からインストールしたメモです。

ボードの追加


[ファイル]-[環境設定]で開くダイアログの[設定]タブの[追加のボードマネージャのURL]に「http://arduino.esp8266.com/stable/package_esp8266com_index.json」を入力。

[ツール]-[ボード]-[ボードマネージャ]で[esp8266 by ESP8266 Community]を選択し、[インストール] (2.4.1)

スケッチの準備


[ツール]-[ボード]-[Generic ESP8266 Module]

[ツール]


設定値は不明。「シリアルポート: <環境に合わせる>」

スケッチ例


[ファイル]-[スケッチ例]-[ESP8266]-[Blink]

[ツール]-[Builtin LED:]を配線に合わせて[4]に変更。

再度書き込むときは本体側の電源をOFF/ONすれば良い。

IO0を3.3Vに接続して電源を再投入すれば実行モードになる。

実行モード時:80mA程度
書き込みモード時:30mA程度

2016年12月12日月曜日

ESP-WROOM-02を秋月のFT232RL USBシリアル変換モジュールで使ってみる。


師匠のtozさんにESP-WROOM-02本体をもらっていたが、端子ピッチが1.5mmとなんとも中途半端でなかなか実験できないでいた。あきらめてaitendoで変換基板 [IFB1518J-A]を買って使ってみた。

秋月の変換基板の方が安いが、なんか変な形だし、aitendoの通販無料会員になっているのでaitendoの方にした。

表面実装だが1.5mmピッチだし楽勝と思っていたが、モジュールの裏面にはんだが回ってブリッジするので結構難儀した。←はんだ吸い取り線がなかなか効かない。

手はんだでやるなら適量のはんだを基板に盛ってえいやっで引きはんだした方がいいかも。



配線図




でかいブレッドボードを使っているのは理由があって、幅が広くて普通にブレッドボードに載せると配線するスペースがなくなってしまう。秋月の変換基板は変な形しているが、ピンが出ている部分の幅が狭いので普通のブレッドボードでも配線しやすいんだと思う(^q^;

ESP-WROOM-02のIO0(Pin8、ブレッドボード図の青色のケーブル)をGNDにつなぐと書き込みモード、3.3Vにすると実行モードになる。

FT232RLモジュール(AE-UM232R)のジャンパーは

JP1 1-2 ショート
JP2 1-2 ショート

にする。USBから電源を供給し、VIOは3.3Vの設定になる。このジャンパの設定だとUART(TX/RX)の信号レベルも3.3Vになる。JP1を2-3ショートにしてVIOを5Vにすると信号レベルは5Vになる。←やっと確認した。

Arduino IDEの準備


Arduino IDE 1.6.4の「ファイル」-「環境設定」の「Additional Boards Manager URLs:」に「http://arduino.esp8266.com/stable/package_esp8266com_index.json」を入力

「スケッチ」-「inlclude Library」-「Manage Libraries...」で「esp8266」をインストール

「ツール」-「ボード:」で「Generic ESP8266 Module」を選択

「ツール」-「Reset Method:」で「nodemcu」選択←まだ、よくわかっていない(^q^;

「ツール」-「ポート:」でFT232RLモジュールに割り当てられたポートを選択

Arduinoのスケッチ

ESP_WROOM-02_Blink

const int LED = 4;

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, LOW);
  delay(100);
  digitalWrite(LED, HIGH);
  delay(200);
}


ExampleのESP8266/Blinkでも動作するが、LEDが書き込みで使うUARTのTXDと同じGPIO1なので、別にGPIO4(Arduinoだとint型の4になる)を指定した。

書き込み時には、IO0をGNDに接続して書き込む。書き込み完了後、いったんUSBケーブルを抜いてIO0を3.3Vに接続する。ふたたびUSBケーブルをつなぐとLEDがチカチカする。

Lチカだけでも電波が飛んでるようだ。


メモ:


ESP-WROOM-02はもう少しあっさりした感じだと思っていたが、結構いろいろいじりがいがありそう。