2013年3月31日日曜日

誘導雷で壊れたと思われる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