#author("2022-01-30T03:13:34+00:00","","")
#author("2022-02-08T02:42:30+00:00","","")
&size(24){ESP8266とBME280とOLEDをつないでAmbientにデータ送信};

#contents

* やりたいこと [#v1e09ae2]
- WiFiのみのESP8266モジュールを使う~
Wemos D1 Mini NodeMCUのコピー品
Wemos D1 Mini NodeMCUのコピー品(1個400-500円)
- センサーはBME280で温度・湿度・気圧を測定
- 測定値をOLED(32x128の細いやつ)に表示
- Ambientにデータフィードしてグラフ化

* Arduino IDEの設定 [#sdcd5e2b]
** ボードとライブラリの追加 [#n469a96c]
- ボードマネージャにESP8266モジュールを追加する
-- ファイル>環境設定>追加のボードマネージャのURLの右端のアイコンをクリックして追記~
http://arduino.esp8266.com/stable/package_esp8266com_index.json
-- ツール>ボード>ボードマネージャを開いて、ESP8266をインストールする
- ライブラリを追加(ツール>ライブラリを管理)
-- Adafruit BME280 Library
-- ESP8266 and ESP32 OLED driver for SSD1306 displays
-- Ambient ESP32 ESP8622 lib
** ボード書き込みの設定 [#gfd5c9c6]
&ref(ArduinoIDE_ESP8266.jpg);

ボード選択はLOLIN(WEMOS)D1 R2 & miniを選択~
シリアルポートは自分の環境に合わせ、他はデフォルトでOK

* Wemos D1 Miniのピン配列 [#g8d1d84a]
&ref(esp8266-wemos-d1-mini-pinout.png);

* ハードウエア接続 [#rfd25824]
|D1 Mini|OLED|MBE280|
|+3.3V  |VCC |VCC   |
|GND    |GND |GND   |
|D1(GP5)|SCL |SCL   |
|D2(GP4)|SDA |SDA   |

* コード [#s4cf029d]
ボードをWemos D1 miniに指定することで、物理ピン番号の指定が基板に印刷されたD0〜D8で指定可能です。~
数字のみで指定する場合はGPIO番号を使用します。


 // BME280を使ってESP8266で温度・湿度・気圧を測定し、Ambientにデータを送る
 // OLED(32x128)にも表示 更新周期ごとに表示を白黒反転
 // Wemos D1 Mini NodeMCU WiFi
 // 2022.01.30 J.Sawada JQ1BWT
 
 #include <ESP8266WiFi.h>
 #include <Wire.h>
 #include <Adafruit_Sensor.h>
 #include <Adafruit_BME280.h>
 #include <Ambient.h>
 #include <SSD1306Wire.h>
  
 #define PERIOD 300  // 300s = 5min
 #define SEALEVELPRESSURE_HPA (1013.25)
 
 Adafruit_BME280 bme;  //i2c
 WiFiClient client;
 Ambient ambient;
 
 unsigned long delayTime;
 float temp;
 float pressure;
 float humid;
 
 const char* ssid = "WiFi-APのSSID";
 const char* password = "WiFi-APのパスワード";
 
 unsigned int channelId = 00000; // AmbientのチャネルID
 const char* writeKey = "abcdefghijklmnop"; // ライトキー
 
 // SSD1306 OLED (Addr=0x3C, SDA=D2, SCL=D1)
 SSD1306Wire  display(0x3c, D2, D1, GEOMETRY_128_32); // I2C Addr, SDA pin, SCL pin
 
 int disp_inv = 0;
 
 void setup() {
   Serial.begin(115200);
   Serial.println("-------------------");
   Serial.println(" BME280 to Ambient");
   Serial.println("2022.01.30 BWT Lab.");
   Serial.println("-------------------");
 
   //Wire.begin(D2,D1);
 
   // OLED
   display.init();                             //ディスプレイを初期化
   display.clear();
   display.setBrightness(50);                  // ディマー(0〜100で指定)
   display.flipScreenVertically();
   display.setFont(ArialMT_Plain_16);          //フォントを設定 (10/16/24)
   display.drawString(0,0,"BME280 Server");
   display.drawString(0,16,"Device Initialize...");
   display.display();
 
   delay(1000);
 
   bool status;
   status = bme.begin(0x76); //小さい紫色のモジュール
   while (!status) {
     Serial.println("BME280 connection eror");
     delay(1000);
   }
   delayTime = 1000;
   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()); 
   ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化
 
   IPAddress ipadr = WiFi.localIP();
   display.clear();
   display.drawString(0,0,"WiFi Connected!");
   display.drawString(0,16,(String)ipadr[0] + "." + (String)ipadr[1] + "." + (String)ipadr[2] + "." + (String)ipadr[3]);
   display.display();
 
   delay(1000);
 }
 
 
 void loop() { 
   temp=bme.readTemperature();
   pressure=bme.readPressure() / 100.0F;
   humid=bme.readHumidity();
   Serial.print("温度 ;");
   Serial.print(temp);
   Serial.println(" °C");
    
   Serial.print("気圧 ;");
   Serial.print(pressure);
   Serial.println(" hPa");
   Serial.print("湿度 ;");
   Serial.print(humid);
   Serial.println(" %");
   Serial.println();
 
   if(disp_inv == 1) {
     disp_inv = 0;
     display.invertDisplay();
   } else {
     disp_inv = 1;
     display.normalDisplay();
   }
 
   display.clear();
   display.drawString(8,0,(String)temp + "'C  " + (String)humid + "%");
   display.drawString(16,16,(String)pressure + "hPa");
   display.display();
   
   delay(delayTime);
   ambient.set(1, temp); // 温度をデータ1にセット
   ambient.set(2, humid); // 湿度をデータ2にセット
   ambient.set(3, pressure); // 気圧をデータ3にセット
 
   ambient.send(); // データをAmbientに送信
 
   delay(PERIOD * 1000);
 }

* 注意事項、メモ [#j3349675]
- 購入したモジュール~
&ref(ESP-12F.png);~
https://www.amazon.co.jp/gp/product/B07S6G6TWJ/
- 技適が取れていない~
国内では電波法の技適が取れていないので、そのままではWiFiは使えません。~
「技適未取得機器を用いた実験等の特例制度」を使用して、簡単な手続きで180日間使用できます。~
https://www.tele.soumu.go.jp/j/sys/others/exp-sp/
- シリアルモニターが化けます~
プログラム起動後は正常に表示されますが、電源投入直後の部分は化けています。~
シリアルの速度を74880bpsにすると文字化けは解消します。~
これはCH340Gが使用されているせいかもしれません。電源投入直後は74880bpos固定みたいです。~
起動時の文字化けが気になる人はスケッチの一部を修正すると良いです。(シリアルモニターもこの速度にする)~
 void setup() {
   //Serial.begin(115200);
   Serial.begin(74880);
- シルク印刷とGPIO番号の関係
|Pin	|Function			|ESP-8266 Pin	|h
|TX	|TXD				|TXD            |
|RX	|RXD				|RXD            |
|A0	|Analog input, max 3.3V input	|A0             |
|D0	|IO				|GPIO16         |
|D1	|IO, SCL			|GPIO5          |
|D2	|IO, SDA			|GPIO4          |
|D3	|IO, 10k Pull-up		|GPIO0          |
|D4	|IO, 10k Pull-up, BUILTIN_LED	|GPIO2          |
|D5	|IO, SCK			|GPIO14         |
|D6	|IO, MISO			|GPIO12         |
|D7	|IO, MOSI			|GPIO13         |
|D8	|IO, 10k Pull-down, SS		|GPIO15         |
|G	|Ground				|GND            |
|5V	|5V				|-              |
|3V3	|3.3V				|3.3V           |
|RST	|Reset				|RST            |

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS