JUGEMテーマ:電子工作
arduino互換とDHT11での保温箱と保温コントローラー
温度を制御するための汎用的なコントローラーと保温箱を作成してみました。
■全体構成

■回路図

ATMEGAは8MHz動作の内臓クロック使用です。
電源電圧は5Vとなります。
関連記事 https://ameblo.jp/fc2miha/entry-12833772883.html
今回は温度センサーは手持ちで余っていたDHT11を使用します。
スイッチの代わりにロータリーエンコーダーを使用します。
表示装置として手持ちがあったAQM1602Y-NLW-FBWを使用します。
100Vの熱源にも対応したかったので、SSRの30Aタイプを使用しました。
使用した熱源の抵抗が20Ωで、30VのACアダプタをかませて15Wで運用します。
保温するための熱源としては、壊れてしまった電気毛布の電熱線を再利用しました。

上の段の[]が設定温度で、下の段が測定結果の温度と湿度です。
■機能
冷やす機能はないです。熱源を切ってただ冷えるのを待ちます。
設定した温度を記憶しておき、
温度センサーで測定した温度と比較
状況に応じて電熱線をON/OFFします。
■温度センサー
温度センサーはDHT11を使用します。
温度と湿度を測定できますが、
温度は1°C単位、湿度は1%単位の分解能なので、
30℃の次は31℃となります。
DHT21とかDHT22なら0.1℃単位、0.1%単位が可能ですが、
実用的には0.1℃の差とか気にならないと思います。
■納豆

実は納豆作成のため開発しています。
■保温箱

台所から拝借してきた、バット?のまわりに、
電気毛布からとってきた電熱線をくぐグル巻いています。
■コントローラー中身
いつも適当です。

右上のがSSRですね。
基盤とかLCDはホットボンドでくっつけています。
固まると十分な強度ですし、
後で剥がすのも比較的簡単です。
■実用性とか
納豆なら問題ないですね。納豆は40℃~45℃ぐらいです。
お湯を沸かそうとすると、パワーが足りないので、
コンロ用のヒーターとか使わないとですね。
あと、防水のDHT11の入手が必要です。
今回の組み合わせだと最大で50℃でした。
温泉卵作るのには足りないですね。
■プログラム
#include "EEPROM.h"
#include "ST7032_asukiaaa.h"
ST7032_asukiaaa lcd;
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11 // DHT11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);
#define LOGO "Ho-ON!R2"
int ondo;
int situdo;
int settei_ondo;
int old_settei_ondo;
long lastTm;
long old = -1;
//
// address 2=設定温度
//
void save_EEPROM(int address, int v)
{
int address_h = address*2;
int address_l = address*2+1;
EEPROM.write(address_h, v/256);
EEPROM.write(address_l, v%256);
Serial.println("save");
Serial.println(address_h);
Serial.println(address_l);
Serial.println(v/256);
Serial.println(v%256);
}
int load_EEPROM(int address)
{
int address_h = address*2;
int address_l = address*2+1;
int h = EEPROM.read(address_h);
int l = EEPROM.read(address_l);
//Serial.print("h=");
//Serial.println(h);
//Serial.print("l=");
//Serial.println(l);
int r = h * 256 + l;
Serial.print("r=");
Serial.println(r);
if(h==255 && l==255){
return -1;
}
return r;
}
int on_flag = 0;
void displaySet()
{
char Do[2];
Do[0] = 0xdf;
Do[1] = 0x00;
lcd.setCursor(0, 0);
lcd.print(LOGO);
lcd.print(" [");
lcd.print(settei_ondo);
lcd.print(Do);
lcd.print("C] ");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(ondo);
lcd.print(Do);
lcd.print("C ");
lcd.print(situdo);
lcd.print("% ");
if(on_flag){
lcd.print("ON ");
}
else{
lcd.print("OFF ");
}
}
void setup()
{
pinMode(13, OUTPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
dht.begin();
lcd.begin(16, 2);
lcd.setContrast(10);
//displaySet();
Serial.begin(9600);
Serial.println(LOGO);
settei_ondo = load_EEPROM(2);
if(settei_ondo < 1 || 100 <= settei_ondo){
settei_ondo = 43;
}
Serial.print("settei_ondo = ");
Serial.println(settei_ondo);
old_settei_ondo = settei_ondo;
lastTm = millis();
}
int old_on_flag = 0;
int old5=1;
void loop()
{
float t = dht.readTemperature();
float h = dht.readHumidity();
ondo = t;
situdo = h;
//Serial.print(int(t));
//Serial.print("゚C, ");
//Serial.print(int(h));
//Serial.print("% ");
//Serial.println("");
if(ondo==settei_ondo){
if(old_on_flag==1){
digitalWrite(13, LOW);
on_flag = 0;
}
if(old_on_flag==0){
digitalWrite(13, HIGH);
on_flag = 1;
}
}
if(ondo<settei_ondo){
digitalWrite(13, HIGH);
old_on_flag = 1;
on_flag = 1;
}
if(ondo>settei_ondo){
digitalWrite(13, LOW);
old_on_flag = 0;
on_flag = 0;
}
int val5 = digitalRead(5); //くるぐる
int val6 = digitalRead(6); //ぐるぐる
if(old5!=val5){
if(val5==0){
Serial.print("val5 = ");
Serial.println(val5);
Serial.print("val6 = ");
Serial.println(val6);
if(val6==1){
settei_ondo = settei_ondo + 1;
if(settei_ondo>=100){
settei_ondo = 99;
}
lastTm = millis();
}
else{
settei_ondo = settei_ondo - 1;
if(settei_ondo<=1){
settei_ondo = 1;
}
lastTm = millis();
}
}
}
displaySet();
old5=val5;
long now = millis();
if((now-lastTm)>10000){
if(old_settei_ondo!=settei_ondo){
old_settei_ondo = settei_ondo;
save_EEPROM(2, settei_ondo);
}
}
if(now-old>5000 || old == -1){
old = now;
Serial.print(ondo);
Serial.print("゚C, ");
Serial.print(situdo);
Serial.print("% ");
Serial.println("");
}
}





























