M5STACK(13) 時計に温度表示

ブログランキング・にほんブログ村へ

時計に温度府表示を追加してみました。

配線

温度を表示したときの配線と同じです。

ADT7410M5STACK
VDDG
SCL22
SDA21
GND5V

スケッチ

#include <M5Stack.h>
#include <WiFi.h>
#include <Wire.h>
#include "time.h"

// Wi-FiのSSID
char *ssid = "elecom2g-b7052c";
// Wi-Fiのパスワード
char *password = "3214988521041";

#define JST 3600* 9

int ADT7410_ADDR = 0x48; // ADT7410温度センサのアドレス
uint16_t uiVal;
float fVal;
int iVal;

void setup_wifi(){
  Serial.println("Connecting to ");
  Serial.print(ssid);
  // WiFi接続性改善のため、いったん切断
  WiFi.disconnect( true, true ); //WiFi OFF, eraseAP=true
  delay(500);
  // WiFi開始
  WiFi.begin(ssid, password);
  // Wi-Fi接続待ち
  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    M5.Lcd.print(".");
  }
  // WiFi接続成功メッセージの表示
  M5.Lcd.setCursor(0, 10);
  M5.Lcd.setTextSize(2);
  M5.Lcd.println("WiFi Connected.");
  // M5StackのIPアドレスを表示
  M5.Lcd.print("IP address: ");
  M5.Lcd.println(WiFi.localIP());
}

void printLocalTime(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    M5.Lcd.println("Failed to obtain time");
    return;
  }
  // テキストサイズ指定
  M5.Lcd.setTextSize(4);
  // カーソル位置を設定
  M5.Lcd.setCursor(40,80);
  M5.Lcd.printf("%04d-%02d-%02d ", timeinfo.tm_year+1900, timeinfo.tm_mon+1, timeinfo.tm_mday);
  // テキストサイズ指定 
  M5.Lcd.setTextSize(5); 
  // カーソル位置を設定             
  M5.Lcd.setCursor(40,120);
  M5.Lcd.printf("%02d:%02d:%02d",timeinfo.tm_hour,timeinfo.tm_min,timeinfo.tm_sec);
}

void setup(){
  // M5Stack objectの初期化
  M5.begin();
  // Wi-Fi処理の開始
  setup_wifi();
  configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp");//NTPの設定
  //configTime(JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
  printLocalTime();
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);

  // 内部プルアップ抵抗有効化
  pinMode(21, INPUT_PULLUP);
  pinMode(22, INPUT_PULLUP);
  //Serial.begin(9600); // 通信速度を9600bpsに設定
  Wire.begin(); // I2Cバスにマスタとして接続

  
}

void loop(){
  Wire.requestFrom(ADT7410_ADDR, 2); // ADT7410に2byteのデータを要求
  uiVal = (uint16_t)Wire.read() << 8; // 1byte受信し、1byte左シフト
  uiVal |= Wire.read(); // 1byte受信し、前回値に加算
  uiVal >>= 3; // 3bit右シフト
  
  if(uiVal & 0x1000){ // bit 12が1のとき
    iVal = uiVal-0x2000; // 負の温度換算
  }
  else{
    iVal = uiVal; // 正の温度換算
  }
  
  fVal = (float)iVal / 16.0;
   
  //Serial.println(fVal,4);
  M5.Lcd.setTextSize(3);
  M5.Lcd.setCursor(10, 180);
  M5.Lcd.print("Temp:");
  M5.Lcd.print(fVal,1);
  M5.Lcd.print(" Celsius");
  M5.Lcd.setTextSize(3);
  
  
  printLocalTime();
  delay(1000);
}

実行結果












ブログランキング・にほんブログ村へ

  • X

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です