誘導雷で壊れたと思われるarduinoを利用したボイラーの灯油タンク レベルセンサー(超音波)を修理してみた。どうやら、AVRとセンサが破損したようで、この2つを交換したら復活した。今度は、サージアブソーバーをつけてみた。これで、破損を防止できればいいのだが。。また、家庭用コンセントから電源とると、他の機器を破損するおそれもあるので、充電池を利用してみた。灯油タンクの針は窓から見にくい位置にあるため、室内で手軽に残量を計測できるのは、とても便利である。
スケッチは以下のとおり
//
// I2C制御 ACM1602 共通関数テスト用I2Cホスト
// wire使用バージョン
//
#include <Wire.h> // I2C
#include "wAcm1602Func.h" // LCD共通関数
wLcdFunc lcd; // LCD共通関数
char StrBuf[17];
//反射波の変数を用意
unsigned long echo = 0;
//信号ピンを9番ピンに設定
int signalPin = 9;
void setup(void) {
byte adrs, i;
Wire.begin(); // I2C初期化
lcd.init(); // LCD初期化
lcd.clear(); // 全クリア
lcd.noBlink(); // カーソル点滅なし
lcd.noCursor(); // カーソル表示なし
delay(1000);
// 表示OFF/ON
lcd.display();
delay(1000);
}
void loop(void) {
//まず信号ピンを出力に設定(発信用)
pinMode(signalPin, OUTPUT);
//2マイクロ秒間LOWで出力
digitalWrite(signalPin, LOW);
delayMicroseconds(2);
//5マイクロ秒間HIGHで出力
digitalWrite(signalPin, HIGH);
delayMicroseconds(5);//超音波発信
//信号ピンをLOWに戻す
digitalWrite(signalPin, LOW);
//信号ピンを入力に設定(受信用)
pinMode(signalPin, INPUT);
//信号ピンをHIGHに設定
digitalWrite(signalPin, HIGH);
//反射波が戻ってくるまでの時間を計測し
//片道の時間(半分の値)にする
echo = pulseIn(signalPin, HIGH)/2;
//ミリメートル単位に変換
int distance = echo*0.34442;
//距離を出力
lcd.setCursor(0, 0);
sprintf(StrBuf, "%03dL", 30*(670-distance)/100);
lcd.string(StrBuf);
lcd.setCursor(4, 0);
sprintf(StrBuf, "(67-%02d=%02dcm)", distance/10,67-distance/10);
lcd.string(StrBuf);
// 数値文字列表示
for(int x=0;x< 17*(670-distance)/670 ;x=x+1){
lcd.setCursor(x, 1); // カーソル位置指定
sprintf(StrBuf, "*");
lcd.string(StrBuf);
}
delay(250);
// 文字列表示
lcd.clear(); // 全クリア
参考サイト
http://www.eleki-jack.com/mycom2/2012/05/arduinoi2clcd_acm16021.html
http://kousaku-kousaku.blogspot.jp/2008/08/arduino_22.html