【Arduino】温度計を作ってみた(arduinoプログラム編)

こんにちはkazuです。
arduinoで温度計を作ってみたので
解説していきます。
今回はプログラミング編です。

センサから温度取得

まずは温度センサから温度を取得するためのコードになります。
まだセグメントは関係ないです。
実際に見ていきましょう。

int sensorPin = A0;
int sensorValue = 0;

void setup(){
  Serial.begin(9600);
}
void loop() {
  sensorValue = analogRead(sensorPin);
  float temp = calculationTemp(sensorValue);
  Serial.println(temp);
  // 15分
  delay(900000);
}
// 温度計算
float calculationTemp(int analogVal){
  float volt = 5;
  float tempC = ((volt * analogVal) / 1024) * 100;
  return tempC; 
}

コードを見ると簡単そうに見えますよね?
実際に処理としてはcalculationTempに数値を渡して
計算したものをfloatで返しているだけです。
ちなみに今回はfloatにしましたがint型で整数値だけ返すことも可能になります。
実際に見てみるとこのように温度を返してくれます。

できていますね!
ちなみにですが今回はcsvを作成するということですので、
csvを作成するだけであるならarduinoは上記コードを書いておけば
csvの作成はすることができます。
次から実際にセグメントを使った温度表示をしてみましょう!

セグメント表示

int sensorPin = A0;
int sensorValue = 0;
//セグメント追加
int temperature = 0;
boolean flag = false;

// 0-9のセグメントLED表示配列
boolean segmentArray[10][7]={
  {0,0,0,0,0,0,1}, //0
  {1,0,0,1,1,1,1}, //1
  {0,0,1,0,0,1,0}, //2
  {0,0,0,0,1,1,0}, //3
  {1,0,0,1,1,0,0}, //4
  {0,1,0,0,1,0,0}, //5
  {0,1,0,0,0,0,0}, //6
  {0,0,0,1,1,0,1}, //7
  {0,0,0,0,0,0,0}, //8
  {0,0,0,0,1,0,0}, //9
};

void setup(){
  Serial.begin(9600);
  //2~8番ピン デジタル出力へセット
  for (int digiPin = 2; digiPin <= 8; digiPin++){
    pinMode(digiPin,OUTPUT);
  }
  pinMode(13,OUTPUT);
  pinMode(11,OUTPUT);
}

void loop() {
  sensorValue = analogRead(sensorPin);

  // print 表示
  float temp = calculationTemp(sensorValue);
  Serial.println(temp);
  
  //  セグメント表示
  // pin HIGH5V LED点灯 LOW0V LED非点灯
  temperature = calculationTemp(sensorValue);
  if(flag) {
    digitalWrite(11,LOW);
    digitalWrite(13,HIGH);
    flag = false;
    numDisplay(numParse(temperature,1)); //1の位決定
  } else {
    digitalWrite(11,HIGH);
    digitalWrite(13,LOW);
    flag = true;
    numDisplay(numParse(temperature,2)); //10の位決定
  }
  
  // 15分(csv出力時こちらを読み込み)
 //  delay(900000);
  // 0.01秒(セグメント使用時はこれを読み込み)
  delay(10);
}

void numDisplay(int number){
  for (int obj=0; obj<=7; obj++){
    digitalWrite(obj+2,segmentArray[number][obj]);
  }
}

int numParse(int number,int index){ 
  if(index == 1) {
    //10で割ったあまり = 1の位の値
    return number % 10; 
  } else if(index == 2) {
    //10で割った値を整数にする = 10の位の値
    return number / 10; 
  }
  return 0;
}

// 温度取得
float calculationTemp(int analogVal){
  float volt = 5;
  float tempC = ((volt * analogVal) / 1024) * 100;
  return tempC; 
}

セグメントの表示でだいぶ増えましたね!
実際に動かしたものを確認してみてください。


ちゃんと温度が表示されているのがわかりますね!
ここで注意していただきたいのですが
delay(10);の部分ですが、遅くすると温度計の役割をしません。
今回表示してるのは0.01秒を常に読み込んで温度表示をしています。
そして、10の位と1の位を表示するのに2回読み込んで(0.02秒)で10の位と1の位を表示していますので、
1回の呼び出しを遅くすると片方しか表示していないようにしか見えなくなります。
それだけは注意してください。
ここが上手く実装できていなくてcsvの出力とバラバラになってしまうということです。
csvは15分ごとに記載していきたいと思っていたので…
まぁ2日でやったにしてはよくできましたが(笑)
改良必要ですね!

最後に

いかがでしたでしょうか?
自分としては改良の余地はありますが、
メインとしては温度をcsvに出力させるのでそこそこ満足しています。
前回に回路編の記事を書いているのでそちらも見てみてください。
最後までご覧いただきありがとうございました。

関連記事

こんにちはkazuです。 本日はarduinoで温度計を作ってみたので 解説していきます。 はじめに まずは今回どのようなものを作成したかといいますと、 温度センサから温度を取得してそれをセグメント(LED)に 温度を表[…]

関連記事

こんにちはkazuです。 arduinoで温度計を作ってみたので 解説していきます。 今回はpythonプログラミング編です。 pythonでのcsv取得 pythonからのcsv作成はあまり難しいことは ありません。 コード[…]