環境計の製作構想・・・

気圧計の表示は見ていて結構面白いので、製作してみたかった。
そしてそれを当局のシャックか実験室に常駐させる事にしました。
センサにBME280を使用し、気圧のみならず気温と湿度もついでに表示させる。
この3点セットで「環境計」と名乗っても許されるかなと思った・・・

(1)有機ELディスプレイ(OLED)による、気圧・気温・相対湿度のデジタル表示
  測定値をなるべく見易い様にと有機EL表示器を使用する事にしました。

(2)フルカラーLEDによる、気圧の発色表示
  本器から離れていても、概ね気圧値が解る様にしてみたかった。

(3)ケース
  当局の苦手なケースですが、LEDを投影できるスクリーン兼用プラ・ケース
  自分で使うので、とりあえず百均ででも適当に探してくるかな
  これは不格好でも笑って許して欲しい・・・

↑ 回路図

PIC接続モジュール類はI2C接続
よって配線が楽になっています







↑ 基板スライドSW部分

右側がRA3、右から2番目がRA4
右から3番目がRA5に接続
この状態で気圧の発色表示します

中央ピン2個は3.3V電源出力
左側ピン2個はI2Cバス、下側がSCL



↑ OELD実働試験

文字表示はくっきり綺麗です
上段が気圧と不快指数表示
下段が気温と湿度の表示



↑ フルカラーLEDの発光
基板の四隅に設置しているので、ケースのふた部分を照らす事になります。

ハードウエアの構想および概要

(1)14ピンのPIC16F18326を使用
  メモリ容量が大きいので、当局の様な素人でも気楽にCプログラムを書きまくれます。

(2)センサ等へのインターフェイスとしてI2Cバスを用意
  今回は内蔵MSSPモジュールを使用し、RC0,RC1をI2Cバスとして使用します。
  基板上のバス接続コネクタは2ポートを用意
  RC0=SCL、RC1=SDAとなり,基板上でプルアップされます。

(3)フルカラーLEDを4基装備
  基板の4箇所の隅に設置、並列接続となります。
  PIC+TRによるドライブで、ジャンパピンで1~4個を選択できます。
  RC3=RED、RC4=GREEN、RC5=BLUEとなります。

(4)AE-BME280環境センサモジュール
  I2Cバスに接続、気圧・気温・湿度を測定

(5)AE-SO1602 16桁2行OELDモジュール
  I2Cバスに接続、表示文字がくっきり見えますが、文字がやや小さめ。
  ちょっとお高いのが難点・・・ (-_-)
  BME280とSO1602が本器のコストの大半を占めます。

PIC16F1823機能基本設定

・システムクロックは内部発振16MHZと2xPLLで32MHZ
・RCポートはRC0-RC1はI2Cバスに、RC2-5はLED駆動に使用
・RAポートはRA0-RA2はADC入力、RA3-RA5はスイッチ入力に使用
・タイマ0によるインタバル割込みを使用、割込みルーチン内にLEDの変調処理

PIC16F18326は16F1823とはメモリ容量程度の差だろうと勝手に思い込んでました。
所が、いきなりシステムクロック関連からして変更で、まるで動作せず。
システムクロック関連新設レジスタの設定でデバッグ用LEDが点灯し始め、
PPSおよびモジュールOFF関連レジスタ設定でMSSPも動作するようになりました。
これでディスプレイとセンサが動作し始めました。
さらにタイマ0が高機能化されており、把握するのに、またひと手間掛かりました・・・
これでタイマ0による割込みも動作し始め、ようやく先が見えてきました・・・

↑ SRAC-01 ACアダプタ

付属のプラグを下記左側の物に変えます











↑ 使用した百均のプラ・ケース



↑ 基板・モジュール類を配置



↑ 正面からの画像

OELDの下中央にあるのがコンデンサマイク
電源ジャックは右側側面
センサは背面に配置



↑ ACアダプタで動作させています

実機の製作

