schaltlogik entwickeln für 8-gang-schaltung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

danke!

also:

Code: Alles auswählen

if:  fahrlicht_schalter == 1    #abfrage fahrlicht_schalter
       led_licht_vorn = fahrlicht_vorn  # dann mache 'led_licht_vorn' auf 'fahrlich vorn'

else:   #sonst
        led_licht_vorn.value = startvalue  #led auf startvalue
richtig?

muss nu erstmal mit frauchen einkaufen fahren.....
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du Dich nicht an die Syntax von Python hältst, dann bekommst Du einen SyntaxError. Etwas Sorgfalt gehört zum Programmieren dazu.

Wie schon geschrieben, merkt man sich am besten den Zustand:

Code: Alles auswählen

class Licht:
    FAHRLICHT = 0.6
    FERNLICHT = 1
    BREMSLICHT = 1

    def __init__(self):
        self.led_licht_vorn = PWMLED(21, initial_value=0)
        self.led_licht_hinten = PWMLED(20, initial_value=0)
        self.fahrlicht_schalter = Button(26)
        self.fahrlicht_schalter.when_pressed = self.fahrlicht_an
        self.fahrlicht_schalter.when_released = self.fahrlicht_aus
        self.fernlicht_taster = Button(19)
        self.fernlicht_taster.when_pressed = self.fernlicht_an_aus
        self.bremslicht_taster = Button(10)
        self.bremslicht_taster.when_pressed = self.bremslicht_an
        self.bremslicht_tatser.when_released = self.bremslicht_aus
        self.fahrlicht = False
        self.fernlicht = False
        self.bremslicht = False

    def fahrlicht_an(self):
        self.fahrlicht = True
        self.update()

    def fahrlicht_aus(self):
        self.fahrlicht = False
        self.update()
    
    def fernlicht_an_aus(self):
        self.fernlicht = not self.fernlicht
        self.update()

    def bremslicht_an(self):
        self.bremslicht = True
        self.update()

    def bremslicht_aus(self):
        self.bremslicht = False
        self.update()
    
    def update(self):
        if self.fernlicht:
            self.led_licht_vorn.value = self.FERNLICHT
        elif self.fahrlicht:
            self.led_licht_vorn.value = self.FAHRLICHT
        else:
            self.led_licht_vorn.value = 0
        if self.bremslicht:
            self.led_licht_hinten.value = self.BREMSLICHT
        elif self.fahrlicht:
            self.led_licht_hinten.value = self.FAHRLICHT
        else:
            self.led_licht_hinten.value = 0
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

wow!
da schaut ja ganz anders aus als bei meinem gewusel.

nun zu verstehen dazu ;-) :
ganz oben setzt du die zustände für's die lichter, wenn sie an sind.

in

def __init__(self):

setzt du alle schalter und anfangs-parameter ein.

danach komme die anweisungen was wann passieren muss.

wie das
def update (self):
GENAU arbeitet ist mir noch nicht ganze klar

das muss ich mir ALLES erstmal ordentlich durchlesen und verstehen lernen :-)

danke für diesen lösungsansatz.

ich muss noch viel viel lernen :-)
morgen wenn ich wieder 'frischer drauf bin' schau ich mir das sehr sehr sorgfälltig an und wenn ich meine ich weiss was da alles passiert,
probier ich mal vorsichtig, mit einer kopie davon(!), den blinker dazu zu nehmen (bitte nicht vormachen sonst lern ich das ja nicht wie man das zusammenbastelt :-) ich schrei dann schon und frage wenn ich's nicht hinkriege -relativ wahrscheinlich ;-) .......
danke danke noch mal!

und für heute is genuch, es qualmt der kopf ;-) ............
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

so weiter geht's....
habe den code komplett kopiert und mit allen einrückungen in eine neue datei übernommen.
nur die zeilen:

#!/usr/bin/python3
from gpiozero import LED, Button, PWMLED

habe ich ganz oben rein gechrieben, weil sonst weiss ja das script nicht, das es gpiozero, buttons etc. nutzen soll.

der code funktioniert nicht.
wenn ich ihn recht verstanden habe, sollte er es aber -eigentlich. :-)

ich mutmaße mal das noch etwas fehlt, was für nicht-anfänger selbstverständlich ist.
für mich leider, noch nicht .

