2019年5月30日木曜日

[Elegoo:12] DHT11 温度・湿度センサ




概要 (Overview)
  • 温度・湿度センサについて学ぶ
  • DTH11から温度・湿度・データを取得してシリアルモニタに表示する



使用する電子部品 (Component Required)
電子種別電子部品個数
マイコン Elegoo UNO R3 マイコンボード1
USBケーブル1
能動 DHT11 デジタル温度・湿度センサ1
機構 ジャンプワイヤ(緑)[オス-メス]1
ジャンプワイヤ(黒)[オス-メス]1
ジャンプワイヤ(赤)[オス-メス]1



電子部品について (Component Introduction)

DHT11 温度・湿度センサ


  • 「DHT11 デジタル温度・湿度センサ」は温度と湿度の較正されたデジタル信号出力を含む複合センサ
  • <較正>湿度・温度データに8Bitのチェックサムを付加し、データの送り手側が決められた計算方法によって算出した値と、受け手側が同一の計算方法によって算出した値が一致するかどうかを調べ、データの信頼性の向上を図ることができる
《データシート》
精度(25℃)温度±2℃、湿度±5%RH
サンプリング期間2秒以上

《ピン》
Vcc電源入力(5V or 3V)
DATAデジタルIO (プルアップ抵抗付)
GNDGND



電子回路 (Electronic Circuit)

回路図 (Schematic)



実体配線図 (Wiring Diagram)





実践 (To Practice)

配線写真 (Example Picture)


プログラム (Code)

SimpleDHT11ライブラリ
書式引数説明
int SimpleDHT11::read(int pin,
 byte* ptemperature,
 byte* phumidity,
 byte pdata[40])
int pin:ピンNO
byte* ptemperature:温度
byte* phumidity:湿度
byte pdata[40]:取得データ
温度・湿度・データを取得する

スケッチ
/*************************************************
 * 【 Elegoo:12 】DHT11 温度・湿度センサー
 *    温度・湿度をシリアルモニタに表示する
 *************************************************/
/*--------------------------------------------*/
/* SimpleDHT11ライブラリ                       */
/*--------------------------------------------*/
#include <simpledht.h>

// SimpleDHT11オブジェクトを作成
SimpleDHT11 objDHT11;

// ピン
#define PIN_DHT11  2

/********/
/* loop */
/********/
void loop() {
  Serial.println("=================================");
  Serial.println("DHT11 サンプリング中...");
  
  byte byteTemperature = 0;   //温度
  byte    byteHumidity = 0;   //湿度
  byte    byteData[40] = {0}; //取得データ

  // --------------------------------------------------
  // DTH11から温度・湿度・データを取得する
  // --------------------------------------------------
  if (objDHT11.read(PIN_DHT11, &byteTemperature, &byteHumidity, byteData)) {
    // 取得 失敗
    Serial.print("Read DHT11 failed");
    return;
  }

  // --------------------------------------------------
  // 取得した温度・湿度・データをシリアルモニタに表示する
  // --------------------------------------------------
  Serial.print("Read DHT11 OK : ");
  // --------------------------------------------------
  // 温度
  Serial.print((int)byteTemperature); Serial.print(" *C, ");
  // --------------------------------------------------
  // 湿度
  Serial.print((int)byteHumidity); Serial.println(" %");
  // --------------------------------------------------
  // データ
  // [湿度(整数)8Bit][湿度(小数)8Bit][温度(整数)8Bit][温度(小数)8Bit][チェックサム8bit]
  // チェックサム=温度・湿度のByteDataを足した下位8Bit
  Serial.print("RAW Bits: ");
  for (int i = 0; i < 40; i++) {
    Serial.print((int)byteData[i]);
    if (i > 0 && ((i + 1) % 4) == 0) {
      Serial.print(' ');
    }
  }
  Serial.println("");

  
  // サンプリング:2秒以上
  delay(2000);
}

/*********/
/* setup */
/*********/
void setup() {
  // シリアルモニタ開始
  Serial.begin(9600);
}

結果(動画)・モニタリング


温度・湿度・データをシリアルモニタに表示する

2019年5月19日日曜日

[Elegoo:11] キーパッドでミュージックボックス



概要 (Overview)
  • キーパッド[メンブレン(膜)スイッチモジュール]について学ぶ
  • ユーザーに押されたキー別にメロディを鳴らすミュージックボックスを作る



