工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

カテゴリ:11.電子工作(IoT) > 11.2 Arduino

概要

フルカラーのLEDアレイを作ることにした。今回は、設計を行った。


背景と目的

とある事情で、LEDアレイを作成することになった。まず、仕様を決め、設計する。


詳細

1.仕様

LEDアレイは、各種製品が電子部品屋で売っているのでそれを使えばいいはずなのだが、

  • 5Vのモバイルバッテリーで駆動
  • 取り付け先の寸法にきっちり合わせる必要がある
  • 安く

という仕様を満たす必要があるため、いちいち自作が必要になってしまった。


2.設計

いろいろ悩んだ挙句、

を使うことにした。回路図は以下。5Vで各LEDに約15mAが流れるように抵抗を設定。各色のLEDをスイッチングするトランジスタを用意。

回路図

基板上の実装パターンは、以下。これを12個分繰り返す。基板上に、角型フルカラーLEDを配列して実装する。はんだ付け箇所が多くてめんどくさそうだが、仕方ない・・・。

橙が5V、R、G、Bがそれぞれ信号線で、トランジスタのコレクタに接続する。トランジスタはArduinoなどで駆動する予定。そちらの設計はこれから。

配線図

まとめ

フルカラーLEDアレイの設計ができた。次は実装する。

概要

人が近づいたら、サーボモータで壁の照明スイッチを無理やり操作するシステムを製作した。


背景と目的

最近、引っ越しをして住み始めた家では、階段の照明をよく消し忘れる。その結果、一日つけっぱなしという無駄を何度も発生させてしまっているので、改善したい。王道として思いつくのは、人感式の照明に付け替えることだが付け替えるお金をかけたくないのと、引っ越し後工作をしていないせいで無駄でもいいから何かしら工作をしたいという欲求が抑えられないため、消し忘れても自動で消えるシステムをわざわざ作ってみる。


詳細

1.方法の検討

問題の電灯は、階段の2階側と1階側にそれぞれ壁スイッチがあり、押すごとに点灯/消灯が切り替わる。そこで、これを無理やりサーボモータで押すという力技が思いつくが、実は、以前同システムを作ったのでまさにそれが流用できそうである。ただ、そのシステムはIoT系の工作でGoogleHomeから呼び出して動かすものであったが、今回はネット経由で操作する必要はないので、人感センサでトリガしてあげるように変更する。(なんだか、IoTから退化した感じで微妙だが使い道を考えると仕方ない)


以前作成したシステム

DSC_0237


2.設計

ハードウェアは、すべて手持ち品のArduinoNano互換ボードと、人感センサSB412A、サーボモータSG-92Rを組み合わせで間に合わせた。また、壁スイッチは点灯/消灯の状態を知ることができないので、明るさセンサで状態を知る必要もありそうだ。

というわけで、以下のような回路にした。SB412Aが2つあるのは、私の家の階段が途中で折れ曲がっており、1つでは階段全体が検出範囲に入らないためである。SB412Aの出力レベルはArduinoNano互換ボードと厳密には合わないがちゃんとHIGH状態が読み取れたので気にしないことにした。明るさセンサはCdSとし、直列抵抗との分圧点をセンサ出力としてアナログ入力端子に接続。

20180927233430


3.プログラム

非常に簡単なので、コードは割愛するが、おおざっぱに言って、

  • 2つの人感センサ出力のORがTRUEで、暗い場合、サーボモータを動かす
  • 2つの人感センサ出力のORがFALSEで、明るい場合、サーボモータを動かす

だけ。1秒周期で上記ロジックを実行する。ただし、人感センサは1度検出すると30秒程度HIGHが持続するようにしている。サーボモータの駆動は標準ライブラリのServo.hを使用。


4.実装

以下が実装した図。見た目は全然気にしていないので、いずれ家族からクレームが出そうだが、所望の動作はしている。2つの人感センサはそれぞれ1階と2階の階段の初段付近に設置。明るさセンサは2階側の人感センサと並べて設置。

DSC_0571


まとめ

それなりに実用的なシステムができた。今後は見た目をまともにして生活空間に溶け込ませたい。

概要

ESP-WROOM-32からデータをAmbientに送信して可視化することができた。


背景と目的

