エントリー

カテゴリー「気象センサー」の検索結果は以下のとおりです。

なんちゃって百葉箱を作ってみる

ESP8266と気象センサを使って,なんちゃって百葉箱を作ってみる

なんちゃってといっても実用レベルを目指すつもり

いろんな試行実験が必要なので完成までは時間が掛かる予定

はじめに

実のところデジタルセンサで百葉箱を作ろう計画はかなり前からあり研究準備していた

と,いうのも現在住んでる場所が山の側であり市街に設置されていたアメダスと気温が(-2℃位)異なるため自宅付近の気温をロギングしたかったためであった

それが2年前8月にアメダスが近く(300m位離れた場所)に引っ越してきたため作製の意欲が無くなり現在に至ることとなる

準備したパーツも勿体ないので重い腰を上げたって感じでもある

arduinoIDE

基盤はESP8266であり久々に使うことになるのだが,先ずアップデートされたarduinoIDE(ボードESP8266選択)で(かなり)嵌る

Setup.png

設定が増えていて「Crystal Freequency」を26MHzに設定しないと古いESP8266では問題が生じるようだ

例えばシリアル出力が指定bps通りに出力されず文字化けする

ESP8266でDHT11とLPS25Hを試す

IMG_20180909_102030659_BURST001.jpgIMG_20180909_135921606.jpg

Arduinoで試していたDHT11とLPS25HのスケッチがあるのでESP8266で動作させてみたところ,DHT11は(DHT22も)動作したがLPS25HはCPU依存コードもあってか動作不良となった

  • sizeof(int)の違い
  • ESP8266のバイトオーダーはLSBファースト

ほどなくスケッチの解決はしたが,LPS25HをESP8266とArduino(ATMega328P)で差し替えしながら計測値を比べていたところ情けない事に逆差しして破壊してしまう

IMG_20180915_210806939.jpg

大気圧センサとしてLPS25H,気温・湿度センサとしてSHT31を高精度なので利用しようと考えていたため残念なことに・・・既にLPS25Hは販売していないのでBME280に変更を余儀なくされた

BME280を使う

BME280からのデータ取得はややこしかったのでライブラリをこちらからいただくことにして入出力部をSPIからI2Cへとコンストラクタを修正

ESP8266のデフォルトのI2Cピンアサインは、SDA: IO04, SCL: IO05だが Wire.begin(SDA, SCL); で指定可能

BME280は省電力モードで使用

サーバ

データは自前のWebサーバで受けMySQLでDB化,閲覧には見栄えするグラフ化を予定

DBは以下のとおりテーブルを3個

