錯過了愚人節,還有清明節

愚人節表白簡直弱爆了,清明節表白才是王道。

因為萬一被拒絕,可以說:「不好意思,剛才被附體了。」

愚人節已經過去,是不是還在後悔沒來的及向女神表白?別怕,錯過了愚人節還有清明節!清明節表白才是王道。既然是清明節表白,當然需要尋找一份和這個節日匹配的禮物。作為一名資深技術屌,自己動手才更有誠意。細想和清明節有關聯的元素,腦海中迅速浮現了一大堆形容詞,最終選了兩個比較有代表的形容詞:藍光和詭異。

如何將藍光和詭異集中在同一件禮物上了,這是個問題。藍光可以選擇藍色 LED 燈即可,可是詭異就有點難了。LED 燈如何才能產生詭異效果了,還好本人機智,利用視覺停留不就可以完美呈現嗎?當 LED 移動時出現一些奇怪的東西,靜止時就是普通的閃光燈。沒錯,這就是搖搖棒。下面就介紹如何利用 Arduino 製作搖搖棒。

硬體電路

我選擇了16位 LED 燈,可以理解為對應的也就是16個像素點。晃動過程中,每個像素的的亮滅時間都需要準確控制,這裡直接選取了利用16個管腳進行控制。所以,硬體電路就相當簡單,採用 LED 陽極統一接高電平, LED 陰極分別接各管腳。如下圖:

上圖中的1N4007為整流二極體,保護電路所用,缺失並不會影響主要功能。這就是本次的核心電路,就是這麼簡單。當然要做成可晃動的成品,參考 Arduino 官網焊接一個最小系統即可,這裡不作贅述。這樣會有一個問題,就是反方向晃動時會產生鏡像文字。有種辦法,就是每次反方向晃動時按一下開關,當然,我們不能做這樣沒有追求的事情。可以採用比較常用的做法,焊一個水銀開關,由於清明節,水銀開關需要周一發貨,索性就不展示。

軟體編程

人眼的視覺停留時間大概是41.67ms(1/24),也就是說,當 LED 移動時,41.67ms內的 LED 亮滅都會被人眼作為一幅畫面。手晃動的時,在第一個位置,LED 點亮其中的一部分燈,晃動到第二個位置時,點亮一部分燈。控制每一個位置 LED 燈的亮滅,也就控制了每一列的像素顯示,從而控制了一整幅畫面的圖案。如下面示意圖(以八位模擬):

Talk is cheap!

void setup() {n char i;n char arr[] = {0,2,3,4,5,6,7,8,9,10,11,15,16,17,18,19};n for(i=0;i<16;i++){ n pinMode(arr[i], OUTPUT);n }n n}nnnn// the loop function runs over and overagain forevernvoid loop() { n char loveyou[] = {n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x20,0x00,0x20,0x00,0x20,n 0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x0F,n 0x04,0x10,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x04,0x10,0xF8,0x0F,0x00,0x00,n 0x00,0x00,0x00,0x00,0xFE,0x07,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x10,n 0x00,0x08,0xFE,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x3F,0x82,0x20,0x82,0x20,n 0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,0x00,0x00,0x00,0x00,0x00,0x00,n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,n }; n char i;n for(i=0;i<64;i++){n char j, k, tempa, tempb;n char arr[] = {0,2,3,4,5,6,7,8,9,10,11,15,16,17,18,19};n n tempa = loveyou[i*2 ];n for(j=0;j<8;j++){n char hh = (0x01 & ~tempa);n digitalWrite(arr[j], hh);n tempa = tempa >> 1;n }nn tempb = loveyou[i*2 + 1];n for(k=0;k<8;k++){ n char hh = (0x01 & ~tempb);n digitalWrite(arr[k+8],hh); n tempb = tempb >> 1;n }n delay(1.2);n }n n}n

上面是 Arduino 顯示"LOVE"的程序,其中 loveyou 數組中存儲的是字母「LOVE」對應的 LED 亮滅點陣。這裡存儲的是16進位,每兩個16進位數控制的一列 LED 燈的亮滅。主函數初始化了16個管腳控制16個 LED 燈,循環函數中的for循環進行的是位操作,目的是將數組中的16進位數轉化成二進位控制對應的 LED 亮滅。效果如下圖:

寫在後面的話

上面就是作為一個技術宅送女神的表白禮物,是不是相當低碳環保?整個製作並沒有比較難度的地方,最難的是清明節表白的勇氣和顯示圖案的創意,祝大家清明節成功追到女神。

更多內容可參考:探索物聯網。

推薦閱讀:

什麼是全棧(Full Stack)開發者?
《輻射4》中老冰棍的diy水平在技術宅當中算什麼級別?
動漫製作里的經費燃燒具體指什麼?
怎樣將收音機接受到的電磁波用電腦顯示出來?
如何把寢室裝修成圖拉丁吧風格?

TAG:表白 | 技术宅 | 清明节 |