先日、ESP-WROOM-32にDHT22を接続して温度、湿度を計測することができた。そこで、計測データをWeb上に送信して可視化してみたい。


詳細

1.可視化手段=Ambient

可視化するには、有料、無料含めて様々なものがあるが、今回は無料で使えるAmbientというサービスを使ってみる。私は初めて使うのだが、Web上に情報がさまざまあるため、始めやすそうだ。


2.Ambientのユーザー登録

こちらから、メールアドレスとパスワードだけで登録ができた。ログインすると、コンソール画面になるので、Myチャネルから、チャネルの作成をしておく。そうすると、チャネルID、リードキー、ライトキーなどがもらえる。


3.ESP-WROOM-32のコーディング

3.1 ライブラリの準備

[[サンプル>]]などを参考に、進めてみた。まず、Ambient接続用のArudinoライブラリがあるので、こちらダウンロード。表示がESP8266とあるが、気にしない。Arduinoのライブラリフォルダに置く。


3.2 コーディング

こちらなどを参考に、書いてみた。1分間隔で、DHT22の計測値を送信している。また、注意が必要なのは、WiFiClientSecureは使えない。(Ambientのエンドポイントが、HTTPだからか?)

#include 
#include "Ambient.h"
#include "DHTesp.h"

unsigned int channelId = 数字;
const char* writeKey = "Ambientのコンソールで確認";
const int GPIO_DHT22 = 33;

WiFiClient client; // WiFiClientSecureではだめ
Ambient ambient; // Ambient
DHTesp dht; // DHT22

void setup() {
  
  Serial.begin(115200);
  
  Serial.println("Attempting to connect to SSID: " + String(YOUR_SSID));
  WiFi.begin(YOUR_SSID, PASSWORD); // Wi-Fiモジュールの初期化
  while (WiFi.status() != WL_CONNECTED) {
      Serial.print(".");
      delay(1000); // 1秒ずつ待つ
  }
  Serial.println("Connected to " + String(YOUR_SSID)); // 接続成功通知
  
  // Ambientの初期化
  bool tf = ambient.begin(channelId, writeKey, &client);
  if (!tf) {
    Serial.println("ambient.begin failed.");
  }

  // DHT22初期化
  dht.setup(GPIO_DHT22, DHTesp::DHT22);

}

void loop() {

  // 計測
  TempAndHumidity newValues = dht.getTempAndHumidity();

  // 結果表示
  Serial.println(" T:" + String(newValues.temperature) + " H:" + String(newValues.humidity));

  // データのセット
  ambient.set(1, newValues.temperature); // 温度
  ambient.set(2, newValues.humidity); // 湿度
  
  // 送信
  Serial.println("send...");
  bool tf = ambient.send();
  if (!tf) {
    Serial.println("ambient.send failed.");
  }
  delay(60 * 1000);

}


4.動作確認

コンソールで、送信先チャネルを選び、グラフを作成。今回は、湿度と温度それぞれを時系列で表示してみた。グラフの設定も、送信したデータが表示されている。※なお、途中から大きく数字が変わっているが、前半はダミーのいい加減な数値を送信したためで、後半は本物のセンサ計測値。

(どうでもいいけど、コンソールのデザインのBootstrap感がすごい。まあ、嫌いじゃないけど。)

20180712221733


まとめ

ESP-WROOM-32からデータをAmbientに送信して可視化することができた。非常に簡単なので、ぜひ今後も利用していきたい。

概要

湿温度計DHT22をESP-WROOM-32に接続して、温度と湿度を取得できた。


背景と目的

とある事情で、家の中の温度と湿度を測ってデータを蓄積する必要が出た。そのため、手持ちのESP-WROOM-32に湿温度センサを接続し、動作させる。


詳細

1.使用するデバイス

  • ESP-WROOM-32 DevKitC基板
  • DHT22

DHT22を選択したのは、Amazonで検索したら最初のほうに出てきたのと、ネット上に参考情報がたくさんあったため。(ちなみに、以前DHT11を持っていたのだが、電源逆接続という初歩的なミスで壊してしまったので、どうせならそれより精度の良いものを買ってしまえということで、買ったという経緯もある。)


2.接続方法

