本帖最後由 ccu516 於 2014-6-23 19:32 編輯
各位前輩好
經過一段時間 小弟終於把理想中的保溫箱做出來了
不過就有一點點小瑕疵無法解決,希望前輩們能給予一點意見
首先是我的程式碼
/* 可調溫式保溫箱 */
/*程式描述:
本程式用途為保溫箱溫度之控制。
經由一旋鈕改變保溫箱內之設定溫度 TempSet,
(其中TempSet會透過七段顯示器來顯示。)
並與溫度感測器DHT11所量測保溫箱內之實際溫度值TempNow進行比較,
當 TempNow>TempSet+2 -->溫度過高,開起風扇 。風扇持續運轉到TempNow=TempSet停止。
當 TempNow<TempSet-2 -->溫度過低,開起保溫燈。保溫燈持續運轉到TempNow=TempSet停止。
當 TempSet-2 < TempNow < TempSet+2 -->保溫箱達到恆溫。*/
/* 版本:v1.2 */
/*完成日期:2014.6.8*/
//------------------------------ 「1」 ------------------------------//
/*載入dht11 Library;定義DHT11之格式*/
#include <dht11.h>
dht11 DHT11;
//宣告pin編號
/*類比*/
#define Knob 0 //旋鈕
/*數位*/
#define ASeg 4
#define BSeg 5
#define CSeg 11
#define DSeg 9
#define ESeg 10
#define FSeg 3
#define GSeg 2
#define digiten 6 // 十位數 on/off
#define digione 8 // 個位數 on/off
#define Fan 12 // 風扇 on/off
#define Lamp 13 // 保溫燈 on/off
#define DHT11PIN 7 // dht11之溫度讀取(串列)
//------------------------------ 「1」 ------------------------------//
//------------------------------ 「2」 ------------------------------//
/*宣告pin 1~13->output*/
void setup() {
for(int i=0;i<14;i++){ //pin1~13為output
pinMode(i,OUTPUT);
}
}
//------------------------------ 「2」 ------------------------------//
//------------------------------ 「3」 ------------------------------//
/*主程式迴圈 */
void loop() {
//讀取旋鈕數值存到TempSet,轉化為25~40oC
int TempSet = map(analogRead(Knob),0,1020,25,35);
//0~1020 是為了避免1024可變電阻轉到底(5Vor1024)時不穩,數字會跳。
//七段顯示器顯示TempSet
tempshow(TempSet);
//讀取DHT11溫度計溫度 TempNow
int chk = DHT11.read(DHT11PIN);
int TempNow = DHT11.temperature;
//---------「穩定」-----------//
digitalWrite(Fan,LOW);
digitalWrite(Lamp,LOW);
//---------「穩定」-----------//
//---------「過熱」-----------//
if(TempNow>TempSet+1){
while(TempNow>TempSet){
//讀取TempSet
TempSet = map(analogRead(Knob),0,1020,25,35);
//讀取TempNow
chk = DHT11.read(DHT11PIN);
TempNow = DHT11.temperature;
//開啟風扇
digitalWrite(Fan,HIGH);
digitalWrite(Lamp,LOW);
//七段顯示器顯示TempSet
tempshow(TempSet);
}
}
//---------「過熱」-----------//
//---------「過冷」-----------//
if(TempNow<TempSet-1){
while(TempNow<TempSet){
//讀取TempSet
TempSet = map(analogRead(Knob),0,1020,25,35);
//讀取TempNow
chk = DHT11.read(DHT11PIN);
TempNow = DHT11.temperature;
//開啟保溫燈
digitalWrite(Fan,LOW);
digitalWrite(Lamp,HIGH);
//七段顯示器顯示TempSet
tempshow(TempSet);
}
}
//---------「過冷」-----------//
}
//------------------------------ 「3」 ------------------------------//
//------------------------------ 「4」 ------------------------------//
/*副程式(七段顯示器)*/
byte segs[7] = { ASeg, BSeg, CSeg, DSeg, ESeg, FSeg, GSeg };
byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 }, // = 0
{ 0,1,1,0,0,0,0 }, // = 1
{ 1,1,0,1,1,0,1 }, // = 2
{ 1,1,1,1,0,0,1 }, // = 3
{ 0,1,1,0,0,1,1 }, // = 4
{ 1,0,1,1,0,1,1 }, // = 5
{ 1,0,1,1,1,1,1 }, // = 6
{ 1,1,1,0,0,0,0 }, // = 7
{ 1,1,1,1,1,1,1 }, // = 8
{ 1,1,1,0,0,1,1 } // = 9
};
void tempshow(byte number){
lightdigione(number%10);
delay(5);
lightdigiten(number/10%10);
delay(5);
}
void lightdigione(byte number){
digitalWrite(digione,LOW);
digitalWrite(digiten,HIGH);
singlenumber(number);
}
void lightdigiten(byte number){
digitalWrite(digione,HIGH);
digitalWrite(digiten,LOW);
singlenumber(number);
}
void singlenumber(byte number) {
for (int i=0;i<7;i++){
digitalWrite(segs, seven_seg_digits[number]);
}
}
//------------------------------ 「4」 ------------------------------//
我的程式運行後確實可以成功的進行溫度調控,
不過問題就在顯示TempSet的七段顯示器,由於刷的速度太慢了
導致一定有一個位數會一閃一閃的(速度不夠無法形成視覺暫留)
就算調整tempshow()中的delay值或是把tempshow()中十位數與個位數平均拆散在程式中還是一樣
每行程式運算的太慢導致迴圈刷得不夠快
請問有辦法解決嗎??
卡關卡好久.... |