schaltlogik entwickeln für 8-gang-schaltung

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
__deets__
User
Beiträge: 6054
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 2. August 2019, 16:38

Ich hab dir dazu was geschrieben.
Eine weg sowas zu machen ist die Zustände der diversen Schalter bitweise zu kombinieren. 1 für Licht an, 2 für bremse gedrückt. Verodert nimmt das dann Werte von 0-3 an, und DAS schlägst du dann in einer Liste mit PWMS, zb [0, 0.5, 1, 1] nach. Da ist dann nicht bremsen und nicht Licht aus, Licht an halb hell, und alle anderen Kombinationen - nur bremsen, oder bremsen mit Licht - ganz hell.
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

Freitag 2. August 2019, 16:59

irgendwie hab ich da einen knoten im kopf.
wie ist das gemeint?
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

Freitag 2. August 2019, 17:49

hier mal eine meiner notizen:
Bild

das problem liegt dann wieder in der letzen zeile:
wie kann das zurück-schalten von 'licht mit bremslicht' oder 'licht mit fernlicht' korrekt laufen jenachdem in welchem zustand das licht vorher war?

also:
wenn licht gerade an war und man nichtmehr bremst, DANN wieder auf 'licht an' sonst ganz aus.
bzw:
wenn licht gerade an war und man nichmehr fernlicht an hat, DANN wieder auf 'licht an' sonst ganz aus

DAS problem hab ich bei bisher bei allen herangehensweisen :-)
egal ob mit listen oder oder :-)

irgendwo hab ich da besagten knoten im kopf.
einziger lösungsansatz den ich da bisher sehe:
den 'istzustand' irgendwie irgendwo hinspeichern und wieder auslesen können -nur wie?!
Benutzeravatar
__blackjack__
User
Beiträge: 3868
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 2. August 2019, 18:08

@geist4711: Den Zustand ob das Licht an oder aus ist zu speichern, wäre der Weg, den ich nehmen würde. Und zusätzlich die Stufe (aus, an, extra hell), damit man in den Methoden zum an- und ausschalten des Lichts und des zu- und abschalten von Fernlicht oder Bremslicht, immer die richtige Entscheidung treffen kann welche Stufe gesetzt werden muss. Denn es gibt ja nicht nur die Entscheidung bei Fern- oder Bremslicht ob man beim Abschalten auf normale Beleuchtung oder ganz aus wechselt, sondern auch beim Anschalten vom Fahrlicht ob man auf „an“ wechselt oder den aktuellen Zustand belässt wenn gerade das Fern- oder Bremslicht an ist. Beispiel: Wenn man gerade beim bremsen ist und dabei das Licht anschaltet, darf das Bremslicht dadurch ja nicht auf normale Helligkeit runter gehen.
“There's also a certain pleasure in actually getting things to work in Java, somewhat like the pleasure, I imagine, of building ships in bottles.”
— David Cook in c.l.p
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

Freitag 2. August 2019, 21:09

ausgehend vom bisherigen beleuchtungsscript,
müsste dann also wenn ich mit 'fahrlicht_an' das fahrlicht anmache,
auchnoch irgendwie und irgendwo abspeichern 'fahrlich ist jetzt = 0.6' zb

also eine zeile dazu schreiben, die sagt 'speichere istzustand'

wenn dann 'fernlicht_aus' kommt, wird 'fahrlicht ist jetzt = 0.6''' abgefragt und
dessen wert als der wert genommen, den das fahrlicht nun annehmen soll.

das selbe beim bremslicht.

man kann dann auchnoch solche werte für bremslicht und fernlicht eintragen und beim einschalten des lichtes abfragen, das beim einschalten nicht das bremslicht aus geht......

oder:
ich hab 2 ausdrücke(vorderlichtwert, hinterlichtwert zb),
die 3 zustände(o, o.6, 1 -eben die pwm-stufen) annehmen können,
und da wird der 'momentanwert' eingetragen, also einer der 3 möglichen werte.

ich hab dann eine routine die nur abfragt welchen zustand das licht vorn und hinten hat und danach wird das licht dann heller oder dunkler gemacht -oder auch aus.

