【IoT入門】小型Arduino互換機で温度を取得する

最初に

IoT機器を作りたいと思い、温度取得まで出来たのでここにメモを残します。

用意するもの

・ESP01
(Amazonだと1個500円くらいかな…)
image.png

・BMP280
(Amazonだと安くて1個200円くらい、ただ湿度がとれるBME280のほうが少し高いけど良いかもしれません。)
image.png

代用は効くけど、あると便利なもの
・ESP01書き込み機材
image.png

※Amazonにもありますが、改造が必要です。

・ブレッドボード
・ブレッドボード用の線材
image.png

・USB to Serial変換
image.png

#実施

配線

image.png

1.準備

モジュールを利用するために、下記のURLをボードマネージャに追加します。

http://arduino.esp8266.com/stable/package_esp8266com_index.json  
image.png image.png

ボードはボードマネージャからespと探すとesp8266というのが出るので、この設定を利用します。
image.png

image.png

私の設定値はこんな感じです。

image.png

2.Code

モジュールインストール

まず、利用するモジュールをダウンロードします。
ライブラリをインクルードからライブラリの管理を選択します。
image.png

ライブラリマネージャBME280と検索します。
image.png
BME280というモジュールをインストールします。

ソースコード編集

モジュールにはコーディング例が入っているのでこれを利用します。
ファイルスケッチ例と選択して、下の方に行きます
image.png

BME280の中にBME_280_I2C_Testという項目があるのでこれを選択します。
image.png

ソースコードを下記のように変更します。
Wire.begin();を削除し、2行追加します。
これはi2cで利用するポートの初期化と指定です。

  Wire.pins(0, 2);  //追加  
  Wire.begin(0, 2); //追加  
 //Wire.begin();      削除  
  
  while(!bme.begin())  
  {  
    Serial.println("Could not find BME280 sensor!");  
....  

3.書き込みとテスト

これを、書き込み用の環境に接続し、書き込みを行います。

書き込みボタン
image.png

下記のような表示が出れば正常に終了です。

Executable segment sizes:  
IROM   : 238256          - code in flash         (default or ICACHE_FLASH_ATTR)   
IRAM   : 27680   / 32768 - code in IRAM          (ICACHE_RAM_ATTR, ISRs...)   
DATA   : 1260  )         - initialized variables (global, static) in RAM/HEAP   
RODATA : 888   ) / 81920 - constants             (global, static) in RAM/HEAP   
BSS    : 25456 )         - zeroed variables      (global, static) in RAM/HEAP   
最大958448バイトのフラッシュメモリのうち、スケッチが268084バイト(27%)を使っています。  
最大81920バイトのRAMのうち、グローバル変数が27604バイト(33%)を使っていて、ローカル変数で54316バイト使うことができます。  
esptool.py v2.8  
Serial port /dev/cu.wchusbserial1410  
Connecting....  
Chip is ESP8266EX  
Features: WiFi  
Crystal is 26MHz  
MAC: b4:e6:2d:26:d9:43  
Uploading stub...  
Running stub...  
Stub running...  
Configuring flash size...  
Auto-detected Flash size: 1MB  
Compressed 272240 bytes to 198387...  
  
Writing at 0x00000000... (7 %)  
Writing at 0x00004000... (15 %)  
Writing at 0x00008000... (23 %)  
Writing at 0x0000c000... (30 %)  
Writing at 0x00010000... (38 %)  
Writing at 0x00014000... (46 %)  
Writing at 0x00018000... (53 %)  
Writing at 0x0001c000... (61 %)  
Writing at 0x00020000... (69 %)  
Writing at 0x00024000... (76 %)  
Writing at 0x00028000... (84 %)  
Writing at 0x0002c000... (92 %)  
Writing at 0x00030000... (100 %)  
Wrote 272240 bytes (198387 compressed) at 0x00000000 in 22.6 seconds (effective 96.3 kbit/s)...  
Hash of data verified.  
  
Leaving...  
Hard resetting via RTS pin...  

実行環境に接続して、電源をいれれば温度が取得できます。
image.png

感想

実際に、ハードウェアがからんでくるため、いろいろなところで悩んでしまいました。
電気系の勉強もサボっているため、引き続きしていきたいと思います。
参考になったら良いねください!

詰まったところ、詰まりそうなところ

USB to Serial はMACではドライバが必要

組み込み系のケーブルは基本的にはドライバが必要です。
購入した機器により、異なるのですが基本的には「型番」で検索をすると出てきます。
「型番」が不明な場合は、基板上の英数字で検索すればいいと思います。

恐ろしく読みづらいので、私はスマホで撮影して拡大して見ています。

image.png ![image.png](/image/b66528f3-a5f9-46a4-b1be-1bc8b55298d2.png)

GNDレベルを同一にしないとSerial通信ができない

シリアル通信を行う場合、該当の機器と電位差が発生してしまう事があります。
そうすると、うまく通信が行えない場合があるので、各グランド線は同一にしておくと良いです。
※私もこれで通信できず悩みました…

電源が安定化しないと動かない場合がある(書き込み失敗も含む)

今回は3.3Vでしたが、電源がこの電圧を出力できていてもうまく行かない場合があります。
理由として、電気を消費し始めると電圧が下がってしまい安定動作しなくなります。
対策としてキャパシタなどをグランドと3.3Vの間に挟んでおくと、電流が不足した場合にそこから
取得するようなイメージになるので安定化します。
私も電源回路には10μF0.1μFのキャパシタを挟んでいます。

こんな感じです。
image.png

シリアル通信で変な文字が出る

Serialの通信速度が異なる場合になります。
ソースコードで定義されている通信速度に合わせる、または何度か変更してみるのもいいと思います。

Serialが複数ポートあり、選択に失敗している。

私もよく間違えるのですが、2台以上のSerialポートが有る場合に選択を間違えているとうまく動きません。
ツールシリアルポートから選択が可能です。

image.png

書き込みモードにならない

Amazonなどに売っている、書き込み用の機材は一部配線を改造しなければ書き込みできません。
私もこのようにGPIO0GNDショートさせています。
image.png
image.png