4chサーミスタ温度測定シールド!
1. プログラム!
//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)
//サーミスタ回路の出力電圧から温度に換算
/*----------------------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() {
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_STRING = String(String(j + 1) + String(dtostrf(Temp[j], 6, 1, s)));
/*----------------------PCにシリアル出力---------------------------*/
Serial.print(Temp[0]); //温度をシリアル出力
Serial.print(","); Serial.print(Temp[1]); //温度をシリアル出力
Serial.print(","); Serial.print(Temp[2]); //温度をシリアル出力
Serial.print(","); Serial.println(Temp[3]);} //温度をシリアル出力
/*------------------------------------------------------------------*/
図4:プログラム