テストで買ってみた大気圧センサー 買ってまだ封も開いていなかった。

袋から取り出してピン半田つけしてセット

 

 

 

MPL115A1-V2 大気圧センサーモジュール

https://akizukidenshi.com/catalog/g/gI-06078/

 

ライブラリー設定してさあ書込み。

シリアルモニターで出力確認。おお一応動いたぞ

ほお、気温も測定してるんだ・・・・・ あれ?なんだこの値は。それっぽい値は出てるけど安定しない。

今は1020hPa前後のはずなのに。

 


気温の値も安定していない。なんだろう、ハンダが悪いのか?

ううん、これは使い物にならないぞ。

とりあえず1晩放置して様子見るか。まあSPIだし単純にはSDカードとバッティングしちゃうし。今度はI2Cのやつを買ってみるか。

とりあえず今回は気圧の測定はお預け。残念でした。

 

SPIの機器って複数接続するときはどうするのだろう。調べてみるか。

インターネットで調べると色々出てくるのはありがたいね。

 

 

 

PCに接続しないときも時刻を保持して起動時には時刻を取れるようにRTC(リアルタイム・クロック)と言うもの使うということで amazonoでポチリ。3つセットで\890でした。

電池はあるのでいいやと思ってたら、利用するバッテリーは「充電式バッテリLIR2032」だって

ええっ CR2032じゃないんだ。

 ネット調べたらCR2032でそのまま電源接続して長時間使っていると(特に5Vで)バッテリーが壊れるらしいので、充電の回路パターンカットして5V利用時に充電側の電圧がかからないようにするということでした。

 いつも参照させてもらっているgeotechlab-workshopに記載がありCutしている場所の写真は入っていたものの、もう一つ見えずらかったので他にどこか無いかなと思ったら、ありました。回路図でのカット位置も入って理解しやすかったです。

なるほど、ここをカットするんだ。

 geotechlabさんと場所は違うけどダイオードの上流側か下流側どっち切るかの差で理屈は同じことが分かり、私はカットしやすそうなダイオードのバッテリー側をカットしました。

 これで一安心してCR2032入れたまま使えます。

 

カット前 ダイオードにつながってる線をカットします

カット後 これで5V利用時に電池側に電圧かからなくなりました

 

 

 

せっかく半田付けも終わって使えてたLCD AQM1602XA-RN-GBW パリッと

あああ 見やすく表示出来て順調に動いてたのに
 
で別に秋月で買ってたAQM1602Y-RN-GBWがあるので使って見るか。

コマンドは同じと言うことで

1μFのコンデンサ2つ付いてるし秋月の資料のデータシート見ながら接続したのに全く反応無し。…
ネットでいろいろ探して、やっと有りました。
コンデンサは1つでOK、あと9pinをVCCに繋いでONにしておかないといけなかったのね。
後はコントラストとPower/ICON/Contrust Controlを3.3V用にセットしないと見えない。
これが微妙で調整してやっと読めるようになった。
多少見ずらいけど表示出来るようになったからいいか。
Pin接続 左から
1  -
2  -
3と4の間にコンデンサ 1.0uF (付属品)
5  VDD  3.3V
6  GND
7  SDA  Data input  ArduinoのA4
8  SCL  Clock input ArduinoのA5
9  Reset Signal  3.3Vへ  これわからずに動かなかった。回路では5と直結

結局付属のコンデンサ2つのうち1つは使わなかった。

 

 

 

スケッチ

------------------------------------------------

/*
 * Author: URK Labo
 * IDE V1.8.13
 * AE-AQ1602Y-RN-GBW Test
 */
#include <Wire.h>
#define LCD_ADRS 0x3E  //SCL:A5  SDA:A4

String LCD_STRING;
char s[16];
unsigned long time;

void setup() {
  Wire.begin(LCD_ADRS);
  init_LCD();
  }

//Main
void loop() {
  time = millis();
  LCD_STRING="Time= "+String(time);
  LCD_DISP_16_1();
  LCD_STRING="AQ1602Y-RN-GBW";
  LCD_DISP_16_2();
  delay(500);  
  }

//AE-AQ1602 write Command
void writeCommand(byte command){
  Wire.beginTransmission(0x3E);
  Wire.write(0x00);
  Wire.write(command);
  Wire.endTransmission();delay(10);} 

//AE-AQ1602 write Data
void writeData(byte data){
  Wire.beginTransmission(0x3E);
  Wire.write(0x40);
  Wire.write(data);
  Wire.endTransmission();delay(1);
  }

//AE-AQ1602 1行目データ書込み
void LCD_DISP_16_1(void){
  writeCommand(0x80);
  for(int i = 0; i < 16; i++){writeData(LCD_STRING[i]);}
  }

