arduinoをLS-GLに収納する前に。
arduinoIDEの設定。
arduinoIDEをインストールしたlibrariesフォルダに以下の4ファイルを展開する。
OneWire.zip (DHT22で使用)
DHT-sensor-library-master.zip(DHT22用)
Arduino-Temperature-Control-Library-master.zip(DS18B20用)
I2CLiquidCrystal-1.1.zip(I2C液晶)
実際にはArduinoIDE起動時にフォルダ名がヤバくて使えない旨表示されるので適度にフォルダ名を変更。
以下が、スケッチ。
[crayon]
//
// 温湿度センサ DHT22(StraberryLinux品番:RHT03 メーカー品番:SEN-10167)
// と、DS18B20を用いて温湿度・温度を取得するスケッチ。
// タクトスイッチの動作でLED照明ON、シリアルポートに現在温度出力
// 2013/03/29 Ver1.0
//
//
// I2CLCDはA4(SDA)とA5(SCL)に接続
// DHT22 は 2pin
//
#include “DHT.h”
#include
#include
#include
#include
#define ONE_WIRE_BUS 10 //DS18B20の接続ピン
#define TEMPERATURE_PRECISION 9 // 分解能?
#define DHTPIN 2 // what pin we’re connected to
#define DHTTYPE DHT22 // DHT 22 (AM2302)
#define LEDINT 10 //LED照明の点灯している時間
#define MAXWRITECOUNT 50 //シリアルポートに出力する回数
//DHTの初期化
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
// arrays to hold device addresses
//センサーの定義 インサイド、アウトサイド
DeviceAddress insideThermometer, outsideThermometer;
int sensCnt = 0; //DHT22以外のDS18B20のセンサー数 (セットアップ時に自動で検出される)
float temp0 = 99.9;
float temp1 = 99.9;
float h = 99.9;
float t = 99.9;
const int ledPin = 3; //LED
const int buttonPin = 13; //動作スイッチ
int i = 0; //LED照明の点灯時間用
int buttonState = 0; // variable for reading the pushbutton status
boolean ledSts = false;
int writecnt = 0; //シリアルポートに温度・湿度を出力する回数用
DHT dht(DHTPIN, DHTTYPE);
I2CLiquidCrystal lcd(30, true);
//I2CLiquidCrystal lcd(20, false);
// | +— set true if the power suply is 5V, false if it is 3.3V
// +——– contrast (0-63)
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin,LOW);
dht.begin();
lcd.begin(16, 2);
// Start up the library
// 繋がっているDS18B20の数を検出
sensors.begin();
sensCnt=sensors.getDeviceCount();
switch (sensCnt) {
//センサーのアドレスを取得
case 0:
break;
case 1:
sensors.getAddress(insideThermometer,0);
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
break;
case 2:
sensors.getAddress(insideThermometer,0);
sensors.getAddress(outsideThermometer,1);
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
break;
default:
break;
}
}
void loop() {
// proc light (on || off)
if (i == 0) {
// turn LED off:
// LED消灯
digitalWrite(ledPin,LOW);
//スイッチの状態を取得
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
// turn LED on:
// LEDの点灯
ledSts = true;
digitalWrite(ledPin, HIGH);
i++;
}
} else {
if (ledSts) {
//LEDが点灯している
//スイッチが押されてLEDが点灯している間は
//シリアルポートに現在温度と湿度を出力
i++;
if (isnan(t)) { t=99.99;}
if (isnan(h)) { h=99.99;}
Serial.print(“H:”);
Serial.print(h);
Serial.print(“%\t”);
Serial.print(“T0:”);
Serial.println(t);
if (i> LEDINT ) {
//設定したLEDの点灯時間が過ぎたら消灯
// turn LED off:
ledSts=false;
i=0;
digitalWrite(ledPin,LOW);
}
}
}
//DHT22から温度、湿度を取得
h=99.9;
t=99.9;
h = dht.readHumidity();
t = dht.readTemperature();
if (isnan(t) || isnan(h)) {
lcd.setCursor(0,0);
lcd.print(“Failed to read”);
} else {
lcd.setCursor(0,0);
lcd.print(“H:”);
lcd.print(h);
lcd.print(“%”);
lcd.print(“T:”);
lcd.print(t);
lcd.print(“C”);
}
//センサーの数分、DS18B20から温度を取得
switch (sensCnt) {
case 0:
break;
case 1:
sensors.requestTemperatures();
temp0=sensors.getTempC(insideThermometer);
lcd.setCursor(0,1);
lcd.print(temp0);
lcd.print(“C”);
break;
case 2:
sensors.requestTemperatures();
temp0=sensors.getTempC(insideThermometer);
temp1=sensors.getTempC(outsideThermometer);
lcd.setCursor(0,1);
lcd.print(temp0);
lcd.print(“C / “);
lcd.print(temp1);
lcd.print(“c”);
break;
default:
break;
}
int inputchar; //シリアルポートからの指示
inputchar = Serial.read(); //シリアルからの値を読み込む
if(inputchar != -1) { //値が入っていたら
switch(inputchar){
case ‘i’: //init
sensors.begin();
sensCnt=sensors.getDeviceCount();
switch (sensCnt) {
//センサーのアドレスを取得
case 0:
break;
case 1:
sensors.getAddress(insideThermometer,0);
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
break;
case 2:
sensors.getAddress(insideThermometer,0);
sensors.getAddress(outsideThermometer,1);
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
break;
default:
break;
}
case ‘s’: //
lcd.begin(16, 2);
break;
case ‘a’: //
break;
case ‘r’: //
break;
case ‘g’: //温度取得
writecnt=1;
break;
case ‘l’: //ON light
ledSts = true;
digitalWrite(ledPin, HIGH);
i++;
break;
}
}
if (writecnt >0 ) {
//シリアルポートに温湿度を出力
if (isnan(t)) { t=99.99;}
if (isnan(h)) { h=99.99;}
Serial.print(“H:”);
Serial.print(h);
Serial.print(“%\t”);
Serial.print(“T0:”);
Serial.print(t);
switch(sensCnt) {
case 0:
Serial.println(“”);
break;
case 1:
Serial.print(“\t”);
Serial.print(“T1:”);
Serial.println(temp0);
break;
case 2:
Serial.print(“\t”);
Serial.print(“T1:”);
Serial.print(temp0);
Serial.print(“\t”);
Serial.print(“T2:”);
Serial.println(temp1);
}
writecnt++;
if(writecnt > MAXWRITECOUNT) {
writecnt=0;
}
}
}
[/crayon]
ソースではタクトスイッチに連動してLEDを点灯(実際はPOWER-MOS-FETでリレーして12VのLED照明)できるように
しているが、あまり使用頻度が無いので割愛。ソースはそのままでも問題無し。