使用する電子部品 (Component Required)
電子種別電子部品個数
マイコン Elegoo UNO R3 マイコンボード1
USBケーブル1
能動 パッシブブザー1
機構 4×4マトリックス
メンブレンキーパッド(#27899)
1
ジャンプワイヤ(黒)[オス-メス]1
ジャンプワイヤ(赤)[オス-メス]1
ジャンプワイヤ(白)[オス-オス]2
ジャンプワイヤ(青)[オス-オス]2
ジャンプワイヤ(緑)[オス-オス]2
ジャンプワイヤ(黄)[オス-オス]2



電子部品について (Component Introduction)

マトリクスキーパッド


使用するキーパッドには16個のキー(0-9, A-D, *, #)がある。
リニアキーパッドではキー総数分とグランドピン1本の出力ピンが必要だが
マトリクス不等号化式キーパッドは、行列各4ピンの計8ピンと配線が少なくて済む。
まずは4列(ピン1〜4)を一度にローまたはハイにしてから、4行(ピン5〜8)の状態をポーリングして 列の状態に応じて押されたキーを認識する

《データシート》
最大定格24VDC/30mA
インターフェース4×4マトリックスへの8ピンアクセス
使用温度0〜50℃

《端子とキー配列》
白/黒4 ↓3 ↓2 ↓1 ↓
8 →123A
7 →456B
6 →789C
5 →*0#D




電子回路 (Electronic Circuit)
回路図 (Schematic)


実体配線図 (Wiring Diagram)




実践 (To Practice)
配線写真 (Example Picture)


プログラム (Code)

KeyPadライブラリ
書式引数説明
Keypad::Keypad(char userKeymap,
 byte rowPins, byte colPins,
 byte rows, byte cols)
userKeymap:キー配列
rowPins:行ピンNo配列
colPins:列ピンNo配列
rows:行数
cols:列数
KeyPadオブジェクトを作成し、
ピンを割り当てる
Keypad::makeKeymap(char hexKeymap) hexKeymap:キー配列 キーマップ作成
char Keypad::getKey()
押されたキーを取得

音階の周波数(Hz)
pitches.h

/*************************************************
 * pitches.h : 音階(NOTE_B0 - DS8)の周波数(Hz)を定義
 * https://www.arduino.cc/en/Tutorial/ToneMelody
 * Public Constants 
 *************************************************/

#define NOTE_B0    31
#define NOTE_C1    33
#define NOTE_CS1  35
       …

#define NOTE_CS8  4435
#define NOTE_D8    4699
#define NOTE_DS8  4978

メロディ リスト
melodyList.h

/*************************************************
 * 【melodyList.h】 メロディ リスト
 *    [0] 音階     [ NOTE_xx, 0:休符 ]
 *    [1] 音の長さ[ 4:四分音符, 8:八分音符 ]
 *-------------------------------------------------
 *      ①ドレミの歌 [ドレミファソラシド]
 *      ②きらきらぼし
 *      ③ゆかいな牧場
 *      ④にんげんっていいな
 *      ⑤おもちゃのチャチャチャ
 ************************************************/

// 音階の周波数(Hz)
#include "pitches.h"

#define NOTE      0       // 音階
#define DURATIONS 1       // 音の長さ

//-------------------------------------------------
// ドレミの歌
//-------------------------------------------------
// ド[C]
int aryMelodyC[][7] = {
  { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_C4, NOTE_E4, NOTE_C4, NOTE_E4 },
  { 2, 4, 2, 4, 2, 2, 2 }
};
// レ[D]
int aryMelodyD[][7] = {
  { NOTE_D4, NOTE_E4, NOTE_F4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_F4 },
  { 2, 4, 2, 4, 2, 2, 2 }
};
// ミ[E]
int aryMelodyE[][7] = {
  { NOTE_E4, NOTE_F4, NOTE_G4, NOTE_E4, NOTE_G4, NOTE_E4, NOTE_G4 },
  { 2, 4, 2, 4, 2, 2, 2 }
};
// ファ[F]
int aryMelodyF[][7] = {
  { NOTE_F4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_A4 },
  { 2, 4, 8, 8, 8, 8, 2 }
};
// ソ[G]
int aryMelodyG[][7] = {
  { NOTE_G4, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4 },
  { 2, 4, 8, 8, 8, 8, 2 }
};
// ラ[A]
int aryMelodyA[][7] = {
  { NOTE_A4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4 },
  { 2, 4, 8, 8, 8, 8, 2 }
};
// シ[B]
int aryMelodyB[][7] = {
  { NOTE_B4, NOTE_E4, NOTE_FS4, NOTE_GS4, NOTE_A4, NOTE_B4, NOTE_C5 },
  { 2, 4, 8, 8, 8, 8, 2 }
};
// ド[C5]
int aryMelodyC5[][7] = {
  { NOTE_B4, NOTE_B4, NOTE_A4, NOTE_F4, NOTE_B4, NOTE_G4, NOTE_C5 },
  { 8, 8, 4, 4, 4, 4, 2 }
};
// C4 -> C5
int aryMelodyC4_C5[][8] = {
  { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5 },
  { 4, 4, 4, 4, 4, 4, 4, 4 }
};
// C5 -> C4
int aryMelodyC5_C4[][8] = {
  { NOTE_C5, NOTE_B4, NOTE_A4, NOTE_G4, NOTE_F4, NOTE_E4, NOTE_D4, NOTE_C4 },
  { 4, 4, 4, 4, 4, 4, 4, 4 }
};

//-------------------------------------------------
// きらきらぼし
//-------------------------------------------------
int aryMelodyStar[][14] = {
  { NOTE_C4, NOTE_C4, NOTE_G4, NOTE_G4, NOTE_A4, NOTE_A4, NOTE_G4, 
    NOTE_F4, NOTE_F4, NOTE_E4, NOTE_E4, NOTE_D4, NOTE_D4, NOTE_C4},
  { 4, 4, 4, 4, 4, 4, 2,
    4, 4, 4, 4, 4, 4, 2 }
};

//-------------------------------------------------
// ゆかいな牧場
//-------------------------------------------------
int aryMelodyCow[][13] = {
  { NOTE_G4, NOTE_G4, NOTE_G4, NOTE_D4, NOTE_E4, NOTE_E4, NOTE_D4,
    0,       NOTE_B4, NOTE_B4, NOTE_A4, NOTE_A4, NOTE_G4 },
  { 8, 8, 8, 8, 8, 8, 2,
    8, 8, 8, 8, 8, 2 }
};

//-------------------------------------------------
// にんげんっていいな
//-------------------------------------------------
int aryMelodyHuman[][14] = {
  { NOTE_G4, NOTE_F4, NOTE_E4, NOTE_F4, NOTE_D4, NOTE_C4, 0,
    NOTE_E4, NOTE_E4, 0,       NOTE_G4, NOTE_F4, NOTE_D4, NOTE_E4 },
  { 4, 4,  4, 4, 4, 4, 8,
    2, 4, 16, 8, 4, 4, 4 }
};

//-------------------------------------------------
// おもちゃのチャチャチャ
//-------------------------------------------------
int aryMelodyCha[][24] = {
  { NOTE_C4, NOTE_C4, NOTE_C4, NOTE_E4, NOTE_A4, NOTE_A4, NOTE_A4,
    NOTE_D4, NOTE_D4, NOTE_D4, NOTE_F4, NOTE_G4, NOTE_G4, NOTE_G4,
    NOTE_G4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_A4, NOTE_A4, NOTE_GS4,
    NOTE_G4, NOTE_B4, NOTE_C5 },
  { 8, 8, 8, 8, 8, 8, 2,
    8, 8, 8, 8, 8, 8, 2,
    8, 8, 8, 8, 8, 8, 8,
    8, 8, 8 }
};

スケッチ
/**************************************************
 * 【 Elegoo:11 】膜(メンブレイン)スイッチモジュール
 *    キーパッドでミュージックボックス
 *************************************************/

/*--------------------------------------------*/
/* Keypadライブラリ                            */
/*--------------------------------------------*/
#include <keypad .h>
// 行列数
const byte bytRows = 4;                  // 行数
const byte bytCols = 4;                  // 列数
// 行列ピンNo
byte aryRowPins[bytRows] = {9, 8, 7, 6}; // 行ピンNo
byte aryColPins[bytCols] = {5, 4, 3, 2}; // 列ピンNo
// キー配列
char hexKeymap[bytRows][bytCols] = {     
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
// Keypadオブジェクトを作成
Keypad objKeypad = Keypad( makeKeymap(hexKeymap),   // キーマップ作成
                           aryRowPins, aryColPins,  // 行列ピンNo
                           bytRows, bytCols         // 行列数
                          );

/*--------------------------------------------*/
/* ブザー                                     */
/*--------------------------------------------*/
// ピンの定義
#define BUZZER    12      // D12

/*--------------------------------------------*/
/* メロディ                                   */
/*--------------------------------------------*/
#include "pitches.h"      // 音階の周波数(Hz)
#include "melodyList.h"   // メロディリスト

/*****************************************/
/* 関数名:メロディ 出力                   */
/*  引数:rAryNote      [音階   ]        */
/*      :rAryDurations [音の長さ]        */
/*      :rBytNoteNum   [音階総数]        */
/*****************************************/
void outputMelody( int *rAryNote, int *rAryDurations, byte rBytNoteNum){

  // --------------------------------------------------
  //  音階数の周波数を音の長さだけ出力する 
  // --------------------------------------------------
  for( int i = 0; i < rBytNoteNum; i++){
    tone( BUZZER, rAryNote[i],( 1000 / rAryDurations[i] ) );
    delay( 500 );   //演奏速度
  }

  // --------------------------------------------------
  // 周波数の出力を停止する
  // --------------------------------------------------
  noTone( BUZZER );
  delay( 500 );
}


/********/
/* loop */
/********/
void loop() {
  byte bytNoteNum;    // 音階総数

   // 押されたキーを取得する
  char chrKey = objKeypad.getKey();

  // --------------------------------------------------
  // 押されたキー別にメロディを出力する
  //    メロディ[0] 音階
  //    メロディ[1] 音の長さ
  // --------------------------------------------------
  if (chrKey){
    switch(chrKey){
      // --------------------------------------------------
      // 1:ド
      case '1':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyC[NOTE] ) / sizeof( aryMelodyC[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyC[NOTE], aryMelodyC[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 2:レ
      case '2':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyD[NOTE] ) / sizeof( aryMelodyD[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyD[NOTE], aryMelodyD[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 3:ミ
      case '3':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyE[NOTE] ) / sizeof( aryMelodyE[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyE[NOTE], aryMelodyE[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 4:ファ
      case '4':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyF[NOTE] ) / sizeof( aryMelodyF[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyF[NOTE], aryMelodyF[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 5:ソ
      case '5':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyG[NOTE] ) / sizeof( aryMelodyG[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyG[NOTE], aryMelodyG[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 6:ラ
      case '6':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyA[NOTE] ) / sizeof( aryMelodyA[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyA[NOTE], aryMelodyA[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 7:シ
      case '7':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyB[NOTE] ) / sizeof( aryMelodyB[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyB[NOTE], aryMelodyB[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 8:ド
      case '8':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyC5[NOTE] ) / sizeof( aryMelodyC5[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyC5[NOTE], aryMelodyC5[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 9:ド[C4 -> C5]
      case '9':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyC4_C5[NOTE] ) / sizeof( aryMelodyC4_C5[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyC4_C5[NOTE], aryMelodyC4_C5[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // 0:ド[C5 -> C4]
      case '0':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyC5_C4[NOTE] ) / sizeof( aryMelodyC5_C4[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyC5_C4[NOTE], aryMelodyC5_C4[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // A:きらきらぼし
      case 'A':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyStar[NOTE] ) / sizeof( aryMelodyStar[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyStar[NOTE], aryMelodyStar[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // B:ゆかいな牧場
      case 'B':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyCow[NOTE] ) / sizeof( aryMelodyCow[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyCow[NOTE], aryMelodyCow[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // C:にんげんっていいな
      case 'C':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyHuman[NOTE] ) / sizeof( aryMelodyHuman[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyHuman[NOTE], aryMelodyHuman[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // D:おもちゃのチャチャチャ
      case 'D':
        // 音階総数
        bytNoteNum = sizeof( aryMelodyCha[NOTE] ) / sizeof( aryMelodyCha[NOTE][0] );
        // メロディ 出力
        outputMelody( aryMelodyCha[NOTE], aryMelodyCha[DURATIONS], bytNoteNum ); 
      break;
      // --------------------------------------------------
      // その他:シリアルモニタに表示
      default:
        Serial.println(chrKey);
    }
  }
}


/*********/
/* setup */
/*********/
void setup(){
  // pinの設定
  pinMode( BUZZER, OUTPUT );  // BUZZER : 出力用

  // シリアルモニタ開始
  Serial.begin( 9600 );
}

結果(動画)・モニタリング

動画


ドレミの歌
ボタン1→2→3→4:ド→レ→ミ→ファ


 ボタンA:きらきらぼし
ボタンB:ゆかいな牧場
ボタンD:おもちゃのチャチャチャ