Skip to content

Commit

Permalink
si7021版の追加
Browse files Browse the repository at this point in the history
  • Loading branch information
bokunimowakaru committed Aug 12, 2023
1 parent e31075b commit b9a6618
Show file tree
Hide file tree
Showing 2 changed files with 144 additions and 0 deletions.
85 changes: 85 additions & 0 deletions 2_example/example09c_hum_si7021/example09c_hum_si7021.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*******************************************************************************
Example 9: (IoTセンサ) Wi-Fi 温湿度計 SILICON LABS製 Si7021 版
デジタルI2Cインタフェース搭載センサから取得した温湿度を送信するIoTセンサです。
温湿度を送信するIoTセンサのクラウドサービスAmbientへの送信機能つき版です。
変更点(example09c_humとの違い):
①デバイスドライバ「i2c_hdc.ino」を「i2c_si7021.ino」へ置き換えた
②初期化関数「hdcSetup」を「si7021Setup」へ書き換えた
Copyright (c) 2016-2019 Wataru KUNINO
********************************************************************************
本サンプルで使用するクラウドサービスAmbient用の設定確認ページ
http://ambidata.io/ch/channels.html
*******************************************************************************/

#include <ESP8266WiFi.h> // ESP8266用ライブラリ
#include <WiFiUdp.h> // UDP通信を行うライブラリ
#include "Ambient.h" // Ambient用のライブラリの組み込み
#define PIN_LED 13 // IO 13(5番ピン)にLEDを接続する
#define SSID "1234ABCD" // 無線LANアクセスポイントのSSID
#define PASS "password" // パスワード
#define AmbientChannelId 100 // チャネルID(整数)
#define AmbientWriteKey "0123456789abcdef" // ライトキー(16桁の16進数)
#define SENDTO "192.168.0.255" // 送信先のIPアドレス
#define PORT 1024 // 送信のポート番号
#define SLEEP_P 29*60*1000000ul // スリープ時間 29分(uint32_t)
#define DEVICE "humid_1," // デバイス名(5文字+"_"+番号+",")
void sleep();
Ambient ambient;
WiFiClient client;

void setup(){ // 起動時に一度だけ実行する関数
int waiting=0; // アクセスポイント接続待ち用
pinMode(PIN_LED,OUTPUT); // LED用ポートを出力に
digitalWrite(PIN_LED,HIGH); // LEDの点灯
si7021Setup(); // 湿度センサの初期化
Serial.begin(9600); // 動作確認のためのシリアル出力開始
Serial.println("Example 09C HUM->Amb"); // 「Example 09」をシリアル出力表示
WiFi.mode(WIFI_STA); // 無線LANをSTAモードに設定
WiFi.begin(SSID,PASS); // 無線LANアクセスポイントへ接続
while(WiFi.status() != WL_CONNECTED){ // 接続に成功するまで待つ
delay(100); // 待ち時間処理
waiting++; // 待ち時間カウンタを1加算する
if(waiting%10==0)Serial.print('.'); // 進捗表示
if(waiting > 300) sleep(); // 300回(30秒)を過ぎたらスリープ
}
Serial.println(WiFi.localIP()); // 本機のIPアドレスをシリアル出力
ambient.begin(AmbientChannelId, AmbientWriteKey, &client); // Ambient開始
}

void loop(){
WiFiUDP udp; // UDP通信用のインスタンスを定義
float temp,hum; // センサ用の浮動小数点数型変数
char s[6];

temp=getTemp(); // 温度を取得して変数tempに代入
hum =getHum(); // 湿度を取得して変数humに代入
if( temp>-100. && hum>=0.){ // 適切な値の時
udp.beginPacket(SENDTO, PORT); // UDP送信先を設定
udp.print(DEVICE); // デバイス名を送信
udp.print(temp,1); // 変数tempの値を送信
Serial.print(temp,2); // シリアル出力表示
udp.print(", "); // 「,」カンマを送信
Serial.print(", "); // シリアル出力表示
udp.println(hum,1); // 変数humの値を送信
Serial.println(hum,2); // シリアル出力表示
udp.endPacket(); // UDP送信の終了(実際に送信する)
/* クラウドへ */
dtostrf(temp,-5,2,s); // 温度を文字列に変換
ambient.set(1,s); // Ambient(データ1)へ温度を送信
dtostrf(hum,-5,2,s); // 湿度を文字列に変換
ambient.set(2,s); // Ambient(データ2)へ湿度を送信
ambient.send(); // Ambient送信の終了(実際に送信する)
}
sleep();
}

void sleep(){
digitalWrite(PIN_LED,LOW); // LEDの消灯
delay(200); // 送信待ち時間
ESP.deepSleep(SLEEP_P,WAKE_RF_DEFAULT); // スリープモードへ移行する
while(1){ // 繰り返し処理
delay(100); // 100msの待ち時間処理
} // 繰り返し中にスリープへ移行
}
59 changes: 59 additions & 0 deletions 2_example/example09c_hum_si7021/i2c_si7021.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*********************************************************************
本ソースリストおよびソフトウェアは、ライセンスフリーです。(詳細は別記)
利用、編集、再配布等が自由に行えますが、著作権表示の改変は禁止します。
I2C接続の温湿度センサの値を読み取る
SILICON LABS社 Si7021
Copyright (c) 2017-2019 Wataru KUNINO
https://bokunimo.net/bokunimowakaru/
*********************************************************************/

#include <Wire.h>
#define I2C_si7021 0x40 // Si7021 の I2C アドレス

float _i2c_si7021_hum;

float getTemp(){
int temp,hum;
_i2c_si7021_hum=-999.;
Wire.beginTransmission(I2C_si7021);
Wire.write(0xF5);
if(Wire.endTransmission()) return -999.;

delay(30); // 15ms以上
Wire.requestFrom(I2C_si7021,2);
if(Wire.available()!=2) return -999.;
hum = Wire.read();
hum <<= 8;
hum += Wire.read();

delay(18); // 15ms以上
Wire.beginTransmission(I2C_si7021);
Wire.write(0xE0);
if(Wire.endTransmission()) return -989.;

delay(30); // 15ms以上
Wire.requestFrom(I2C_si7021,2);
if(Wire.available()!=2) return -999.;
temp = Wire.read();
temp <<= 8;
temp += Wire.read();

_i2c_si7021_hum = (float)hum / 65536. * 125. - 6.;
return (float)temp / 65535. * 175.72 - 46.85;
}

float getHum(){
return _i2c_si7021_hum;
}

void si7021Setup(){
delay(2); // 1ms以上
Wire.begin(); // I2Cインタフェースの使用を開始
delay(18); // 15ms以上
Wire.beginTransmission(I2C_si7021);
Wire.write(0xE6);
Wire.write(0x3A);
Wire.endTransmission();
delay(18); // 15ms以上
}

0 comments on commit b9a6618

Please sign in to comment.