電子工作メモ1(圧電スピーカ―、温度センサ)
環境
Arduino Uno
Arduino IDE 2.0.1
圧電スピーカー(?)
温度センサ(ADT7310, ADT7410)
圧電スピーカー
圧電スピーカーには+と-があって、丸い部分に[+]と表記があり、そこで区別する。
私のスピーカーには[+]表記が無く、代わりに[M]との表記がある。とりあえず[M]が書かれている側を+としてやってみよう。
回路図
人生初めて回路図を書いた。なんか感動。
プログラム
鳴った!音階でいうところの「ド」が鳴った!
やはり[M]表記が[+]でいいらしい。
#define NOTE_C5 523
const int BUZZER_PIN=8;
int duration =500;
void setup() {
pinMode(BUZZER_PIN,OUTPUT);//デジタル8番PINをアウトプットに設定
}
void loop() {
tone(BUZZER_PIN,NOTE_C5,duration);//durationミリ秒間、周波数NOTE_C5Hzの音をだす。
delay(1000);//1秒何もせず待つ
}
温度センサ
温度センサと湿度センサを試したかったが、間違えて温度センサを2つ買っていた…アホ過ぎる…
回路図
初めて回路図シンボルを作成した。絶対何違うと思う。
プログラム
#include <Wire.h> //I2C通信のライブラリ
int adt7410I2CAddress = 0x48; //温度センサのアドレス
void setup(void) { // 初期化
Serial.begin(9600); //シリアル通信開始
Wire.begin(); //I2C通信開始
}
void loop(void) {
uint16_t uiVal; //2バイト(16ビット)の領域
float fVal;
int iVal;
Wire.requestFrom(adt7410I2CAddress, 2); //2バイト要求
uiVal = (uint8_t)Wire.read() << 8; // 1バイト読み出しで上位にシフト
uiVal |= Wire.read(); // 1バイト読み出して下位にセット。Wire.readが8ビットずつしか呼べないから、2回呼び出して結合している?
uiVal >>= 3; // 右シフトで13bit化。2回目の1バイトデータの下三桁はデータが無いらしい
if (uiVal & 0x1000) { // 13ビットで符号判定(1ならマイナス、0ならプラの温度を示す)
iVal = uiVal - 0x2000; // マイナスの時 (10進数で8192を引く)
}
else {
iVal = uiVal; //プラスの時
}
fVal = (float)iVal / 16.0; // 温度換算(摂氏)
Serial.println(fVal, 4); // シリアル送信 小数点以下4桁表示
delay(1000); //1秒待つ
}
コードは「計測ブログ」様を参考にした。
pinModeで入力/出力ピンを指定する必要は無いのかな。
I2I通信についても理解が曖昧である。追って理解しよう。
何はともあれ温度を取得できた!分解能0.0625って地味にすごいな