DHT22は、動作電圧範囲が最低3.3Vで、ESP-WROOM-32のGPIOレベル(だいたい3.3Vより低くなる)で確実に動作するのかよくわからないので、3.3V/5Vのレベルシフタをかませることにした。ただ、DHT22は独自の単線インターフェースなので、双方向レベルシフタが必要で、いろいろ考えた挙句、以下のような回路になった。(実は、最低動作電圧を多少下回っても動くのかな?やってないのでわからないが)

20180711184326

3.ソフトウェア

3.1 ライブラリのインストール

基本的に、arduino-esp32を使うが、DHT22は、Arduinoライブラリが存在しており、Arduino IDE>スケッチ>ライブラリをインクルード>ライブラリを管理から、インストールできた。

20180710210408

3.2 コーディング

都合もあり詳細は割愛するが、基本的には、以下の簡単なコードで取得できた。

// インクルード
#include "DHTesp.h"

// DHTespクラスインスタンスを作成
DHTesp dht;

// 初期化
dht.setup(GPIOピン番号, DHTesp::DHT22);

// 計測
TempAndHumidity newValues = dht.getTempAndHumidity();

// 結果表示
Serial.println(" T:" + String(newValues.temperature) + " H:" + String(newValues.humidity));

4.動作確認

以下が、動作確認した様子。暑くて30度を越えているが、手持ちの別の温度計もほぼ同じような値であり、湿度も自分の住んでいるエリアのリアルタイム湿度と比較してほぼ同じだったので、正しく動作しているようだ。

 T:30.90 H:54.90


まとめ

DHT22をESP-WROOM-32に接続して、動作させることができた。次は、Web上に蓄積する。

概要

ESP-WROOM-32で、スリープからスイッチを押して復帰するプログラムを作成し、正しく動作することを確認した。


背景と目的

ESP-WROOM-32で、複数のスイッチのうちいずれかを押したらスリープから復帰させ、なおかつどれが押されたか認識したい。なので、サンプルプログラム等を参考に、プログラムを組み動作確認してみる。


詳細

0.試す条件

  • ESP-WROOM-32 DevKit-C
  • スイッチをGPIO32,34,35に接続(押したらHIGH)


1.コーディング

今回やりたいことは、

  • 3つのスイッチのいずれかを押したら、sleepから復帰し、押されたスイッチを認識する

である。ドキュメントを読む限り、External wakeup (ext1)でできそうだ。そして、サンプルプログラムがあるので、基本骨格は、ExternalWakeUp.inoとして、いくつか変更を加える。

なお、

  • ESP_EXT1_WAKEUP_ALL_LOW = 監視対象のGPIOすべてがLOW
  • ESP_EXT1_WAKEUP_ANY_HIGH = 監視対象のGPIOいずれかがHIGH

といういずれかの動作モードしか選べないので、スイッチを押すとLOWになる複数の入力のいずれかを検出というのは難しい。(手元にそういう構成で作ってしまったハードがあって使えないことが分かりがっかり。。。)

まず、スイッチを接続するGPIOピンが3つあるので、

#define BUTTON_PIN_BITMASK 0xD00000000 // 2^32, 2^34 2^35なので、0b1101 0000 ...

とする。そして、wakeupのトリガになったピンが分かるように、esp_sleep_get_ext1_wakeup_statusなる関数を用いて、シリアルにピン番号を表示する関数を作成し、setup関数内で、print_wakeup_reasonの後に呼び出す。

void print_wakeup_pin(){

  uint64_t wakeup_pin = esp_sleep_get_ext1_wakeup_status();

  if (wakeup_pin & 0x100000000) {
    Serial.println(32);
  }
  if (wakeup_pin & 0x400000000) {
    Serial.println(34);
  }
  if (wakeup_pin & 0x800000000) {
    Serial.println(35);
  }
  
}

そして、ext0を無効、ext1を有効にするため、setup関数内で、

//esp_sleep_enable_ext0_wakeup(GPIO_NUM_33,1);
//If you were to use ext1, you would use it like
esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH);

とする。なお、悲しいことにサンプルプログラムは、古いAPIを修正し忘れたのか、esp_deep_sleep_enable_ext1_wakeupという間違った関数名になっていてそのままではエラーになるので、esp_sleep_enable_ext1_wakeupに修正すること。


2.動作確認

上記変更をしたプログラムを書き込み立ち上げると、