//AE-AQ1602 2行目データ書込み
void LCD_DISP_16_2(void){
  writeCommand(0x40+0x80);
  for(int i = 0; i < 16; i++){writeData(LCD_STRING[i]);}
  }

//AE-AQ1602Y 初期化
void init_LCD(){
  int intDelay=1;   //Originalは20になってるけど 仕様書では  <26.3us なので1ms
  delay(50);     //Wait time >40ms
  writeCommand(0x38);   //Function set
  delay(intDelay);
  writeCommand(0x39);   //Function Set
  delay(intDelay); 
  writeCommand(0x14);   //Internal OSC frequency
  delay(intDelay);
  writeCommand(0x74);   //Contrust set   3.3V=0x73, 5V=0x7A(74~ )
  delay(intDelay);
  writeCommand(0x56);   //Power/ICON/Conttlust Control  3.3V=0x56, 5V=0x54
  delay(intDelay);
  writeCommand(0x6C);   //Follower control
  delay(200);           // wait time>200ms ここだけは長くしないといけないようで
  writeCommand(0x38);   //Function set
  delay(intDelay);
  writeCommand(0x01);   //Clear Display
  delay(intDelay);
  writeCommand(0x0C);   //Display ON/OFF control
  delay(intDelay);
}

 

Arduinoで温度測定してUSB通してデータをPCに送るのはできるけど、単独の状態で使えるようにするのはSDカードなどに記録したいので。

ということで、SDカード書込みの実験

まずは「Micro SD TFカードメモリシールドモジュール」をアマゾンでポチリました。

並行輸入品 3個セットで550円 ボードにはHW-125の表記がありました。

 

接続や使い方のスケッチについては geotechlab-workshop さんのサイトを参照させてもらいました。

接続はこんな感じです

(Arduino側)―(SDカードシールド側)

   13                CLK (SCK)

   12                MISO

   11                MOSI

   10                CS

   5V               VCC

   GND             GND

 

最初3.3Vだと思ってVCC3.3V側に接続したのですがエラーでした。これは5V用に変換回路入ってました。なにせアマゾンからの送付は箱に3個ポロっと入ってるだけで説明書も何もないもので。せめてネットでサンプル接続図でも入れてあればよかったのにね

ネットで調べて実験してみるしかないって感じでやってみました。

使用したSDカードは東芝のSDHC16GBのマイクロSDカードです 「あきばおー」にClass4のが\250で見切り品で安く売ってたの書込みスピードも関係ないので。

フォーマットは標準のFAT32です

 

SDカードは途中で抜いても今のところ問題なし。ただしSDカード差し込んだ後はリセットボタンで再起動しないと記録されません。またファイルは追記なので初期化したい場合はPCでファイル消すだけです。

 

書き込まれたデータはこんな感じ

----Start----
time,temp,hum,T,Bright
2409,24,42,5.30,676
32516,24,42,5.49,675 
62622,24,42,5.49,675

 

Excelで読込むと

こんな感じでA列に時間が入っているので、SDカード取り外した時刻さえわかれば逆算して

それぞれの時刻を取得できるということで F列に時刻を入れてみました

F3510セル:  [=F3511-(A3511-A3510)/1000/86400]

 

スケッチはこちら

--------------------------------------------------------------

/*
 * Author: URK Labo
 * IDE V1.8.13
 * 温湿度計、照度とをLCD AE-AQ1602Aに表示してSD_Cardに書込み
 */
#include <dht11.h>
#include <SPI.h> 
#include <SD.h>
#include <Wire.h>
#define LCD_ADRS 0x3E  //SCL:A5  SDA:A4

const String SD_FileName ="datalog.csv" ;
const int chipSelect = 10; // Arduino UNO:10   MEGA:53
String LCD_STRING;
char s[16];
double SET;    

unsigned long time;


dht11 DHT;                  //Note:DHT on behalf of the temperature and humidity sensor 
const int dht11_data = 6;   //DHT11   pin
int photocellPin =A1;       //光センサー pin

double Vout;  //サーミスタ電圧(Vout)
double Rt;  //サーミスタ抵抗値(R1)
double B=3950;  //補正係数(B)
double T;  //サーミスタ温度(T)
double R1=9750;  //バランス抵抗(Ω)
double A0c; //analogRead(0)
int temp=0;   //DHT11 温度
int hum=0;    //DHT11 湿度

//初期化
void setup() {
  Serial.begin(9600);      //Set serial baud rate to 9600 bps
  Wire.begin(LCD_ADRS);
  init_LCD();
  init_SD();
  }

