本帖最后由 KZC 于 2017-7-1 09:28 編輯 很多朋友一聽到編程就非常頭疼,覺得非常高深非常復(fù)雜,無法下手。實(shí)際上無論是硬件還是編程都和堆積木非常類似。只要明確了各個部分的功能和參數(shù)的意義,實(shí)現(xiàn)類似于Tally這種簡單的功能還是非常輕松的。那么今天就將無線Tally的代碼分享給大家。 出于最簡單最容易理解的角度,我沒有使用復(fù)雜點(diǎn)編碼方式,而是直接以1字節(jié)表示一個Led的亮暗。比如8訊雙色Tally我們就需要16字節(jié)來表示16個Led的亮暗信息。 那么先從主控端開始,為了簡潔,在主控端我只寫出了3訊雙色Tally的代碼。(所有//后和/* */之間的的都是注釋) int tally1=1; int tally2=2; int tally3=3; int tally4=4; int tally5=5; int tally6=6; //設(shè)置tally對應(yīng)的模擬輸入引腳號,如果有需要更多的led,則可以依次增加。 int t1=0; int t2=0; int t3=0; int t4=0; int t5=0; int t6=0; //初始化模擬輸入讀取的存儲,如果有需要更多的led,則可以依次增加。 byte Tally[7]={}; /*初始化實(shí)際發(fā)送的一維字節(jié)數(shù)組。[]內(nèi)的數(shù)值為實(shí)際Led數(shù)量+1。在這里我們有6個LED那么[]內(nèi)數(shù)值即為6+1=7。*/ void setup() { Serial1.begin(9600); } //初始化串口 9600為波特率。我們需要保證主控端和終端的波特率一致。 void loop() //循環(huán)體 會在經(jīng)過setup初始化后持續(xù)循環(huán)執(zhí)行 { t1 = analogRead(tally1); t2 = analogRead(tally2); t3 = analogRead(tally3); t4 = analogRead(tally4); t5 = analogRead(tally5); t6 = analogRead(tally6); //讀取模擬輸入的值并存儲到之前初始化的int類型中 Tally[0]=0; if(t1<912) { Tally[1]=1; } else { Tally[1]=0; } if(t2<912) { Tally[2]=1; } else { Tally[2]=0; } if(t3<912) { Tally[3]=1; } else { Tally[3]=0; } if(t4<912) { Tally[4]=1; } else { Tally[4]=0; } if(t5<912) { Tally[5]=1; } else { Tally[5]=0; } if(t6<912) { Tally[6]=1; } else { Tally[6]=0; } /*判斷Tally信號的高低并寫入編碼后的數(shù)值到一維字節(jié)數(shù)組中。1即是亮,0即是滅。如果需要更多LED數(shù)量 即可將*/ /* if(t6<912) { Tally[6]=1; } else { Tally[6]=0; } */ /*這一段復(fù)制,每一段代表一個LED燈。只需修改兩個[]中的數(shù)字即可。(復(fù)制時不含/* */)*/ Serial1.write(Tally,7); /*將一維字節(jié)數(shù)組寫入到串口中。最后的數(shù)字7需要與聲明byte Tally的數(shù)值相同,等于Led數(shù)量+1.*/ delay(30); //延遲30毫秒 以避免持續(xù)寫入造成錯誤。 } 以上即為我們主控端的程序代碼。結(jié)構(gòu)非常簡單,也非常直觀,如果需要更多的LED數(shù)量,則更改對應(yīng)數(shù)值和復(fù)制對應(yīng)模塊即可。 那么終端的程序代碼則更為簡單。 int led_pin1 = 3; int led_pin2 = 4; //設(shè)置數(shù)字輸出引腳序號。 byte Tally[7]={}; //[]中數(shù)字需要與主控端的保持一致 void setup() { Serial.begin(9600); pinMode(led_pin1,OUTPUT); pinMode(led_pin2,OUTPUT); } //設(shè)置數(shù)字引腳為輸出。 void loop() { //循環(huán)體 Serial.readBytes(Tally,7); //從串口中讀取Tally數(shù)據(jù)。 if(Tally[0]==0) { if(Tally[1]==1) { digitalWrite(led_pin1, HIGH); } else { digitalWrite(led_pin1, LOW); } if(Tally[2]==1) { digitalWrite(led_pin2, HIGH); } else { digitalWrite(led_pin2, LOW); } /*此處只針對兩個LED進(jìn)行操作,因?yàn)槲覀兪鞘褂秒p色Tally ,每個終端只控制兩個LED的亮暗,那么如何區(qū)別不同訊道呢?我們依舊只需要更改[]中的數(shù)值,在這個例子中我們寫出了第一訊,那么如果我們需要第二訊,則可以將1和2修改為3和4。第三訊則將1和2修改為5和6。之后以此類推即可。一開始的Tally[0]保持不變。*/ } } 以上即為我們需要的全部程序代碼,稍有編程經(jīng)驗(yàn)的人估計(jì)在一個小時內(nèi)就能寫出來,那么毫無編程經(jīng)驗(yàn)的人,根據(jù)說明,也可以經(jīng)過修改對應(yīng)數(shù)值和模塊就能實(shí)現(xiàn)所需要的功能。 最簡單的兩訊道的系統(tǒng)全部部件和連線。左側(cè)為主控端 右側(cè)為兩個終端。 一個三訊系統(tǒng)所需要的器件。 以上即為我們無線Tally的全部內(nèi)容了,希望能夠?qū)Ω魑挥兴鶐椭H绻衅渌胱约簞邮肿龅挠耙曉O(shè)備,歡迎在下方評論和給我留言。 |
|