Gra ucząca jak mieszają się barwy RGB w diodach LED
- Płytka ESP8266
- Przewody męsko męskie
- Płytka stykowa
- Wyświetlacz OLED I2C
- Przycisk
- Potencjometr
- Pasek LED WS2812
Komputer z programem Thonny
Celem projektu jest zrozumienie jak mieszają się barwy w diodach LED, poprzez zabawną grę w zgadywanie.
Mieszanie się barw w diodach LED polega na łączeniu różnych rodzajów diod LED, które emitują światło o różnych kolorach (np. czerwony, zielony i niebieski), aby uzyskać pożądany kolor docelowy. W naszym przypadku diody są na tyle małe że ich nie widać ale zasada działania jest ta sama. Ten proces nazywany jest mieszaniem addytywnym, gdzie różne kolory są sumowane, tworząc nowe barwy. Poprzez regulację jasności poszczególnych diod LED można osiągnąć szeroką gamę kolorów, co jest często wykorzystywane w technologii oświetlenia LED, telewizorach, monitorach komputerowych oraz innych urządzeniach, które wymagają precyzyjnego sterowania kolorami emitowanego światła.
Gra losuje kolor, a następnie przy pomocy potencjometru wybieramy jak dużo każdej ze składowych jest w danym kolorze. Następnie w zależności od tego jak blisko docelowego koloru byliśmy gra wylicza punkty, oraz pokazuje naprzemiennie oba kolory, a także poprawną i naszą odpowiedź, tak abyśmy mogli zrozumieć jaka jest między nimi różnica.
Należy połączyć układ według schematu zamieszczonego pod kodem. Podłączamy płytkę, potencjometr, przycisk, pasek LED i wyświetlacz i łączymy według schematu przy użyciu przewodów męsko męskich. Po czym wgrywamy program na płytkę ESP 8266.
from machine import Pin, I2C, ADC
import time
import ssd1306
from neopixel import NeoPixel
import random
p0 = Pin(2, Pin.OUT)
i2c = I2C(scl=Pin(5), sda=Pin(4))
oled = ssd1306.SSD1306_I2C(128,64,i2c)
oled.fill(0)
ledPin = Pin(0, Pin.OUT)
np = NeoPixel(ledPin, 8)
btn = Pin(12, machine.Pin.IN, machine.Pin.PULL_UP)
adc=ADC(0)
def nextBtn():
oled.text("Wcisnij przycisk", 0, 45)
oled.text("aby kontynuowac",0,55)
oled.line(121,58,125,60,1)
oled.line(121,58,121,62,1)
oled.line(121,62,125,60,1)
oled.line(122,60,122,61,1)
state = 0
change = 0
randColor = [0,0,0]
ansColor = [0,0,0]
points = 0
showAns = False
for i in range(8):
np[i] = (0,0,0)
np.write()
timeRef = time.ticks_ms()
while True:
time.sleep(0.1)
now = time.ticks_ms()
if btn.value() is 0:
if state is 2:
ansColor[0]=int(adc.read()/1024*258-3)
elif state is 3:
ansColor[1]=int(adc.read()/1024*258-3)
elif state is 4:
ansColor[2]=int(adc.read()/1024*258-3)
if state is 5:
state=0
change=0
for i in range(8):
np[i] = (0,0,0)
np.write()
else: state+=1
time.sleep(0.5)
oled.fill(0)
oled.show()
if state is 0:
oled.text('Hitaj w grze!', 0, 0)
nextBtn()
oled.show()
elif state is 1:
oled.text('Uzyj pokretla,', 0, 0)
oled.text('aby zgadnac ile', 0, 10)
oled.text('czerwonego, zie-', 0, 20)
oled.text('lonego i nie-', 0, 30)
oled.text('bieskiego jest w', 0, 40)
oled.text('tym kolorze', 0, 50)
oled.line(121,58,125,60,1)
oled.line(121,58,121,62,1)
oled.line(121,62,125,60,1)
oled.line(122,60,122,61,1)
oled.show()
elif state is 2:
if change is 0:
randColor=[(time.ticks_us()*1313131345364123)%256,(time.ticks_us()*1313131345364123)%256,(time.ticks_us()*1313131345364123)%256]
change=1
for i in range(8):
np[i] = (randColor[0],randColor[1],randColor[2])
np.write()
oled.fill(0)
oled.text("Ilosc czerwonego:",0,0)
oled.text(str(int(adc.read()/1024*258)-3),45,20)
nextBtn()
oled.show()
elif state is 3:
oled.fill(0)
oled.text("Ilosc zielonego:",0,0)
oled.text(str(int(adc.read()/1024*258-3)),45,20)
nextBtn()
oled.show()
elif state is 4:
oled.fill(0)
oled.text("Ilosc niebies-",0,0)
oled.text("kiego:",0,10)
oled.text(str(int(adc.read()/1024*258-3)),45,20)
nextBtn()
oled.show()
elif state is 5:
points = int((765-abs(randColor[0]-ansColor[0])-abs(randColor[1]-ansColor[1])-abs(randColor[2]-ansColor[2]))/765*1000)
oled.fill(0)
oled.text("PUNKTY: "+str(points),20,0)
if points<550:
oled.text("Dobra robota",0,10)
elif points<900:
oled.text("Swietny wynik",0,10)
else:
oled.text("Wygrales!",0,10)
oled.text("Wylosowany kolor:",0,20)
oled.text("("+str(randColor[0])+", "+str(randColor[1])+", "+str(randColor[2])+")",10,30)
oled.text("Twoja odpowiedz",0,40)
oled.text("("+str(ansColor[0])+", "+str(ansColor[1])+", "+str(ansColor[2])+")",10,50)
oled.show()
if(time.ticks_diff(now, timeRef)>500):
showAns= not showAns
timeRef = now
if showAns:
for i in range(8):
np[i] = (randColor[0],randColor[1],randColor[2])
np.write()
else:
for i in range(8):
np[i] = (ansColor[0],ansColor[1],ansColor[2])
np.write()