CREATE TABLE IF NOT EXISTS `LOG` (
  `LOCATION`       char(2)         DEFAULT NULL COMMENT '計測場所(ID)'
, `DATETIME`       datetime        DEFAULT NULL COMMENT '適用日'
, `PRESSURE`       decimal(6,2)    DEFAULT NULL COMMENT '気圧'
, `TEMPERATURE`    decimal(4,2)    DEFAULT NULL COMMENT '気温'
, `HUMIDITY`       decimal(4,2)    DEFAULT NULL COMMENT '湿度'
, `BATTERY_VOLT`   decimal(4,2)    DEFAULT NULL COMMENT 'バッテリー電圧'
, `BATTERY_TEMP`   decimal(4,2)    DEFAULT NULL COMMENT 'バッテリー温度'
, PRIMARY KEY (`LOCATION`, `DATETIME`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='気象データログ'

CREATE TABLE IF NOT EXISTS `LOCATION` (
   `ID`             char(2)         DEFAULT NULL COMMENT '計測場所ID'
, `NAME`           varchar(32)     DEFAULT NULL COMMENT '計測場所名'
, `STATUS`         boolean         DEFAULT NULL COMMENT '計測有効'
, `PRES_ID`        char(2)         DEFAULT NULL COMMENT '気圧センサID'
, `TEMP_ID`        char(2)         DEFAULT NULL COMMENT '気温センサID'
, `HUMI_ID`        char(2)         DEFAULT NULL COMMENT '湿度センサID'
, PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='計測場所'

CREATE TABLE IF NOT EXISTS `SENSOR` (
  `ID`             char(2)         DEFAULT NULL COMMENT 'センサID'
, `NAME`           varchar(32)     DEFAULT NULL COMMENT '名称'
, `VENDOR`         varchar(32)     DEFAULT NULL COMMENT '売り手'
, PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='センサ'

受けはPHPでプログラミングして今回はPOSTを使用(GETは手動確認用で使う)

<?php

//自宅アメダス : 気象データ(気圧,気温,湿度)を登録
//
//コード:UTF-8N
// 行末:LF
//TAB:4

//インターフェイスチェック
if(php_sapi_name() == "cli") {
    //コマンドラインで実行
   exit(0);
}
//Web経由で実行

//登録データ取得
$inLoc  = empty($_POST['LOC'])? empty($_GET['LOC'])? "0":$_GET['LOC']: $_POST['LOC'];  //計測場所
$inPres = empty($_POST['PRES'])?empty($_GET['PRES'])? "":$_GET['PRES']:$_POST['PRES']; //気圧
$inTemp = empty($_POST['TEMP'])?empty($_GET['TEMP'])? "":$_GET['TEMP']:$_POST['TEMP']; //気温
$inHumi = empty($_POST['HUMI'])?empty($_GET['HUMI'])? "":$_GET['HUMI']:$_POST['HUMI']; //湿度

$inBVolt = empty($_POST['BVOLT'])?empty($_GET['BVOLT'])? "":$_GET['BVOLT']:$_POST['BVOLT']; //バッテリー電圧
$inBTemp = empty($_POST['BTEMP'])?empty($_GET['BTEMP'])? "":$_GET['BTEMP']:$_POST['BTEMP']; //バッテリー温度

if(empty($inLoc) || empty($inPres) && empty($inTemp) && empty($inHumi)) {
   //パラメタエラー
   $content .= "Error.\n";
} else {

    //DB接続
    $db = new mysqli("localhost", "tenki", "tenki", "tenki");
   $db->query("set names utf8");

    //登録
    $sql = "insert into LOG (LOCATION, DATETIME, PRESSURE, TEMPERATURE, HUMIDITY, BATTERY_VOLT, BATTERY_TEMP)";
   $sql .= " values (${inLoc}, now(), '${inPres}', '${inTemp}', '${inHumi}', '${inBVolt}', '${inBTemp}')";
    $db->query($sql);
    $db->close();
    $content .= "Ok.\n";
}

//コンテンツ出力
echo $content;

?>
消費電力

ESP8266とサーバ側のDB登録が出来ているので消費電力の確認を行った

IMG_20180924_200700705.jpg

(Waitで1分毎にデータをDB登録)

IMG_20180924_210738254.jpg

1時間で累積42mAhとなる

(ディープスリープ使用で10分毎にデータをDB登録)

IMG_20180927_060539865.jpg

12時間で8mAhとなった

これは先人様が計測されているのと変わりないようである

また(WiFi有効の)起動時には300mA,通信時には約70mA程流れるらしい

気象用センサーの仕様

手持ちの気象用センサー仕様をまとめてみる

  BME280 SHT31 DHT11 DHT22/AM2302 LPS25H
基本仕様
電源電圧(V) 1.71~3.6 2.4~5.5 3.3~5.5 5(3.5~5.5) 1.7~3.6
通信方式 I2C/SPI I2C シリアル単線 シリアル単線 I2C/SPI
動作温度(℃)   0~90      
温度(℃)
範囲 -40~+85 -40~+125 0~+50 -40~+80 -30~105
精度 ±1 ±0.2 ±2 ±0.5 ±2
分解能 0.01      
湿度(%)
範囲 0~100 0~100 20~90 0~99.9  
精度 ±3 ±2 ±5 ±2  
分解能 0.008        
気圧(hPa)
範囲 300~1100       260~1260
精度 ±1       ±0.2
分解能 0.18        

AM2302は中華から購入(¥453/個)

IMG_20180814_192549836.jpgIMG_20180814_192626230.jpg

BMP280(左),BME280(右)をI2Cで使用する場合の結線

IMG_20190504_135159994.jpg

BMP280のVDDIOを接続しないとSPIになるそうだが接続しなくても良いようだ

BMP280のSCL,SDAはプルアップされている

BME280のJ1~J3をジャンパしたのでSCL,SDAはプルアップされI2Cアドレスが0x76になる(説明書

 

気象関係センサーの使い道を考える

温度,湿度,気圧センサーを使って何ができるか(ぼちぼち)考えてみる

もう1つ雷センサーがあるが検証する方法が現状ないので置いてある

この雷センサーも追加して考える

設置型運用

気象観測(温・湿・圧)

  • いわゆるアメダスのような物
  • 時刻取得とログ機能が必要
  • 公開するならWebサーバへデータを送り込む機能が必要
  • サーバへデータを送り込むなら時刻(RTC)は無くてもよい
  • 降水量がわからないとダメか
  • ログから天気予報を出せないか

部屋の温度管理(温・湿)

  • データはWebサーバで収集して全部屋の温湿度を参照できるようにする
  • 外気温も欲しい
  • 火災報知器になるかな?(反応が遅いので不向きだけど)
移動型運用

以下の機能を持ち歩けるようにする

センサー,表示部以外にブザーがいるかな

  • 温度計
  • WBGT(暑さ指数)監視
  • 高度計
  • 相対的な高度計
  • 雷警告
参考

iPhone6には気圧センサーが搭載されており移動時の高度ログを作っている

例えば運動用センサーとして高低差を見てエネルギー消費量の計算を行ったり,現状気圧から天気予報も行うようだ

人がいるところに限定されるけど全スマホから気圧情報をかき集めたら気圧マップができそうだね

設置型でデータ収集(転送)をどうするか?いろいろ調べていたらEPS-WROOM-02が面白そうだ(懸案なのは消費電力かな)

大気圧センサ(LPS25H)を試す

これまでの続きで大気圧センサ(LPS25H)を試してみる

温湿度センサを繋いでいるブレッドボードに追加

FSTN液晶モジュールもそのままにしてあるためSPIで接続しCSを8にする

 (LPS25H)      (arduino)          (ATMEGA328P)
1    VDD        +3.3V
 2    SCL        13                    19                SPI共通
 3    SDA/SDI    11                    17                SPI共通
4    SAO/SDO    12                    18                SPI共通
5    CS          8                    14                SPI別
6    NC
7    INT1
8    GND        GND

こちらからライブラリをいただいてテストプログラムを調整

// 大気圧センサLPS25H(SPI接続)のテスト
//
#include <SPI.h>
#include "skLPSxxSPI.h"

#define LPS25H_CS    8

skLPSxxx LPS(LPS25H,LPS25H_CS);             // デバイスはLPS25Hを指定

void setup() {
    int ans;

    // シリアルモニターの設定
    Serial.begin(9600);
    // SPIの初期化
    SPI.begin();                            // SPIを行う為の初期化
    SPI.setBitOrder(MSBFIRST);              // ビットオーダー
    SPI.setClockDivider(SPI_CLOCK_DIV4);    // クロック(CLK)をシステムクロックの1/4で使用(16MHz/4)
    SPI.setDataMode(SPI_MODE3);             // クロック極性 1(HIGH) クロック位相 1(HIGH)

    pinMode(LPS25H_CS, OUTPUT);             // 気圧センサーのCS

    delay(3000);                            // 3Sしたら開始

    // 気圧センサの初期化を行う(更新速度は1Hz)
    ans = LPS.PressureInit();
    if(ans == 0) {
        Serial.println("Initialization normal");
    } else {
        Serial.print("Initialization abnormal ans=");
        Serial.println(ans);
    }
    delay(1000);
}
void loop() {
    LPS.PressureRead();                     // 圧力と温度を読み出す
    Serial.print("[LPS25H]");
    Serial.print(Press);                    // 気圧値の表示を行う
    Serial.print(" hPa  ");
    Serial.print(Temp);                     // 温度の表示を行う
    Serial.println(" 'C");

    delay(1000);                            // 1秒後に繰り返す
}

 

特に問題なく動作確認完了

 

ページ移動

ユーティリティ

検索

エントリー検索フォーム
キーワード

過去ログ

Feed