• 5/6

Brug af knap og lidt mere avanceret lysstyring.

Beskrivelse 

Hvis man gerne vil bruge knappen til at kunne skifte mellem lyssekvenser – eller f.eks. slukke for lystrekanten – uden at hive strømstikket ud, så skal der tilføjes lidt ekstra linjer til vores Python program fra step 3:

Kredsløb: Prøv at tilføje knappen til dit kredsløb

Kodeeksempel: Lav knap-styrede farveskrift

from neopixel import Neopixel
from utime import sleep
from farve import FARVE, REGNBUE_SEKVENS
import machine

# Defination af trekanterne 0-5. Tallene angiver de pixels der er med i hver trekant.
# Disse skal muligvis tilpasses til dit system
trekantNum = [
    [0, 42],    #trekant 0: 43 dioder
    [43, 62],   #trekant 1: 20 dioder
    [63, 82],   #trekant 2: 20 dioder
    [83, 102],  #trekant 3: 20 dioder
    [103, 122], #trekant 4: 20 dioder
    
]

pixels = Neopixel(trekantNum[-1][-1]+1,0,0,"GRB")
button = machine.Pin(3, machine.Pin.IN, machine.Pin.PULL_DOWN) # Opret en knap med en indbygget pull-down
state = 0 # tilstandsvariabel til at bruge sammen med knappen


# Funktion til at lave en gradient i hver trekant
# trekant: 0-4 - valg af trekant
# farve1: hvilken farve der skal startes fra. Se farve.py for mulige farver
# farve2: hvilken farve der skal gradieres til
# lysstyrke: 0-255
def sæt_gradient_trekant(trekant, farve1, farve2, lysstyrke):
    start_pixel = trekantNum[trekant][0]
    slut_pixel = trekantNum[trekant][-1]
    pixels.set_pixel_line_gradient(start_pixel, slut_pixel, farve1, farve2, lysstyrke)
    pixels.show()

# Funktion der sætter farven i en hel trekant.
# trekant: 0-4 - valg af trekant
# farve: se filen farve.py for de farver der kan tilgås
# lysstyrke: 0-255
def sæt_farve_trekant(trekant, farve, lysstyrke):
    start_pixel = trekantNum[trekant][0]
    slut_pixel = trekantNum[trekant][-1]
    pixels.set_pixel_line(start_pixel, slut_pixel, farve, lysstyrke)
    pixels.show()


# Funktion til at lave en gradient i over hele lampen
# farve1: hvilken farve der skal startes fra. Se farve.py for mulige farver
# farve2: hvilken farve der skal gradieres til
# lysstyrke: 0-255
def sæt_gradient_lampe(farve1, farve2, lysstyrke):
    start_pixel = trekantNum[0][0]
    slut_pixel = trekantNum[-1][-1]
    pixels.set_pixel_line_gradient(start_pixel, slut_pixel, farve1, farve2, lysstyrke)
    pixels.show()


# Funktion der sætter farven i hele lampen.
# farve: se filen farve.py for de farver der kan tilgås
# lysstyrke: 0-255
def sæt_farve_lampe(farve, lysstyrke):
    pixels.brightness(lysstyrke)
    pixels.fill(farve)
    pixels.show()

# Funktion der laver en gradient i de fire foreste trekanter
# farve1: hvilken farve der skal startes fra. Se farve.py for mulige farver
# farve2: hvilken farve der skal gradieres til
# lysstyrke: 0-255
def sæt_gradient_forside(farve1, farve2, lysstyrke):
    start_pixel = trekantNum[1][0]
    slut_pixel = trekantNum[-1][-1]
    pixels.set_pixel_line_gradient(start_pixel, slut_pixel, farve1, farve2, lysstyrke)
    pixels.show()

# Skriv din egent kode herunder, der bruger de ovenstående funktioner:

# Eksempel på hvordan man kan lave knap-styrede farveskift
while True:
    if button.value() == 1: # tjek om knappen er trykket ind
        if state == 0:
            state = 1
            sæt_farve_lampe(FARVE['violet'],255)
        else:
            state = 0
            sæt_farve_lampe(FARVE['grøn'],255)
        sleep(0.2) # Undgå prel - når knappen trykkes ind skifter den tilstand (tændt/slukket) mange gange, men ved at indsætte en pause undgår vi at den bliver læst med det samme igen.

