Hjälp en newbie med slutklämmen på en python-kod.

Trädvy Permalänk
Medlem
Registrerad
Sep 2008

Hjälp en newbie med slutklämmen på en python-kod.

Jag har byggt en låda som ska öppnas var femte kilo jag går ner i vikt. Men det är slutet på koden som jag inte får till. Jag har en knapp och en nummer-LED på lådan, varje gång jag trycker på knappen minskar värdet på LCDn med 0,1 kilo. Så från 5 kilo till 4,9 efter ett tryck. När siffran är nere på 0 vill jag att servon ska öppnas, sen när jag trycker en gång till så att värdet blir -0.1 vill jag att servon ska stängas igen och värdet ska återgå till 5,0 så att jag kan börja om igen. Jag har försökt med många olika sätt att skriva det sista men får det inte att fungera, nu fortsätter bara värde att bli mer minus för varje tryck. Kan någon komma med ett förslag hur jag ska skriva den sista delen i funktionen?

import RPi.GPIO as GPIO import time from Adafruit_LED_Backpack import SevenSegment display = SevenSegment.SevenSegment() display.begin() colon = False GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP) #knapp GPIO.setup(18,GPIO.OUT) #servo GPIO.setup(5,GPIO.OUT) GPIO.setup(6,GPIO.OUT) p = GPIO.PWM(18,50) p.start(12) hekto = 4.9 GPIO.output(6, True) numbers = [5.0] input_state = GPIO.input(17) print('Press Ctrl-C to quit.') while True: for i in numbers: display.clear() display.print_float(i, decimal_digits=2) display.set_colon(colon) display.write_display() time.sleep(0.2) input_state = GPIO.input(17) if input_state == False: numbers[0] = hekto hekto -= 0.1 print('knapp') if numbers[0] == 0.0: #open servo p.ChangeDutyCycle(12.5) if numbers[0] == -0.1: #close servo reset number p.ChangeDutyCycle(3.5) numbers[0] = 5.0

Trädvy Permalänk
Medlem
Registrerad
Aug 2012

Det första du gör i input_state==false är att sätta numbers till hekto. Så det är nog hekto som du ska sätta då servot stängs.

En god grundregel är också att inte jämföra decimaltal rakt av med med "==" utan istället använda en marginal och köra med < eller >

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006

Flyttal är djävulskap. Det du skriver som 0.1 blir istället egentligen något likt 0.100000001234. Jag vet inte riktigt hur Python gör men att jämföra flyttal på det sättet är fullt av risk. Så när du jämför numbers[0] med -0.1 kan det innebära att du kanske jämför -0.1000000004321 med -0.1000000001234 vilket såklart inte är lika. Om nu inte Python har någon smart hantering vill säga.

I och med att du har en variabel som heter hekto skulle jag även använda den så, stoppa inte in ett kg-värde där utan kör på 1 hekto. Ha en variabel vikt_hekto(egentligen helt på engelska) eller liknande som du använder och använder heltal för att representera den vikt du är på. Då är 5 kg 50 hekto och du kan dra av 1 hekto istället för 0.1 kg. Då kan du jämföra vikt_hekto med 0 och se om de är exakt.

Trädvy Permalänk
Medlem
Plats
Götet, typ
Registrerad
Okt 2004
Skrivet av Shimonu:

Flyttal är djävulskap. Det du skriver som 0.1 blir istället egentligen något likt 0.100000001234. Jag vet inte riktigt hur Python gör men att jämföra flyttal på det sättet är fullt av risk. Så när du jämför numbers[0] med -0.1 kan det innebära att du kanske jämför -0.1000000004321 med -0.1000000001234 vilket såklart inte är lika. Om nu inte Python har någon smart hantering vill säga.

I och med att du har en variabel som heter hekto skulle jag även använda den så, stoppa inte in ett kg-värde där utan kör på 1 hekto. Ha en variabel vikt_hekto(egentligen helt på engelska) eller liknande som du använder och använder heltal för att representera den vikt du är på. Då är 5 kg 50 hekto och du kan dra av 1 hekto istället för 0.1 kg. Då kan du jämföra vikt_hekto med 0 och se om de är exakt.

Man kanske kan multiplicera båda med 100 och göra om dem till int och jämföra? Är det något som känns vettigt eller är det bara omständigt?

/M

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Okt 2006
Skrivet av Marowak:

Man kanske kan multiplicera båda med 100 och göra om dem till int och jämföra? Är det något som känns vettigt eller är det bara omständigt?

Om man nu verkligen av någon anledning måste jobba med flyttal så kan det vara ett alternativ. Man kan även göra så att man kollar om de skiljer mindre än något delta så anses de vara lika.

Har man däremot möjlighet skulle jag hellre uppmana att bara jobba med heltal(integer), det är mindre huvudvärk och processorn är generellt sätt effektivare på det.

Trädvy Permalänk
Medlem
Registrerad
Sep 2008

Tack för svar, har ändrat till 50 istället för 5.0, för det spelar ju egentligen ingen roll vad det står på skärmen. Det fungerar i alla fall bra nu. Har bara problem med att min servo står och stampar, fattar inte hur man stänger av den och kan sätta på den när man behöver ändra position.

Trädvy Permalänk
Medlem
Plats
Götet, typ
Registrerad
Okt 2004
Skrivet av zealen:

Tack för svar, har ändrat till 50 istället för 5.0, för det spelar ju egentligen ingen roll vad det står på skärmen. Det fungerar i alla fall bra nu. Har bara problem med att min servo står och stampar, fattar inte hur man stänger av den och kan sätta på den när man behöver ändra position.

Jag såg att någon hade löst det genom att ställa om porten till input tills han skulle köra den igen. Låter ju inte supervackert, men det kanske funkar. Men det var för Arduino, vet inte om det funkar likadant när man kör från Rpi

/M