用NodeMCU制作春節(jié)小彩燈,哦耶

首先是購買配件

nodemcu選擇便宜的esp8266
燈帶用了以前剩下的ws2801技肩,(大家如果買的話建議買ws2811/2812)

刷nodemcu固件

默認(rèn)固件不支持ws2801,去官網(wǎng)適配支持ws2801的固件刷入esp8266
win下開發(fā):http://www.reibang.com/p/af28ee8a3d06
win下開發(fā):http://www.reibang.com/p/a2482b542f45
mac刷固件詳細(xì)過程:http://www.reibang.com/p/e06c621d32fb

引出ws2801四個(gè)引腳

四根線分別是
vcc(我買的對(duì)應(yīng)5v)
ck (時(shí)鐘線)
si (信號(hào)線)
gnd (gcc)

其中注意vcc和gnd要外接usb電源(如果是12v的也需要額外的12v電源)不要讓nodemcu提供5v電源俗冻,會(huì)把板子燒了

接線

引出的ck線接D3口(gpio0)
引出的si線接D4口 (gpio2)

代碼

因?yàn)槭莾?nèi)建模塊,所以用法很簡單
初始化

ws2801.init(0,2)

將所有燈泡熄滅

ws2801.write(string.char(0,0,0):rep(100))

設(shè)置燈的顏色

ws2801.write(string.char(0,50,0))

其中數(shù)值第一位為紅色牍颈,第二位為藍(lán)色迄薄,第三位為綠色,數(shù)值的范圍是0-255煮岁,這和官方文檔不一樣讥蔽,官方文檔對(duì)應(yīng)的藍(lán)色和綠色是對(duì)調(diào)的,這不影響實(shí)現(xiàn)的最終效果

最后的代碼


ws2801.init(4,2)
ws2801.write(string.char(0,0,0):rep(100))


function HSL(hue, saturation, lightness)
    local chroma = (1 - math.abs(2 * lightness - 1)) * saturation
    local h = hue/60
    local x =(1 - math.abs(h % 2 - 1)) * chroma
    local r, g, b = 0, 0, 0
    if h < 1 then
        r,g,b=chroma,x,0
    elseif h < 2 then
        r,b,g=x,chroma,0
    elseif h < 3 then
        r,g,b=0,chroma,x
    elseif h < 4 then
        r,g,b=0,x,chroma
    elseif h < 5 then
        r,g,b=x,0,chroma
    else
        r,g,b=chroma,0,x
    end
    local m = lightness - chroma/2
    return math.floor((r+m)*255),math.floor((g+m)*255),math.floor((b+m)*255)
end

turntype =4
loopNum = 0
direction = 1

--tmr.delay(1000000)
--ws2801.write(string.char(0,50,0))

ledNum = 25
ledColors = ledNum*3

ledPool = {}
ledPoolTo = {}
for i=1, ledColors,3 do
    ledPool[i] = 0
    ledPool[i+1] = 0
    ledPool[i+2] = 0
    local cr,cg,cb = HSL(math.random(0,255),1,.1)
    ledPoolTo[i]=cr
    ledPoolTo[i+1]=cg
    ledPoolTo[i+2]=cb
--    ledPoolTo[i]=math.random(65,90)
--    print(cr,cg,cb)
end

function turnLed()
    local str = ""
    for i=1, ledColors, 3 do
--        ledPool[i]=ledPool[i]+(ledPoolTo[i]-ledPool[i])/10
--        ledPool[i+1]=ledPool[i+1]+(ledPoolTo[i+1]-ledPool[i+1])/10
--        ledPool[i+2]=ledPool[i+2]+(ledPoolTo[i+2]-ledPool[i+2])/10
        str=str..string.char(ledPoolTo[i],ledPoolTo[i+1],ledPoolTo[i+2])
    end
    ws2801.write(str)
--    print(str)
end

function turnLedTo()
    local str = ""
    if turntype==1 then
        for i=1, ledColors, 3 do
            local cr,cg,cb = HSL(math.random(0,255),1,.05)
            ledPoolTo[i]=cr
            ledPoolTo[i+1]=cg
            ledPoolTo[i+2]=cb
            str=str..string.char(ledPoolTo[i],ledPoolTo[i+1],ledPoolTo[i+2])
        end
    elseif turntype==3 then
        loopNum=(loopNum+1)%4
        for i=1, ledColors, 3 do
            if (i+loopNum)%4~=0 then
                str=str..string.char(0,0,0)
            else
                local cr,cg,cb = HSL(math.random(0,255),1,.05)
                ledPoolTo[i]=cr
                ledPoolTo[i+1]=cg
                ledPoolTo[i+2]=cb
                str=str..string.char(ledPoolTo[i],ledPoolTo[i+1],ledPoolTo[i+2])
            end
        end
    elseif turntype==2 then
        loopNum=(loopNum+1)%ledNum
        for i=1, ledColors, 3 do
            if i~=(loopNum*3+1) then
                str=str..string.char(0,0,0)
            else
                local cr,cg,cb = HSL(math.random(0,255),1,.05)
                ledPoolTo[i]=cr
                ledPoolTo[i+1]=cg
                ledPoolTo[i+2]=cb
                str=str..string.char(ledPoolTo[i],ledPoolTo[i+1],ledPoolTo[i+2])
            end
        end
    elseif turntype==4 then
        if math.random(0,100)>90 then
            direction = -direction
        end
        loopNum=loopNum+direction
        if loopNum<0 then
            loopNum = ledNum-1
        elseif loopNum>=ledNum then
            loopNum = 0
        end
        for i=1, ledColors, 3 do
            if i~=(loopNum*3+1) then
                str=str..string.char(0,0,0)
            else
                local cr,cg,cb = HSL(math.random(0,255),1,.05)
                ledPoolTo[i]=cr
                ledPoolTo[i+1]=cg
                ledPoolTo[i+2]=cb
                str=str..string.char(ledPoolTo[i],ledPoolTo[i+1],ledPoolTo[i+2])
            end
        end
    end
    ws2801.write(str)