dazu eine 'sperre' wenn fern- oder bremslicht an gemacht wird, das das licht so hell bleibt wie beim bremsen/fernlicht sein soll, aber trotzdem den 'vorderlicht, hinterlicht'-wert neu schreibt, wenn man genau dann das licht einschaltet.

wie speichert man solche werte und liest sie aus?

oder hab ich da wieder ein 'hirngespinnst' ? ;-)
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

Samstag 3. August 2019, 12:30

leute ich hab ein problem:
ich verwuche zu lernen wie ich python programmieren muss.
da bin ich auf beispiel- und lern-seiten.
zb hier:
http://www.michael-holzapfel.de/progs/p ... n_kurz.htm

da wir dann zb erklärt wie ich
irgendwas mache und was dann dabei raus kommt:
zb:

Code: Alles auswählen

if-elif-else                      Beispiel:

#-von mir eingefügt
                    x = 8
                    if x > 5:
                       print ("x ist größer als 5")
                    elif x < 5:
                       print ("x ist kleiner als 5")
                    else:
                       print ("x ist 5")   #-von mir eingefügt

                    Ausgabe:  
                    x ist größer als 5 
ist soweit alles auch logisch und mir verständlich.
nun wollte ich damit 'spielen' oindem ich x = 8 mal bischen veränder, um das was ich gelernt hab mal 'gesehen zu haben' , also wie sich die print-ausgabe tatsächlich so ändert...

wenn ich dann das zwischen den #-zeichen kopiere in mein file 'funktionstest.py' kopiere und 'run' mache kommt:

Traceback (most recent call last):
File "C:\Users\geist4711\AppData\Local\Programs\Thonny\lib\ast.py", line 35, in parse
return compile(source, filename, mode, PyCF_ONLY_AST)
File "D:\rasbpi\funktionstest.py", line 1
x = 8
^
IndentationError: unexpected indent

was ist hier los? bin ich zu doof die paar zeilen code zu kopieren und auszuführen?
Zuletzt geändert von geist4711 am Samstag 3. August 2019, 12:37, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 6054
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 3. August 2019, 12:36

Bitte Code Tags benutzen. Denn so sieht man genau das, was relevant in Python ist, nicht. Und was auch für deinen Fehler verantwortlich ist. Nämlich die Einrückungen.
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

Samstag 3. August 2019, 12:41

is mir auch grad aufgefallen, da man nicht sieht wie ds da steht, habs geändert.

einrücken:
wenn ich das alles so einrücke das
x=8
so wie hier ganz links steht und alles danach ausgerichtet eingerückt ist, bleibt der fehler, leider.
wie soll ich denn was lernen wenn nichtmal sowas funktioniert?! tschuldigung bin grad echt sauer, auf mich, irgendwie hab ich da wohl ne blokade....

so sieht mein funktionstest.py aus:

Code: Alles auswählen


x = 8
    if x > 5:
        print ("x ist größer als 5")
    elif x < 5:
        print ("x ist kleiner als 5")
    else:
        print ("x ist 5")
        
        
Benutzeravatar
__blackjack__
User
Beiträge: 3868
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 3. August 2019, 12:47

@geist4711: Warum rückst Du das denn *so* ein? Was soll das denn bedeuten?

Die verlinkte Kurzübersicht ist irgendwo zwischen Python 2 und 3 – da stehen Sachen die gelten so nur für Python 2 und welche die für Python 3. Ohne das irgendwie zu kennzeichnen.
“There's also a certain pleasure in actually getting things to work in Java, somewhat like the pleasure, I imagine, of building ships in bottles.”
— David Cook in c.l.p
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

Samstag 3. August 2019, 12:55

ich hab das so eingerückt weil der schreiber das auch so eingerückt hat und ich das so übernommen habe :-)

ich wollte damit mal 'spielen' um zu lernen.

wenn da dann python 2 und 3 gemixt wird is das dämlich, also für mich nicht nutzbar.
mist!

kennst du ne deutsche seite wo man das besser lernen kann, wie man was in python macht?
und bitte nicht irgendwas von da:
https://py-tutorial-de.readthedocs.io/d ... lflow.html