Boot number: 1
Wakeup was not caused by deep sleep
Going to sleep now

となり、wakeupではない旨とsleepに移行した旨が表示される。そして、GPIO32に接続したスイッチを押したところ、

Boot number: 2
Wakeup caused by external signal using RTC_CNTL
32
Going to sleep now

となり、正しく押したSWを認識できている。34、35も同様だった。ということで正しく動作することが分かった。

また、消費電流もスイッチを押した直後少し増えて、スリープになったら減少(電源のメータの読みなのでいい加減)したのでちゃんと動いていそう。


まとめ

正しく動作させることができた。

概要

ESP-WROOM-32で、プログラムを書き込む容量を増やす方法をまとめた。


背景と目的

ESP-WROOM-32で、あるプログラムを書き込もうとしたところ、以下のように

"最大1310720バイトのフラッシュメモリのうち、スケッチが1333771バイト(101%)を使っています。"

と表示され書き込みができなかった。そこで、容量を増やす方法について調べ、実際に増やしてみる。


詳細

0.方法を知る

Web各所で情報を探し回ったところ、

などがあったが、いろいろ試行錯誤した結果、結論から言うと、以下の2手順が必要ということがわかった。

  • tools/partitions/default.csvの編集
  • boards.txtの編集

ということで、以下順に行う。


1.tools/partitions/default.csvの編集

default.csvを開くと、以下のような記述が出てくる。

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x140000,
app1,     app,  ota_1,   0x150000,0x140000,
eeprom,   data, 0x99,    0x290000,0x1000,
spiffs,   data, spiffs,  0x291000,0x16F000,

app0からspiffsという4行分を編集する。プログラム書き込み領域を0x20000 = 131072byte増加させることにすると、

# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     0x9000,  0x5000,
otadata,  data, ota,     0xe000,  0x2000,
app0,     app,  ota_0,   0x10000, 0x160000,
app1,     app,  ota_1,   0x170000,0x160000,
eeprom,   data, 0x99,    0x2D0000,0x1000,
spiffs,   data, spiffs,  0x2D1000,0x12F000,

という感じで、app0とapp1のsizeを0x20000増やし、spiffsのsizeは0x40000減らす。また、app1、eeprom、spiffsのoffsetをそれぞれ0x20000だけずらせばよい。


2.boards.txtの編集

arduino-esp32のrootにあるboards.txtを開くと、10行目くらいにある

esp32.upload.maximum_size=1310720

という記述がある。書き込み時に

"最大1310720バイトのフラッシュメモリのうち、・・・"

の数値だ。これを所望のサイズに変更する。今回は、先ほどpartitions/default.csvで0x20000 = 131072byte増加させたので、こちらも同様に1310720 + 131072となるように変更。

esp32.upload.maximum_size=1441792

3.動作確認

上記の作業をして、プログラム書き込みを行ったところ、以下のように最大サイズが変更され、以前収容できなかったプログラムを書き込むことができた。というわけで成功。

最大1441792バイトのフラッシュメモリのうち、スケッチが1333771バイト(92%)を使っています。


まとめ

ESP-WROOM-32で、プログラムを書き込む容量を増やすことができた。

概要

arduino-esp32を使って、ESP-WROOM-32でiBeaconをスキャンすることができた。


背景と目的

以前、esp-idfを使ってiBeaconをスキャンできたが、Arduino用SDKのarduino-esp32では難しかった。しかし、最新版では、BLE_scanというサンプルコードが追加されており、これを使えばiBeaconのスキャンができそうだ。なので、やってみる。


詳細

1.方針

2017/10/14時点でarduino-esp32には、どうやらNeil Kolbanさんという人が親切にも作ってくれたESP32_BLE_Arduinoというサンプルが含まれているようなので、ありがたく使用させていただく。BLE_scanというサンプルコードは、BLEデバイスをスキャンしてアドバタイジングデータを取得できるようなので、iBeaconだけを検出するようにちょっと変更してみる。


2.コーディング

2.1 iBeaconを扱うクラス

まず、iBeaconを扱うための処理をまとめておいたほうがいいと思ったので、BLEAdvertisedDeviceという型の変数を受け取って、iBeaconか判断し、iBeaconであれば、uuid、major、minor、rssiを読み取って保持するクラスを作成。細かい処理はlibraries\BLE\src\BLEAdvertisedDevice.cppあたりを参考にした。

