以純文字方式查看主題

- 塔內植物園 (/tbgweb/cgi-bin/leobbs.cgi)
-- [ 食蟲植物 ] (/tbgweb/cgi-bin/forums.cgi?forum=19)
--- 我做的溫度上下限控制器,原型版曝光 (/tbgweb/cgi-bin/topic.cgi?forum=19&topic=10146)


-- 作者: 批批批批批批
-- 發表時間: 2009/12/06 00:21am

剛剛終於把程式寫完了,接上電路,效果不賴,目前的功能:
1.時間功能.可設定(未來可能會拿掉!)
2.溫度更新時間為一秒鐘(DS1821的限制)
3.溫度解析度為1度(DS1821的限制)
4.顯示器,背光,夜間可導引方向
都是一些很簡單的功能
目前正在規劃
1.溫度上下限設定(使用鍵盤)
2.設備損壞警告音
3.溫度C轉F
4.停電通知(10秒鐘)
5.上下限溫度可顯示於LCD上
[color=#DC143C]6.自動開關燈設定+燈具損壞警告音(如果時間功能還在)[/color]
7.感測器可拉長1.5M
8.設備保護功能
9.由市電取得電源
未來更強功能!!
1.可同時使用8個感測器
2.省電功能


看圖吧,如果你想要可別寫信給我,目前只是測試版,Bug很多,可能會當機

[UploadFile=100_5161_1260001192.jpg]
[UploadFile=100_5163_1260001233.jpg]


-- 作者: cyriax
-- 發表時間: 2009/12/06 01:14am

好厲害喔!! 等您造福大家喔!!  還是讓大家中毒更深呢!!!  ^_^


-- 作者: playerst
-- 發表時間: 2009/12/06 02:16am

我記得一個偵測器就要一個port了耶
但是微處理機似乎只有4個port
還是有更強的單晶片??


-- 作者: 批批批批批批
-- 發表時間: 2009/12/06 02:25am

[這篇文章最後由批批批批批批在 2009/12/06 02:28am 第 2 次編輯]

DS1821是使用單線控制喔,它是使用串列傳輸的方式
我使用的微處理機是最嫩的(89s51)
DS1821控制有點難,要花點心思去看Datasheet
http://www.farnell.com/datasheets/77165.pdf
如果你想玩玩看,這裡有Datasheet
還有我之前寫的程式(只能看溫度)
#include "at89x51.h"
#include "intrins.h"

#define LCDP P1
sbit RS=P3^2;
sbit RW=P3^1;
sbit EN=P3^0;

sbit SW1=P2^0;

#define DQ P2_1
void H(void);
void L(void);
void DS_Reset(void);
void SCT(void);
void RT(void);

bit DQ0;
bit DQ1;
bit DQ2;
bit DQ3;
bit DQ4;
bit DQ5;
bit DQ6;
bit DQ7;

void init_LCM(void);
void write_inst(char);
void write_data(char);
void write_pat(void);
void delay(int);
void debouncer(void);

char LCMD[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
char pat[16]={0x08,0x14,0x0b,0x04,0x04,0x04,0x03,0x00,
0x08,0x14,0x0b,0x04,0x07,0x04,0x04,0x00};
char line1[]="Temp =          ";
char line2[]="                ";

int TempC,TempF;
char key,n;
bit dcdf=0;

main()
{int a,b,c,d,e,f,g;
init_LCM();
write_pat();

while(1)
{DS_Reset();

           SCT();

           delay(6000);

           DS_Reset();

           RT();

a=!DQ0;
b=!DQ1;
c=!DQ2;
d=!DQ3;
e=!DQ4;
f=!DQ5;
g=!DQ6;
TempC=a+b*2+c*4+d*8+e*16+f*32+g*64;
TempF=(TempC*9/5)+32;

write_inst(0x80);
for(n=0;n<16;n++)
{write_data(line2[n]);
}
if(dcdf==0)
{write_inst(0xc0);
for(n=0;n<12;n++)
{write_data(line1[n]);
}
if((TempC/100)%10!=0)
{write_data(LCMD[(TempC/100)%10]);
}
else
{write_data(0x20);
}
write_data(LCMD[(TempC/10)%10]);
write_data(LCMD[TempC%10]);
write_data(0x00);
}
else
{write_inst(0xc0);
for(n=0;n<12;n++)
{write_data(line1[n]);
}
if((TempF/100)%10!=0)
{write_data(LCMD[(TempF/100)%10]);
}
else
{write_data(0x20);
}
write_data(LCMD[(TempF/10)%10]);
write_data(LCMD[TempF%10]);
write_data(0x01);
}

if(SW1==0)
{debouncer();
dcdf=~dcdf;
while(SW1==0);
}
}
}

void H(void)
{DQ=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=1;
delay(2);
}

void L(void)
{DQ=0;
delay(2);
DQ=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
}

void DS_Reset(void)
{DQ=0;
delay(20);
DQ=1;
delay(10);
}

void SCT(void)
{L();
       H();
       H();
       H();
       L();
       H();
       H();
       H();
}

void RT(void)
{L();
       H();
       L();
       H();
       L();
       H();
       L();
       H();

       DQ=0;
       _nop_();_nop_();
       DQ=1;
       _nop_();_nop_();DQ0=!DQ;
       delay(2);
       DQ=0;
       _nop_();_nop_();
       DQ=1;
       _nop_();_nop_();DQ1=!DQ;
       delay(2);
       DQ=0;
       _nop_();_nop_();
       DQ=1;
       _nop_();_nop_();DQ2=!DQ;
       delay(2);
       DQ=0;
       _nop_();_nop_();
       DQ=1;
       _nop_();_nop_();DQ3=!DQ;
       delay(2);
       DQ=0;
       _nop_();_nop_();
       DQ=1;
       _nop_();_nop_();DQ4=!DQ;
       delay(2);
       DQ=0;
       _nop_();_nop_();
       DQ=1;
       _nop_();_nop_();DQ5=!DQ;
       delay(2);
       DQ=0;
       _nop_();_nop_();
       DQ=1;
       _nop_();_nop_();DQ6=!DQ;
       delay(2);
       DQ=0;
       _nop_();_nop_();
       DQ=1;
       _nop_();_nop_();DQ7=!DQ;
       delay(2);
}

void init_LCM(void)
{write_inst(0x30);
write_inst(0x30);
write_inst(0x30);
write_inst(0x38);
write_inst(0x08);
write_inst(0x01);
write_inst(0x06);
write_inst(0x0c);
}

void write_inst(char inst)
{RS=0; RW=0;
EN=1;
LCDP=inst;
delay(100);
EN=0;
}

void write_data(char dat)
{RS=1; RW=0;
EN=1;
LCDP=dat;
delay(10);
EN=0;
}

void write_pat(void)
{char i;
RS=0; RW=0;
EN=1;
LCDP=0x40;
delay(100);
EN=0;
RS=1; RW=0;
for(i=0;i<16;i++)
{write_data(pat[i]);
}
}

void delay(int t)
{int i;
for(i=0;i<t;i++);
}

void debouncer(void)
{int i;
for(i=0;i<2400;i++);
}


-- 作者: playerst
-- 發表時間: 2009/12/06 02:38am

如果改用組語寫架構會變大嗎?
因為我想用組語寫 雖然困難度會很高


-- 作者: 批批批批批批
-- 發表時間: 2009/12/06 02:45am

[這篇文章最後由批批批批批批在 2009/12/06 02:54am 第 1 次編輯]

組合語言.....程式碼會很長,可是編譯出來HEX檔會比C語言小一點
[UploadFile=09BCC6A6ECB9qA4l_1260010341.rar]
靈感來自這裡.....如果要焊接,電路要稍微小改


-- 作者: arvin
-- 發表時間: 2010/03/19 01:23am

建議用C語言寫,這樣會比較輕鬆也容易維護,組合語言對乘除法會比較麻煩

另外批批批批批批大,建議你最好用timer中斷,會比用polling來的好。


-- 作者: csyin
-- 發表時間: 2010/03/19 01:39am

C語言不能燒在IC裡面吧?


-- 作者: playerst
-- 發表時間: 2010/03/19 01:47am

現在是可行的
早期因為微處理機記憶體小(成本問題)
所以選擇空間較小的組語
現在記憶體超便宜
很多人都用c寫摟


-- 作者: arvin
-- 發表時間: 2010/03/19 02:01am

是的,playerst大說的沒錯,現在micro control大都用C來取代組語了
4K亦足夠了,除非你含括一些特殊函式庫,那就不夠用了


-- 作者: 麻毬
-- 發表時間: 2010/03/20 03:34am

阿! 可能會當機!? 批大難道忘了在硬體上加上看門狗電路?

1個R,1個C、1支2極體、1隻輸出腳加上個位數的指令而已,批大還是加上吧!!


-- 作者: 批批批批批批
-- 發表時間: 2010/03/20 07:17am

[這篇文章最後由批批批批批批在 2010/03/20 07:22am 第 2 次編輯]

問題解決了,只是一般溢位的問題(時鐘的問題)
目前要考試,這種東西以後再玩嚕
打算用pic的單晶片
8051才4k :em01:
這就是timer中斷阿,礙於智慧財產權,這程式就不放嚕
未來還要用外部時脈控制時鐘,比較準
目前一個星期誤差2秒...


-- 作者: 旭
-- 發表時間: 2010/03/20 07:33am

[這篇文章最後由旭在 2010/03/19 11:39pm 第 1 次編輯]

我的已經在用了,花了不少時間跟精力,等有空再改進
這是我以前的貼圖
http://www.chinese-cp.com/forum/viewthread.php?tid=3129
目前功能:
Time 系統時間調整
Lcd液晶背光燈時間調整,單位:秒(0秒為常亮)
Light植物光照時間設定,分別為開啟時間和關閉時間(“開”“關”項為光照控制是否允許)
Temp24小時溫度設定,單位:小時 (Mod"0-9"為控溫模式,0不控溫....)
Water澆花時間設定(一天可設定連續5次不同澆花時間,可設置星期幾不澆花)
Fan通風扇時間設定(每隔N時間啟動)
safe安全溫度設定(設上限下限,過溫發出報警聲並斷開總電源繼電器保護,啟動排風扇1分鐘,溫度恢復正常後繼電器自動接通)


溫度探頭損壞或斷線,顯示“錯誤”發出報警聲,啟動排風扇1分鐘,並斷開控溫電源
斷電光照狀態恢復

溫度控制MOD
0 不控溫
1 開0秒; 延時0秒後關
2 開1秒; 延時1秒後關
3 開2秒; 延時2秒後關
4 開6秒; 延時5秒後關
5 開10秒; 延時7秒後關
6 開15秒; 延時9秒後關
7 開20秒; 延時12秒後關
8 開25秒; 延時15秒後關
9 開1秒; 延時15秒後關(適合夏天制冷用)
[img]http://www.chinese-cp.com/forum/attachments/month_0912/091208001616b5bd8ee50ed55b.jpg[/img]

[img]http://www.chinese-cp.com/forum/attachments/month_0912/09120808184a690f2cd1fe7ceb.jpg[/img]


-- 作者: 旭
-- 發表時間: 2010/03/20 07:51am

現在用的是STC89c58rd,能裝32K的程序,現在用了11440字節,使用DS18B20溫度傳感器,DS1302實時時鐘,1602液晶,調整使用了3個按鍵


© 中文版權所有: 塔內植物園 繁體版權所有:摩尼網  程式翻譯:auron 版本: LeoBBS X Build041101