Preview:
# LED Candle animation for microypthon on esp8266

import time
import uos
import math
import machine
import neopixel


# number of leds in the strip
LED_COUNT = 20

# base color
r = 99
g = 31
b = 6

np = neopixel.NeoPixel(machine.Pin(4), LED_COUNT)


def show():
   np.write()

def Color(r, g, b):
    return (int(r), int(g), int(b))


def setPixelColor(i, color):
    np[i] = color


def wait(ms):
   time.sleep(ms/1000.0)


def randint(min, max):
    return min + int(int.from_bytes(uos.urandom(2), 10) / 65536.0 * (max - min + 1))


def c_brightness(c, brightness):
    return max(0, min(c * brightness / 100, 255))


class LED_light(object):
    def __init__(self, pos):
        self.time = 0
        self.pos = pos


    def update(self, delta):
        self.time = self.time - delta
        if self.time <= 0:
            self.random_mode()
            self.random_duration()


    def set_brightness(self, brightness):
        setPixelColor(self.pos, Color(c_brightness(r, brightness), c_brightness(g, brightness), c_brightness(b, brightness)))


    def random_mode(self):
        # Probability Random LED Brightness
        # 50% 77% –  80% (its barely noticeable)
        # 30% 80% – 100% (very noticeable, sim. air flicker)
        #  5% 50% –  80% (very noticeable, blown out flame)
        #  5% 40% –  50% (very noticeable, blown out flame)
        # 10% 30% –  40% (very noticeable, blown out flame)
        brightness = 0
        r = randint(0, 100)
        if r < 50:
            brightness = randint(77, 80)
        elif r < 80:
            brightness = randint(80, 100)
        elif r < 85:
            brightness = randint(50, 80)
        elif r < 90:
            brightness = randint(40, 50)
        else:
            brightness = randint(30, 40)
        self.set_brightness(brightness)


    def random_duration(self):
        # Probability Random Time
        # 90% 20 ms
        #  3% 20 – 30 ms
        #  3% 10 – 20 ms
        #  4%  0 – 10 ms
        r = randint(0, 100)
        if r < 90:
            self.time = 20
        elif r < 93:
            self.time = randint(20, 30)
        elif r < 96:
            self.time = randint(10, 20)
        else:
            self.time = randint(0, 10)


def main():
    candles = [LED_light(i) for i in range(LED_COUNT)]
    while True:
        now = time.ticks_ms()
        [l.update(now) for l in candles]
        show()
        wait(2)


main()
downloadDownload PNG downloadDownload JPEG downloadDownload SVG

Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!

Click to optimize width for Twitter