Sida 1 av 1

kodhjälp micropython toknybörjare en knapp och oled display

Postat: 21 maj 2020, 01:35:19
av tokfan
Hej!
Är helt ny på python och rätt kass på C programmering med.
Jag labbar med en oled display och knapp och försöker göra så displayen skiftar mellan att skriva "steg 1" och "steg 2" när
jag trycker på knappen.
Det fungerar halvbra. Skiftar ibland och stannar ibland på samma steg flera knapptryckningar i rad.
Vad är felet?

Det borde väl gå att göra en variabel i slutet på första if-satsen typ: var = 1 och sedan starta nästa "steg 2" med
if var=1:
gör såhär när knappen trycks igen
var = 0

Ja ni ser att jag är helt lost och antar att vissa saker i koden kanske inte ens gör någon nytta.
Någon som har lust att berätta hur jag gör detta på ett smidigt vis eller vart jag kan hitta bra info?

hittar bara basic projekt på sparkfuns hemsida om hur man använder gpio, adc osv men inget hur man styr upp syntax och andra saker som i detta exempel.

Kod: Markera allt

import machine
from machine import Pin,I2C
import SSD1306
import time


 
i2c = I2C(-1,scl=Pin(22),sda=Pin(21))
oled=SSD1306.SSD1306_I2C(128,64,i2c,0x3c)

button = machine.Pin(23, machine.Pin.IN, machine.Pin.PULL_UP)
while True:
    
    first = button.value()
    time.sleep(0.5)
    second = button.value()
    
    if not first and second:
        print('steg 1!')
        oled.fill(1)
        oled.invert(1)
        oled.text("steg 1!",0,3,0)
        oled.show()
        
        
        
    
    fir = button.value()
    time.sleep(0.5)
    sec = button.value()
    
    if not fir and sec:
      print('steg 2!')
      oled.fill(1)
      oled.invert(1)
      oled.text("steg 2!",0,3,0)
      oled.show()  
    

Re: kodhjälp micropython toknybörjare en knapp och oled dis

Postat: 21 maj 2020, 05:49:49
av Zkronk
Något i den här stilen kanske skulle kunna fungera?
Dock är koden helt o-testad, så jag lämnar inga garantier :vissla:

Kod: Markera allt

from machine import Pin, I2C
import SSD1306
import time

stage = 1
DEBOUNCE_TIME = 0.5

i2c = I2C(-1, scl=Pin(22), sda=Pin(21))
oled = SSD1306.SSD1306_I2C(128, 64, i2c, 0x3c)
button = Pin(23, Pin.IN, Pin.PULL_UP)

def button_is_pressed():
    first_reading = button.value()
    time.sleep(DEBOUNCE_TIME)
    second_reading = button.value()

    return (not first_reading and second_reading)

def display_stage(current_stage):
    message = f"steg {current_stage}!"

    print(message)
    oled.fill(1)
    oled.invert(1)
    oled.text(message, 0, 3, 0)
    oled.show()

while True:
    display_stage(stage)

    # Wait here until the button is pressed.
    while (button_is_pressed() == False):
        pass

    if stage == 1:
        stage = 2
    else:
        stage = 1

Re: kodhjälp micropython toknybörjare en knapp och oled dis

Postat: 21 maj 2020, 10:23:43
av tokfan
Tusen tack!
Precis vad jag behövde!
Har inte testat än men koden ger hur som helst en bättre överblick över hur man lägger upp allt.
Klurade på rad 20 vad f står för f"steg?

En annan fråga: kan man ladda in massa filer i processorn som typ funktioner.py
och sedan bara skriva i main.py: import funktioner?
(som man gör med #include i C-programmering).

Re: kodhjälp micropython toknybörjare en knapp och oled dis

Postat: 21 maj 2020, 22:20:09
av swesysmgr
f-prefixet är formatted string, den sätter in variabler omgivna av klammerparenteser i texten innan den skrivs ut. Är man van vid printf i C så är det ungefär samma tänk tycker jag.

Re: kodhjälp micropython toknybörjare en knapp och oled dis

Postat: 22 maj 2020, 01:22:49
av tokfan
Tackar! Då är jag med.
Mina första små testprojekt kommer ju bestå av delarna i din kod i olika kombinationer och modifieringar tills jag känner att jag blir säkrare. Sedan får man utveckla därifrån.

Re: kodhjälp micropython toknybörjare en knapp och oled dis

Postat: 23 maj 2020, 00:23:25
av Mr Andersson
Lite udda sätt att läsa knapptryck i mitt tycke.
Vad händer om användaren trycker ner knappen innan första läsningen?
Vad händer om användaren trycker ner knappen mindre än 0,5s mellan första och andra läsningen?
Vad händer om användaren trycker ner knappen efter andra läsningen och håller kvar mer än 0,5s?

I alla tre fall kommer du missa ett knapptryck.

Jag skulle hellre rekommendera ett flankinterrupt för att detektera nertrycket, och bara ha debounce på uppsläppet.
En annan fråga: kan man ladda in massa filer i processorn som typ funktioner.py
och sedan bara skriva i main.py: import funktioner?
(som man gör med #include i C-programmering).
Ja det kan du göra.