下手の横好きのスクラップブック!!

下手の横好きの、いろいろな記録です。
電子工作・PIC・Arduino・太陽光発電・写真などetc

Arduinoで温度と湿度を計測する

2010-12-27 | Arduino

温度の計測には、センサーとしてLM61CIZを使用してマイナスの気温も測れるようにしし、さらに湿度を測れる機能を追加することにしました。
湿度センサーには、GE Sensing社製のHS15Pがあり比較的安価に入手できますが、使用に当たっては制約があります。
HS15Pは交流信号を加え、湿度によりインピーダンスが変化するのを読み取ります。
その変化は指数関数的に変化するので対数増幅器を接続して直線的な出力にする必要があります。
一方TDK社製のCHS-GSSは全ての回路がオールインワンになっていて、若干価格的には高いのですが、5Vを加えるだけで、DC1Vの出力が100%(RH)になり電圧計の読みがそのまま位取りの変換だけで相対湿度が読み取れます。
今回は価格の高さに目をつぶりCHS-GSSを使うことにしました。

接続図

スケッチ

//温度と湿度の測定

#include <LiquidCrystal.h>

//センサーに接続したアナログピンの番号
float sensor1Pin = 0;
float sensor2Pin = 1;

//変数の定義
float v = 5;
float temp = 0;
float hum = 0;
float value1 = 0;
float value2 = 0;

 
//LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  //LCDの桁数と行数をセットする
  lcd.begin(16, 2);
}

void loop() {
  //LCDの表示をクリアする
  lcd.clear();
 
  //センサーピン0の温度センサーの値を読み取る
  value1 = analogRead(sensor1Pin);
 
  //センサーピン1の湿度センサーの値を読み取る
  value2 = analogRead(sensor2Pin);
 
  //読み取った値を温度に換算
  temp = (((v / 1024) * value1) * 100)-60 ;
 
  //読み取った値を湿度に換算
  hum = ((v / 1024) * value2) *100;
 
  //LCDに温度を表示する
  lcd.print("temp: ");
  lcd.print(temp);
  lcd.setCursor(10, 0);
  lcd.write(0xDF);
  lcd.print("C ");
 
   lcd.setCursor(0, 1);
  lcd.print("hum : ");
  lcd.print(hum);
  lcd.setCursor(10, 1);
  lcd.print("% ");
 
  //次のループまで1秒待つ
  delay(1000);
}

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduino で温度を計る(3)

2010-12-23 | Arduino

マイナスの温度も計測できるようにする。

LM35DZをセンサーとして使用した場合の温度測定範囲は0℃から+100℃でした。
当地盛岡では冬期間の外気温度は当然氷点下になりますので、このまヽでは気温の測定には使えないことになります。
そこでマイナスの気温でも測定が可能なようにセンサーをLM61CIZに取り替えて実測してみました。
LM61CIZの測定範囲は-30℃から+100℃とになり、0℃のときの出力電圧は600mvになります。つまり600mvのオフセットがかかっていることになります。
そのことにより、単電源でマイナス温度まで計れることになります。

スケッチの変更は温度に変換する計算式が変わります。

  temp2 = (((V / 1024) * Value2) * 100) -60

 

早朝の外気温が氷点下の時に実測した写真です。temp1の表示はセンサーがLM35DZで測定範囲を超えていますので、ゼロになり、temp2はLM61CIZですのでマイナスの温度が表示されています。

変更したスケッチ(赤字の部分が変更箇所)

//マイナスの温度を測れるようにセンサーを変更

#include <LiquidCrystal.h>

//センサーに接続したアナログピンの番号
float sensor1Pin = 0;
float sensor2Pin = 1;

//変数の定義
float v = 5;
float temp1 = 0;
float temp2 = 0;
float value1 = 0;
float value2 = 0;
int sum = 0;
int data = 0;
 
//LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  //LCDの桁数と行数をセットする
  lcd.begin(16, 2);
}

void loop() {
  //LCDの表示をクリアする
  lcd.clear();
 
  //センサーピン1の温度センサーの値を読み取る
  //センサーの値を50回読み取り平均化する
 sum = 0;
 for (int i = 0; i < 50; i++) {
  data = analogRead(sensor1Pin);
 sum = sum + data;
 delay(2);
 }
  value1 = sum / 50;
 
  //センサーピン2の値を読み取る
  value2 = analogRead(sensor2Pin);
 
  //読み取った値を温度に換算
  temp1 = ((v / 1024) * value1) * 100 ;
  temp2 = (((v / 1024) * value2) * 100)-60 ;
 
  //LCDに温度を表示する
  lcd.print("temp1: ");
  lcd.print(temp1);
  lcd.setCursor(11, 0);
  lcd.write(0xDF);
  lcd.print("c ");
 
   lcd.setCursor(0, 1);
  lcd.print("temp2: ");
  lcd.print(temp2);
  lcd.setCursor(11, 1);
  lcd.write(0xDF);
  lcd.print("c ");
 
  //次のループまで1秒待つ
  delay(1000);
}

 

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

