智能插座遠(yuǎn)程控制電器很好玩弟头!如果你有單片機(jī)或嵌入式基礎(chǔ),你也可以自己動(dòng)手做一個(gè)

轉(zhuǎn)自嵌入式ARM

學(xué)號(hào)16020311003? 姓名:楊虎成

【嵌牛導(dǎo)讀】多嘗試自己動(dòng)手用嵌入式解決問題

【嵌牛鼻子】嵌入式在大部分電氣中有很大的作用

【嵌牛提問】嵌入式系統(tǒng)在電子元件中如何工作

【嵌牛正文】

智能插座遠(yuǎn)程控制電器很好玩群井!如果你有嵌入式單片機(jī)基礎(chǔ),你也可以自己動(dòng)手做一個(gè)...

——————————————————

自己DIY用的零件清單(大部分都是手頭拆機(jī)的):

1)STC51系列單片機(jī)(淘寶上幾塊錢就能買到毫胜,自己純手工焊了一塊板子)

2)中央空調(diào)控制面板上拆的繼電器书斜,有四路,剛好可以控制四個(gè)插座

3)藍(lán)牙POS機(jī)(淘寶上一毛錢包郵很多酵使,我這款叫“開店寶”)荐吉,用于做藍(lán)牙串口透傳

4)廢舊插座一個(gè)

由于普通插座都是共火線和共零線,為了實(shí)現(xiàn)四路單獨(dú)控制口渔,需要改造插座样屠,將四個(gè)插孔的火線分開,然后與四路繼電器相連缺脉,

 

整個(gè)控制流:手機(jī)APP –> 藍(lán)牙POS –> 51單片機(jī) –> 繼電器 –> 插座

手機(jī)APP通過藍(lán)牙發(fā)送數(shù)據(jù)到藍(lán)牙POS痪欲,藍(lán)牙POS作為一個(gè)藍(lán)牙透傳設(shè)備,將控制指令數(shù)據(jù)通過串口發(fā)送給單片機(jī)攻礼,單片機(jī)通過GPIO口來控制繼電器业踢,最終實(shí)現(xiàn)對插座的控制。(其實(shí)該藍(lán)牙POS是個(gè)STM32單片機(jī)礁扮,可以無需51單片機(jī)知举,直接將STM32的GPIO引出來去控制瞬沦,如果你動(dòng)手能力強(qiáng)的話,鑒于自己動(dòng)手能力一般雇锡,焊接不好那么細(xì)的芯片引腳蛙埂,所以干脆拿了個(gè)51單片機(jī)來中轉(zhuǎn)一下)。


  

下面奉上代碼:

插座的通斷是通過單片機(jī)來控制遮糖,結(jié)合藍(lán)牙POS機(jī)做透傳绣的,即可直接通過藍(lán)牙來控制繼電器。

  

51單片機(jī)代碼比較簡單欲账,放出完整代碼屡江。

#include <stc89c5xrc.h>

#include <string.h>

#define FOSC 22118400L //定義晶振頻率

#define BAUD 115200? //定義波特率

#define SMOD? 1

#define RX_BUFF_SIZE 64

#define ERR_CODE_RSP 0xD0? //錯(cuò)誤碼

/*定義四路開關(guān)控制引腳*/

sbit PLUG_1 = P2^4 ;

sbit PLUG_2 = P2^7? ;

sbit PLUG_3 = P2^6 ;

sbit PLUG_4? = P2^5 ;

unsigned char rx_buff[RX_BUFF_SIZE] = {0}; //串口接收緩沖區(qū)

volatile unsigned char rx_count = 0; //接收計(jì)數(shù)器

volatile unsigned char pos = 0;? ? //讀取計(jì)數(shù)器,記錄當(dāng)前讀取字節(jié)數(shù)?

volatile unsigned char msg_code = 0x00;? //存儲(chǔ)控制碼

volatile unsigned char status_code = 0x70;? //存儲(chǔ)狀態(tài)碼

/** 串口發(fā)送 **/

void byte_send(unsigned char ch)

{

? ? SBUF = ch ;

? ? while(!TI);

? ? TI = 0;

}

/** 判斷緩存是否有數(shù)據(jù)可讀取 **/

unsigned char is_rx_buffer_empty(void)

{

? ? return !(rx_count - pos);

}

/** 讀緩沖區(qū)一個(gè)字節(jié) **/

unsigned char uart_read(void)

{

? ? unsigned char c;

? ? c = rx_buff[pos++];

? ? if(rx_count == pos){

? ? ? ? rx_count = pos = 0;

? ? }?

? ? return c;

}

/** 消息處理 **/

/** 簡單起見赛不,就用了一個(gè)字節(jié)做控制碼

? ? bit0 ~ bit3: 分別對應(yīng)四路開關(guān)惩嘉,置0為關(guān),置為1為開

? ? bit4 ~ bit8: 作為參數(shù)類型(0x06:查詢開關(guān)狀態(tài) 0x07:設(shè)置開關(guān)狀態(tài))

**/

void msg_process(void)