end

--tmr.stop(0)
--tmr.alarm(0, 50, tmr.ALARM_AUTO, turnLed)
tmr.stop(1)
tmr.alarm(1, 50, tmr.ALARM_AUTO, turnLedTo)

function onBtnEvent()
    local tt = turntype-1
    tt=(tt+1)%4
    turntype=tt+1
    print(turntype)
    if turntype==2 then
        tmr.stop(1)
        tmr.alarm(1, 100, tmr.ALARM_AUTO, turnLedTo)
    elseif turntype==4 then
        tmr.stop(1)
        tmr.alarm(1, 50, tmr.ALARM_AUTO, turnLedTo)
    elseif turntype==3 then
        tmr.stop(1)
        tmr.alarm(1, 1000, tmr.ALARM_AUTO, turnLedTo)
    else
        tmr.stop(1)
        tmr.alarm(1, 2000, tmr.ALARM_AUTO, turnLedTo)
    end
end
gpio.mode(3, gpio.INT, gpio.PULLUP)
gpio.trig(3, "up", onBtnEvent)

--color1 = HSL(100,.5,.5)
--print(color1[0])
--print(color1[1])
--print(color1[2])

ps:我將io口從3画机,4改為2冶伞,4(gpio4,2)色罚,這是因?yàn)閚odemcu上的物理按鍵對(duì)應(yīng)的D3口碰缔,在不外擴(kuò)的情況下可以用來切換彩燈的顯示效果

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末账劲,一起剝皮案震驚了整個(gè)濱河市戳护,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瀑焦,老刑警劉巖腌且,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異榛瓮,居然都是意外死亡铺董,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門禀晓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來精续,“玉大人,你說我怎么就攤上這事粹懒≈馗叮” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵凫乖,是天一觀的道長确垫。 經(jīng)常有香客問我,道長帽芽,這世上最難降的妖魔是什么删掀? 我笑而不...
    開封第一講書人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮导街,結(jié)果婚禮上披泪,老公的妹妹穿的比我還像新娘。我一直安慰自己搬瑰,他們只是感情好款票,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開白布计福。 她就那樣靜靜地躺著,像睡著了一般徽职。 火紅的嫁衣襯著肌膚如雪象颖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評(píng)論 1 305
  • 那天姆钉,我揣著相機(jī)與錄音说订,去河邊找鬼。 笑死潮瓶,一個(gè)胖子當(dāng)著我的面吹牛陶冷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毯辅,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼埂伦,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了思恐?” 一聲冷哼從身側(cè)響起沾谜,我...
    開封第一講書人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胀莹,沒想到半個(gè)月后基跑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡描焰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年媳否,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荆秦。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篱竭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出步绸,到底是詐尸還是另有隱情掺逼,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布靡努,位于F島的核電站坪圾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惑朦。R本人自食惡果不足惜兽泄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漾月。 院中可真熱鬧病梢,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钮热,卻和暖如春填抬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隧期。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來泰國打工飒责, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仆潮。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓宏蛉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親性置。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拾并,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

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

  • Arduino Due有14個(gè)數(shù)字I/O,6個(gè)模擬I/O鹏浅,一個(gè)復(fù)位開關(guān)嗅义,一個(gè)ICSP下載口,7-12v電源供電篡石。 ...
    麥牛2013閱讀 3,340評(píng)論 0 8
  • 智能小車演示視頻 摘要:該項(xiàng)目我會(huì)開源芥喇,大家一起參與進(jìn)來,對(duì)智能小車進(jìn)行完善凰萨。一定要牢記樹莓派的GPIO引腳不能輸...
    IT楓閱讀 26,993評(píng)論 21 94
  • 寫在前面 為什么要寫這樣一系列文章,網(wǎng)上很早就有并且還很多此類文章了呀械馆,對(duì)于電子相關(guān)專業(yè)的人分分鐘可以搞定的事呀胖眷。...
    happycool閱讀 2,029評(píng)論 0 6
  • 耶穌他自己都把屬靈爭戰(zhàn)排在第一順位,較其他事工更為重要霹崎∩翰螅……在這種溫馴、粉飾太平的社會(huì)中尾菇,人們太容易夢(mèng)游一生境析,淪為...
    gaoyan22閱讀 175評(píng)論 0 0
  • 九江之行 6.3 周五 雨天 兩個(gè)酷愛浪的人在一起,那是可怕的派诬,天氣是阻擋不了什么的劳淆。早晨還在計(jì)劃周末去圖書館寫作...
    各自燦爛閱讀 340評(píng)論 0 0