使用PICは14ピンPIC16F18326で、基板は秋月の穴あきB基板です。
接続周辺モジュールの関係上、PICを3.3Vで駆動します。
よって、基板にICSP端子は作りませんでした。
電源は外部6Vで、内部で3.3Vに安定化します。
ただし、LEDにはそのまま6Vを供給します。
電池駆動もできない事は無いと思いますが、LED_OFFでも長時間持ちません。
LEDは秋月で購入の、「OSTA71A1D-A」で角形のモジュールでアノードコモンです。
これを4個並列接続し、コモン側ジャンパ切り替えで駆動数を変えられます。
LED内部各色エレメントは約15~20mAを流し、最大240mA電流消費します。
外部電源は400mA以上の容量が必要です。
このLEDは熱に弱い様で、はんだ付けには注意が必要です。

LEDドライブは2SC1815GRで行い、PICポート=1でONとなります。
ドライブするLEDの数は、ジャンパピンで選択し、最大4つです。
TRはただのスイッチング用途なので、極端にHFEが低く無ければ何でもOKです。

OELD表示器は16桁2行で、1行に2数値表示とちょっと苦しいです。
1行目に気圧と(hPa)、不快指数(単位無)、
2行目に気温(℃)と湿度(%)を常に表示します。
表示は小数点以下1位までで、2位以下は切り捨てています。
スイッチでの表示内容切替は今の所対応していません。

コンデンサマイク付低周波アンプと整流回路をRA2に接続しています。
これを音圧センサとしていますが、発色用の遊びで、特に意味はありません。
アンプ部分は、トランジスタ等ディスクリート部品で作っています。
1段増幅では電圧利得が足りないので、低周波2段の簡素な増幅回路です。
2段では増幅度も結構高くなり、気を抜くと発振してしまいます。
また、最大増幅度では、結構電源雑音や些細な振動も拾います、
その他雑音電圧で、何もしていなくても整流出力が0.3~0.5V程出力されます。
基板内VRは増幅度を可変しますので、感度調整として使用します
PIC側入力調整用VRは省く事にしました。
出力電圧がPIC側VDDを超えないように感度調整します。
場合によっては送信機からのRF回り込みが考えられますが、対策はしていません。

RA0、RA1ピンが余ってしまったのが悔しいです・・・
基板上の余裕も無いし、簡単面白センサも思い浮かばないので放置としました・・・

スイッチ類
RA3~5をSW0~2として、基板用スライドSWを使用しました。
今回は発色のソース切り替え用に使用しています。
実働してみて、ただのジャンパピンで良かったなと後悔しています

ケースは百均で購入したプラ・ケースで、お世辞にもかっこ良くないです・・・
発色用スクリーンとしてもイマイチですが、安価(0.1K)なので良しとしました。

ACアダプタは秋月でO.2K円で購入した、SRAC-01スイッチング電源です。
出力は6V1Aで本器には十分な容量で、小型で安価で文句無の電源です。
ただし、出力DCプラグが小さいサイズで対応ジャックの手持ちが無かった。
よって、出力コードを切断して2.1mmの標準的なプラグに変更しています。
ジャックも2.1mm用の標準的なもので、本器には電源スイッチはありません。
このアダプタからの電源供給で今の所は本器の長時間動作に支障は出ていません。
使用ソースファイル

 16F18326_ENV_METER01d.c

 MSSP02b.h
 MSSP02b.c

 SO1602v1.h
 SO1602v1.c

 BME280v1.h
 BME280v1.c
ソースファイル 概要

(1)MSSP・I2Cマスタモード低レベル関数 MSSP0.2b
  今の所は安定してアクセスできるので、使用バージョン変わらず。
  まだまだI2Cバスの仕様を満たしていないのは今まで道理です。

(2)LCDアクセス関数群 SO1602v1
  3.3V I2C接続の有機ELディスプレイ用です。
  見易いAQM1602と言った所です。
  基本的な関数の使用方法はAQM1602v1と同じです。

