Gra ucząca mieszania barw z użyciem diod LED

Typ_projektu
microPython
Zdjecie główne
Zdjęcie układu
Krótki opis projektu

Gra ucząca jak mieszają się barwy RGB w diodach LED

Niezbędne elementy
  1. Płytka ESP8266
  2. Przewody męsko męskie
  3. Płytka stykowa
  4. Wyświetlacz OLED I2C
  5. Przycisk
  6. Potencjometr
  7. Pasek LED WS2812
Sprzęt

Komputer z programem Thonny

Opis projektu

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.

 

Zdjęcia
Zdjęcia działającego układu
kod programu
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()
            
            
            
            
            
            
            
Pliki_projektu
Schemat
Youtube
Tagi
kolory gra oled zgadywanie mieszaniebarw ws2812