
Sterowanie pinami RasbperryPi
Co uzyskamy.
Całość kursu jest dostępna w formie wideo.
Do RasbperryPi jest podłączony przycisk i dioda Led. Na stronie internetowej będą dwa przyciski jeden będzie kontrolował stan diody, drugi będzie kontrolowany przez przycisk na RPi. Analogicznie w aplikacji mobilnej będą dwa przełączniki jeden do sterowania diodą Led drugi sterowany przez RasbperryPi.
Jest to bardzo prosty przykład sterowania stanami pinów RasbperryPi.
Aplikacja na Androida ( nie jest wymagana, jak nie chcesz sterować aplikacją odrazu przejdź do kroku dodawania strony internetowej)
Pobierz i zainstaluj Arduino Remote LITE. Zaloguj się aplikacją do swojego konta w RemoteMe. Jak nie masz konta w RemoteMe załóż je tutaj
Po zalogowaniu na aplikacji mobilnej w zakładce Variables zostaną utworzone zmienne sterowane przez aplikację.
- Zakładka Variables (zmienne)
- Zmienne
- Dobrze jest kliknąć ikonkę dyskietki i zaznaczyć zmienne Relay_01 i Relay_02. Dzięki temu pomiędzy resetowanie programy na RasbperryPi czy włączaniu strony aplikacji mobilnej będziemy mieli ostatni zapisany stan
Możemy zmieniać stan zmiennych przez aplikację, zmiany pojawią się w belce poszczególnych zmiennych.
Dodawanie strony internetowej (nie jest wymagany, ale wtedy musisz zainstalować aplikacja mobilną)
Kod Samej strony zostanie wygenerowany automatycznie, gdy dodamy korzystając z kreatora (wizarda), jest to najprostszy sposób. Można oczywiście pisać własne kontrolery korzystając z gotowych bibliotek które umożliwiają komunikacje z systemem.
Strony internetowe są przechowywane w chmurze remoteMe i jest do nich dostęp z każdego miejsca gdzie mamy internet. Możesz więc sterować swoim RaspberryPi z dowolnego miejsca na świecie.
Dodamy jedną stronę internetową z dwoma przyciskami. Przyciski parujemy ze zmiennymi RELAY_01 i RELAY_02
Dodawanie strony
- Zakładka Devices
- New Device w prawym górnym rogu
- New WebPage
- name :controlWeb
- deviceId:10
- template — nie zmieniamy.
- więcej o stronach internetowych tutaj
- W nowo utworzonej stronie klikamy index.html, a następnie “Edit with wizard”
- Klikamy przycisk: Insert Component
- i wypełniamy okno:
- nowo utworzony przycisk będzie zmieniał stan zmiennej Relay_01
- dodajemy analogicznie drugi przycisk do zmiennej RELAY_02
- zamykamy okno
- klikamy na index.html następnie open in newTab
-
- Po kliknięciu na przyciski zmienia się ich stan. Analogicznie, gdy mamy otwartą aplikację androidową zmienia się stan przełączników.
RasbperryPi
Ogólnie rzecz biorąc na RasbperryPi będzie uruchomiony program (instalacja programu tutaj ) Po uruchomieniu w skonfigurowaniu programu połączy się on do naszego konta w remoteMe i uruchomi także nasz skrypt pythonowy który będzie odpowiedzialny za sterowanie stanami pinów, a także będzie reagował na wciskanie przycisku podpiętego do jednego z pinów. W czasie tworzenia skryptu pythonowego poprzez generator, tworzone są metody do sterowania zmiennymi. Uzupełniamy funkcje w zależności co chcemy aby nasze Rpi zrobiło gdy stan jakiejś zmiennej się zmieni, albo w przypadku tego kursu skopiujemy cały skrypt i po prostu go wkleimy w oknie edycji
Teraz pora podłączyć nasze RasbperryPi. Podłączamy według schematu. Pamiętając, żeby sprawdzić połączenia przed włączeniem RPi, inaczej możesz spalić swoją malinkę
- Anodę diody led jest podłączona do pinu 19
- Katoda diody led przez opornik jest podłączona do uziemienia
- Jedna nóżka przycisku jest podłączona do pinu 26 druga do uziemienia
Po podłączeniu przycisku i diody pora napisać skrypt sterujący więcej o skryptach tutaj
W menu kontekstowym RasbperryPi w zakładce devices wybieramy “Add external script with wizard”
W pierwszym kroku wybieramy
drugi krok dediveId:5, name python.
W kroku ostatnim klikamy na “create Device”. Wtedy program zarządzający na RasbperryPi zostanie zresetowany i po ponownym podłączeniu otrzymamy
Zielone ikonki połączenia oznaczają, że zarówno nasze RPi jak i skrypt pythonowy są podłączone do chmury RemoteMe
Oczywiście dioda ani przycisk nie będą działały dopóki nie zaimplementujemy funkcji do obsługi i zmieniania stanu zmiennych remoteMe
- Rozwijamy belkę Python script device
- następnie klikamy na python.py i wybieramy Edit
- Wklejamy kod:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667import loggingimport socketimport structimport sysimport osos.chdir(sys.argv[1])sys.path.append('../base')import remotemeimport RPi.GPIO as GPIOLED_PIN=19BUTTON_PIN=26relay2=False;def setRELAY_01(b):remoteMe.getVariables().setBoolean("RELAY_01", b)def setRELAY_02(b):remoteMe.getVariables().setBoolean("RELAY_02", b)def changeButtonState(channel):global relay2relay2=not relay2setRELAY_02(relay2)passdef onRELAY_01Change(b):GPIO.output(LED_PIN, GPIO.HIGH if b else GPIO.LOW)passdef onRELAY_02Change(b):global relay2relay2=bpassdef setupPins():GPIO.setmode(GPIO.BCM)GPIO.setup(LED_PIN, GPIO.OUT)GPIO.output(LED_PIN, GPIO.LOW)GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)GPIO.add_event_detect(BUTTON_PIN,GPIO.RISING,callback=changeButtonState,bouncetime=200)passtry:logging.basicConfig(level=logging.DEBUG,format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',datefmt='%d.%m %H:%M',filename="logs.log")logger = logging.getLogger('application')setupPins()remoteMe = remoteme.RemoteMe()remoteMe.startRemoteMe(sys.argv)remoteMe.getVariables().observeBoolean("RELAY_01" ,onRELAY_01Change);remoteMe.getVariables().observeBoolean("RELAY_02" ,onRELAY_02Change);remoteMe.wait()finally:pass
Jak to działa
Kiedy w zakładce Variables rozwiniesz belki Relay_01 i Relay_02 otrzymamy:
oznacza to że wszystkie trzy urządzenia (strona internetowa, Rpi i aplikacja na androida) obserwują zmienne RELAY_01 i RELAY_02, co oznacza że jeżeli zostanie ona zmieniona przez jedno z urządzeń, zmiana zostanie rozpropagowana na wszystkie inne urządzenia.
Kiedy wartość zmiennych RELAY_01 lub RELAY_02 jest zmieniana, zmiana jest propagowana do innych urządzeń które te zmienne obserwują. W RasbeprryPi kiedy przyjdzie informacja o zmianie wartości zmiennej zostanie wywołana funkcja
1 2 3 4 |
def onRELAY_01Change(b): GPIO.output(LED_PIN, GPIO.HIGH if b else GPIO.LOW) pass |
a ta funkcja po prostu zmienia stan piny do którego jest podpięta dioda led
Kiedy natomiast zostanie zmienia zmienna RELAY_02 :
1 2 3 4 |
def onRELAY_02Change(b): global relay2 relay2=b pass |
po prostu zapamiętujemy ją w zmiennej globalnej relay2
Kiedy wciśniemy przycisk podpięty do RPi
1 2 3 4 5 |
def changeButtonState(channel): global relay2 relay2=not relay2 setRELAY_02(relay2) pass |
A ta funkcja zmieni wartość zmiennej relay2 na przeciwny i wyśle nową wartość do systemy remoteme setRELAY_02(relay2)
, a system remoteMe rozpropaguje tą zmianę do strony i aplikacji mobilnej.