(3)センサアクセス関数群 BME280v1
  レジスタアクセス関数、補正データ読込関数、測定生データ読込関数、
  キャリブレート関数で構成されています。
  
(4)フルカラーLED制御関数
  ソフトウエアでON/OFF制御するため、割込み処理部分に存在します。
  1周期長は0~255回の任意
  1周期長を分母として、RBG各色の1周期長を設定します。
  1周期長を255回(0xFF)とした場合、255回呼び出されて1周期となります。
  その場合、数十us間隔で呼び出されないと、うまく発色できなくなります。

(5)10bitADC取得関数 GET_ADC2( )
  基準電圧はVDDとしています。
  RA2ピンをアナログ2入力として、外部からのアナログ電圧を取得します。
  戻値:10bitADC値(16bit符号無整数)

(6)気圧用の発色関数 GET_CLP( )
  引値:気圧値(16bit符号無整数)
  戻値:RBGデータ(32bit符号無整数)
  とりあえず、980hPa~1029hPaで、1hPa刻みで発色変化。
  赤色系~青白系
  「PICEYE」で作った発色ツールを使い色々考えてはみましたが・・・
  悩むと際限が無いのでこの辺で妥協です・・・

(7)気温用の発色関数 GET_CLT( )
  引値:気圧値(16bit符号有整数)
  戻値:RBGデータ(32bit符号無整数)
  とりあえず、-20℃~+30℃で、1℃刻みで発色変化。
  青系~赤系と変化します、色変化はADC用とは違います

(8)ADC値用の発色関数 GET_CLA( )
  引値:ADC値(16bit符号無整数)
  戻値:RBGデータ(32bit符号無整数)
  青色系~赤系

(9)不快指数用の発色関数 GET_CLD( )
  引値:不快指数値(8bit符号無整数)
  戻値:RBGデータ(32bit符号無整数)
  あまり必要なさそうですが、5段階くらいで発色変化
  75以下 グリーン
  76~79 ブルー
  80~84 イエロー
  85~89 オレンジ
  90以上 レッド

(10)スイッチの状態取得関数 GET_SW( )
  引値:無
  戻値:SW0~SW2のデータ(8bit符号無整数)
  下位3bitが対応します


(11)メイン関数
  LCDに計算数値を表示し、スイッチ切り替えで発色モードを変更します

  1)LCD表示は固定です
    1行目 気圧・不快指数
    2行目 温度・湿度
  2)発色モード切替
    SW0~SW2(RA3~RA5)の入力組合せで下記の発色変化表示します。
    ⑦111 気圧
    ⑥110 気温
    ⑤101 不快指数
    ④100 音圧(外部アナログ電圧入力)
    〇000 発光一時停止(割り込みは動作している)
  3)不快指数の演算
    計算式は下記(Discomfort)
    不快指数(DI)=0.81T+0.01H(0.99T-14.3)+46.3
    ※ T=℃、H=%RH
  4)タイマ0による割込み
    約256インストラクションで割込みを掛けています。(注1)
    32MHZ=0.125us/インストラクション
    約32us間隔で割込み発生の計算になりますが・・・
    割込みルーチンがどの程度命令消費しているのか不明です・・・
    アッセンブラだと指折り数える事が出来るのですがね。 (^_^;)
    1周期は255回に設定してますので、約8.2msで1周期となります。
    TMR0がせっかく16bitになったのに、8bit分しか使用していません・・・

注1)256インストラクション
   ここでは、アッセンブラ命令に換算して、256命令数と言う意味です。
   あと、カウント・リスタート時のクロック消費を換算していません。

↑ 今回使用したPIC16F18326
結果および感想

シャックに飾る、実用的なアクセサリとして製作してみました。
QSOネタに、お天気に加え気圧を挿入するのも、ちょっと良いかも・・・
収納ケースが貧弱なのが気がかりですが、ご勘弁を。
有機EL表示器は見易いはずなのですが、物理的大きさが小さいので、まあまあかな程度。
グラフィックLCDにして、3~4行同時表示にした方が良かったかも・・・

