AM2321とArduinoで温湿度計を作った

温湿度センサAM2321を使って、持ち歩き用の温湿度計を作ったけど、携帯するには、ちょっと大きくなっちゃった。
f:id:manpukukoji:20170924080014j:plain
AM2321は、以前に秋月で購入しておいた物だけど、端子のピッチが1.27とへんてこなんで使いにくい。今は、秋月でも通販していないみたいで、かわりにピッチが2.54のAM2320が販売されているようですね。
今回は、できれば持ち歩きたいと思って、プリント基板を作ってみたけど、片面基盤なんで、あまり小さくならなかった。ちなみに、僕の場合、プリント基板は、トレーシングペーパーに印刷して、ポジ感光基盤をブラックライトで感光させて作っている。
ブラックライトは、最近電気やとかホームセンタでは、手に入りにくく、車用品店でなんとか購入。
Arduinoは、ATMEGA328にブートローダを書き込んでチップ単体で3V駆動して使用。これだと、I2Cの電圧を変換しなくてすむしね。
ほんで、回路は、こんな感じ。
f:id:manpukukoji:20170924080102j:plain
で、プログラムは、これまた、あちこちのサイトを参考にさせていただき、ほとんどコピペに近いが、以下のように作成。
タクトスイッチは、温度と湿度の切り替え用
実際のところ、3Vでは、7セグの表示が暗くて、昼のアウトドアでは、よく見えない。
また、ボタン電池だと電池の持ちもいまいち・・・。
と、いうわけで、実際のところ、安定化電源から電源をとりデスクトップで室内の温度と湿度を表示している。

#include <SevSeg.h>
#include <Wire.h>

#define ADDR 0x5C

byte HH,HL,TH,TL,dummy;
int Temp, Humid, DispData;
volatile int chMode = HIGH;
volatile unsigned long time_prev = 0, time_now;

SevSeg sevseg; //Instantiate a seven segment object

void dispchg() {
  time_now = millis(); //現在の割り込み時刻を取得
  if( time_now-time_prev > 20){  
    chMode= !chMode;
  }
   time_prev = time_now;
}

void setup() {
  byte numDigits = 3;
  byte digitPins[] = {3, 6, 7}; // 左が上位桁
  byte segmentPins[] = {4, 8, 10, 12, 13, 5, 9, 11}; // A..G, DPの順

 pinMode(2,INPUT_PULLUP);

  sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
    Wire.begin();

 attachInterrupt(0,dispchg,RISING);
}

void loop() {
  int i,j;
  //------------------------------
    Wire.beginTransmission(ADDR);
  //Wire.write(0);
  delay(1);
  Wire.endTransmission();
  
  Wire.beginTransmission(ADDR);
  Wire.write(0x03);
  Wire.write(0x00);
  Wire.write(0x04);
  Wire.endTransmission();
  
  delayMicroseconds(1500);
  
  Wire.requestFrom(ADDR,6);
  delayMicroseconds(30);
  Wire.read();
  Wire.read();
  HH=Wire.read();
  HL=Wire.read();
  TH=Wire.read();
  TL=Wire.read();
  
  Humid=HH*256+HL;
  if(TH & 0x80){
    Temp=-1*((TH & 0x7F)*256+TL);
  }
  else{
    Temp=TH*256+TL;
  }

  
  //------------------------------
   if (chMode == HIGH) {DispData = Humid;}
   else {DispData = Temp;}
  
    for (j=0;j<100;j++){
    sevseg.setNumber(DispData, 1);
    sevseg.refreshDisplay();
    }
    delay(10);

  }