Skocz do zawartości

Kurs Raspberry Pi - #14 - podstawy Pythona, GPIO


Pomocna odpowiedź

Witam!

Jestem zupełnie zielony z programowania i Raspberry, a do tego humanista, ale...

Czy nasz kod programu do świateł drogowych nie mógłby się skończyć na:

    GPIO.output(20, GPIO.HIGH)
    GPIO.output(21, GPIO.LOW)
    sleep(1)

czyli wyłączeniu diody zielonej na pinie 21, włączeniu żółtej na pinie 20 i odczekaniu sekundy?

Bo w obecnej wersji po wyłączeniu żółtej włączamy czerwoną na pinie 16, czekamy sekundę i... rozpoczynamy pętlę od wyłączenia zielonej i żółtej i ponownym włączeniu czerwonej na sekundę. Mam rację?

(edytowany)

@xtk rozumiem że masz na myśli powtórzenie w tym miejscu:

image.thumb.png.973d0c4bf8f12e3d17f2fead74ae19e6.png

Sekwencja wyglada tak: 

cz/-/-

cz/ż/-

-/-/ź

-/ż/-

cz/-/-

Więc tak jak być powinno 🙂 Wyłączenie na początku pętli powoduje że nie ma wątpliwości czy coś jest wyłączone zwłaszcza przy starcie programu.

Edytowano przez Gieneq

Wyłączenie wszystkiego na początku rzeczywiście ma sens, zwłaszcza, że Ctrl+Z przy poprzednim uruchomieniu pozostawia którąś diodę włączoną.

Ale przy cytowanym powtórzeniu czerwona świeci 3 sekundy: 1 s na końcu (po co?), + 1 s na początku (OK) + 1 s z żółtą (OK).

Chodzi mi o usunięcie:

cz/-/- z końca.

  • Lubię! 1

Witam,

Problem już rozwiązałem lecz mam pytanie na przyszłość ponieważ nie znam źródła tego problemu...

Pisząc kod w nano każdą linię w pętli while zaczynam od TABulatora. Efekt jest dla mnie zaskakujący ponieważ jak widać w kodzie poniżej oraz w nano wszystko jest ładnie w jednej linii. Pojawiał się jednak błąd spacji/tabulatora więc otworzyłem kod w Notepad++ gdzie zauważyłem (screenshot poniżej), że niektóre linie są poprzesuwane - i faktycznie w niektórych liniach było tam przesunięcie tabulatorem a w niektórych zostało to jakoś przekonwertowane na spacje.

Wie ktoś dlaczego się tak zadziało? Z góry dziękuję za odpowiedź 🙂 

image.thumb.png.248bb479b31103f26e135ac6e6b69fb0.png

import RPi.GPIO as GPIO
from time import *

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(16, GPIO.OUT)
GPIO.setup(20, GPIO.OUT)
GPIO.setup(21, GPIO.OUT)

while True:
	#czerwone
	GPIO.output(16, GPIO.HIGH)
        GPIO.output(20, GPIO.LOW)
        GPIO.output(21, GPIO.LOW)
	sleep(1)
	#czerwone i zolte
	GPIO.output(20, GPIO.HIGH)
	sleep(1)
	#zielone
        GPIO.output(16, GPIO.LOW)
        GPIO.output(20, GPIO.LOW)
        GPIO.output(21, GPIO.HIGH)
	sleep(1)
	#zolte
        GPIO.output(20, GPIO.HIGH)
        GPIO.output(21, GPIO.LOW)
        sleep(1)

 

10 minut temu, grucha532 napisał:

Wie ktoś dlaczego się tak zadziało?

Tak - inna szerokość tabulatora w dwóch różnych programach.

Nigdy, przenigdy nie mieszaj tabulatorów ze spacjami! Najlepiej w ogóle nie używać tabulatorów - porządne edytory potrafią posługiwać się spacjami. Nie wiem jak ten cały Notepad++, ale mój Geany ma przełącznik "używaj zawsze spacji". W nano masz do tego opcję -E, czyli coś w stylu:

nano -E mojprogram.py

Możesz sobie na końcu pliku ~/.bashrc dodać linijkę:

alias nano='nano -E'

wtedy bash sam doda -E do wywołania nano (musisz się przelogować aby to zadziałało).

  • Pomogłeś! 1
  • 1 rok później...

Aaaaaa, a tutaj natrafiłem na bardzo dziwny problem. Staram się w Pythonie odczytać stan switcha.

Ustawiam stan danego pinu na wejście 
GPIO.setup(26, GPIO.IN)

I w pętli odczytuję stan

print(GPIO.input(26))

No i mam jakąś dziwną... jazdę. Generalnie mam wrażenie, że od razu po wciśnięciu/puszczeniu switcha przez "chwilę" stan jest odczytywany poprawnie, ale potem się... sam zmienia. 

Powiedzmy drukuje to tak:

1
1
1
tutaj naciskam na switch i zmienia się na:
0
0
0
tutaj puszczam switch i poprawnie zmienia się na:
1
1
1
i nagle, pomimo tego, że nic nie naciskam zaczyna drukować zera!
0
0
0

itd....

Pomocy, ratunku 🙂 o co to może chodzić?

  • 3 lat(a) później...
Treker
Ta treść została wynagrodzona przez moderatora!

Attero otrzymał odznakę: "Odkrywca (podanie odp. na własne pytanie)"

Dzięki za kurs fajna sprawa. Mam nadzieję, że pojawi się więcej materiału z pythonem w roli głównej. Dla osób które przerabiają ten kurs te kilka lat po publikacji mam szybkie info: Sterowanie pinami zmieniło się w najnowszych OS, a WiringPi juz nie ma wsparcia. W internecie pełno jest nieaktualnych informacji nawet  na oficjalnej stronie RPi. U mnie zadziałało dopiero użycie libgpiod

Raspberry Pi 4B 

1. Sprawdzenie GPIO

Lista dostępnych układów GPIO:

gpiodetect

Lista dostępnych pinów:

gpioinfo

2. Sterowanie GPIO z terminala (libgpiod)

Włączenie diody LED na GPIO17:

gpioset gpiochip0 17=1

Wyłączenie diody:

gpioset gpiochip0 17=0

 

 

  • Lubię! 2

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...