Sterowanie oświetleniem w pokoju cz.2/3

Sterowanie oświetleniem w pokoju cz.2/3

Witam wszystkich w części drugiej. Na początek dziękuje wszystkim za miłe słowa oraz oddane głosy. Jak obiecywałem w części pierwszej dzisiaj zapoznamy się z kodem programu na komputer. Na wstępie pragnę jeszcze zaznaczyć, że nie jestem programistą ani zawodowo ani amatorsko. Napisany kod może zawierać błędy, lub pewnie można to zrobić w sposób bardziej elegancki oraz bardziej optymalnie. Bardzo mile widziana wszelaka konstruktywna krytyka :-)

Co nam będzie niezbędne:

  1. Komputer i kawa
  2. C++ Bulider w wersji 6 Personal
  3. Poskładany układ z części pierwszej

Aplikacja Bulider w wersji 6 Personal jest podlinkowana do blogu Pana Mirosława Zalent. Znajdująca się tam wersja jest gotowa do instalacji na komputerze. Jednocześnie serdecznie zapraszam na blog Pana Mirosława. Przygotowane kursy są kapitalne .

Aplikacja, która dzisiaj wspólnie przygotujemy umożliwi komunikowanie się przez port szeregowy z naszym układem. Oczywiście można by to samo osiągnąć wysyłając odpowiednio przygotowane komunikaty wpisywane w jakikolwiek program do komunikacji szeregowej (np wbudowany w Arduino IDE serial monitor). Rozwiązanie takie jest jednak strasznie nie eleganckie. My będziemy mieli program w wersji okienkowej.

W skład interfejsu programu wchodzić będą:

Obrazek Rodzaj elementu Właściwość
Name Caption/text Enabled Cursor
1 Button s_1 1 false crHandPoint
2 Button s_2 2 false crHandPoint
3 Button s_3 3 false crHandPoint
4 Button s_4 4 false crHandPoint
5 Button of_all Wyłącz Wszystkie false crHandPoint
6 Button polacz Połącz true crArrow
7 Button rozlacz Rozłącz false crArrow
8 Image stan nd nd nd
9 CheckBox CheckBox1 Wysyłanie kodów false crArrow
10 Edit Edit2 KOD IR false crDefault
11 Edit Edit3 KOD IR false crDefault
12 Edit Edit4 KOD IR false crDefault
13 Edit Edit5 KOD IR false crDefault
14 Button wyslij_1 >> false crDefault
15 Button wyslij_2 >> false crDefault
16 Button wyslij_3 >> false crDefault
17 Button wyslij_4 >> false crDefault
18 Button w_txt Wczytaj kody IR z pliku true crDefault
19 Button z_txt Zapisz kody IR do pliku true crDefault
20 Button Eeprom Zaprisz IR do EEPROM false crDefault
21 TryIcon TrayIcon1 nd false nd
22 MainMenu MainMenu1 nd nd nd
23 TMenuItem UstawieniaCOM1 Ustawienia COM true crDefault
24 TMenuItem Zakoncz1 Zakończ true crDefault
 programopis

Samo rozmieszczeni elementów oczywiście jest dowolne. Nic nie stoi na przeszkodzie aby go dowolnie zmodyfikować do własnych potrzeb.

Komunikować się z naszym mC będziemy przez Winapi. Zaczynamy od dodania potrzebnych na bibliotek.

 

Przy okazji zadeklarowaliśmy też zmienne potrzebne nam do pracy oraz strukturę DCB obsługującą port COM.

Aby zaoszczędzić wam sporo czasu omówię w tylko po jednym przycisku z grupy. Przyciski te robią dokładnie to samo zmienia się tylko kod IR, którego obsługą w danym momencie się zajmujemy.

