M5 CoreInkで温度計!(その①)
のつづきー
CoreInkは何と言ってもE-inkなので画面点けっぱなしでも電池が持つのです。(原理的に書き換える時にしか電気つかわない)なので、外部バッテリーを付けなくても長時間ログ取りできるんじゃないかしらん? というわけで、
https://www.switch-science.com/catalog/6344/
これを接続して温度を計ってみます。
サンプルスケッチ
公式のサンプルは、
ファイルー>スケッチ例ー>M5Stackー>Unitー>ENVII_SHT30_BMP280 というやつ。
ENV2とENV(無印)は違うので注意です。
でも、CoreInkではこのまま実行してもうまく動きません。
M5.Lcd.
と書かれている行をみんなコメントアウトして、
/*
Description: Use ENV II Unit to read temperature, humidity, atmospheric pressure, and display the data on the screen.
Please install library before compiling:
Adafruit BMP280: https://github.com/adafruit/Adafruit_BMP280_Library
-----
This Version is for M5 CoreInk Mod ! by Rasen
*/
#include <M5Stack.h>
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>
#include "SHT3X.h"
SHT3X sht30;
Adafruit_BMP280 bme;
float tmp = 0.0;
float hum = 0.0;
float pressure = 0.0;
void setup() {
M5.begin();
// M5.Power.begin();
Wire.begin();
// M5.Lcd.setBrightness(10);
// M5.Lcd.setTextSize(3);
Serial.println(F("ENV Unit(SHT30 and BMP280) test..."));
while (!bme.begin(0x76)){
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
// M5.Lcd.println("Could not find a valid BMP280 sensor, check wiring!");
}
// M5.Lcd.clear(BLACK);
}
void loop() {
pressure = bme.readPressure();
if(sht30.get()==0){
tmp = sht30.cTemp;
hum = sht30.humidity;
}
Serial.printf("Temperatura: %2.2f*C Humedad: %0.2f%% Pressure: %0.2fPa\r\n", tmp, hum, pressure);
//M5.Lcd.setCursor(0, 0);
//M5.Lcd.setTextColor(WHITE, BLACK);
//M5.Lcd.printf("Temp: %2.1f \r\nHumi: %2.0f%% \r\nPressure:%2.0fPa\r\n", tmp, hum, pressure);
delay(100);
}
こんなかんじのソースに書き換えてから実行します。
行頭に // と書かれているのがコメント行。その行はムシしてね!と言う意味ですね。
何しろCoreInkさんにはLCDパネルが付いていない(e-inkなので)で、LCD関係のコードそのままではうまく実行できないのです(変なエラーになりますからやめておきましょうw<ーやった人)
実行してみると、画面には当然何にも出てきませんが、
↑の虫眼鏡っぽいアイコンのボタンを押して、シリアルモニタを開きます。
LCDがない代わりにこっちにでてるわけです。
よしよし、ちゃんと温度とか取れてる感じですね。(ちょっとさむいw)
あらためてHelloWorld!
でもやっぱり画面に出したいじゃん。ってわけで、(先に脇道に突き進んじゃいましたけどw)やっぱりHelloWorldからやらないとね。
スケッチ例からM5-CoreInkー>HelloWorldをさがしてきます。
ソースはこんなかんじでした
#include "M5CoreInk.h"
Ink_Sprite InkPageSprite(&M5.M5Ink);
void setup() {
M5.begin();
if( !M5.M5Ink.isInit())
{
Serial.printf("Ink Init faild");
while (1) delay(100);
}
M5.M5Ink.clear();
delay(1000);
//creat ink refresh Sprite
if( InkPageSprite.creatSprite(0,0,200,200,true) != 0 )
{
Serial.printf("Ink Sprite creat faild");
}
InkPageSprite.drawString(35,50,"Hello World!");
InkPageSprite.pushSprite();
}
void loop() {
}
ふむみ、LCD関係とはだいぶ違ってますね。
とりあえず実行。
(∩´∀`)∩☆
味もそっけも……いえいえ、シンプルで素敵な表示ですねw
ソースコードにあるようにいろいろオマジナイは必要なようですが、文字を出すぐらいは簡単なようです。
ただし!
ご注意
に赤文字であるとおり、
画面の書き換えは15分の1秒ではなく、15秒に1回が推奨とのこと。
ぱかぱか書き換えると画面が壊れてしまって修復不能になるそうです。
これは注意しておかないとですねー><
先ほどの ENV2ユニットのテストで使っていた
delay(100);
なんてインターバルは御法度もいいところだった模様><
画面だしてなくてよかった。ε-(´∀`*)ホッ
合体!(∩´∀`)∩☆
ではこの表示(HelloWorld)と温度センサーのプログラムを合体させてみましょう。
さくっと合体させたプログラムがこれ
#include "M5CoreInk.h"
// #include <M5Stack.h> ↑にはいってます
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>
#include "SHT3X.h"
SHT3X sht30;
Adafruit_BMP280 bme;
Ink_Sprite InkPageSprite(&M5.M5Ink); // Eink表示オマジナイ
float tmp = 0.0;
float hum = 0.0;
float pressure = 0.0;
char tempStrbuff[64];
char pressStrbuff[64];
void setup() {
M5.begin();
// Eink初期設定
if( !M5.M5Ink.isInit())
{
Serial.printf("Ink Init faild");
while (1) delay(100);
}
M5.M5Ink.clear();
delay(1000);
//creat ink refresh Sprite
if( InkPageSprite.creatSprite(0,0,200,200,true) != 0 )
{
Serial.printf("Ink Sprite creat faild");
}
Wire.begin();
Serial.println(F("ENV Unit(SHT30 and BMP280) test..."));
while (!bme.begin(0x76)){
Serial.println("Could not find a valid BMP280 sensor, check wiring!");
}
}
void loop() {
pressure = bme.readPressure();
if(sht30.get()==0){
tmp = sht30.cTemp;
hum = sht30.humidity;
}
Serial.printf("Temperatura: %2.2f*C Humedad: %0.2f%% Pressure: %0.2fPa\r\n", tmp, hum, pressure);
sprintf(tempStrbuff,"%2.2f*C : %0.2f%% ", tmp, hum);
sprintf(pressStrbuff,"%0.2fPa", pressure);
InkPageSprite.drawString(10,100,tempStrbuff);
InkPageSprite.drawString(10,130,pressStrbuff);
InkPageSprite.pushSprite();
delay(15000);
}
ほぼまんまですねw
キモは最後の delay(15000); でループを15秒待つことと、一行に表示させようとすると表示しきれなかったので2行に分けたことぐらいでしょうか。
※Serial.printf でシリアルモニタへ送っている情報はサンプルのままです。
実行してみましょう☆
出てます出てます☆ (例によって味も素っ気もないですけどw)
シリアルモニタも
こんな感じでちゃんと取れています。15秒ごとにデータ取り込んでいることがわかりますね~☆
とゆーわけで、気温も測れてEインク表示もできたのでとりあえず今回はここまで。
次回以降、見た目の調整やログ機能、それにRTC(リアルタイムクロック)が入ってるそうなのでその機能の利用なんかもやってみたいとおもいます☆
よろしければサポートお願いします!いただいたサポートはクリエイターとしての活動費にさせていただきます!感謝!,,Ծ‸Ծ,,