kann mir da jemand einen hinweis geben?
sonst fang ich wieder das rumpobieren an und verwirre mich nur selbst(im prinzip hab ich das schon, hab schon einiges probiert in einer extra-kopie um das original nicht kaputt zu machen)

jetzt gibt es aber erstmal essen und dann müssen wir zu einem notfall der meerschweinchen-nothilfe-hamburg, paar schweine retten....
heut abend geht's dann evtl weiter.
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

jetzt geht's weiter....
ich finde den ansatz mit class, also klassen interessant, weil dann könnte ich ja später die gangschaltung auch in eine class setzen, ähnlich dem licht jetzt und eine class=schaltung dazu setzen wodurch licht und schaltung schön getrennt wären, aber zusammen in einem script...

dazu müsste ich aber das mit dem was da gemacht wurde genauer verstehen(was ich schon recht weit tuhe, wenn ich das richtig sehe)
nur es läuft nicht :-)

ich werde jetzt mal mit komentaren dazu schrieben was ich sehe, was welche zeile tut, evtl ergibt sich für andere dann ja etwas was ich nicht sehe(oder ich falsch verstanden habe) und man mir da auf die sprünge helfen kann....

Code: Alles auswählen

#!/usr/bin/python3 #ort python interpreter
from gpiozero import LED, Button, PWMLED #nimmt bibliothek 'gpiozero' und davon 'led, button und pwmled' rein
from signal import pause #nimmt pause aus signal' mit rein

class Licht:	#klassenangabe 'Licht'
    FAHRLICHT = 0.6 #pwm-wert licht
    FERNLICHT = 1 #pwm-wert fernlicht
    BREMSLICHT = 1 #pwm-wert bremslicht

    def __init__(self): #initialisierung aller taster, schalter led's usw, für self
        self.led_licht_vorn = PWMLED(21, initial_value=0) #led licht vorn mit anfangs-helligkeit
        self.led_licht_hinten = PWMLED(20, initial_value=0) #led licht hinten mit anfangswert
        self.fahrlicht_schalter = Button(26) fahrlichtschalter
        self.fahrlicht_schalter.when_pressed = self.fahrlicht_an #wenn button gedrückt führe 'self.fahrlicht_an' aus
        self.fahrlicht_schalter.when_released = self.fahrlicht_aus #wenn button losgelassen führe 'self.fahrlicht_aus' aus
        self.fernlicht_taster = Button(19) #fernlicht-button
        self.fernlicht_taster.when_pressed = self.fernlicht_an_aus #wenn button gedrückt führe 'self.fernlicht_an' aus
        self.bremslicht_taster = Button(10) #bremslicht-button
        self.bremslicht_taster.when_pressed = self.bremslicht_an #wenn button gedrückt führe 'self.bremslicht_an' aus
        self.bremslicht_tatser.when_released = self.bremslicht_aus #wenn button losgelassen führe 'self.fernlicht_aus' aus
        self.fahrlicht = False # ist-wert 'fahrlicht'
        self.fernlicht = False # ist-wert 'fernlicht'
        self.bremslicht = False # ist-wert 'bremslicht'

    def fahrlicht_an(self): #funktion für fahrlicht an
        self.fahrlicht = True #setze self.fahrlicht auf 'TRUE'
        self.update() #führe self.update aus

    def fahrlicht_aus(self): #funktion fahrlicht aus
        self.fahrlicht = False #setze fahrlicht auf 'false'
        self.update()	#führe update aus
    
    def fernlicht_an_aus(self): #funktion fernlich an
        self.fernlicht = not self.fernlicht #fernlicht oder nicht fernlicht -genaue bedeutung unklar
        self.update() #führe update aus

    def bremslicht_an(self): #funktion bremslicht an
        self.bremslicht = True #setze bremslich auf true
        self.update() #führe update aus

    def bremslicht_aus(self): #funktion bremslicht aus
        self.bremslicht = False #setze bremslicht auf false
        self.update() #führe update aus
    
    def update(self): #funktion update
        if self.fernlicht: #wenn(if) fernlicht angesprochen wird
            self.led_licht_vorn.value = self.FERNLICHT # nehme wert von FERNLICHT und setze ihn bei led_licht_vorn.value ein
        elif self.fahrlicht: #ausserdem wenn fahrlicht angesprochen wird
            self.led_licht_vorn.value = self.FAHRLICHT #nehme wert von FAHRLICHT und setze ihn  bei led_licht_vorn.value ein
        else: #sonst
            self.led_licht_vorn.value = 0 #setze led_licht_vorn auf value 0
            
        if self.bremslicht: #wenn bremslicht angesprochen wird
            self.led_licht_hinten.value = self.BREMSLICHT #nehme wert von BREMSLICHT und setze den für led_licht_hinten.value ein
        elif self.fahrlicht: #ausserdem wenn fahrlicht angesprochen wird
            self.led_licht_hinten.value = self.FAHRLICHT #nehme wert von FAHRLICHT und setze ihn bei led_licht_hinten.alue ein
        else: #sonst
            self.led_licht_hinten.value = 0 #setze led_licht_hinten auf value 0