{

? ? if(is_rx_buffer_empty()) //如果設(shè)計(jì)成多個(gè)字節(jié)作為控制碼踢故,此處要改為while循環(huán)

? ? ? ? return;

? ? msg_code = uart_read();

? ? switch((msg_code & 0xF0) >> 4)

? ? {

? ? ? ? case 0x6:? //Get the status

? ? ? ? ? ? msg_reply(status_code);

? ? ? ? ? ? break;

? ? ? ? case 0x7:? //Set and get status

? ? ? ? ? ? PLUG_1 = msg_code & 0x01 ;

? ? ? ? ? ? PLUG_2 = (msg_code & 0x02) >> 1 ;

? ? ? ? ? ? PLUG_3 = (msg_code & 0x04) >> 2 ;

? ? ? ? ? ? PLUG_4 = (msg_code & 0x08) >> 3 ;

? ? ? ? ? ? status_code = msg_code; //保存本次處理結(jié)果

? ? ? ? ? ? msg_reply(status_code);

? ? ? ? ? ? break;

? ? ? ? default:? //Err code

? ? ? ? ? ? msg_reply(ERR_CODE_RSP);? ? ? ?

? ? }

}

/** 消息響應(yīng) **/

void msg_reply(unsigned char msg)

{

? ? //byte_send(':');//unknow reason

? ? delay(1500);

? ? byte_send(msg);

? ? byte_send(':'); //將':'作為間隔符文黎,藍(lán)牙POS收到該符號(hào),才認(rèn)為一條數(shù)據(jù)接收完畢

}

/** 串口初始化 **/

void uart_init(void)

{

? ? SCON = 0x50 ;

? ? TMOD = 0x20 ;

? ? PCON |= 0x80 ;? ? //set smod

? ? TH1 = TL1 = 256 - FOSC*(SMOD+1)/32/12/BAUD ;

? ? TR1 = 1;

? ? ES = 1 ;

? ? EA = 1 ;

}

/** 串口中斷處理 **/

void? serial() interrupt 4? using 1

{

? ? if(RI)

? ? {

? ? ? ? RI = 0;

? ? ? ? if(rx_count > RX_BUFF_SIZE)

? ? ? ? ? ? rx_count = 0;

? ? ? ? rx_buff[rx_count++] = SBUF ;

? ? }

}

/** 主函數(shù) **/

void main(void)

{

? ? P2 = 0x00;

? ? uart_init();

? ? while(1)

? ? {

? ? ? msg_process();

? ? }

}

消息處理函數(shù)殿较,一定要放在主循環(huán)中耸峭,有的開發(fā)者習(xí)慣在中斷響應(yīng)函數(shù)中做消息處理,容易導(dǎo)致串口數(shù)據(jù)丟失淋纲。中斷中一定只做簡單的處理劳闹,本代碼中只是將中斷接收到的數(shù)據(jù)存到數(shù)組中。

測試:

假設(shè)當(dāng)前開關(guān)狀態(tài)為: 0101

用串口助手輸入16進(jìn)制:

輸入:0x60 返回:0x75 0x3A //查詢當(dāng)前開關(guān)狀態(tài)洽瞬,0x3A為’:’對應(yīng)16進(jìn)制ASCII碼

輸入:0x77 返回:0x77 0x3A //設(shè)置開關(guān)0本涕、開關(guān)1、開關(guān)2 開伙窃,開關(guān)3關(guān)閉

操作成功后菩颖,會(huì)聽見繼電器開啟、閉合的聲音为障,可以用萬用表測量是否導(dǎo)通或者切斷晦闰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市产场,隨后出現(xiàn)的幾起案子鹅髓,更是在濱河造成了極大的恐慌,老刑警劉巖京景,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異骗奖,居然都是意外死亡确徙,警方通過查閱死者的電腦和手機(jī)醒串,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鄙皇,“玉大人芜赌,你說我怎么就攤上這事“橐荩” “怎么了缠沈?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長错蝴。 經(jīng)常有香客問我洲愤,道長,這世上最難降的妖魔是什么顷锰? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任柬赐,我火速辦了婚禮,結(jié)果婚禮上官紫,老公的妹妹穿的比我還像新娘肛宋。我一直安慰自己,他們只是感情好束世,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布酝陈。 她就那樣靜靜地躺著,像睡著了一般毁涉。 火紅的嫁衣襯著肌膚如雪后添。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天薪丁,我揣著相機(jī)與錄音遇西,去河邊找鬼。 笑死严嗜,一個(gè)胖子當(dāng)著我的面吹牛粱檀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漫玄,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼茄蚯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了睦优?” 一聲冷哼從身側(cè)響起渗常,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汗盘,沒想到半個(gè)月后皱碘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隐孽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年癌椿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了健蕊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踢俄,死狀恐怖缩功,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情都办,我是刑警寧澤嫡锌,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站琳钉,受9級(jí)特大地震影響势木,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜槽卫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一跟压、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歼培,春花似錦震蒋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至噪窘,卻和暖如春笋庄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倔监。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工直砂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浩习。 一個(gè)月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓静暂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谱秽。 傳聞我的和親對象是個(gè)殘疾皇子洽蛀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容