WS2812 displays als samengesteld display gebruiken met NodeMCU

Met de komst van de WS2812 individueel-adresseerbare RGB leds ontstaat de mogelijkheid om displays te maken in elk gewenst formaat. Op dit moment zijn displaymodules te koop met afmetingen 2×2, 4×4 en 8×8 WS2812 leds met afmetingen van 15x15mm, 30x30mm en 71x71mm die onderling kunnen worden doorgelust om een groter geheel te maken. De leds hebben een individueel volgnummer, genummerd 1 tot aantal modules x aantal leds per module.

In de afbeelding hierboven zijn 8 WS2812-ledmodules van 8×8 leds aaneengeschakeld tot een groter display. De led linksboven in de eerste module heeft nummer 1, de led linksboven in de tweede module heeft 65, enzovoorts. Het omrekenen van een  coördinatenpaar (x, y) naar een led-volgnummer gaat als volgt:

function toLineair(x, y)
  boardNumber = math.floor((y - 1) / boardHeight) * boardsWide + math.floor((x - 1) /   boardWidth)
  boardX = x - math.floor((x - 1) / boardWidth) * boardWidth
  boardY = y - math.floor((y - 1) / boardHeight) * boardHeight
  linPos = boardNumber * ledsPerBoard + (boardY - 1) * boardHeight + boardX
  return linPos
end

De programma’s en documentatie zijn te vinden op GitHub: https://github.com/rudiniemeijer/NodeMCU-Lua-WS2812-matrix-displays

Test PIR sensor

ledpen = 0 -- D0/GPIO16

gpio.mode(ledpen, gpio.OUTPUT)
gpio.write(ledpen, gpio.HIGH) -- led uitzetten
pirsensorpen = 2 -- D2/GPIO4
gpio.mode(pirsensorpen, gpio.INT, gpio.PULLUP)

function beweging()
 print("PIR sensor detecteerde beweging")
 gpio.write(ledpen, gpio.LOW) -- led AAN
 tmr.alarm(0,2000, tmr.ALARM_SINGLE, function()
 gpio.write(ledpen, gpio.HIGH) -- led UIT na 2s
 end)
end

-- Roep de functie aan als het signaal begint ("up")
gpio.trig(pirsensorpen, "up", beweging)