#müsste hier nicht 'pause()' stehen 
das das script nicht nur einmal 
durchläuft und sich dann beendet? 
-so habe ich die erklärungen dazu jedenfalls verstanden......-
bis auf 'self.fernlicht = not self.fernlicht' meine ich also eigentlich alles zu verstehen, wobei ich mich wohl täusche, weil, es läuft zwar fehlerfrei(also ohne fehlermeldungen) aber tut nix :-) .
wo liegt mein denkfehler, was hab ich nicht beachtet oder vergessen um das dazu zu bringe das es auch was tut?

ich wollte sonst versuchen SELBER den bremslicht-button samt led(eigentlich ja einen ausgang high/low setzen) mal da mit ein zu bauen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist nur die Definition der Klasse. Zumindest eine Instanz der Klasse mußt Du erzeugen.
"not a" ist eine logische Operation, not True -> False und not False -> True
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

wie erzeuge ich eine instanz der klasse (hier ja 'Licht')?
verstehe ich das richtig das ich also zwar die klasse definiert und mit inhalt gefüllt habe, diese aber 'so für sich allein' nicht benutzen kann(deswegen tu sich natürlich auch nix) und also noch angeben muss ob und wie diese klasse benutzt werden soll?

zu 'not a' das steht doch für 'nicht a' richtig? da versteh ich nicht die logik hinter
self.fernlicht = not self.fernlicht,

das ist für mich gerade wie:
'bierkasten' = nicht 'bierkasten' ;-)

oder soll das sein 'nichtmehr' also wenn fernlicht nichtmehr fernlicht ist, also dazugehöriger taster gedrückt bzw eben nichtmehr gedrückt - dann (nächste zeile )führe 'self update' aus?

kurz: solange fernlicht-taster gedrückt fernlicht an, sonst update, also ausmachen.

ich frage da so genau nach, damit ich das auch richtig verstehe, nicht das ich mir das falsch merke.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
wie erzeuge ich eine instanz der klasse (hier ja 'Licht')?
Wenn du das (noch) nicht weißt, dann solltest du nochmal z.B. das Tutorial auf docs.python.org durcharbeiten, zumindest den Teil zu Klassen und Instanzen. Das ist elementar wichtig. Bring ja nix, wenn du eine Klasse per C&P übernimmst und dann keine Plan hast, was du damit anstellen sollst.

