Forum: Mikrocontroller und Digitale Elektronik Hilfe bei Programmablauf (µPython LED Pendel)


von Kolja L. (kolja82)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.