Na sam start musimy się z naszym mC się połączyć. Wypadało więc by stworzyć blok konfiguracyjny gdzie będziemy mogli wybrać numer portu COM naszego urządzenia oraz prędkość jaką będziemy nadawać i odczytywać dane. Zdecydowałem się, na ukrycie blogu konfiguracji ponieważ będzie nam on potrzebny tylko raz. Wybieramy więc z menu File->New->Form. Należy także pamiętać żeby w kodzie programu załączyć nową formę(#include “Unit2.h”). Na nowej formie tworzymy dodajemy nowe elementy:

program2

Pola wyboru ComboBox1 oraz ComboBox2 są na chwile obecną puste i trzeba by je wypełnić numerami portów COM oraz dostępnymi szybkościami połączeń. Można to zrobić albo w kodzie programu zaraz po utworzeniu nowej formy (FormCreate) lub w inspektorze obiektów. Ja w Form Create wpisałem po prostu ComboBox1->Items->Add(“COM1”); i tak dla każdego numeru portu COM oraz ComboBox2->Items->Add(“4800”); dla każdej możliwej szybkości.

Przycisk >> Powinien zapisać do pliku txt z ustawieniami nr portu oraz szybkość transmisji oraz w etykiecie Label3 oraz Label4 zapisać stosowne ustawiania. Kod przycisku poniżej:

No to mamy na dysku plik tekstowy z ustawieniami portu COM. Pora połączyć się po raz pierwszy z urządzaniem. Aplikacja po wybraniu przycisku połącz powinna sprawdzić czy na dysku znajduje się odpowiedni plik z ustawieniami. Jeśli plik udało się odczytać to pobrać z niego odpowiednie ustawienia a w przeciwnym wypadku otworzyć okienko z konfiguracją COM.

Należy pamiętać, że dane przychodzące z pliku tekstowego zawsze są traktowane jako tekst. Do zmiennej szybkość potrzebna nam liczba całkowita. Funkcja atoi zmienia ten tekst na liczbę.

Wszystko poszło dobrze i mamy już połączenia z portem COM. Jako, że wszystko co zostało otwarte należy później zamknąć. Osoba sumienna na pewno najpierw rozłączy port COM (przycisk rozłącz) później zamknie aplikację ja natomiast jestem leniwy i użyje do tego przycisku X(ten obok maksymalizuj) na belce programu. Trzeba będzie temu zaradzić. W inspektorze obiektów dla Form1 przełączamy się na zakładkę Events i z listy wybieramy (2xclic). W zdarzeniu wystarczy napisać if(SetCommState(hNumPort, &dcb)==TRUE) CloseHandle(hNumPort). Funkcja najpierw sprawdza czy port jest otwarty i jeśli tak zamyka go po czym włącza aplikację. Przy okazji tworzenia MainMenu opiszę jeszcze jak dodać zdarzenie do pozycji menu zamknij.

Więc tak do przycisku rozłącz dodajemy kod:

Wszystko poszło dobrze i mamy już połączenia z portem COM. Możemy zabrać się za okodowanie przycisków do włączania i wyłączania światła. Jak wspomniałem wcześniej omówię tylko jeden z nich. Analogicznie modyfikujemy kod pozostałych przycisków. Dla przycisku wyłącz wszystkie wysyłamy 5.

Na tym etapie program potrafi już nawiązać połączenie, poprawie je zamykać oraz włączać i wyłączać światło. Pora na dodanie możliwości zmiany kodów IR pilota. Do wpisywania kodów mamy utworzone cztery pola Edit. Możemy je sobie najpierw sprawdzić i po prostu wpisać do okienka a następie wysłać. Tyle, że gdybym kazał wam przepisywać je najpierw na kartkę później przyklepywać do aplikacji Łukasz z pewnością usunął by ten wpis. Przypominamy sobie, że nasz mC także potrafi się odezwać a w dodatku ostatni odebrany kod cały czas przechowuje w zmiennej kod. Wystarczy go o niego zapytać. Biorąc to wszystko pod uwagę zdecydowałem się, że samo kliknięcie w pole Edit powinno je nam odpowiednio przygotować. Tzn wyczyścić bieżącą wartość, zapytać o ostatni kod mC, odebrać gotowy kod i wkleić go w pole, które przed momentem kliknęliśmy. Jako, że pod ostatnim artykułem pojawiły się głosy, że jestem leniwy to wysłać do mC będę go już musiał sam(przycisk >>).

Myślę, że wyjaśnienia wymaga co to jest to tajemnicze Q. Jako, że instrukcja ReadFile wymaga podania ilości znaków do odczynia a my na chwile obecną nie wiemy ile to będzie znaków. Pamiętamy z poprzedniego artykułu, że nasz mC po tym jak odbierze 6 wyśle nam aktualny kod oraz samotną literkę Q. Będziemy więc odczytywać 1 znak odebrany przez aplikacje i sprawdzać czy to nie jest przypadkiem Q. Jeżeli tak to przerywamy pętle jeśli nie to czytamy dalej. Jako, że pętla do … while najpierw wykonuje polecenie z sekcji do a później sprawdza warunek while to znak Q i tak trafi nam do naszej tablicy. Koniecznie trzeba się go pozbyć. Jako, że z zmiennej i wiemy ile odebraliśmy znaków to można napisać pętle for. Tam prosty warunek if wywali nam już niepotrzebne Q. Jezyk C++ udostępnia nam nowy pojemnik na dane którym jest typ string.  Typ ten został specjalnie opracowany do przechowywania napisów czyli łańcuchów znaków a co dla nas w tym momencie najważniejsze znaki te można do siebie dodawać. Oczywiście nie jak liczby (1+1=2) tylko łączyć z całość (a+b+c=abc) i to właśnie odbywa się w pętli for.

Kod przycisku >> wyślij jest prawie tak samo porosty jak przycisków 1,2,3,4. Drobną różnicą jest to, że najpierw musimy wysłać zero aby poinformować mC, że za chwile dostanie kod później 1 lub dwa lub 3 lub 4 (info który to będzie kod) a na samym końcu właściwy ciąg znaków z pola Edit.

 

Jak, że miło by mieć zawsze pod ręką zestaw kodów naszego ulubionego pilota zdecydowałem się na wczytywania i zapisywanie kodów do pliku tekstowego.

 

Kod wydaje się jasny więc przejdźmy do odczytu

Kod dla przycisku Zapisz IR do EEPROM każdy już może napisać samodzielnie. Przypominam tylko, że mC zapisze do pamięci wartość które przechowuje w zmiennych Kod1/2/3/4 a nie te z pól edit. Do uruchomienia funkcji zapisu do EEPROM wystarczy mu wysłać 9.

Na koniec dodamy sobie menu do programu. Opcje które wpadało by dodać do Ustawienia COM oraz Zamknij reszta jest zupełnie opcjonalna. Dodajemy na formę nowy komponent o nazwie MainMenu. Po dwukrotnym kliknięciu na dodawany komponent otworzy się okienko z możliwością dodawania nowych elementów. Po zakończonej edycji z paska na górze wybieramy Ustawienia COM i dodajemy kod:

Ustawienia zostaną dodanie modalnie. Co to znaczy? Wyświetlone okienko nie będzie się dało maksymalizować minimalizować i przed zamknięciem tego okienka nie będzie można wprowadzać zmian w głównej formie aplikacji.

Do przycisku zamknij należy dodać kod:

Pierwsze polecenie sprawdzi nam czy obecnie jesteśmy połączeni z COM i jeśli tak to otwarte połączenie zostanie zamknięte. Druga linia kodu zamyka nam całą aplikację.

Nasz program kiedy jest nie używany a nie chcemy go zamykać nie powinien nam przeszkadzać w normalnej pracy na komputerze. Dlatego dodamy do niego komponent umożliwiający nam po zminimalizowaniu schowanie aplikacji do systemowego traya. Dodajmy nowy komponent o nazwie TryIcon. Poniżej kod:

Tutaj określamy jak ma się zachować nasza aplikacja po kliknięciu w ikonkę na pasku.

Pozostaje nam jeszcze zająć się kosmetycznymi sprawami. Chodzi o to aby uniemożliwić przypadkową maksymalizację okna programu oraz zamianę jego wielkości, określić rozmiar okna, miejsce otwarcia na ekranie monitora po uruchomieniu. Podam tylko nazwy elementów odpowiedzialnych za te zachowania oraz ich ustawienia. Oczywiście to kwesta gustu i wybór odpowiednich parametrów pozostawiam otwarty.

Nazwa Właściwość Co zmienia
AutoSize True Wielkość formy dopasowana do zawartośći
BorderIcon biMinimize: true Możliwość minimalizowania okna
 BorderIcon biMaximize: false Możliwość maksymalizowania okna
Caption Sterownik swiatla 1.0 Nazwa programu na belce tytułowej
Color clCream Kolor tła aplikacji

 

 

Poniżej zamieszczam jeszcze kod całej aplikacji. Aby był bardziej czytelny jest bez komentarzy – to co jest ważne skomentowałem na górze. Zachęcam także do pobrania archiwum paczka_majsterkowo gdzie jest udostępniony kod źródłowy programu, mC, oraz gotowa skompilowana aplikacja. Jako, że zapomniałem o tym w pierwszej części załączam do paczki pliki exela pozwalające lepiej zrozumieć kroki zamiany liczb oraz użyte w programie dla mC biblioteki.

Mam nadzieję że artykuł się podobał i bardzo proszę o zostawienie komentarza. Chętnie odpowiem na wszystkie pytania. W kolejnej częsci artykułu spotkamy się przy projektowaniu płytki PCB, wytrawianiu oraz lutowaniu. Jeżeli sprzęt pozowli chciałem z tych etapów nagrać filmiki.

 

 

 

Ocena: 4.55/5 (głosów: 38)

Podobne posty

13 komentarzy do “Sterowanie oświetleniem w pokoju cz.2/3

    • Jest darmowy i kiedyś miałem już nim styczność. Kod można skompilować w dowolnym innym kompilatorze oczywiście fragmenty odpowiedzialne za konkretne funkcje

      Odpowiedz
      • Visual Studio 2013 Express też jest darmowy a możliwości i przyjemność pracy nieporównywalnie większe ;). Ale co kto lubi. Nie sądzisz że takie kontrolki przyklejone do krawędzi okna jakoś tak dziwnie wyglądają? Tak się czepiam, zboczenie zawodowe ;)
        I jeszcze pytanie końcowe, ile zajęło Ci czasu opracowanie tego wszystkiego i jak kształtuję się koszty? Pytam, bo ostatnio wdrożyłem podobny projekt i chcę porównać powyższe do możliwości obu systemów.

        Odpowiedz
        • Projekt nie jest jeszcze skończony na chwile obecną obecną realny koszt całości to 11 zł atmega, i około 4 zł (jak dobrze pamiętam USB-UART). Trochę drobnicy elektronicznej. Nie mam jeszcze przycisków do ręcznej zmiany światła i na chwile obecną wychodzi, że właśnie to będzie najdroższym elementem układu. Jest to hobby więc ciężko przeliczać to na wydane złotówki czy spędzone godziny. Tematem zajmuje się chyba od połowy sierpnia ale nie jest to typowe siedzenie nad programem układem po parę godzin dziennie tylko w wolnych chwilach czasami pół godzinki dziennie a czasami raz w tygodniu.

          Odpowiedz
  • Pingback:

  • Pingback:

Odpowiedz

anuluj

Masz uwagi?