湯島天神、上野公園の散策

2010-12-21 | 旅行

 12月19日東京へ所用で出かけましたが、空き時間を利用し近場を散策しました。

湯島天神

季節外れとは思いましたが、湯島の白梅で有名な湯島天神を見学しました。JR徒町駅から徒歩で10~15分ぐらいのところにあり、急な階段(男坂)を登るとすぐ境内です。日曜日でもあり参拝客が多く見られました。

   

うえの華灯路 浮世絵行燈

夕方5時過ぎ周囲が暗くなってから、上野公園の浮世絵行燈を見に行きました。平成19年に開始されたということで、歌川広重の「名所江戸百景」が行燈に描かれております。相当の数になると思いますが、なにぶんにも広い公園ですので、暗い道筋に薄ぼんやりと灯る独特の雰囲気を醸し出しておりました。

    

西郷さんの銅像脇の巨木のイルミネーション

  

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduino で温度を測る(2)

2010-12-13 | Arduino

測定した温度が設定値を上回ったらLEDを点灯させる

測定した温度が、事前に設定しておいた温度を超えた時にLEDを点灯させるように、
回路とスケッチを変更してみました。

2個使用していた温度センサーの内1個(temp2)を10KΩの可変抵抗器に置き換え、この可変抵抗器で温度を設定します。

temp2の温度への換算式は次のように変更します。
 temp2 = ((v / 1024) * value2) * 20 ;

式の最後で100倍にして温度表示にしていたものを、20に変更して設定温度を設定しやすいようにします。
使用する可変抵抗器はB型(変化が直線的に変わる)の方が調整しやすくなります。。

LEDを点灯するスケッチの追加

測定した温度 >= 設定した温度 の時 ledPinを HIGHにします。


 if( temp1 >= temp2) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }

スケッチ全体

//測定した温度が設定値より高くなったらLEDを点灯

#include

//センサーに接続したアナログピンの番号
float sensor1Pin = 0;
float sensor2Pin = 1;

//LEDを接続したピン番号
int ledPin = 13;

//変数の定義
float v = 5;
float temp1 = 0;
float temp2 = 0;
float value1 = 0;
float value2 = 0;
int sum = 0;
int data = 0;
 
//LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  //LCDの桁数と行数をセットする
  lcd.begin(16, 2);
  //
  pinMode(13, OUTPUT);
}

void loop() {
  //LCDの表示をクリアする
  lcd.clear();
 
  //センサーピン1の温度センサーの値を読み取る
  //センサーの値を50回読み取り平均化する
 sum = 0;
 for (int i = 0; i < 50; i++) {
  data = analogRead(sensor1Pin);
 sum = sum + data;
 delay(2);
 }
  value1 = sum / 50;
 
  //センサーピン2の値を読み取る
  value2 = analogRead(sensor2Pin);
 
  //読み取った値を温度に換算
  temp1 = ((v / 1024) * value1) * 100 ;
  temp2 = ((v / 1024) * value2) * 20 ;
 
  //
  if( temp1 >= temp2) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
 
  //LCDに温度を表示する
  lcd.print("temp1: ");
  lcd.print(temp1);
  lcd.setCursor(11, 0);
  lcd.write(0xDF);
  lcd.print("c ");
 
   lcd.setCursor(0, 1);
  lcd.print("temp2: ");
  lcd.print(temp2);
  lcd.setCursor(11, 1);
  lcd.write(0xDF);
  lcd.print("c ");
 
  //次のループまで1秒待つ
  delay(1000);
}

配線図

ボード

温度が上昇した時にそれを感知して冷却ファンを自動でまわす時などに応用できます。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduinoで温度を測る

2010-12-12 | Arduino

Arduinoで温度を測る
前回で完成したLCDパネルを利用して温度を測り表示してみた。
温度センサはIC温度センサのLM35を使います。
LM35DZは出力が摂氏温度に比例しており、温度係数はリニアで +10.0mv/℃です。
o℃で0v、10℃で100mv、20℃で200mvの出力があり、+25℃で0.5℃の精度があります。

