亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于ESP8266的投影仪

发布时间:2021-05-12
分享到:

基于ESP8266的投影仪

发布时间:2021-05-12
分享到:

该投影仪是使用ESP8266和小液晶屏来制作的,通过液晶显示屏发出少量的光,且投影到天花板上,而不会破坏黑暗的环境。

硬件部件:

  • ESP8266
  • SSD1306 128x64 OLED
  • 凸透镜(直径:25mm、焦距:45mm)

 示意图:

代码:

//代码 https://tinkerdoodle.cc/user/_/notebooks/Shared/Tinkerdoodle/ESP8266%20Projector.ipynb
//建议使用Tinkerdoodle编辑和部署代码
from ssd1306 import SSD1306_I2C
from machine import Pin, I2C
from time import sleep
from uos import urandom

width = 128
height = 64
# Pin D0 = GPIO16, Pin D7 = GPIO13
i2c = I2C(-1, scl=Pin(16), sda=Pin(13))
lcd = SSD1306_I2C(128, 64, i2c)

def rand(n):
    return int.from_bytes(urandom(2), 'big') % n

def draw_grid(arr):
    for i in range(len(arr[0])):
        lcd.line(0, 16*i, 127, 16*i, 0)
    lcd.line(0, 63, 127, 63, 0)
    for i in range(len(arr)):
        lcd.line(16*i, 0, 16*i, 63, 0)
    lcd.line(127, 0, 127, 63, 0)

def draw_lives(arr):
    for i in range(len(arr)):
        for j in range(len(arr[i])):
            if arr[i][j] == 1:
                lcd.fill_rect(16*i, 16*j, 16, 16, 1)
            else:
                lcd.rect(16*i, 16*j, 16, 16, 1)

def create_lives(w, h):
    arr = [[0] * h for _ in range(w)]
    for i in range(len(arr)):
        for j in range(len(arr[i])):
            arr[i][j] = 1 if rand(10) > 6 else 0
    return arr

def update_lives(arr):
    w = len(arr)
    h = len(arr[0])
    arr2 = [[0] * h for _ in range(w)]
    for i in range(w):
        for j in range(h):
            l = arr[(w+i-1)%w][j]
            r = arr[(i+1)%w][j]
            u = arr[i][(h+j-1)%h]
            d = arr[i][(j+1)%h]
            lu = arr[(w+i-1)%w][(h+j-1)%h]
            ld = arr[(w+i-1)%w][(j+1)%h]
            ru = arr[(i+1)%w][(h+j-1)%h]
            rd = arr[(i+1)%w][(j+1)%h]
            n = l + r + u + d + lu + ld + ru + rd
            if arr[i][j] == 1:
                arr2[i][j] = 1 if n == 2 or n == 3 else 0
            else:
                arr2[i][j] = 1 if n == 3 else 0
    return arr2

arr = create_lives(8, 4)
count = 0
while True:
    lcd.fill(0)
    draw_lives(arr)
    draw_grid(arr)
    lcd.show()
    arr = update_lives(arr)
    sleep(1)
    count += 1
    if sum([sum(x) for x in arr]) == 0 or count % 60 == 0:
        arr = create_lives(8, 4)

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论