電気素人主婦による備忘録 ※ ご利用は自己責任でお願いします ※
/*************************************************************/ /* 【 Elegoo:14 】赤外線ワイヤレスリモコンと赤外線受信モジュール */ /* 赤外線ワイヤレスリモコンからのコードを */ /* 赤外線受信モジュールで受信し、 */ /* シリアルモニタに表示する */ /* */ /* 赤外線リモコンコードフォーマット使用 [国内製] */ /*************************************************************/ int pin = 11; //受信モジュール出力の信号入力ピン int num = 0; unsigned long st; //計測開始時間μs unsigned long dur; //時間μs int num_max = 400; //配列要素数 long time[400]; //num_maxと同じに boolean mode = HIGH; //赤外線モジュール出力がHIGHの待機から始まる long timeout = 120000; //無受信時のタイムアウトμs /*********/ /* setup */ /*********/ void setup() { Serial.begin(9600); pinMode(pin, INPUT); } /********/ /* loop */ /********/ void loop() { // -------------------------------------------------- //計測開始の時間を記憶 st = micros(); //LOW,HIGHが変化するまでループで待機 while(digitalRead(pin) == mode){ //無受信時のタイムアウトでループを抜ける if(micros() - st > timeout){ break; } } // -------------------------------------------------- // 時間を計算 dur = micros() - st; if(mode == LOW){ time[num] = dur; } else{ //LEDオフの時間(受信センサー出力はHIGH)はマイナス符号をつける time[num] = dur * -1; } // -------------------------------------------------- // タイムアウトした時 if(dur > timeout){ //配列に格納されていれば、シリアル出力 if(num > 0){ ser_pri(); } //タイムアウトかつデータ無しなので変数リセット num = -1; mode = LOW; } // -------------------------------------------------- // データが多すぎた時の処理 num += 1; mode =! mode; if(num == num_max){ Serial.println("Too Many Data"); delay(2000); ser_pri(); num = 0; mode = HIGH; } } /*********************/ //受信データのシリアル出力 /*********************/ void ser_pri(){ int data = 0; Serial.println(""); // //配列のデータをそのまま出力 // for(int i = 0; i < num; i++){ // Serial.print(i); // Serial.print("\t"); // Serial.println(time[i]); // } // -------------------------------------------------- // メーカーフォーマットを判別 // リーダー部のON-OFF時間+-1Tの範囲で判別 // [ 1:NECフォーマット2:家電製品協会(AEHA)フォーマット3:ソニーフォーマット0:不明 ] // NEC:T=562 leader 16T+8T repeat 16T+4T // 家電製品協会:T=425 leader 8T+4T repeat 8T+8T // ソニー:T=600 leader 4T // -------------------------------------------------- Serial.println(""); byte data_f = 0; // -------------------------------------------------- // NECフォーマット if(time[1] >= 8430 && time[1] < 9554 && time[2]*-1 >= 3934 && time[2]*-1 < 5058){ Serial.println("NEC Format"); data_f = 1; } // -------------------------------------------------- // 家電製品協会フォーマット if(time[1] >= 2975 && time[1] < 3825 && time[2]*-1 >= 1275 && time[2]*-1 < 2125){ Serial.println("AEHA Format"); data_f = 2; } // -------------------------------------------------- // SONYフォーマット if(time[1] >= 1800 && time[1] < 3000 && time[2]*-1 < 600){ Serial.println("SONY Format"); data_f = 3; } // -------------------------------------------------- // フォーマット不明 if(data_f == 0){ Serial.println("UNKNOWN Format"); } // -------------------------------------------------- //NECフォーマットの時 // -------------------------------------------------- if(data_f == 1){ byte dig = 0; for(int j = 4; j < num; j=j+2){ if(time[j]* -1 < 1000){ Serial.print("0"); } if(time[j]* -1 >=1000 && time[j]* -1 <1800 ){ Serial.print("1"); bitSet(data,dig); } //リピートコード if(time[j]* -1 >=1800 && time[j]* -1 <2500){ //4つ前のデータもリピートコードかどうか if((time[j-4]* -1 >=1800) && (time[j-4]* -1 <2500)){ Serial.print(" ."); } else{ Serial.print("REPEAT CODE"); } dig = 0; } dig += 1; //8ビットごとに区切り if(dig == 8){ Serial.print("\t"); Serial.print(data,HEX); Serial.println(""); dig = 0; data = 0; } } } // -------------------------------------------------- // 家電製品協会フォーマットの時 // -------------------------------------------------- if(data_f == 2){ byte dig = 0; for(int j = 4; j < num; j=j+2){ if(time[j]* -1 < 1000){ Serial.print("0"); } if(time[j]* -1 >=1000 && time[j]* -1 <1800 ){ Serial.print("1"); bitSet(data,dig); } //リピートコード if(time[j]* -1 >=2975 && time[j]* -1 <3825){ //4つ前のデータもリピートコードかどうか if((time[j-4]* -1 >=2975) && (time[j-4]* -1 <3825)){ Serial.print(" ."); } else{ Serial.print("REPEAT CODE"); } dig = 0; } //同信号繰り返し if(time[j]* -1 >=2000){ Serial.println("REPEAT"); j += 2; dig = -1; } dig += 1; //8ビットごとに区切り if(dig == 8){ Serial.print("\t"); Serial.print(data,HEX); Serial.println(""); dig = 0; data = 0; } } } // -------------------------------------------------- // ソニーフォーマットの時 // -------------------------------------------------- if(data_f == 3){ byte dig = 0; boolean sony_func = 0; for(int j = 3; j < num; j=j+2){ if(time[j] < 1000){ Serial.print("0"); } if(time[j] >=1000 && time[j] < 1800 ){ Serial.print("1"); bitSet(data,dig); } //同信号繰り返し if(time[j] >= 2000){ Serial.print("\t"); Serial.print(data,HEX); Serial.println(""); Serial.println("REPEAT"); dig = -1; data = 0; sony_func = 0; } dig += 1; //最初の7ビットが機能コード、以下5~13ビットは機器識別コード if(dig == 7 && sony_func == 0){ sony_func = 1; Serial.print("\t"); Serial.print(data,HEX); Serial.println(""); dig = 0; data = 0; } } Serial.print("\t"); Serial.print(data,HEX); data = 0; } // -------------------------------------------------- // フォーマット不明の時 // -------------------------------------------------- if(data_f == 0){ } Serial.println(""); }
/*************************************************************/ /* 【 Elegoo:14 】赤外線ワイヤレスリモコンと赤外線受信モジュール */ /* 赤外線ワイヤレスリモコンからのコードを */ /* 赤外線受信モジュールで受信し、 */ /* シリアルモニタに表示する */ /* */ /* 赤外線リモートライブラリ使用 [国内・海外製] */ /*************************************************************/ /*--------------------------------------------*/ /* 赤外線リモートライブラリ */ /*--------------------------------------------*/ #include <irremote .h> //Ver2.0.1 June, 2015 Panasonic受信不安定 /*--------------------------------------------*/ // 受信用 #define PIN_RECEIVER 11 // 赤外線受信用ピン IRrecv objIRRecv(PIN_RECEIVER); // 赤外線受信用オブジェクトを作成 decode_results objResults; // 赤外線受信結果を格納する /**************************************/ /* 関数名:getDecodeTypeValue */ /* 内容:受信したType(メーカー)を取得する */ /* 引数:無し */ /* 戻り値:無し */ /**************************************/ void getDecodeTypeValue(){ Serial.print(objResults.decode_type); Serial.print(" : "); // -------------------------------------------------- switch (objResults.decode_type) { default: case UNKNOWN: Serial.print("UNKNOWN"); break ; case NEC: Serial.print("NEC"); dispIRcodeNEC(); break ; case SONY: Serial.print("SONY"); break ; case RC5: Serial.print("RC5"); break ; case RC6: Serial.print("RC6"); break ; case DISH: Serial.print("DISH"); break ; case SHARP: Serial.print("SHARP"); break ; case JVC: Serial.print("JVC"); break ; case SANYO: Serial.print("SANYO"); break ; case MITSUBISHI: Serial.print("MITSUBISHI"); break ; case SAMSUNG: Serial.print("SAMSUNG"); break ; case LG: Serial.print("LG"); break ; case WHYNTER: Serial.print("WHYNTER"); break ; case AIWA_RC_T501: Serial.print("AIWA_RC_T501"); break ; case PANASONIC: Serial.print("PANASONIC : Address["); Serial.print(objResults.address, HEX); Serial.print("]"); break ; case DENON: Serial.print("Denon"); break ; // case AEHA: Serial.print("AEHA"); break ; // case AEHA: Serial.print("AEHA : Address["); // Serial.print(objResults.address, HEX); // Serial.print("]"); break ; } } /*************************************************/ /* 関数名:dispIRcodeNEC */ /* 内容:受信したType[NEC]のValue(IRcode)を表示する */ /* 引数:無し */ /* 戻り値:無し */ /*************************************************/ void dispIRcodeNEC() { Serial.print(" : "); Serial.print(objResults.value, HEX); Serial.print(" ==> "); if( objResults.decode_type == NEC ){ // 受信したValue(IRcode) switch(objResults.value){ case 0xFFA25D: Serial.println("POWER"); break; case 0xFFE21D: Serial.println("FUNC/STOP"); break; case 0xFF629D: Serial.println("VOL+"); break; case 0xFF22DD: Serial.println("FAST BACK"); break; case 0xFF02FD: Serial.println("PAUSE"); break; case 0xFFC23D: Serial.println("FAST FORWARD"); break; case 0xFFE01F: Serial.println("DOWN"); break; case 0xFFA857: Serial.println("VOL-"); break; case 0xFF906F: Serial.println("UP"); break; case 0xFF9867: Serial.println("EQ"); break; case 0xFFB04F: Serial.println("ST/REPT"); break; case 0xFF6897: Serial.println("0"); break; case 0xFF30CF: Serial.println("1"); break; case 0xFF18E7: Serial.println("2"); break; case 0xFF7A85: Serial.println("3"); break; case 0xFF10EF: Serial.println("4"); break; case 0xFF38C7: Serial.println("5"); break; case 0xFF5AA5: Serial.println("6"); break; case 0xFF42BD: Serial.println("7"); break; case 0xFF4AB5: Serial.println("8"); break; case 0xFF52AD: Serial.println("9"); break; case 0xFFFFFFFF: Serial.println(" REPEAT"); break; default: Serial.println(" other button"); } } Serial.println(" "); delay(500); } /********/ /* loop */ /********/ void loop() { // 赤外線を受信 if (objIRRecv.decode(&objResults)) { // 受信したType(メーカー)とValue(ボタン)を表示する getDecodeTypeValue(); // 受信機をリセット objIRRecv.resume(); } } /*********/ /* setup */ /*********/ void setup() { // -------------------------------------------------- // シリアルモニタ開始 Serial.begin(9600); // -------------------------------------------------- // 受信を開始 objIRRecv.enableIRIn(); // 受信時にLEDの点灯を許可する objIRRecv.blink13(true); }
/****************************************************** * 【 Elegoo:13 】ジョイスティックモジュール * X/Yからデータを読み取るためにアナログPINを使用し、 * Switchを読むためにデジタルピンを使用する *****************************************************/ // ピン #define PIN_SW 2 // スイッチ[D2] #define PIN_X 0 // X軸 [A0] #define PIN_Y 1 // Y軸 [A1] /*********/ /* setup */ /*********/ void setup() { // -------------------------------------------------- //Digital PIN (Switch)の設定 pinMode(PIN_SW, INPUT); digitalWrite(PIN_SW, HIGH); //初期化 // -------------------------------------------------- // シリアルモニタ開始 Serial.begin(9600); } /********/ /* loop */ /********/ void loop() { // -------------------------------------------------- //Switch Serial.print("Switch["); Serial.print(digitalRead(PIN_SW)); Serial.print("] "); // -------------------------------------------------- //X Serial.print("X-axis["); Serial.print(analogRead(PIN_X)); Serial.print("] "); // -------------------------------------------------- //Y Serial.print("Y-axis["); Serial.print(analogRead(PIN_Y)); Serial.println("]"); delay(500); }
/************************************************* * 【 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); }
/************************************************* * 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】 メロディ リスト * [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 ); }
/*************************************************/ /* 音階(NOTE_B0 - DS8)の周波数(Hz)を定義 */ /* https://www.arduino.cc/en/Tutorial/ToneMelody */ /*************************************************/ #define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 … #define NOTE_CS8 4435 #define NOTE_D8 4699 #define NOTE_DS8 4978
/**********************************************/ /* 【 Elegoo:10 】超音波センサモジュール */ /* 超音波センサモジュールで */ /* 楽器のテルミンを作る */ /* ※※ 音階の周波数と間隔距離(cm)を任意で設定 */ /**********************************************/ /*--------------------------------------------*/ /* SR04ライブラリの作成 */ /*--------------------------------------------*/ #include <SR04.h> #define PIN_TRIG 12 // D12 : 超音波スピーカー #define PIN_ECHO 11 // D11 : 超音波マイク // SR04オブジェクトの作成 SR04 objSr04 = SR04( PIN_ECHO, PIN_TRIG ); /*-------------------------------------------*/ /* ブザーと音階 */ /*-------------------------------------------*/ #define PIN_BUZZER 13 // D13 : ブザー // 音階(ドレミ)の周波数(Hz):NOTE_B0 - DS8 ※※ #include "pitches.h" int aryNote[] = { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5 }; #define NOTE_STEP 3 // 音階の間隔距離(cm) ※※ int intNoteCM; // 音階全長(cm) /*********/ /* setup */ /*********/ void setup() { // -------------------------------------------------- // ブザーpinの設定 // -------------------------------------------------- pinMode( PIN_BUZZER, OUTPUT ); // -------------------------------------------------- // 音階の数と間隔距離から音階全長を設定 // -------------------------------------------------- intNoteCM = ( sizeof(aryNote) / sizeof(aryNote[0]) ) * NOTE_STEP; // -------------------------------------------------- // シリアルモニタ開始 // -------------------------------------------------- Serial.begin( 9600 ); delay( 1000 ); } /********/ /* loop */ /********/ void loop() { // 対象物までの距離を測る(cm) // 不安定解消のため、計数後(ms, 回数)平均を算出 long lngDistance = objSr04.DistanceAvg( 10, 10 ); // -------------------------------------------------- // 測定可能距離の範囲内:2~400cm(精度3mm) // -------------------------------------------------- if( 2 <= lngDistance && lngDistance <= 402 ){ // 対象物までの距離 - 測定可能開始距離(2cm) lngDistance -= 2; // -------------------------------------------------- // 対象物までの距離別にブザーから音(周波数)を出力 // -------------------------------------------------- // 音階全長(cm)以内 if( lngDistance < intNoteCM ) { // 出力する音の決定 int intCnt = lngDistance / NOTE_STEP; // シリアルモニタに表示 Serial.print( lngDistance ); Serial.print("cm : "); Serial.println( intCnt ); // 音の周波数を出力 tone( PIN_BUZZER, aryNote[intCnt] ); // 音階全長(cm)以外 } else { // 周波数の出力を停止 noTone( PIN_BUZZER ); } // -------------------------------------------------- // 測定可能距離の範囲外 // -------------------------------------------------- }else{ // 周波数の出力を停止 noTone( PIN_BUZZER ); } delay( 100 ); }