bei dem versteh ich teilweise nichtmal was der von mir will, weil der nur irgendwelche bwl-kram behandelt wo mir nichtklar is was sowas soll ;-)

ich such was wo ich funktionen, also eingänge 'soundso' dann ausgänge 'soundso'
speichern, abfragen usw lernen kann, nicht steuerberechnungen oder wer wo wohnt usw :-)

also technische dinge machen kann, nicht die prozente der steuer ausrechnen, da krieg ich hirn-krämpfe bei :-)
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

Samstag 3. August 2019, 13:04

hab's jetzt, nach ca einer std probieren, geschafft das es geht:
dein hinweis 'einrücken' war hilfreich DANKE
so müsste ds aussehen:

Code: Alles auswählen


x = 8
if x > 5:
    print ("x ist größer als 5")
elif x < 5:
    print ("x ist kleiner als 5")
else:
    print ("x ist 5")


dann funktioniert das......

warum kann der das nicht gleich so da hinschreiben ?!
wie soll da ein anfänger dann was von lernen! ich könnt ko....!
tschuldigung, sowas regt mich einfach auf.
__deets__
User
Beiträge: 6054
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 3. August 2019, 13:11

Wer kann was wo hinschreiben?
Benutzeravatar
__blackjack__
User
Beiträge: 3868
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 3. August 2019, 13:49

@__deets__: Na der Herr Holzapfel, wo das Beispiel her ist: http://www.michael-holzapfel.de/progs/p ... n_kurz.htm

@geist4711: Was man mit den Grunddatenstrukturen anstellen kann, wie man mit den Kontrollstrukturen umgeht, wie man Funktionen definiert und aufruft, und wie man Klassen definiert, sowie das Zusammenspiel von Python-Syntax und den ”magischen” Methoden mit den beiden führenden und abschliessenden Unterstrichen, ist unabhängig davon was man konkret damit machen will. Das offizielle Tutorial in der Python-Dokumentation hat also auch, oder sogar überwiegend Beispiele von Sachen, die ganz konkret am Ende nur sehr wenige damit machen werden. Es wäre aber auch unsinnige Zeitverschwendung für jedes Einsatzgebiet ein eigenes Grundlagentutorial zu schreiben, wo im Grunde ja doch immer das gleiche drin steht. Eine gewisse Übertragungsleistung ist auch eine Grundlage beim Programmieren. Denn wenn man immer nur Beispiele suchen muss die genau oder fast das machen was man selber braucht, dann ist das kein Programmieren.

Speziell bei dem Link zu dem Kontrollstrukturen ist doch aber kein ”BWL” in den Beispielen‽

Die verlinkte Seite bei Holzapfel ist ja auch nicht zum lernen der Grundlagen, sondern eine kurze Übersicht zum nachschlagen. Der geht halt davon aus das man a) weiss das Einrückung in Python wichtig ist und welche Bedeutung sie hat, und b) kann man Argumentieren das die Beispiele richtig eingerückt sind, wenn man nicht von der Annahme ausgeht das der Rand der Seite auch der Rand des Beispiels ist. Die sind halt alle für das Layout der Seite eingerückt, damit optisch nicht alles am rechten Rand klebt und sich die ”Überschriften” besser von den Code-Beispielen abheben. Bei einer etwas weniger minimalistisch gestylten Seite hätte man das wahrscheinlich mit einer Tabelle gelöst, wo die ”Überschrift” in der rechten Spalte und die Beispiele dazu in der linken Spalte stehen würde.
“There's also a certain pleasure in actually getting things to work in Java, somewhat like the pleasure, I imagine, of building ships in bottles.”
— David Cook in c.l.p
geist4711
User
Beiträge: 47
Registriert: Montag 29. Juli 2019, 11:48

Samstag 3. August 2019, 17:21

im prinziep ärgere ich mich ehr über meine eigene unflexilität, das ich mich von sowas deratt ablenken und aus dem konzept bringenlasse -früher wär mir sowas nicht passiert....

aber mal eine frage, ich 'bastel weitr an meinem beleuchtung-script.
so schaut es nu aus:

Code: Alles auswählen

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