LED発色による気圧表示も、慣れると意外と大体解る様になります。
多少離れていても、チラ見で認知できるのが便利です。
数時間の内に色変化すると、大概お天気が変わりますので、見てて面白いです。
音圧による発色は、使用してみてすぐ飽きたので、不要と思われました・・・
気温や不快指数の発色表示も無くとも良かったかも・・・
そもそも体感できるのでね。

その他
今回の製作物は、以前公開の「PICEYE」を環境センサ表示機能版にした感じです。
実際、色表示ルーチンは「PICEYE」からXC8用に移植しただけです。
事実上「PICEYE」第2弾と言った所です。
LED4個は結構明るいので、夜は目障りかも・・・

メモリ16KWのPIC16F18326はXC8でのプログラムに最適です。
浮動小数点を含む演算が簡単に行えるのに感激!!
printf()文がLCDに対して普通に使えるのはさらに感激!!!
大昔のパソコンでのBASICプログラミングの感覚を思い出します・・・

実は初期構想では、LCDにAQM1602で、見ずらいが実用本位の環境計器
持ち運び簡単で乾電池3本駆動で数ヶ月持たせる、と言うのがありました・・・
しかし、光るもの大好きな当局は14ピンPIC+AC駆動に走ったのでした・・・
変更ソースファイル

XC8:メインソースファイル

 16F18326_ENV_METER01e.c


XC8:制御関数群

 BME280v1a.h

 BME280v1a.c


MSSP関数及びSO1602用関数はそのままで使用
追記 2019年10月16日

「BME280v1」制御関数群の小変更を行いました。
それに伴い、メイン関数のインクルードファイル名を変更しました。(それだけ)
センサの測定モードはデータシートの「室内推奨設定」としました。
測定モードは何種類か用意しましたので、ご利用環境に合わせて変更して下さい。
詳細は「BME280制御関数」をご参照ください


今回のアップデートの理由
表示される温度が少し高い気がして、メイン関数を見直しましたが、特に変な所は発見できず。
BME280関数群も見直しを行いましたが、やはり変な所は発見できず。
久々にHDC1000温度センサを起動、するとこの環境計の方が2℃以上高い温度表示をします。
何か悔しいので、秋月電子からもう一つBME280を購入してみました。
すると、同じBME280関数群でも今度はHDC1000温度センサとほぼ同じ温度表示します。
因みに、気圧値は新旧センサ間の大きな差は無かったです。
そこで、BME280の各種測定モード設定を用意、(これで精度が変わる)
ワクテカで実験してみるも・・・さしたる変化はなし (-_-メ)
センサの個性なのか、内部設定された補正値(補償値)がそもそも合わないのか、
と言う訳で、今回は「BME280v1a」制御関数群の更新のみとなりました。


追記 2019年10月24日
前回のメイン関数の変更点がもう一つありました。 <m(_ _)m>
センサの生データを読みに行く時にMSSP関数がハングアップする事が発覚したため、生データ読み込み時だけ割り込み禁止にしていました。
これで大丈夫だと思います・・・ 多分 (その処理後では発生していない)
左記プログラムは変更済みです。

古いBME280センサの温度・湿度表示がおかしい点については、1週間ほど色々実験してみましたが、補正手段は見つかっていません。
基本的に温度センサの補正後値を気圧補正や湿度補正にも使用しているようなのですが、温度値がおかしい割には気圧表示は問題無いようです。
固有補正値を適当に(新しいセンサの固有補正値を参考に)弄って、温度表示を新しいBME280センサやHDC1000温度値と無理やり合わせてやると、今度は気圧や湿度表示がおかしくなります。
どうもセンサ側ハードウエアの問題な気がします・・・
古いBME280センサを使用している各局様は新しいBME280センサに買い替えた方が手っ取り早いと思われます。

戻る  実験・製作の記録TOPへ戻る