Tilføjet kode

Det der er tilføjet i forhold til programmet fra sidste step er disse linjer:

import machine
button = machine.Pin(3, machine.Pin.IN, machine.Pin.PULL_DOWN) # Opret en knap med en indbygget pull-down
state = 0 # tilstandsvariabel til at bruge sammen med knappen
# Eksempel på hvordan man kan lave knap-styrede farveskift
while True:
    if button.value() == 1: # tjek om knappen er trykket ind
        if state == 0:
            state = 1
            sæt_farve_lampe(FARVE['violet'],255)
        else:
            state = 0
            sæt_farve_lampe(FARVE['grøn'],255)
        sleep(0.2) # Undgå prel - når knappen trykkes ind skifter den tilstand (tændt/slukket) mange gange, men ved at indsætte en pause undgår vi at den bliver læst med det samme igen.

Beskrivelse af koden

Kommentarerne beskriver hvad de enkelte linjer gør, og lige nu har programmet kun to tilstande, som der skiftes imellem hver gang der trykkes på knappen – men det kan relativt nemt ændres ved at indføre nogle flere sætninger i  loopet:

# Eksempel på hvordan man kan lave knap-styrede farveskift
while True:
    if button.value() == 1: # tjek om knappen er trykket ind
        state += 1
        if state == 1:
            sæt_farve_lampe(FARVE['violet'],255)
        elif state == 2:
            sæt_farve_lampe(FARVE['orange'],255)
        elif state == 3:
            sæt_farve_lampe(FARVE['rød'],255)
        elif state == 4:
            state = 0
            sæt_farve_lampe(FARVE['grøn'],255)
        sleep(0.2) # Undgå prel - når knappen trykkes ind skifter den tilstand (tændt/slukket) mange gange, men ved at indsætte en pause undgår vi at den bliver læst med det samme igen.

Opgave: Kan du lave et program der skifter mellem 3 forskellige farvetilstande (du må selv bestemme hvilke) – men den ene af dem skal være helt slukket.

Beskrivelse

Her er eksempler på mere avancerede programmer – dette eksempel gør ikke brug af knappen

Kodeeksempel: Prøv at sætte dette ind i main

# Skriv din egen kode herunder, der bruger de ovenstående funktioner:


# Her er et eksempel på hvordan alle trekanter tændes i samme farve.
sæt_farve_lampe(FARVE['pink'],50)
sleep(2)

# Her er et eksemppel på hvordan de enkelte trekanter tændes i hver deres farve.
sæt_farve_trekant(0, FARVE['gul'],255)
sæt_farve_trekant(1, FARVE['rød'],255)
sæt_farve_trekant(2, FARVE['hvid'],255)
sæt_farve_trekant(3, FARVE['grøn'],255)
sæt_farve_trekant(4, FARVE['blå'],255)
sleep(2)

# Her er et eksempel på hvordan forsiden laver gradient fra rød til blå og sætter en dæmpet hvid baggrund
sæt_gradient_forside(FARVE['rød'], FARVE['blå'], 150)
sæt_farve_trekant(0, FARVE['hvid'],5)
sleep(2)

# Her er et eksempel på hvordan de 3 ydre trekanters farve roterer om en gul midte,
# alt imens baggrunden blinker pink
farve_sekvens = [FARVE['rød'], FARVE['grøn'], FARVE['blå']]
sæt_farve_trekant(3, FARVE['gul'],255)
for i in range(10):
    sæt_farve_trekant(1, farve_sekvens[i % 3],255)
    sæt_farve_trekant(4, farve_sekvens[(i+1) % 3],255)
    sæt_farve_trekant(2, farve_sekvens[(i+2) % 3],255)
    sæt_farve_trekant(0, FARVE['pink'], 100*(i%2))
    sleep(0.5)

Og afprøv programmet – det skulle gerne se sådan ud:

Tilføjelse af knap til programmet

Hvis ovenstående skal kunne skiftes mellem med en knap er vi nødt til at sørge for at pauserne er styret af en timer i stedet, da vi ikke kan aflæse knappen, mens en  

kommando udføres.