Hey ,
Jakis czas temu musialem wziac sie do roboty i zaczac zmieniac komponenty sterujace w moim mieszkaniu. Gdyby ktos pytal dlaczego
ano dlatego ze np moja plytka sterujaca oswietleniem wygladala praktycznie jak plyta glowna do komputera sterujacego
Po kilku dniach/godzinach ostrego myslenia powstala oto ta plyteczka
Jest ona czescia ukladu sterujacego 230V na chwile obecna.
Wiec dla projektu poczatkowo powstalo kilka zalozen
- Przynajmniej 10 portow do sterowania
- Komunikacja po Wifi
- Jak najprostsza mozliwosc sterowania portami
- Aplikacja do sterowania z poziomu telefonu ( IOS & Android )
- Wyswietlac informacje o stanie pinow dla poszczegolnych portow
- Projektowanie plytki PCB pod termotransfer (bo to tak jak na razie wykonuje swoje plytki )
Majac powyzsza liste na uwadze powstalo kilka pomyslow oraz kilka schematow. Jako glowny koponent zostal uzyty rejestr przesuwny 75hc595 a dodatkowo wykorzystuje 2 porty bezposrednio z procesora.
Uklad nie posiada kwarcu - napedzam go wewnetrznie na 8MhZ . No coz ta chec skrocenia listy komponentow zaowocowala tym ze aby zminimalizowac bledy transmisji UART predkosc zostala ustawiona na 38400
Wiec tak wyglada schemat calego ukladu.
Jako procesor wybralem sobie Atmega88P bo mam je pod reka oraz spelnia wymagania mojego projektu (sterowanie rejestrem przesuwnym oraz dwa dodatkowe wolne porty daja w sumie 10 portow IO
) . Samo zaprogramowanie kodu zrodlowego nie bylo takim problemem. Majac za sobie swiezo kilka rozdzialow z GB poszlo dosc gladko.
No i tutaj pojawila sie moja pierwsza zagwozdka ... pomyslalem sobie ... a zrobie sobie dla odmiany komunikacje binarna i zobaczymy jak to bedzie wygladac
Zalozenie bylo takie , ze wysylam znak startu (powiedzmy 0x01) a nastepnie dwa bajty informacji czyli jaki ma byc stan na rejestrze przesuwnym oraz na 2 pinach procesora
No o ile zestawienie tego w calosc (jak ramka poczatkowa etc ) nie bylo jakims problemem to dalsza obsluga nie byla droga sukcesu plynaca.
Kiedy tylko zaczalem sie bawic po stronie C# czy B4A to nadzialem sie na kilka problemow. Jako , ze jednym z zalozenien mialo byc pokazywanie na biezaco stan portow mozecie sobie wyobrazic ze odebrany bajt trzeba przeanalizowac pod katem stanu dla kazdego portu (oczywiscie moze ktos mialby tu lepszy pomysl : ) )
Wiedzac jak wyglada prostota komunikacja ASCII zmienilem zrodla programu tak aby uproscic sobie zycie
Majac na uwadze powyzsze zmienilem komunikacje na mega prosto oparta o :
- ?<CR> : wyslana z klienta spowoduje odeslanie wartosci portow
- 255,255; : wyslana z klienta spowoduje ustawienie odpowiednich wartosci portu oraz odeslania '#' jako formy potwierdzenia
- # : odsylany jako forma ACK
No i w sumie to konczy opowiesci z zakresu programowania procesora oraz zabaw z UARTEM. Do kodu zrodlowego dolaczonego na dole mozecie znalezc event nastepujacy co 10ms . Nie korzystalem z niego a chcialem sobie tylko zobaczyc czy jeszcze nie zapomnialem jak kodowac pewne zdarzenia
Wiec po tych krotkich przebojach zajalem sie programowaniem aplikacji na telefon. Napisalem aplikacje po dlugim czasie nie pisania niczego w B4A / B4I wiec jak sami zauwazycie nazwa projektu to latarka
ktora latarka nigdy sie nie stala.
Na chwile obecna nie bawilem sie w skalowanie. Wiec aplikacja z domyslu bedzie dzialac na Samsung S4 (ze wzgledu ze IOS to praca wre
jak dobrze pojdze to opublikuje innym razem ). Oczywiscie wiem i zdaje sobie sprawe ze mozna napisac ten kod o wiele lepiej
natomiast jako wstep jestem z niego zadowolony. Chociaz jak ktos bedzie mial jakies krytyczne komentarze to chetnie przeczytam
Aplikacja prezentuje sie nastepujaco :
Jak sami mozecie zobaczyc wprowadzamy IP naszego urzadzenia a nastepnie naciskamy polacz. Jesli uda sie nawiazac polaczenie to mozemy zaczac sie bawic. Jak dobrze sie domysliliscie kazdy z guzikow to odpowiednio bit w naszych bajtach ktore wysylamy. Wiec cala grupa pierwsza to 8 bitow dla naszego rejestru przesuwnego. Za kazdym razem kiedy klikamy jakis przelacznik odpowiednio zmienia sie nam wartosci. Jesli bedziemy chcieli sobie cos juz ustawic to naciskamy "ustaw". Aby sprawdzic jaki jest obecny stan na urzadzeniu wybieramy "refresh"
Oczywiscie po kazdej operacji zmiany stanu aplikacja sama poprosi o update tak zebyscie mieli up to date nformacje. W tym miejscu zastanawiam sie nad wprowadzeniem timera i odczytywaniu stanu automatycznie w tle co jakis czas.
Nastepna fajna sprawa sa tzw "preset" czyli szybki wybor jakis okreslonych "kompozycji". Najpierw sobie ustawiamy interesujace nas porty. A nastepnie jedyne co robimy to przyciskamy odpowiedni klawisz preset dluzej dzieki czemu zapisywane sa ustawienia nas interesujace (czyli wartosci portow )
No i w zasadzie to wszystko razem tworzy naprawde swietna calosc
fajnie jest moc zbudowac cos od podstaw
Cala aplikacja juz przetestowana na zywym organizmei. Tak gdyby ktos pytal to Wifi dziala w trybie TCP server. Ktos moze mi powiedziec ze UDP jest moze i lepsze
ale wg mnie na potrzeby tego projektu to spelnia lepiej zadanie.
Pozdrawiam
Raf
Kod zrodlowyZe wzgledow na jakich oparte jest to forum kod zrodlowy nie zawiera modulu UART ktory w duzej mierze pochodzi z GB. Wiec jesli ktos go nie posiada niestety musi sobie stworzyc obsluge zdarzenia oparta o odebranie CR czyli ASCII o wartosci 13
main.c
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Configs.h
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Timers.c
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Timers.h
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
h_spi.c
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
h_spi.hjęzyk c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.