Kaynağa Gözat

ADC driving RGB LED; electronic mood ring

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.
BruceMe 9 yıl önce
ebeveyn
işleme
bcfe753341
1 değiştirilmiş dosya ile 43 ekleme ve 0 silme
  1. 43 0
      lua_examples/adc_rgb.lua

+ 43 - 0
lua_examples/adc_rgb.lua

@@ -0,0 +1,43 @@
+-- 
+-- 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)