Arduino
lcd
ArduinoDue

Arduinoで指数表示する

Arduinoを使って真空度計を作りたいな。と思うとき、ありますよね。

一般的な真空度の単位であるTorrは、指数表示のオーダーが重要な場面が多いです。でも、Arduinoのフォーマット指定子では、進数表示はサポートされていますが、指数表示がサポートされていません。なので、指数表示する関数がどこかにあるかなと思い検索しましたが、あまりヒットしなかったので、記事にします。


真空度計

今回作った真空度計の仕組みはシンプルです。PKR251という、真空装置に取り付けることで、真空度を電圧で返してくれる装置があります。これから返ってきたアナログ電圧を、ArduinoでAD変換して、電圧→真空度関数に代入、LCDに表示するだけです。お手軽ですね!

2019-05-10_16.30.20.png


Arduino Due

12bitでAD変換したいな、と思ったので、Arduino Dueを用いました。Arduino Dueの記事もあまり見なかったので、いいかなと思います。注意点は


注意!他の主なArduinoボードと違って、Arduino Dueは3.3 V版です。

各I/Oピンに入力できる最大電圧は3.3 Vです。I/Oピンに5 Vを入力するとボードにダメージを与える可能性があります。


Arduino Due - スイッチサイエンス



です。先程のPKR251は8.5Vまで電圧を返せるので、1/3に分圧をしてから、Dueに入れる必要があります。その結果、分解能は下がりますが、Arduino Unoを用いて作った場合より、2.67倍の分解能があります。(Arduino Unoも1/2に分圧はするため。)


LCD

LCDの表示はLiquid Crystal関数で表示できます。Arduinoはお手軽でいいですね。


指数表示を表示する部分を含んだコード

指数表示する関数を作っても良かったのですが、とりあえず動けばいいかということで、このようなコードになっています。気が向いたらきれいにしてみます!編集リクエストもぜひ!

#include <LiquidCrystal.h>

LiquidCrystal Lcd1(12, 11, 7, 6, 5, 4);//正面右側、スイッチ側
LiquidCrystal Lcd2(14, 15, 18, 19, 20, 21);//正面左側、USB側

void setup() {
// シリアル接続を開始する
Lcd1.begin(2, 12);
Lcd2.begin(14, 21);
}

void loop() {
// A0からの入力を標準の分解能で読み取り(10ビット),
// シリアル通信で送信する

analogReadResolution(12);
float v1, v2, v3, v4;//A1~4で入力された電圧値
float p1, p2, p3, p4;//それより求まる真空度
v1 = analogRead(A1) * 3.3 / 4095;
v2 = analogRead(A2) * 3.3 / 4095;
v3 = analogRead(A3) * 3.3 / 4095;
v4 = analogRead(A4) * 3.3 / 4095;
p1 = pow(10, 1.667 * v1 * 3 - 11.46);
p2 = pow(10, 1.667 * v2 * 3 - 11.46);
p3 = pow(10, 1.667 * v3 * 3 - 11.46);
p4 = pow(10, 1.667 * v4 * 3 - 11.46);

//ch1の表示
int cnt1 = 0;
if(p1 > 10){
while(1){
if(p1 < 10){
break;
}
p1 /= 10;
cnt1++;
}
}else if(p1 < 1){
while(1){
if(p1 > 10){
break;
}
p1*=10;
cnt1--;
}
}

analogReadResolution(12);
Lcd2.print("ch1 : ");
Lcd2.print(p1/10, 2);
Lcd2.print("e");
if(cnt1>0){
Lcd2.print("+");
}
Lcd2.print(cnt1 + 1, DEC);

Lcd2.setCursor(0, 1);

//ch2の表示
int cnt2 = 0;
if(p2 > 10){
while(1){
if(p2 < 10){
break;
}
p2 /= 10;
cnt2++;
}
}else if(p2 < 1){
while(1){
if(p2 > 10){
break;
}
p2*=10;
cnt2--;
}
}

analogReadResolution(12);
Lcd2.print("ch2 : ");
Lcd2.print(p2/10, 2);
Lcd2.print("e");
if(cnt2>0){
Lcd2.print("+");
}
Lcd2.print(cnt2 + 1, DEC);

//ch3の表示
int cnt3 = 0;
if(p3 > 10){
while(1){
if(p3 < 10){
break;
}
p3 /= 10;
cnt3++;
}
}else if(p3 < 1){
while(1){
if(p3 > 10){
break;
}
p3*=10;
cnt3--;
}
}

analogReadResolution(12);
Lcd1.print("ch3 : ");
Lcd1.print(p3/10, 2);
Lcd1.print("e");
if(cnt3>0){
Lcd1.print("+");
}
Lcd1.print(cnt3 + 1, DEC);

Lcd1.setCursor(0, 1);

//ch4の表示
int cnt4 = 0;
if(p4 > 10){
while(1){
if(p4 < 10){
break;
}
p4 /= 10;
cnt4++;
}
}else if(p4 < 1){
while(1){
if(p4 > 10){
break;
}
p4*=10;
cnt4--;
}
}

analogReadResolution(12);
Lcd1.print("ch4 : ");
Lcd1.print(p4/10, 2);
Lcd1.print("e");
if(cnt4>0){
Lcd1.print("+");
}
Lcd1.print(cnt4 + 1, DEC);

// シリアルモニタを過度に使用しないようにするための少しのディレイ
delay(500);
Lcd1.clear();
Lcd2.clear();
}