//Main
void loop() {

 time = millis();
  //サミスタ温度
    A0c=analogRead(0);
    Rt=(1024/A0c-1)*R1; //サーミスタ抵抗値(Rt)を計算
    T=1/(1/B*log(Rt/10000)+1/298.15)-273.15; //サーミスタ温度(T)を計算
  // Photocell
    int Bright=analogRead(photocellPin);

  //温度湿度計
    DHT.read(dht11_data);
    temp=DHT.temperature;
    hum=DHT.humidity;
   
    LCD_STRING="T= "+String(T,2)+" B="+String(Bright);
    LCD_DISP_16_1();//LCD一行目に変数を出力する

    LCD_STRING ="T="+String(temp) + " H="+String(hum) +"   URK";
    LCD_DISP_16_2(); //LCD二行目に変数を出力する

  //SDに書込み
    File dataFile = SD.open("datalog.csv", FILE_WRITE);
    if (dataFile)
    {
      dataFile.println(String(temp)+","+String(hum)+","+String(T)+","+String(Bright));
    }    
    dataFile.close();
  
  //Com Portに出力
    Serial.println(String(temp)+","+String(hum)+","+String(T)+","+String(Bright));

    delay(5000);  
  }

//AE-AQ1602コマンド書き込み
void writeCommand(byte command){
  Wire.beginTransmission(0x3E);
  Wire.write(0x00);
  Wire.write(command);
  Wire.endTransmission();delay(10);} 

//AE-AQ1602データ書き込み
void writeData(byte data){
  Wire.beginTransmission(0x3E);
  Wire.write(0x40);
  Wire.write(data);
  Wire.endTransmission();delay(1);
  }

//AE-AQ1602の1行目にデータ書き込み
void LCD_DISP_16_1(void){
  writeCommand(0x80);         //DDRAMアドレスを1行目先頭にセット
  for(int i = 0; i < 16; i++){writeData(LCD_STRING[i]);}
  }

//AE-AQ1602の2行目にデータ書き込み
void LCD_DISP_16_2(void){
writeCommand(0x40+0x80);    //DDRAMアドレスを2行目先頭にセット
for(int i = 0; i < 16; i++){writeData(LCD_STRING[i]);}}

//AE-AQ1602 初期化
void init_LCD(){
  int intDelay=1;   //Originalは20 仕様は<26.3us
  delay(50);     //Wait time >40ms
  writeCommand(0x38);   //Function set
  delay(intDelay);
  writeCommand(0x39);   //Function Set
  delay(intDelay); 
  writeCommand(0x14);   //Internal OSC frequency
  delay(intDelay);
  writeCommand(0x7A);   //Contrust set   3.3V=0x73, 5V=0x7A(74~ )
  delay(intDelay);
  writeCommand(0x54);   //Power/ICON/Conttlust Control  3.3V=0x56, 5V=0x54
  delay(intDelay);
  writeCommand(0x6C);   //Follower control
  delay(200);           //ここだけは wait time>200ms
  writeCommand(0x38);   //Function set
  delay(intDelay);
  writeCommand(0x01);   //Clear Display
  delay(intDelay);
  writeCommand(0x0C);   //Display ON/OFF control
  delay(intDelay);
}

//SD Card TFカードメモリシールド(HW-125) 初期化
void init_SD(){
      while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
    }

     /* ----- Initialisation of SD card ------ */
    Serial.print("Initializing SD card...");
     //see if the card is present and can be initialized:
    if (!SD.begin(chipSelect)) {
       Serial.println("Card failed, or not present");
       LCD_STRING ="Card failed   ";
       LCD_DISP_16_2(); //LCD二行目に変数を出力する
       delay(5000);
      return;         // don't do anything more:
    }
    Serial.println("card initialized. OK");
       LCD_STRING ="Card OK      ";
       LCD_DISP_16_2(); //LCD二行目に変数を出力する
    /* SDカードに書き込み */
    File dataFile = SD.open(SD_FileName, FILE_WRITE);
    if (dataFile)
    {
      dataFile.println("----Start----");
      dataFile.println("time,temp,hum,T,Bright");
    }
    dataFile.close();
    delay(2000);
  
}

 

 

アマゾンで「Miuzei Arduino 用 R3 初心者ス 電子工作 ターターキット」買って一通りやってみたので

次は省エネ表示でIC2接続のLCD AE-AQM1602A(kit)を使ってみようで秋葉原へお買い物。

 

久しぶりに秋葉に行ったら、通りには萌え萌えのお姉ちゃんが並んで呼び込み中。昔このあたりに白い服着たやばい新興宗教一団が居ました。

時代は変わったなああって思いながら。秋月へ

 

AE-AQM1602 ¥550 購入したのはいいけど 老眼には最初の変換基板の半田付けが厳しい。ただでさえ半田付けは下手なのに、なんと1.27mmピッチ。 作業用に虫眼鏡いるね。今後半田のいらない物かせめてピッチの広いのを選ぼうかな

