mirror of
https://github.com/nodemcu/nodemcu-firmware.git
synced 2025-01-16 20:52:57 +08:00
bcfe753341
It's as simple as ADC (analog to digital converter); easy as RGB (Color LED)... This example can be run on any ESP8266, but it runs out of the box on the ebay search for.. "ESP8266 Battery Holder" with the light sensor on ADC0 and RGB LED. Fun and easy way to do more than blink a light.
44 lines
1.1 KiB
Lua
44 lines
1.1 KiB
Lua
--
|
|
-- Light sensor on ADC(0), RGB LED connected to gpio12(6) Green, gpio13(7) Blue & gpio15(8) Red.
|
|
-- This works out of the box on the typical ESP8266 evaluation boards with Battery Holder
|
|
--
|
|
-- It uses the input from the sensor to drive a "rainbow" effect on the RGB LED
|
|
-- Includes a very "pseudoSin" function
|
|
--
|
|
|
|
function led(r,Sg,b)
|
|
pwm.setduty(8,r)
|
|
pwm.setduty(6,g)
|
|
pwm.setduty(7,b)
|
|
end
|
|
|
|
-- this is perhaps the lightest weight sin function in existance
|
|
-- Given an integer from 0..128, 0..512 appximating 256 + 256 * sin(idx*Pi/256)
|
|
-- This is first order square approximation of sin, it's accurate around 0 and any multiple of 128 (Pi/2),
|
|
-- 92% accurate at 64 (Pi/4).
|
|
function pseudoSin (idx)
|
|
idx = idx % 128
|
|
lookUp = 32 - idx % 64
|
|
val = 256 - (lookUp * lookUp) / 4
|
|
if (idx > 64) then
|
|
val = - val;
|
|
end
|
|
return 256+val
|
|
end
|
|
|
|
pwm.setup(6,500,512)
|
|
pwm.setup(7,500,512)
|
|
pwm.setup(8,500,512)
|
|
pwm.start(6)
|
|
pwm.start(7)
|
|
pwm.start(8)
|
|
|
|
tmr.alarm(1,20,1,function()
|
|
idx = 3 * adc.read(0) / 2
|
|
r = pseudoSin(idx)
|
|
g = pseudoSin(idx + 43)
|
|
b = pseudoSin(idx + 85)
|
|
led(r,g,b)
|
|
idx = (idx + 1) % 128
|
|
end)
|