fahrlicht_schalter = Button(26) #lichtschalter
fernlicht_taster = Button(19) #fernlichtschalter
blinker_links_schalter = Button(13) #blinkschalter links
blinker_rechts_schalter = Button(6) #blinkschalter rechts
hupentaster = Button(5) #hupenschalter
bremslicht_taster = Button(10) #bremslichtschalter

startvalue = 0 # Helligkeit bei Skriptstart
fahrlicht_vorn = 0.6 #Abblendlicht vorn, wert
fernlicht_vorn = 1 #fernlicht vorn, wert
fahrlicht_hinten = 0.6 #fahrlicht hinten ,wert
bremslicht_hinten = 1 #bremslicht hinten, wert

led_licht_vorn = PWMLED(21,initial_value=startvalue) # Fahrlicht vorn
led_licht_hinten = PWMLED(20,initial_value=startvalue) # Fahrlicht hinten
led_blinker_links = LED(16) # blinker links
led_blinker_rechts = LED(12) # blinker rechts
led_hupe = LED(7)  # hupe

def fernlicht():
    if led_licht_vorn.value < 1: # wenn abgeblendet
        led_licht_vorn.value = 1 # dann aufblenden
        
    else: # sonst
        led_licht_vorn.value = fernlicht_aus # 
 
def fernlicht_aus():
    if  fahrlicht_schalter = 1
        led_licht_vorn = fahrlicht_vorn
 
    else
        led_licht_vorn.value = startvalue

def fahrlicht_an():
    led_licht_vorn.value = fahrlicht_vorn
    led_licht_hinten.value = fahrlicht_hinten
    
def fahrlicht_aus():
    led_licht_vorn.value = startvalue
    led_licht_hinten.value = startvalue
    
def bremslicht_an():
    led_licht_hinten.value = bremslicht_hinten
    
def bremslicht_aus():
    led_licht_hinten.value = fahrlicht_hinten

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

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

 
bremslicht_taster.when_pressed = bremslicht_an
bremslicht_tatser.when_released = bremslicht_aus

fahrlicht_schalter.when_pressed = fahrlicht_an
fahrlicht_schalter.when_released = fahrlicht_aus

fernlicht_taster.when_pressed = fernlicht

blinker_links_schalter.when_pressed = blinker_links                         
blinker_links_schalter.when_released = led_blinker_links.off

blinker_rechts_schalter.when_pressed = blinker_rechts
blinker_rechts_schalter.when_released = led_blinker_rechts.off

hupe_taster.when_pressed = led_hupe.on
hupe_taster.when_released = led_hupe.off

pause()
ich versuche immernoch das fahrlicht,
wenn ich das fernlicht aus machen will,
dabei ab zu fragen,
ob fahrlicht_schalter momentan gedrückt ist
und danach dann die helligeit von fahrlicht_vorn zu setzen.

fernlicht aus-code nochmal einzeln, mit möglichst ausführlichem komentar, was ich damit wollte:

Code: Alles auswählen


def fernlicht_aus(): 				#funktion fernlicht aus
    if  fahrlicht_schalter = 1 		 	# if, abfrage fahrlicht_schalter (-noch falsch-)
        led_licht_vorn = fahrlicht_vorn 	#dann, led_licht_vorn auf fahrlicht_vorn helligkeit
 
    else								#sonst
        led_licht_vorn.value = startvalue	#led_licht_vorn auf standartvalue helligkeit
        
momentan steht da ja, das falsche:

if fahrlicht_schalter = 1

das funktioniert nicht, gibt ein 'invalid syntax'

egal ob ich da ein
fahrlicht_schalter.when_pressed
oder
if_pressed
oder sonstwas hin mache,

nix geht.

wie bitte heisst die korrekte abfrage eines jetzigen schaltzustandes eines eingangs?

also NICHT
'beispielbutton.when pressed',

was ja soweit ich weiss heisst

'wenn gedrückt wird',

sonder die abfrage:

'ist es gerade gedrückt?'
__deets__
User
Beiträge: 6054
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 3. August 2019, 17:26

Der Vergleich geschieht mit ==. Nicht =. Das ist für Zuweisungen. Und hinter eine if-Abfrage muss immer ein : - wie auch bei allen anderen Konstrukten die danach einen Block von Code haben.
Antworten