Wobei du ja schon - wahrscheinlich unbewusst - Instanzen von Klassen nutzt. Z.B. hier ´self.bremslicht_taster = Button(10)` bindest du ein Instanz der der Klasse `Button` an das Attribut `self.bremslicht_taster`.
zu 'not a' das steht doch für 'nicht a' richtig? da versteh ich nicht die logik hinter
Das ist Bool'sche Logik. Es gibt zwei Zustände, True und False. Wenn du einen Zustand negierst, dann ist es automatisch der andere. Also würde die Zeile `self.fahrlicht = not self.fahrlich` das Licht umschalten (also von aus -> an oder an -> aus, je nach dem, was der Ausgangszustand ist).
Der Vergleich mit dem Bierkasten passt nicht, weil der Bierkasten keine Wahr oder Falsch Zustand hat.

Gruß, noisefloor

P.S.: und kauf' dir endlich mal einen neue Tastatur, deine Umschalten-Tasten ist immer noch kaputt. Hatte ich dich schon im Rapsi-Forum drauf hingewiesen...
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

Ja meine schreibweise......
Ich werde es versuchen, auch wenn all meine Beiträge dann mindestens ne 1/4std länger dauern und ich mich oft selbst wieder aus dem konzept bringe, weil ich nimmer weis was ich schreiben wollte, hoffe ihr kommt nie in solch eine situation das ihr nicht immer könnt wie ihr wollt...........

Nun zum eigenlichen:
Ich dacht, ich hab ja ein classen-Script welches gut funktioniert, das von der Gangschaltung.
Also bringen wir mal beide zusammen und wenn des mit Gangschaltung funktioniert, also wohl dei Instanz für die classe schon mit drin hat, sollte ja dann auch die Lichtschaltung hinhauen......

war natürlich Pustekuchen :-)

Nun hab ich ein Script wo aber wenigstens schonmal die Gangschaltung hinhaut ;-)

Jetzt hattet Ihr was zum schmunzeln und ich versuche raus zu kriegen wie ich Instanzen und Kassen richtig anwende.

für neugierige hier mein copy&paste werk:

Code: Alles auswählen

#!/usr/bin/env python3

from functools import partial
from signal import pause
from gpiozero import Button, AngularServo, LED, PWMLED


GEAR_CHANGE_SERVO_PIN = 25
GEAR_UP_PIN = 11
GEAR_DOWN_PIN = 9

GEAR_TO_ANGLE = [-90, -64.3, -38.6, -12.9, 12.8, 38.5, 64.2, 90]


def clamp(value, lower, upper):
    return max(min(upper, value), lower)


class GearChange:
    
    def __init__(self, gear_to_angle, servo_pin, gear_up_pin, gear_down_pin):
        self._current_gear = 0
        self._gear_to_angle = gear_to_angle
        self._servo = AngularServo(
            servo_pin,
            initial_angle=self._gear_to_angle[self.current_gear],
            min_angle=min(self._gear_to_angle),
            max_angle=max(self._gear_to_angle),
            min_pulse_width=0.0008,
            max_pulse_width=0.0023,
        )
        self._gear_up_button = Button(gear_up_pin)
        self._gear_up_button.when_pressed = partial(self.change, +1)
        self._gear_down_button = Button(gear_down_pin)
        self._gear_down_button.when_pressed = partial(self.change, -1)

    @property
    def gear_count(self):
        return len(self._gear_to_angle)

    @property
    def current_gear(self):
        return self._current_gear
    
    @current_gear.setter
    def current_gear(self, value):
        self._current_gear = clamp(value, 0, self.gear_count - 1)

    def change(self, direction):
        self.current_gear += direction
        self._servo.angle = self._gear_to_angle[self.current_gear]


class Licht:
    FAHRLICHT = 0.6
    FERNLICHT = 1
    BREMSLICHT = 1

    def __init__(self):
        self.led_licht_vorn = PWMLED(21, initial_value=0)
        self.led_licht_hinten = PWMLED(20, initial_value=0)
        self.fahrlicht_schalter = Button(26)
        self.fahrlicht_schalter.when_pressed = self.fahrlicht_an
        self.fahrlicht_schalter.when_released = self.fahrlicht_aus
        self.fernlicht_taster = Button(19)
        self.fernlicht_taster.when_pressed = self.fernlicht_an_aus
        self.bremslicht_taster = Button(10)
        self.bremslicht_taster.when_pressed = self.bremslicht_an
        self.bremslicht_tatser.when_released = self.bremslicht_aus
        self.fahrlicht = False
        self.fernlicht = False
        self.bremslicht = False

    def fahrlicht_an(self):
        self.fahrlicht = True
        self.update()

    def fahrlicht_aus(self):
        self.fahrlicht = False
        self.update()
    
    def fernlicht_an_aus(self):
        self.fernlicht = not self.fernlicht
        self.update()

    def bremslicht_an(self):
        self.bremslicht = True
        self.update()

    def bremslicht_aus(self):
        self.bremslicht = False
        self.update()
    
    def update(self):
        if self.fernlicht:
            self.led_licht_vorn.value = self.FERNLICHT
        elif self.fahrlicht:
            self.led_licht_vorn.value = self.FAHRLICHT
        else:
            self.led_licht_vorn.value = 0
        if self.bremslicht:
            self.led_licht_hinten.value = self.BREMSLICHT
        elif self.fahrlicht:
            self.led_licht_hinten.value = self.FAHRLICHT
        else:
            self.led_licht_hinten.value = 0
            

   
def main():
    hupe = Button(5)
     
    _gear_change = GearChange(
        GEAR_TO_ANGLE, GEAR_CHANGE_SERVO_PIN, GEAR_UP_PIN, GEAR_DOWN_PIN
    )


if __name__ == '__main__':
    main()           
ist wie gesagt schon getestet, der Servo läuft wie er soll ;-)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn dich die Großschreibung belastet, lass es. Konzentrier dich auf die Semantik des Codes. Das PI Forum hat andere regeln, hier wird zwar auch gelegentlich ein bisschen mehr Mühe beim formulieren von Fragen gefordert, aber Großbuchstaben sind im Zeitalter von Textnachrichten, mobilen Endgeräten, und dem allgegenwärtigen Englisch, das auch ohne auskommt, das geringste Problem. Ich schreibe das hier auf nem iPad. Da erstmal zum Deutsch Diktat zu bitten bevor ich abschicke ist ein bisschen übertrieben.

Bei deinem Code hingegen steckt vieles im Argen. Viel zu viel Zustand, viel zu viele callbacks.

Ich habe es schon ein paar mal angesprochen, aber hier mal als Code:

Code: Alles auswählen

ruecklicht_stufe = self.bremslicht_taster.value << 1 | self.fahrlicht_schalter.value
scheinwerfer_stufe = self.fernlicht_taster.value << 1 | self.fahrlicht_schalter.value
Das packst du in eine Methode, die für ALLE 3 Buttons als callback gesetzt wird. Und die resultierenden werte von 0 bis 3 übersetzt du per Lookup-Tabelle in deine PWMs. Wann immer sich also irgendwas der drei Taster ändert, rechnest du die neuen Stufen aus & setzt die. Es ist völlig überkandidelt da feingranular nur was machen zu wollen, wenn für einen der Dinger was passiert.
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

Wenn du das (noch) nicht weißt, dann solltest du nochmal z.B. das Tutorial auf docs.python.org durcharbeiten, zumindest den Teil zu Klassen und Instanzen. Das ist elementar wichtig. Bring ja nix, wenn du eine Klasse per C&P übernimmst und dann keine Plan hast, was du damit anstellen sollst.
ich weiss ja recht genau was da anstellet wird und auch was die freunlichen helfer da geschrieben haben.
wenn nicht frag ich, und ich kann auch funktionen und schalter usw dazu hinzufügen usw.

aber wie krieg ich es hin das das ganze überhaupt erstmal läuft?!

konkret, was muss ich wo bitte schreiben damit die 'class Licht' zb genutzt wird und nicht einfach nur 'nichts' passiert?

das ist so dermaßen frustrierend, das ich den pi echt langsam in die ecke pfeffern könnte und mir ein paar transistoren schnapp und das damit mach.

sch... auf camera usw was später noch dazu sollen könnte, komm da eh nie hin, es fehlt einfach der allererste anfang.

und der steht nirgends so das ich es auch verstehe.

ich hab da beim lesen immer das gefühl man sagt:
schreib: class 'dein wahlname':
schreib: def __init__: und setzt da alles rein womit du hantieren willst

und dann stürzt man sich auf funktionen, zusammenhäge also iregendwas anderes, aber wie ich die classe dann auch korrekt aufrufe und nutze, das fehlt

tschuldigung wenn da jetzt die exakte rechtschreibung wieder fehlt aber dafür hab ich jetzt nicht auchnoch die nerven....
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du das elektronisch lösen kannst, mach das. Ist besser. Das meine ich nicht sarkastisch. Der PI ist kompliziert, stromhungrig, fehleranfällig. Damit sowas aufzubauen war noch nie ne gute Idee. Du hast halt behauptet du willst damit das programmieren lernen. Aber das scheint ja nun etwas schwieriger als geplant. Und vor allem: wenn du mit der Nummer deine Ruhe haben willst, ist das eh keine gute Idee gewesen.

Alternativ, als Zwischenlösung, ein Arduino oder so. Robuster, und leichter zu programmieren.
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

naja, ich sags mal so:
was ich machen wollte,
ist von SPS, was ich irgendwann als azubi hatte und konnte, ja nicht zu weit weg.

er hakt vor allem ja an den einfachen einstiegs-schritten in python.
der rest ist nicht das unüberwältigbare problem, ich will ja auch nicht überbordert-aussergewöhnlich schwieriges machen.

wenn sich nirgends etwas, und keiner findet der einem diese anfänglichkeiten erklären kann, auch auf anfrage, ist das traurig und frustrierend und dann wendet man sich eben ab nachdem man häuftig genug versucht hat diese 'anfangswand' zu durchbrechen......
auch wenn es evt so klingen mag für den ein oder anderen, das ist eine feststellung keine kritik an irgendwem.
ich werde noch ein wenig mich weiter versuchen, mit hilfe der vielen hilfreichen codebeispiele von hier (wofür ich mich ausdrücklich bedanken möchte!) und werde sehen ob ich den einstieg nun irgendwie allein hinbekomme oder nicht.....

@deets: klar will ich programmieren lernen, gerne sogar, nur wenn ich nichtmal das einfachste verstehe, wie soll ich das dann lernen?
bin wohl zu alt den sinn der zich tutorials die es so gibt zu verstehen und die 'originale' sind alle in englisch da bin ich nicht gut genug drin.
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

Abschluss für Heute:
Hab nun mich nochmal dran gesetzt und scripte alles ohne Objekt-orientierung ähm -Programmierung ;-) und Klassen.
Bin jetzt soweit das die Gangschaltung läuft und Licht grundsätzlich auch funktioniert.
Einzig 'zurückschalten' von Fern- und Brems-Licht, bestimmt davon ob gerade Fahrlicht an oder aus ist, geht noch nicht auf die korrekte Stufe, sondern nur auf 'Fahrlicht-helligkeits-Stufe'.
Evtl find ich da auch noch ne Lösung für, den Ansatz hab ich dazu ja im class-script versteckt.
Morgen gibt's dann wahrscheinlich noch mal ein paar Fragen und dann auch den aktuellsten Code, für diejenigen die hier jetzt und später mal mitlesen -der Pi 'schläft' für heute schon, da liegt das aktuellste Script ;-)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe dir den Ansatz weiter oben gegeben. Der hat auch mit Klasse oder nicht Klasse nix zu tun.
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

@deets, danke!
Damit werde ich mich Morgen beschäftigen, in einer neuen Datei wo es nur um diese Beleuchtung geht. mal seh'n ob ich das so hin bekomme ;-)
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
konkret, was muss ich wo bitte schreiben damit die 'class Licht' zb genutzt wird und nicht einfach nur 'nichts' passiert?
Du musst eine Instanz der Klasse bilden und dann kannst du bei der Instanz Attribute setzen und Methoden anwenden.

Also z.B.

Code: Alles auswählen

...
licht = Licht()
licht.fahrlicht_an() #der Methodenaufruf schaltet das Fahrlicht ein
Gruß, noisefloor
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

So, heute ging es noch weiter.

Der Spagetti-code funktioniert nun.
Einzig Fern-licht schaltet nicht wie beim Auto, also
Fernlicht-tippen -> Fernlicht an,
Fernlicht-tippen -> Fernlicht aus
Sondern wie das Bremslicht, aber damit kann ich leben.

Aktueller code:

Code: Alles auswählen


#!/usr/bin/python3
from gpiozero import LED,Button,PWMLED,AngularServo
from time import sleep
from signal import pause
from functools import partial

fahrlicht_button = Button(26) #lichtschalter
fernlicht_button = Button(19) #fernlichtschalter
blinker_li = Button(13) #blinkschalter links
blinker_re = Button(6) #blinkschalter rechts
hupe = Button(5) #hupenschalter
gang_hoch = Button(11) #servo hoch-schalten
gang_runter = Button(9) #servo runter-schalten
bremse = Button(10)

GEAR2SERVO = [-90, -64.3, -38.6, -12.9, 12.8, 38.5, 64.2, 90] 

current_gear = 0
servo = AngularServo(25,
    initial_angle=GEAR2SERVO[current_gear],
    min_angle=min(GEAR2SERVO),
    max_angle=max(GEAR2SERVO), min_pulse_width=0.0008, max_pulse_width=0.0023)

fahrlicht = 0.5 #Abblendlicht vorn, wert
fernlicht = 1 #fernlicht vorn, wert
bremslicht = 1 #bremslicht hinten, wert
lichtaus = 0

led1 = PWMLED(21,initial_value=0) # Fahrlicht vorn
led2 = PWMLED(20,initial_value=0) # Fahrlicht hinten
led3 = LED(16) # blinker links
led4 = LED(12) # blinker rechts
led5 = LED(7)  # hupe

def clamp(value, lower, upper):
    return max(min(upper, value), lower)

def shift(direction):
    global current_gear
    current_gear = clamp(current_gear + direction, 0, len(GEAR2SERVO)-1)
    servo.angle = GEAR2SERVO[current_gear]

def blinker_links():
    led3.blink (on_time = 0.8, off_time = 0.2)

def blinker_rechts():
    led4.blink (on_time = 0.8, off_time = 0.2)

def fernlicht_an():
    if led1.value < 1: # wenn abgeblendet
        led1.value = 1 # dann aufblenden       
    else: fernlicht_aus

def fernlicht_aus():
    if fahrlicht_button.is_pressed:
        led1.value = fahrlicht
    else: led1.value =lichtaus

def fahrlicht_an():
    led1.value = fahrlicht
    led2.value = fahrlicht
    
def fahrlicht_aus():
    led1.value = lichtaus
    led2.value = lichtaus
    
def bremslicht_an():
    led2.value = bremslicht
    
def bremslicht_aus():
    if fahrlicht_button.is_pressed:
        led2.value = fahrlicht
    else: led2.value = lichtaus

gang_hoch.when_pressed = partial(shift, +1)
gang_runter.when_pressed = partial(shift, -1)

blinker_li.when_pressed = blinker_links                         
blinker_li.when_released = led3.off

blinker_re.when_pressed = blinker_rechts
blinker_re.when_released = led4.off

fahrlicht_button.when_pressed = fahrlicht_an
fahrlicht_button.when_released = fahrlicht_aus

fernlicht_button.when_pressed = fernlicht_an
fernlicht_button.when_released = fernlicht_aus

bremse.when_pressed = bremslicht_an
bremse.when_released = bremslicht_aus

hupe.when_pressed = led5.on
hupe.when_released = led5.off

pause()

Jetzt geht es an die 'Hardware' (Sobald ich das zweite Steckboard habe):
Optokoppler-Schaltung aufbauen, FET's verkabeln, LED's verkabeln, usw.
Hab mir übrigens LED's mit 0.5w/120° für Blinker und Rücklicht geholt, soll ja möglichst hell werden.
Welche LED's das Fahrlicht bekommt, ist noch nicht raus, da die Frontleuchten nochnicht feststehen.
Jedenfalls wird es wegen der Stvo noch Batterie-Stecklicht geben und diese Beleuchtung wird 'zusatzlicht', damit ist der Stvo genüge getan und trotzdem hab ich(zusätzlich) meine Beleuchtung.

für die die es interessiert werde ich weiter berichten.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Der Spagetti-code funktioniert nun.
Zu deiner Ehrenrettung muss man ja sagen, dass das kein Spaghetticode ist. Bei Verwendung von gpiozero ist das ja erst mal der normale Weg, dass man Funktionen definiert und die an Callbacks bindet.

Irgendwann kommt halt der Punkt, wo man das ganze besser in eine Klasse packt, um z.B. `global`zu vermeiden, s.o.

Wenn du Python lernst bzw. richtig lernen willst, dann _musst_ du dich mit Klassen und Instanzen beschäftigen. Weil ohne kannst du nie nie nie vernünftigt bzw. größere Sachen in Python programmieren.
Wenn Python mittel zum Zweck für dein Bastelprojekt ist, dann wäre der Code IMHO ok so. Wobei ich auch, wie oben schon von anderen gesagt wurde, eher eine Mikrocontroller wie den ESP32/ESP8266 dafür nehmen würde. Grund: läuft robuster, der Raspi ist ja letztendlich nur ein Computer, der abstützen kann wie jeder Computer.
Und die ESP kannst du auch mit Python programmien ;-) - wenn du willst.

Gruß, noisefloor
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

ja, auf dauer komm ich da nicht drumrum, mich auch in klassen usw ein zu arbeiten.
noch kann ich aber die übersicht darüber behalten, was ich da so scripte -noch, wenn auch wohl nichtmehr lange, wenn es denn fortschreitet.

ich beschäftige mich auch in zukunft damit das zu realisieren wie das denn geht, weil es einfach sauberer ausschaut und man besser sachen hinzufügen etc kann :-)

klingt interessant mit dem kleinen controler, alleinschon dem platz wegen.

kann ich da auch eine camera anbinden?
wenn die beleuchtung und gangschaltung läuft, wäre das der nächste schritt.
so mit aufzeichnung der wegstrecke usw.
und danach was mir noch so einfällt :-)
Antworten