ボタっと下手な半田付けてハイ短絡。吸い取り機でハンダ取って、やっと短絡しないように付いた時には本体側が熱で少しブヨブヨって感じ 大丈夫か?
まあいいや実験だ!とは思いながらも動いてくれ!!
 

AuduinoにUSB接続、プログラム書き込んで
おおお、ちゃんと表示できました。
熱で壊れてなかったよ。
以前の12本のケーブル(上に丸めたやつ)が電源入れて4本になりました。I2C便利ですね。

 

 

このサイト参考にして勉強させてもらってます

NOBのArduino日記!
   LCDの使い方(AE-AQM1602A)組立て編

   LCDの使い方(AE-AQM1602A)動作確認 後編

 

今回の部品

秋月電子 LCD AE-AQM1602A

 

LCD配線

   +V      =  5V

   SCL    =  A5  

   SDA    =  A4

   GND   = GND

   

表示用に作ったスケッチ

----------------------------------------------------------

/*
 * Author: URK Labo
 * IDE V1.8.13
 * 温湿度計、照度とをLCD AE-AQ1602Aに表示
 */
#include <dht11.h>
#include <Wire.h>
#define LCD_ADRS 0x3E  //SCL:A5  SDA:A4

String LCD_STRING;
char s[16];
double SET;       //変数の宣言

dht11 DHT;                  //Note:DHT on behalf of the temperature and humidity sensor 
const int dht11_data = 6;   //DHT11   pin
int photocellPin =A1;       //光センサー pin

double Vout;  //サーミスタ電圧(Vout)
double Rt;  //サーミスタ抵抗値(R1)
double B=3950;  //補正係数(B)
double T;  //サーミスタ温度(T)
double R1=9750;  //バランス抵抗(Ω)
double A0c; //analogRead(0)
int temp=0;   //DHT11 温度
int hum=0;    //DHT11 湿度

void setup() {
  // Serial.begin(9600);      //Set serial baud rate to 9600 bps
  Wire.begin(LCD_ADRS);
  init_LCD();
  }

void loop() {
  //サミスタ温度
    A0c=analogRead(0);
    Rt=(1024/A0c-1)*R1;      //サーミスタ抵抗値(Rt)を計算
    T=1/(1/B*log(Rt/10000)+1/298.15)-273.15;   //サーミスタ温度(T)を計算
 

  //明るさl
    int Bright=analogRead(photocellPin);

  //温度湿度計
    DHT.read(dht11_data);
    temp=DHT.temperature;
    hum=DHT.humidity;
   
    LCD_STRING="T= "+String(T,2)+" B="+String(Bright);
    LCD_DISP_16_1();   //LCD一行目

    LCD_STRING ="T="+String(temp) + " H="+String(hum) +"   URK";
    LCD_DISP_16_2();  //LCD二行目

  delay(1000);
  }

//AE-AQ1602コマンド書き込み
void writeCommand(byte command){
  Wire.beginTransmission(0x3E);
  Wire.write(0x00);
  Wire.write(command);
  Wire.endTransmission();delay(10);} 

//AE-AQ1602データ書き込み
void writeData(byte data){
  Wire.beginTransmission(0x3E);
  Wire.write(0x40);
  Wire.write(data);
  Wire.endTransmission();delay(1);
  }

//AE-AQ1602の1行目にデータ書き込み
void LCD_DISP_16_1(void){
  writeCommand(0x80);         //DDRAMアドレスを1行目先頭にセット
  for(int i = 0; i < 16; i++){writeData(LCD_STRING[i]);}
  }

//AE-AQ1602の2行目にデータ書き込み
void LCD_DISP_16_2(void){
writeCommand(0x40+0x80);    //DDRAMアドレスを2行目先頭にセット
for(int i = 0; i < 16; i++){writeData(LCD_STRING[i]);}}

//AE-AQ1602 初期化
void init_LCD(){
  int intDelay=1;   //Originalは20 仕様は<26.3us
  delay(50);     //Wait time >40ms
  writeCommand(0x38);   //Function set
  delay(intDelay);
  writeCommand(0x39);   //Function Set
  delay(intDelay); 
  writeCommand(0x14);   //Internal OSC frequency
  delay(intDelay);
  writeCommand(0x7A);   //Contrust set   3.3V=0x73, 5V=0x7A(74以上 )
  delay(intDelay);
  writeCommand(0x54);   //Power/ICON/Conttlust Control  3.3V=0x56, 5V=0x54 
  delay(intDelay);
  writeCommand(0x6C);   //Follower control
  delay(200);           //ここだけは wait time>200ms となっていたので
  writeCommand(0x38);   //Function set
  delay(intDelay);
  writeCommand(0x01);   //Clear Display
  delay(intDelay);
  writeCommand(0x0C);   //Display ON/OFF control
  delay(intDelay);
}