温湿計とLEDを連携してみよう ~DHT11+LED by C~
はじめに
今回は、温湿度計(DHT11)で計測した値をもとにLEDを点灯させていきます。
下記2つの内容を組み合わせて行います。わからない部分は参照してください。
用意するもの
Raspberry Pi | Raspberry Pi 4 |
DHT11 | DHT11 |
LED | 3mm赤色LED 70° OSR5JA3Z74A |
抵抗 | カーボン抵抗 1/2W 5.1kΩ(100本入) |
ジャンパーケーブル | ジャンパーケーブル |
ブレッドボード | ブレッドボード |
方針
DHT11で測定した温度が一定値を超えたときにLEDが点灯、下回った時に消灯するようにします。
温度のチェックは30秒毎に行うことにします。温度は室温を目安に設定してください。
機器の接続
機器の接続は下図のようにしました。
18番にDHT11の測定データピン、23番にLEDのプラスを接続しています。
実機だとこのようになります。
接続が増えるのでぐちゃぐちゃです。
プログラム・実行
温湿度を計測する処理が長いので省略してます。
全体は本記事一番末尾に記載します。
#include <stdio.h>
#include <time.h>
#include <wiringPi.h>
#include <math.h>
//dht parameter
・
・
・
int main()
{
//START
・
・温湿度を計測する処理
・
wiringPiSetupGpio();
pinMode(23 , OUTPUT); //GPIO23のモードをOUTに設定
if ( dt[2] + dt[3]/100 >= 24 ){ //dt[2]:温度の整数部分 dt[3]:温度の少数部分
digitalWrite(23 , HIGH);
}else{
digitalWrite(23 , LOW);
}
return 0;
}
dt[2]が温度の整数部分(〇〇.00の〇)、dt[3]が温度の少数部分を整数で表した値(00.〇〇の〇)ですので、dt[2]にdt[3]を100で割ったのを足して温度を算出しています。
記述時の我が家の室温が23度~24度でしたので24度を超えた場合にLEDが点灯するようにしました。
温湿度計を指で温めれば高い温度を出すことができます。
規定温度を超えるまで指で温めればLEDが点灯するはずです。指を話せばそのうち元の温度に戻りますのでLEDが消灯します。
おわりに
室温に対応してLEDを点灯することができました。
pythonはライブラリが公開されているので簡単でしたがC言語だとちょっと面倒ですね。
pythonも一から書いたら大変ですが・・・。
何より温湿度の測定、LEDとの連携ができたので他の機器との連携も簡単に行えると思います。
付録
#include <stdio.h>
#include <time.h>
#include <wiringPi.h>
#include <math.h>
//DHT parameter
#define DHT11_DATAPIN 18
#define DHT11_START_SIG_LOW 20
#define DHT11_START_PullUp 10
#define DHT11_WAITRES_LOW 88
#define DHT11_WAITRES_HIGH 92
#define DHT11_DATAWAIT_LOW 58
#define DHT11_BITZERO 27
#define DHT11_BITONE 68
#define DHT11_END 56
int main()
{
//START
//SetUp
int DHT11_DATA[40]= {0};
wiringPiSetupGpio();
pinMode(DHT11_DATAPIN , OUTPUT);
digitalWrite(DHT11_DATAPIN , HIGH);
delay(2000);
//START OUTPUT LOW >18ms
digitalWrite(DHT11_DATAPIN , LOW);
delay(DHT11_START_SIG_LOW);
//START PUll up
digitalWrite(DHT11_DATAPIN , HIGH);
delayMicroseconds(DHT11_START_PullUp);
//WAIT DATA SIG
pinMode(DHT11_DATAPIN , INPUT);
//Response LOW SIG
pinMode(DHT11_DATAPIN , INPUT);
for ( int i = 0 ; i < DHT11_WAITRES_LOW ; i++ ){
if (digitalRead(DHT11_DATAPIN) == HIGH){
break;
}
delayMicroseconds(1);
}
//Response HIGH SIG
delayMicroseconds(DHT11_WAITRES_HIGH);
for ( int i = 0 ; i < DHT11_WAITRES_HIGH ; i++ ){
if (digitalRead(DHT11_DATAPIN) == LOW){
break;
}
delayMicroseconds(1);
}
//DATA Recieve
for ( int i = 0 ; i < 40 ; i++){
//start bit wait
delayMicroseconds(DHT11_DATAWAIT_LOW);
for ( int j = 0 ; j < DHT11_DATAWAIT_LOW ; j++){
if(digitalRead(DHT11_DATAPIN) == HIGH){
break;
}
delayMicroseconds(1);
}
for ( int j = 0 ; j < 255 ; j++){
if (digitalRead(DHT11_DATAPIN) == LOW){
if ( j < DHT11_BITONE ){
DHT11_DATA[i] = 0;
} else {
DHT11_DATA[i] = 1;
}
break;
}
delayMicroseconds(1);
}
}
//End process
delayMicroseconds(DHT11_END);
digitalWrite(DHT11_DATAPIN , HIGH);
//data check
int dec[8] = {1,2,4,8,16,32,64,128};
int dt[5] = {0};
for ( int i = 0 , j = 7 ,k = 0 ; i < 40 ; i++ , j--){
if (DHT11_DATA[i] == 1 ){
dt[k] += dec[j];
}
if ( j < 0 ){
j = 7;
k += 1;
}
}
wiringPiSetupGpio();
pinMode(23 , OUTPUT);
if ( dt[2] + dt[3]/100 >= 24 ){
digitalWrite(23 , HIGH);
}else{
digitalWrite(23 , LOW);
}
return 0;
}