// iBeaconを扱うクラス
class iBeacon
{
private:
  String uuid;
  uint16_t major;
  uint16_t minor;
  int rssi;
public:
  bool createByAdvertisedDevice(BLEAdvertisedDevice advertisedDevice); // BLEAdvertisedDeviceからデータを組み立てる
  String getUUID() { return uuid; }
  uint16_t getMajor() { return major; }
  uint16_t getMinor() { return minor; }
  int getRSSI() { return rssi; }
};

// BLEAdvertisedDeviceからデータを組み立てる
bool iBeacon::createByAdvertisedDevice(BLEAdvertisedDevice advertisedDevice) {

  char work[7];
  
  // 16進データをもらう
  String hexString = (String) BLEUtils::buildHexData(nullptr, (uint8_t*)advertisedDevice.getManufacturerData().data(), advertisedDevice.getManufacturerData().length());
  // iBeaconかチェック
  if (hexString.substring(0, 8).equals("4c000215")) {
    // iBeaconのとき
    uuid =  hexString.substring(8, 16) + "-" + 
            hexString.substring(16, 20) + "-" + 
            hexString.substring(20, 24) + "-" + 
            hexString.substring(24, 28) + "-" + 
            hexString.substring(28, 40);  
    ("0x" + hexString.substring(40, 44)).toCharArray(work, 7);
    major = (uint16_t) atof(work);
    ("0x" + hexString.substring(44, 48)).toCharArray(work, 7);
    minor = (uint16_t) atof(work);
    rssi = advertisedDevice.getRSSI();
    return true;
  } else {
    // iBeaconじゃないとき
    return false;
  }
}
2.2 Arduinoプログラム

次に、サンプルを上記のiBeaconクラスを使って修正。uuid、major、minor、rssiをシリアルに出力する。

#include "BLEDevice.h"
#include "BLEUtils.h"
#include "BLEScan.h"
#include "BLEAdvertisedDevice.h"

int scanTime = 2; //In seconds

/*
ここに、上記のiBeaconクラスを記述
*/

BLEScan* pBLEScan;

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
      // アドバタイジングデータを受け取ったとき
      iBeacon ibcn;      
      if (ibcn.createByAdvertisedDevice(advertisedDevice)) {
        char uuid[37];
        ibcn.getUUID().toCharArray(uuid, 37);
        Serial.printf("UUID: %s, Major: %d, Minor: %d, RSSI: %d \n", uuid, ibcn.getMajor(), ibcn.getMinor(), ibcn.getRSSI());
      }
    }
};

void setup() {
  Serial.begin(115200);
  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
}

void loop() {
  BLEScanResults foundDevices = pBLEScan->start(scanTime);
}

3.動作確認

上記のプログラムを動かしてみたところ、以下のようになった。ちゃんとiBeaconを検出できている。が、フラッシュメモリをかなり消費する。これはもともとのサンプル自体が大きいためだ。なので、メモリ不足に注意が必要。

UUID: 00000000-1ae9-1001-b000-001c4d6465e, Minor: 1, Minor: 4, RSSI: -66

まとめ

arduino-esp32を使って、ESP-WROOM-32でiBeaconをスキャンすることができた。esp-idfを使わないで済む場面がまた1つ増えてよかった。

概要

ESP-WROOM-32で、HTTPSサイトにアクセスしてみた。


背景と目的

ESP-WROOM-32を使ってWebサービスと連携するため、arduino-esp32のサンプルWiFiClientSecureを使ってHTTPSサイトにアクセスしてみる。


詳細

1.コーディング

いきなりだが、以下の通りコーディング。

接続先は、どこでもいいのだが、AWSのAPI Gatewayで、jsonで"Hello world"が返ってくるだけのリソースを作成しておいたので、そこにGETリクエストしてみる。


#include 

const char* ssid     = "your_network_ssid";     // your network SSID (name of wifi network)
const char* password = "your_network_password"; // your network password
const char* server = "*************"; // "www.google.co.jp"など
const char* path = "/"; // サーバー名に続くパス, "/"から始める

