2026年8月10日月曜日

Arduino Uno:温度センサADT7310(SPI),AE-TB6612,SHT35(I2C)

https://independence-sys.net/main/?p=3804 より参照
Arduino Unoとは以下のように接続します。
ADT7310 – Arduino 3.3vでもうごくのでラズピコでもOK
CS – Pin10 SS(CS)     chip select マイナス論理
SDI – Pin11 MOSI      sdi:   serial data in
SDO – Pin12 MISO sdo: serial data out
SCL – Pin13 SCK        scl:   serial clock line
VDD – 5V
GND – GND
Arduino UnoのMISO(Master In Slave Out)端子は、SPI通信でセンサー(スレーブ)からデータを受け取る(読み込む)ための入力端子 MOSIはMaster Out Slave Inの略で、
Arduino(マスター)からセンサや周辺機器(スレーブ)へデータを送信(出力)するための端子です。つまりtx,rxのようなクロス結合となっている。I2CはDaisy Chainで全然ちがう。

#include <SPI.h>
 
/*
 * ADT7310での温度データ取得
 * ADT7310 - Arduino
 *  CS  - Pin10 SS(CS)
 *  SDI - Pin11 MOSI
 *  SDO - Pin12 MISO
 *  SCL - Pin13 SCK
 *  VDD - 5V
 *  GND - GND
 */
 
int SSPin = 10; // Pin10をSS
  
// 初期化
void setup(void) {
  pinMode(SSPin, OUTPUT);
  Serial.begin(9600);
  // 以下の3行は呪文やな
  SPI.setBitOrder(MSBFIRST);  //最上位ビット(MSB)から送信
  SPI.setClockDivider(SPI_CLOCK_DIV128); //通信速度を遅く設定
  SPI.setDataMode(SPI_MODE0); //CPOL(クロック極性):0 CPHA(クロックフェーズ):0
 
  SPI.begin();
  
  SetSSPin(LOW); // マイナス論理、0の間だけ通信可能となる
// 本プログラムではループしつづけるのでSetSSPin(High)は不要
 
  //ソフトウェアリセット
  SPI.transfer(0xFF);
  SPI.transfer(0xFF);
  SPI.transfer(0xFF);
  SPI.transfer(0xFF);
     
  SPI.transfer(0x54);    // 測定開始(continuously read)
  delay(500);            // 仕様上は、240msで開始
}
  
// メインループ
void loop(void) {
  uint16_t uiVal;
  float fVal;
  int iVal;
  
  uiVal = (uint16_t)SPI.transfer(0) << 8;  // AD変換値 上位
  uiVal |= SPI.transfer(0);                // AD変換値 下位
 
  uiVal >>= 3;                          // シフトで13bit化  
  //uiVal = 0x1fff; //確認テスト用
  
  if(uiVal & 0x1000) {               // 13ビットで符号判定
    iVal = uiVal - 0x2000;         // マイナスの時 (10進数で8192)
  }
  else{
    iVal = uiVal;                 //プラスの時
  }
   
  fVal = (float)iVal / 16.0;           // 温度換算(摂氏)
  Serial.println(fVal, 4);             // シリアル送信
   
  delay(5000);          //例として5秒待つ
}
 
/*
 * SSピンの設定
 * Lowでマスタからの通信が有効(セレクト)
 * (Highではマスタから通信出来ない(無視される)セレクト解除の状態)
 */
void SetSSPin(int val)
{
    digitalWrite(SSPin, val);
}

---------------------------------
const int AIN2 = 8// 方向制御ピン1 
const int AIN2 = 7; // 方向制御ピン2 
const int PWMA = 9; // 速度制御ピン (必ずPWM対応ピンにする) 
void setup() { 
// すべて出力ピンとして設定 
 pinMode(AIN1, OUTPUT); 
 pinMode(AIN2, OUTPUT);
 pinMode(PWMA, OUTPUT); } 
void loop() { 
// --- 1. 正転方向にセット --- HIGH,LOWを逆にすると逆転
digitalWrite(AIN1, HIGH); 
digitalWrite(AIN2, LOW);
// --- 2. 徐々に加速 (0 から 255 まで) --- for (int speed = 0; speed <= 255; speed++) 
  analogWrite(PWMA, speed); // PWM出力で速度変更 delay(20); // 20ミリ秒待機 (約5秒で最高速に) }  
delay(2000); // 最高速で2秒間キープ 
// --- 3. 徐々に減速 (255 から 0 まで) --- 
for (int speed = 255; speed >= 0; speed--) 
{ analogWrite(PWMA, speed); delay(20); }
// --- 4. ショートブレーキで1秒停止 --- 
 digitalWrite(AIN1, HIGH); // LOW,LOWは慣性ブレーキでキレが良くない
 digitalWrite(AIN2, HIGH); 
 analogWrite(PWMA, 0); 
 delay(1000); 
}
  • STBY(スタンバイ)ピンの繋ぎ忘れ:ここがGNDに落ちている、またはどこにも繋がっていない状態(オープン)だと、プログラムが正しくてもモーターは一切ピクリとも動きません。必ず5V(HIGH)に接続してください。 
  • 低すぎるPWM値analogWrite の値を 50 以下などの小さな値にすると、モーターの摩擦に負けてジジジと音がするだけで回転しない(ストールする)ことがあります。動かない場合は数値を高めに設定してみてください。 
----------------------------------------------------
#include <Wire.h>
#include <Adafruit_SHT31.h>  
// 手持ちはsht35だがsht31で流用可能とのこと 3.3,5いずれもOK

// SHT35インスタンスの作成
Adafruit_SHT31 sht35 = Adafruit_SHT31();

void setup() {
  // シリアル通信の開始(PCのシリアルモニタで確認用)
  Serial.begin(9600);
  while (!Serial) delay(10); // シリアルポートが開くまで待機

  Serial.println("SHT35 テストプログラム");

  // センサーの初期化 (一般的なI2Cアドレス 0x44 を指定)
  // もし動かない場合は 0x45 に変更してください
  if (!sht35.begin(0x44)) {

    Serial.println("SHT35 センサーが見つかりません。配線を確認してください。");
    while (1) delay(1); // エラー時はここで停止
  }

  Serial.println("SHT35 センサーの初期化に成功しました。");
}

void loop() {
  // 温度(摂氏)と湿度(%)の読み込み
  float temperature = sht35.readTemperature();
  float humidity = sht35.readHumidity();

  // 読み込みが正常に行われたかチェック (NaN: Not a Number)
  if (!isnan(temperature) && !isnan(humidity)) {
    // シリアルモニタへの出力
    Serial.print("温度: ");
    Serial.print(temperature, 2); // 小数点以下2桁
    Serial.print(" °C\t");
    
    Serial.print("湿度: ");
    Serial.print(humidity, 2);
    Serial.println(" %");
  } else {
    Serial.println("センサーからのデータ読み込みに失敗しました。");
  }

  // 2秒待機(SHT35の連続測定負荷を減らすため)
  delay(2000);
}

0 件のコメント:

コメントを投稿