一方Arduinoのアナログ入力は 0~5vの電圧を1024段階で読み取りますので、これを
0~500℃のスケールで温度として使用できることになりますが、実際動作範囲は0~100℃になります。

センサーの読み取り値の温度への換算

温度(℃)=((5/1024)*温度センサの読み取り値)*100

今回は温度センサを2個使い、一方では計測した温度を50回積算しその平均を算出してLCDに表示し、
もう一方は1回の計測値をそのまま表示しております。

50回の平均値を表示 TEMP1
1回の計測値を表示  TEMP2

温度を測るスケッチ

//温度を測る temp3

#include <LiquidCrystal.h> 

//センサーに接続したアナログピンの番号
float sensor1Pin = 0;
float sensor2Pin = 1;

//変数の定義
float v = 5;
float temp1 = 0;
float temp2 = 0;
float value1 = 0;
float value2 = 0;
int sum = 0;
int data = 0;
 
//LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  //LCDの桁数と行数をセットする
  lcd.begin(16, 2);
}

void loop() {
  //LCDの表示をクリアする
  lcd.clear();
 
  //センサーピン1の温度センサーの値を読み取る
  //センサーの値を50回読み取り平均化する
 sum = 0;
 for (int i = 0; i < 50; i++) {
  data = analogRead(sensor1Pin);
 sum = sum + data;
 delay(2);
 }
  value1 = sum / 50;
 
  //センサーピン2の値を読み取る
  value2 = analogRead(sensor2Pin);
 
  //読み取った値を温度に換算
  temp1 = ((v / 1024) * value1) * 100 ;
  temp2 = ((v / 1024) * value2) * 100 ;
 
  //LCDに温度を表示する
  lcd.print("temp1: ");
  lcd.print(temp1);
  lcd.setCursor(11, 0);
  lcd.write(0xDF);
  lcd.print("c ");
 
   lcd.setCursor(0, 1);
  lcd.print("temp2: ");
  lcd.print(temp2);
  lcd.setCursor(11, 1);
  lcd.write(0xDF);
  lcd.print("c ");
 
  //次のループまで1秒待つ
  delay(1000);
}

LM35DZ

LM35DZには3本の足がありそれぞれ +5v、Vout、GNDに接続します。
実際に動作している時に指でつまむと、表示値が変化しますので動作の確認ができます。

ボードの配線

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ArduinoにLCDを接続し文字を表示させる

2010-12-06 | Arduino

ArduinoにLCDを接続する

LEDの点滅から一歩前進させて、今回はLCD(Liquid Crystal Display)キャラクタディスプレイをを使っていろんな表示に利用してみたいと思います。

Arduinoには、LCD用のライブラリが用意されており、このライブラリが対象としているのはコントローラーLSIが日立のHD44780に対応したもので、数多くのモジュールが販売されているとのことです。

今回はSD1602Hを使いますが、ピンの配置がちょっと変わっていますので配線の時に注意が必要です。
このディスプレイは2行16桁のキャラクタディスプレイで、ライブラリを利用してLDCに文字を表示することができます。

SD1602Hの外観

表面   

裏面

 ピン配置と接続

      

接続図

スケッチ

// LCDを接続する

//「sketch」メニューからLiquidCrystalライブラリを読み込み
#include

//使用するピンの定義
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  //LCDの行と桁数の設定
  lcd.begin(16, 2);
 
  //0行目にメッセージを表示
  lcd.print("Hello,world!"); 
}
 
void loop() {

  //カーソルを0桁、1行目にセット
 lcd.setCursor(0, 1);
 
 //動作開始からの経過時間を秒単位で表示
 //「zikann :」を 0桁1行目表示
 lcd.print("zikan :");

 //8桁1行目に経過時間を秒単位で表示
 lcd.setCursor(8,1);
  lcd.print( millis() / 1000);
  lcd.setCursor(13,1);
  lcd.print("sec");
}

ボード

コメント (4)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Arduino RGB 3色フルカラーLEDの明るさと色の調整

2010-12-03 | Arduino

RGB 3色フルカラーLEDの明るさと色をランダムに変えながら点灯させる

前回は各色の明るさを 0から255までの256段階を連続的に変化させ
明るさと色を変化させましたが、今回は 0から255の値をランダムに変化
させることにより、色と明るさを変化させてみました。
更に、ランダムに変更される値をシリアル・プリントで確認できるようにしました。