WiFiClientSecure client;

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(115200);
  delay(100);

  // Wi-Fiに接続
  Serial.print("Attempting to connect to SSID: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    // wait 1 second for re-trying
    delay(1000);
  }
  Serial.print("Connected to ");
  Serial.println(ssid);

  // サイトにアクセス
  Serial.println("\nStarting connection to server...");
  if (!client.connect(server, 443))
    Serial.println("Connection failed!");
  else {
    Serial.println("Connected to server!\n");
    // Make a HTTP request:
    client.println("GET " + String(path) + " HTTP/1.1");
    client.println("Host: " + String(server)); // HTTP1.1で必須のヘッダ, アクセス先サーバーとしておく(そうしないとクロスドメインアクセスになる)
    client.println("Connection: Keep-Alive");
    client.println();

    if (client.connected()) {
      // ヘッダの受信
      Serial.println("--- Header ---");
      while (1) {
        String line = client.readStringUntil('\n');
        Serial.println(line);
        if (line == "\r") {
          break; // ヘッダの末尾は\r\nだからそこで終了
        }
      }
      // ボディの表示
      Serial.println("--- Body ---");
      while (client.available()) {
        char c = client.read();
        Serial.write(c);
      }
    }
    client.stop();
  }
  Serial.println("\n\nfinish.");
}

void loop() {
  // do nothing
}

2.動作確認

動作させたときのシリアルコンソールの出力は以下。ちゃんとアクセスできた。

Attempting to connect to SSID: your_network_ssid
..Connected to your_network_ssid

Starting connection to server...
Connected to server!
--- Header ---
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 42
Connection: keep-alive
Date: Sat, 16 Sep 2017 10:29:44 GMT
: (省略)

--- Body ---
{"event": {}, "contents": "Hello, world."}

finish.


まとめ

ESP-WROOM-32で、HTTPSサイトにアクセスできた。これで、セキュアにデータのやり取りをすることができそうだ。

  // macアドレスの表示
  // WiFi.beginを実行してから呼ぶ
  byte mac_addr[6];
  char buf[20];
  WiFi.macAddress(mac_addr);
  sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  Serial.println(buf);
  Serial.print("IPAddress = ");
  Serial.println(WiFi.localIP());

概要

ESP-WROOM-32にSDカードを接続し、ファイル書き込みをすることができた。


背景と目的

ESP-WROOM-32で、センサ計測値等をWi-Fi等で送信できない場合に、いったん保存しておきたい。そこで、SDカードを使ってファイルにデータを保存する方法を調べ、メモしておく。


詳細

1.材料

microSDカードは、WindowsPCのアプリケーションSDFormatterにて、FAT32でフォーマットしておいた。


2.接続

カードスロットとESP-WROOM-32の間の接続は、こちらこちらを参考にして、以下のような配線とした。写真は、ブレッドボードに組んだ様子。

20170803233952

図2.1 回路図

DSC_0082

図2.2 ブレッドボードに組んだ様子


3.ソフトウェア

ここでは、もっとも単純に、ArduinoのSDライブラリを使用して、"This is test."という文字列を10回書き込むだけとした。書き込み先は、ルートディレクトリの"test1.txt"というファイルとした。

#include <SD.h>

const uint8_t cs_SD = 5; // GPIO5=CS
const char* fname = "/test1.txt";

File fo; // ファイルオブジェクト
int i = 0;

void setup() {
  Serial.begin(115200);
  
  // SDライブラリを初期化
  SD.begin(cs_SD, SPI, 24000000, "/sd");

  // 書き込みモードでファイルを開く
  fo = SD.open(fname, FILE_WRITE);

  for (i = 0; i < 10; i++) {
    // 書き込む
    fo.println("This is test.");
    
    // 1秒待つ
    delay(1000);
    Serial.println(i, DEC);    
  }
  
  // ファイルを閉じる
  fo.close();
  
}

void loop() {

  Serial.println("Finish.");

}


4.動作確認

書き込んだSDカードをPCで開いたところ、ルートディレクトリに"test1.txt"というファイルができていた。中身を開くと、以下の通り10回分"This is test."が書き込まれていた。正しく、書き込みができたようだ。

20170803232159


まとめ

ESP-WROOM-32にSDカードを接続し、ファイル書き込みをすることができた。センサ等を接続して、計測値を記録するのに役立てられそうだ。

このページのトップヘ