====== Schnelle Funktionen zur Abfrage der Knöpfe und Pixel zeichnen ====== {{ :lehrkraefte:blc:informatik:glf19:oxocard:upload_ivobuttons.py |}} Dieses Programm muss nur einmal auf die OxoCard geladen und ausgeführt werden, um die Bibliothek auf der OxoCard abzulegen. Es erscheint dann ein grünes OK auf der OxoCard. Im Simulator passiert nichts. {{ :lehrkraefte:blc:informatik:glf19:oxocard:ivobuttons.py |}} Diese Datei muss im gleichen Verzeichnis liegen, wie die eigene Programmdatei, damit die Funktionen auch im Simulator zur Verfügung stehen. Eventuell muss die Datei auch in TigerJython geöffnet sein, damit es funktioniert. #Initialisierung der Oxocard try: from machine import Pin, deepsleep, ADC, reset from globals import __np import time Pin(2, Pin.OUT).value(1) # audio ampli on Pin(15, Pin.OUT).value(0) # neopix on __np.set(37, 0xffff00, update = True) # Möglichkeit zum Ausschalten... for i in range(50): if Pin(13, Pin.IN, Pin.PULL_DOWN).value() == 1 and Pin(27, Pin.IN, Pin.PULL_DOWN).value() == 1: print("Power off") for k in [250, 100, 50, 20, 10, 5, 1, 0]: for i in range(8): __np.set(9*i+1, k << 16, update = False) __np.set(7*i+8, k << 16, update = False) __np.show() time.sleep(0.5) Pin(2, Pin.OUT).value(0) # audio ampli off Pin(15, Pin.OUT).value(1) # neopix off deepsleep() time.sleep(0.02) except ImportError: pass ################################### # Start vom eigentlichen Programm # ################################### from oxocard import * from ivobuttons import * def hsv2rgb(h,s,v): c = v*s x = c*(1-abs(h*6 % 2 -1)) m = c-v rgb = (0,0,0) if (h<1/6): rgb = (c,x,0) elif h<2/6: rgb = (x,c,0) elif h<3/6: rgb = (0,c,x) elif h<4/6: rgb = (0,x,c) elif h<5/6: rgb = (x,0,c) else: rgb = (c,0,x) rgb = ((int((rgb[0]+m)*255)), (int((rgb[1]+m)*255)),(int((rgb[2]+m)*255))) return rgb clear(BLACK) dirs = ((0,1),(1,0),(0,-1), (-1,0)) x = 0 y = 0 d = 0 h = 0.0 a = 0 b = 0 dd = 0 ivobuttons.delay=0 fps = getms() while True: for i in range(24): fastDot(x,y,hsv2rgb((h+i/40)%1, 1, (i/24)**1.5)) x+=dirs[d][0] y+=dirs[d][1] if (x>7 or x<0 or y>7 or y<0): x-=dirs[d][0] y-=dirs[d][1] d=(d+1)%4 x+=dirs[d][0] y+=dirs[d][1] if (i==0): a = x b = y dd = d fastRepaint() s = ivobuttons.states() if (s & IVO_R2): sleep(0.05) if (s & IVO_R3): sleep(0.15) h = (h+0.005)%1 x = a y = b d = dd fps2 = getms() print("%d fps" % int(1000/(fps2-fps))) fps = fps2 ====== HSV-Farben, Gamma-Faktor ====== Folgender Code enthält eine Funktion **hsv2rgb**, um Farbangaben von HSV (Hue, Saturation, Value, d.h. Farbton, Sättigung, Helligkeit) nach RGB umzurechnen. Zusätzlich ist eine Funktion **gamma**, um Bildschirm-RGB-Farben auf OxoCard-RGB-Farben umzurechnen. Ein Beispiel mit einem Farbverlauf ist hier zu finden: #Initialisierung der Oxocard try: from machine import Pin, deepsleep, ADC, reset from globals import __np import time Pin(2, Pin.OUT).value(1) # audio ampli on Pin(15, Pin.OUT).value(0) # neopix on __np.set(37, 0xffff00, update = True) # Möglichkeit zum Ausschalten... for i in range(50): if Pin(13, Pin.IN, Pin.PULL_DOWN).value() == 1 and Pin(27, Pin.IN, Pin.PULL_DOWN).value() == 1: print("Power off") for k in [250, 100, 50, 20, 10, 5, 1, 0]: for i in range(8): __np.set(9*i+1, k << 16, update = False) __np.set(7*i+8, k << 16, update = False) __np.show() time.sleep(0.5) Pin(2, Pin.OUT).value(0) # audio ampli off Pin(15, Pin.OUT).value(1) # neopix off deepsleep() time.sleep(0.02) except ImportError: pass ################################### # Start vom eigentlichen Programm # ################################### from oxocard import * # Farbe von Hue (Farbton, von 0 bis 1.0), Saturation (Sättigung, von 0 bis 1) und Value (Helligkeit, von 0 bis 1) # Formel von von https://www.rapidtables.com/convert/color/hsv-to-rgb.html def hsv2rgb(h,s,v): c = v*s x = c*(1-abs(h*6 % 2 -1)) m = c-v rgb = (0,0,0) if (h<1/6): rgb = (c,x,0) elif h<2/6: rgb = (x,c,0) elif h<3/6: rgb = (0,c,x) elif h<4/6: rgb = (0,x,c) elif h<5/6: rgb = (x,0,c) else: rgb = (c,0,x) rgb = ((int((rgb[0]+m)*255)), (int((rgb[1]+m)*255)),(int((rgb[2]+m)*255))) return rgb # Wendet einen Gamma-Faktor (default 2) auf einen RGB-Wert an. def gamma(rgb, gamma=2): return (int((rgb[0]/255)**gamma*255), int((rgb[1]/255)**gamma*255),int((rgb[2]/255)**gamma*255)) def regenbogen(offset=0): for y in range(8): for x in range(8): # Nummer des Pixels, von 0 bis 63 nr = (x+8*y+offset)%64 # Hue (Farbton ist nr/64) rgb = hsv2rgb(nr/64,1,1) dot(x,y,gamma(rgb)) enableRepaint(False) while True: for i in range(64): regenbogen(i) repaint() ====== Bild-Konverter ====== Das folgende TigerJython Programm transformiert ein beliebiges Bild in eine matrix, die mit image(matrix) auf der OxoCard ausgegeben werden kann. {{ :lehrkraefte:blc:informatik:glf19:oxocard:imageconverter.py |}} Verwendung: #Initialisierung der Oxocard try: from machine import Pin, deepsleep, ADC, reset from globals import __np import time Pin(2, Pin.OUT).value(1) # audio ampli on Pin(15, Pin.OUT).value(0) # neopix on __np.set(37, 0xffff00, update = True) # Möglichkeit zum Ausschalten... for i in range(50): if Pin(13, Pin.IN, Pin.PULL_DOWN).value() == 1 and Pin(27, Pin.IN, Pin.PULL_DOWN).value() == 1: print("Power off") for k in [250, 100, 50, 20, 10, 5, 1, 0]: for i in range(8): __np.set(9*i+1, k << 16, update = False) __np.set(7*i+8, k << 16, update = False) __np.show() time.sleep(0.5) Pin(2, Pin.OUT).value(0) # audio ampli off Pin(15, Pin.OUT).value(1) # neopix off deepsleep() time.sleep(0.02) except ImportError: pass ################################### # Start vom eigentlichen Programm # ################################### from oxocard import * while True: # Art 0, gamma 2 matrix=(((12,15,17),(14,16,19),(60,37,22),(37,34,32),(66,40,24),(46,38,33),(12,15,18),(12,15,17),),((13,15,18),(30,33,36),(142,37,0),(49,18,4),(153,37,0),(82,32,8),(39,40,43),(21,23,26),),((45,36,30),(46,28,18),(80,21,1),(26,17,12),(117,28,0),(34,14,5),(85,24,2),(36,22,14),),((77,42,20),(128,30,0),(58,57,58),(57,53,50),(37,36,36),(52,51,51),(188,44,0),(45,24,14),),((25,21,19),(78,20,1),(70,58,50),(227,113,42),(190,109,56),(115,84,63),(30,11,3),(30,23,19),),((17,19,21),(38,38,38),(96,44,17),(251,122,42),(201,126,77),(105,47,17),(64,64,65),(7,8,10),),((4,5,6),(51,51,53),(87,55,34),(231,125,54),(100,75,62),(125,95,76),(49,50,51),(4,5,6),),((9,11,13),(13,15,17),(34,36,39),(34,22,15),(37,35,34),(29,32,34),(14,16,19),(9,11,13),),) image(matrix) sleep(1) # Art 0, gamma 1.4 matrix=(((30,35,39),(33,38,42),(92,66,46),(67,62,60),(100,70,49),(77,67,62),(31,35,40),(30,35,39),),((31,36,40),(57,60,65),(169,66,3),(80,40,15),(178,66,1),(115,60,24),(68,70,74),(44,48,51),),((76,65,57),(77,54,40),(113,45,6),(52,38,31),(147,55,3),(63,34,17),(119,49,8),(65,46,34),),((111,72,43),(158,57,3),(91,89,90),(89,84,82),(66,65,65),(84,82,83),(206,74,1),(76,50,34),),((50,44,42),(112,43,6),(104,90,82),(235,144,73),(208,140,89),(146,117,95),(57,29,12),(58,47,42),),((38,42,45),(67,67,68),(129,75,38),(252,152,72),(216,155,110),(137,78,39),(96,97,97),(21,24,26),),((14,16,18),(82,83,85),(121,88,63),(238,155,86),(133,109,94),(154,127,109),(81,81,82),(15,17,19),),((25,29,33),(31,35,39),(62,65,68),(62,46,36),(66,64,62),(56,59,62),(34,37,41),(25,29,33),),) image(matrix) sleep(1) # Art 1, gamma 2 matrix=(((12,15,18),(12,15,18),(20,13,9),(53,55,58),(37,25,18),(60,60,63),(12,15,18),(12,15,18),),((11,14,17),(17,19,22),(235,57,0),(39,9,0),(233,56,0),(44,13,2),(49,51,55),(25,29,31),),((33,33,33),(15,9,7),(193,46,0),(14,6,4),(227,56,0),(31,9,1),(121,29,0),(21,17,15),),((31,18,10),(125,29,0),(127,127,127),(25,25,25),(75,75,75),(135,134,137),(249,59,0),(21,9,6),),((41,41,43),(129,30,0),(166,168,168),(245,169,110),(222,160,112),(81,74,70),(37,8,0),(33,31,31),),((11,14,17),(55,55,55),(105,48,20),(253,184,128),(235,134,69),(158,73,29),(94,96,97),(2,3,4),),((0,1,1),(82,83,84),(62,31,15),(249,82,6),(45,40,40),(237,207,182),(51,51,51),(0,0,0),),((9,11,13),(9,11,13),(32,34,37),(11,9,9),(73,73,74),(20,23,25),(9,11,13),(9,11,13),),) image(matrix) sleep(1) ====== Labyrinth ====== Anleitung: * Schütteln, um Zufall zu erzeugen. * Neigen Sie die OxoCard, um den roten Punkt in die untere rechte Ecke des Labyrinths zu steuern {{ :lehrkraefte:blc:informatik:glf19:oxocard:laby.py |}}