接続図は前回と全く同じです

スケッチ

/*RGB3色LEDを各色順番に点灯
各色の明るさはランダムに変化する
点灯はフェードイン/フェードアウトで行う
シリアル・プリントでrandNumberの値を読む
*/

const int ledrPin = 9;  //ピン9LED赤を接続
const int ledbPin = 10;  //ピン10LED青を接続
const int ledgPin = 11;  //ピン11LED緑を接続

 int randNumber = 0;  //LEDの明るさを設定する変数

void setup () {
  pinMode(ledrPin, OUTPUT);  //LEDピンを出力に設定
  pinMode(ledbPin, OUTPUT);
  pinMode(ledgPin, OUTPUT);
  Serial.begin(9600);
}

void loop () {
  //色の選択 0 = 赤: 1 = 青: 2 = 緑
  for(int j = 0; j <= 2; j++) {
    if( j == 0) {
      //赤をフェードインで点灯
      randNumber = random(0,110);
       Serial.println(randNumber);
      for(int i = 0; i <= randNumber; i++) {
        analogWrite(ledrPin,i);
        delay(30);
      }
   
      //色の選択 0 = 赤: 1 = 青: 2 = 緑 
     }else if( j == 1) {
        //青をフェードインで点灯
         randNumber = random(40);
           Serial.println(randNumber);
       for(int i = 0; i <= randNumber; i++) {
        analogWrite(ledbPin,i);
        delay(30);
      }
    
    } else {
       //緑をフェードインで点灯
        randNumber = random(256);
          Serial.println(randNumber);
       for(int i = 0; i <= randNumber; i++) {
        analogWrite(ledgPin,i);
        delay(30);
      }
   
    }
  }
}

シリアルプリント画面

 

RGB 3色フルカラーLEDの明るさを半固定抵抗(VR)で調整し点灯させる


アナログ入力端子に半固定抵抗器(VR)を接続し入力された電圧値をanalogRead読み、
それを 0から255の値に変換することによりLEDの明るさを調整する。
各色とも同じ回路、同じスケッチで動作させ3個のVRで明るさと色を自由に変えることができます。

接続図

スケッチ

/*RGB3色LEDを半固定抵抗(VR)で各色の調整をする*/

const int ledrPin = 9;  //ピン9LED赤を接続
const int ledbPin = 10;  //ピン10LED青を接続
const int ledgPin = 11;  //ピン11LED緑を接続

const int vrrPin = 0;  //ピン0にVR(赤)を接続
const int vrbPin = 1;  //ピン1にVR(青)を接続
const int vrgPin = 2;  ///ピン2にVR(緑)を接続


void setup () {

  pinMode(ledrPin, OUTPUT);  //LEDピンを出力に設定
  pinMode(ledbPin, OUTPUT);
  pinMode(ledgPin, OUTPUT);

  }

void loop () {

  //vrrPinの値ををvluerに読み取り
  //vluerをmapにより intensityr(0~255)に変換
  //intensityrの値でledrを点灯

  int valuer = analogRead(vrrPin);
  int intensityr = map(valuer, 0, 1023, 0, 255);
  analogWrite(ledrPin,intensityr);
 
  //vrbPinの値ををvluebに読み取り
  //vluebをmapにより intensityb(0~255)に変換
  //intensitybの値でledbを点灯

  int valueb = analogRead(vrbPin);
  int intensityb = map(valueb, 0, 1023, 0, 255);
  analogWrite(ledbPin,intensityb);
 
  //vrgPinの値ををvluegに読み取り
  //vluegをmapにより intensityg(0~255)に変換
  //intensitygの値でlegrを点灯

  int valueg = analogRead(vrgPin);
  int intensityg = map(valueg, 0, 1023, 0, 255);
  analogWrite(ledgPin,intensityg);

  }
   

ボード

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

我が家の太陽光発電  2010年11月の発電量

2010-12-02 | 太陽光発電

 12月1日付けで発表された気象庁の「11月の天候」によると、盛岡の日照時間は120.3時間で平年比101%でした。発電量は昨年に比べて若干増えております。

因みに、昨年の日照時間は102.4時間で平年比86%でした。

11月29日には初積雪もあり、これから本格的な冬の到来となり、発電量も2月頃まで低下傾向が続きます。

 

 

 11月の太陽電池の温度推移

 放射冷却の影響と思いますが、低い方の温度は周囲温度に比べて相当低くなっており、マイナスの状態が増えてきております。

11月29日の初積雪

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする