Nabend
Nachdem mein erster Thread in eine Pythonmachbarkeitsstudie ausgeartet
ist,
von der ich nun wirklich nichts verstehe, fange ich hier von vorne an:
Ich habe: einen ESP8266 mit Micropython, einen Beschleunigungssensor
(MPU6050) und ein paar WS2812 LEDs.
Der Aufbau pendelt an dem USB Kabel.
Ich möchte: die LEDs so ansteuern, dass sie, je nach Position des
Pendels, eine andere Farbe haben. Das Pendel soll nicht immer gleich
lang sein und nicht immer gleich hoch ausschlagen.
Mein Ansatz: Wendepunkte des Pendels erkennen, dazwischen die Zeit
messen, Zeit durch die Anzahl der Schritte des Farbverlaufes teilen,
wenn diese Zeit verstrichen ist, den Wert des Farbverlaufen um eins
erhöhen. Dass bis zum anderen Wendepunkt, welcher erkannt wird und das
Spiel geht von vorne los.
Was funktioniert: Sensor auslesen und Werte glätten, LEDs ansteuern,
Wendepunkte des Pendels (Hoch- und Tiefpunkt von GyZ) erkennen und die
Zeit dazwischen messen. Also alles was ich brauche im Einzelnen.
Mein Problem: Ich verzettele mich in Funktionen die Funktionen aufrufen.
1 | from machine import I2C, Pin
| 2 | import time
| 3 | import utime
| 4 | import mpu6050
| 5 | import math
| 6 | import machine, neopixel
| 7 |
| 8 | np = neopixel.NeoPixel(machine.Pin(13), 16)
| 9 | i2c = I2C(scl=Pin(5), sda=Pin(4))
| 10 | accel = mpu6050.accel(i2c)
| 11 |
| 12 |
| 13 | # HSV values in [0..1] returns (r, g, b) values from 0 to 255
| 14 | def hsv_to_rgb(h, s, v):
| 15 | h_i = int((h*6))
| 16 | f = h*6 - h_i
| 17 | p = v * (1 - s)
| 18 | q = v * (1 - f*s)
| 19 | t = v * (1 - (1 - f) * s)
| 20 |
| 21 | if h_i==0: r, g, b = v, t, p
| 22 | elif h_i==1: r, g, b = q, v, p
| 23 | elif h_i==2: r, g, b = p, v, t
| 24 | elif h_i==3: r, g, b = p, q, v
| 25 | elif h_i==4: r, g, b = t, p, v
| 26 | elif h_i==5: r, g, b = v, p, q
| 27 | else: r, g, b = 0, 0, 0
| 28 | return (int(r*255), int(g*255), int(b*255))
| 29 |
| 30 | ## LEDs mir HSV Wert einschalten
| 31 | def LED_an(hsv_value):
| 32 | hsv_value = hsv_value / 100
| 33 | for j in range(0, 2):
| 34 | np[j] = hsv_to_rgb(hsv_value, 0.9, 0.21)
| 35 | np.write()
| 36 |
| 37 | ## LEDs mit HSV aufrufen und anschließend HSV erhöhen
| 38 | hsv = 0
| 39 | schritt = 1
| 40 | def led_verlauf():
| 41 | global hsv
| 42 | LED_an(hsv)
| 43 | #print(hsv)
| 44 | hsv += schritt
| 45 | if hsv > 100: hsv = 0
| 46 |
| 47 | ## Zeitmessung
| 48 | zeit2 = 0
| 49 | zeit1 = 0
| 50 | def zeitmessung():
| 51 | global zeit1, zeit2
| 52 | zeit1 = utime.ticks_ms() - zeit2
| 53 | #print(zeit1)
| 54 | zeit2 = utime.ticks_ms()
| 55 |
| 56 |
| 57 | ## Zeitmessung für LED Update
| 58 | after_now = utime.ticks_ms()
| 59 | zeitschritt = zeit1 / 100
| 60 | def LED_zeit():
| 61 | global after_now, zeitschritt
| 62 | now = utime.ticks_ms()
| 63 | if utime.ticks_diff(now, after_now) > zeitschritt:
| 64 | led_verlauf()
| 65 | print(zeit1)
| 66 | after_now = now
| 67 |
| 68 |
| 69 | ## Vars for LOOP
| 70 | state = 1
| 71 | wert_alt = 0
| 72 |
| 73 | ## START
| 74 | print("Start")
| 75 |
| 76 |
| 77 | ## THE LOOP
| 78 | while True:
| 79 | wert_neu = accel.get_smoothed_values().get("GyZ")
| 80 | #print(wert_neu)
| 81 |
| 82 |
| 83 | if wert_neu > 0:
| 84 | if wert_alt < wert_neu and state == 0:
| 85 | wert_alt = wert_neu
| 86 | print(state)
| 87 | state = 1
| 88 | hsv = 0
| 89 | zeitmessung()
| 90 |
| 91 |
| 92 | if wert_neu < 0:
| 93 | if wert_alt > wert_neu and state == 1:
| 94 | wert_alt = wert_neu
| 95 | print(state)
| 96 | state = 0
| 97 | hsv = 0
| 98 | zeitmessung()
| 99 |
| 100 |
| 101 | LED_zeit()
|
Könnt Ihr mir da raus helfen, indem ihr mich auf einen anderen Weg
bringt?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|