NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

4ch温度測定シールドの作製!その3(プログラム編)

イメージ 3
4chサーミスタ温度測定シールド!

 前回4chサーミスタ温度測定シールド」の形は出来たので、動作させるプログラムを書いてみました

1. プログラム!

 プログラムの内容は先日の記事で書いたサーミスタLCD」「ボタンスイッチ」のプログラムをくっ付けて少し調整しました
//NOBのArduino日記!4ch温度測定シールドの作製!_(20180830)
/*----------------------LCD↓---------------------------*/
#include <Wire.h>//関数読み込み
String LCD_STRING; char s[8]; double SET; //変数の宣言
//コマンド書き込み
void writeCommand(byte command) {
 Wire.beginTransmission(0x3E);
 Wire.write(0x00);
 Wire.write(command);
 Wire.endTransmission(); delay(10);}
//データ書き込み
void writeData(byte data) {
 Wire.beginTransmission(0x3E);
 Wire.write(0x40);
 Wire.write(data);
 Wire.endTransmission(); delay(1);}
//LCDの1行目にデータ書き込み
void LCD_DISP_8_1(void) {
 writeCommand(0x80);//DDRAMアドレスを2行目先頭にセット
 for (int i = 0; i < 8; i++) {
   writeData(LCD_STRING[i]);}}
//LCDの2行目にデータ書き込み
void LCD_DISP_8_2(void) {
 writeCommand(0x40 + 0x80); //DDRAMアドレスを2行目先頭にセット
 for (int i = 0; i < 8; i++) {
   writeData(LCD_STRING[i]);}}
/*----------------------サーミスタ↓---------------------------*/
double Vout;  //出力電圧(Vout)
double R1;  //サーミスタ抵抗値(R1)
double B;  //補正係数(B)
double T;  //サーミスタ温度(T)
//サーミスタ回路の出力電圧から温度に換算
float TempRead(byte pin) {
 Vout = analogRead(pin) * 5.0 / 1024.0; //出力電圧(Vout)を測定
 R1 = (5.0 * 4.7) / Vout - 4.7; //サーミスタ抵抗値(R1)を計算
 B = 3452.9 * pow(R1, -0.012329); //補正係数(B)を計算
 T = B / log(R1 * exp(B / (25 + 273.15)) / 10) - 273.15; //サーミスタ温度(T)を計算
 return T;}
/*----------------------ボタンスイッチ↓---------------------------*/
byte Count = 0;  // Countボタンを押した回数
uint32_t ms, lastChange = millis(), dbTime = 25, Time = lastChange;
bool lastState = false, state = false, invert = false, changed = false, pinVal = false;
bool ButtonRead(uint8_t pin) {
 ms = millis(); pinVal = digitalRead(pin);
 if (invert) pinVal = !pinVal;
 if (ms - lastChange < dbTime) {changed = false;
 } else {
   lastState = state; state = pinVal; changed = (state != lastState);
   if (changed) lastChange = ms;}
 Time = ms;
 return !state && changed;}//離した時True
/*------------------------------------------------------------------*/


void setup() {
 Serial.begin(57600);           //57600bpsでシリアルポートを開く
 /*----------------------LCD↓---------------------------*/
 //液晶初期化
 Wire.begin(); delay(100);
 writeCommand(0x38); delay(20);
 writeCommand(0x39); delay(20);
 writeCommand(0x14); delay(20);
 writeCommand(0x75); delay(20); //3.3V=0x73, 5V=0x7A(コントラスト調整)
 writeCommand(0x54); delay(20); //3.3V=0x56, 5V=0x54
 writeCommand(0x6C); delay(20);
 writeCommand(0x38); delay(20);
 writeCommand(0x01); delay(20);
 writeCommand(0x0C); delay(20);
 byte fig[8] = {0x08, 0x14, 0x08, 0x07, 0x08, 0x08, 0x08, 0x07};//「℃」文字作成
 for (int i = 0; i < 8; i++) {
   writeCommand(0x40 + i); //CGRAMアドレスをi行目にセット
   writeData(fig[i]);}  //作ったCGRAMDataをCGRAMアドレスに出力
 /*----------------------サーミスタ↓---------------------------*/
 pinMode(A0, INPUT);  //A0~A3番ピンを入力用に設定する
 pinMode(A1, INPUT);
 pinMode(A2, INPUT);
 pinMode(A3, INPUT);
 /*----------------------ボタンスイッチ↓---------------------------*/
 pinMode(2, INPUT_PULLUP);}  //2番ピンをプルアップし入力用に設定する
 /*------------------------------------------------------------------*/


void loop() {
 /*-----------ボタンで選択したchの温度をLCDにI2C出力↓---------------*/
 float Temp[4];byte i,j;  //まとめて宣言
 for (i = 0; i < 4; i++) Temp[i] = TempRead(i); //4ch全て温度測定
 if (ButtonRead(2)) Count++; //ボタンが押されたらCount1増加
 if (Count == 4) Count = 0; //Countが4になったら0に戻す
 if (Count == 3) {j = 0;} else {j = Count + 1;}  //LCD二行目のNoをjに代入
 LCD_STRING = String(String(Count + 1) + String(dtostrf(Temp[Count], 6, 1, s))); 
 LCD_DISP_8_1();//LCD一行目に変数を出力する
 LCD_STRING = String(String(j + 1) + String(dtostrf(Temp[j], 6, 1, s)));
 LCD_DISP_8_2();//LCD二行目に変数を出力する
 /*----------------------PCにシリアル出力---------------------------*/
 Serial.print(Temp[0]); //温度をシリアル出力
 Serial.print(","); Serial.print(Temp[1]); //温度をシリアル出力
 Serial.print(","); Serial.print(Temp[2]); //温度をシリアル出力
 Serial.print(","); Serial.println(Temp[3]);} //温度をシリアル出力
 /*------------------------------------------------------------------*/
イメージ 1
図4:プログラム

2. まとめ

 次回は作ったプログラムが「4chサーミスタ温度計」でちゃんと温度が測れるか確認してみます!

イメージ 1イメージ 3
励みになりますのでよければクリック下さい(^o^)/



この商品は、Amazon.co.jp が販売、発送します。 ギフトラッピングを利用できます。