IO22D08 Library

Podczas przeszukiwania internetu znalazłem całkiem ciekawą płytkę rozwojową która może posłużyć za dobrą bazę do sterownika automatyki. Jest to płytka o nazwie IO22D08 wiadomej chińskiej produkcji.

 Niestety jedyne znalezione oprogramowanie tej płytki po długich poszukiwaniach było dalekie od zadowalającego. dlatego na jego bazie postanowiłem napisać swoją "bibliotekę"  do obsługi płytki.

Płytka przystosowana jest do montażu z płytką Adruino Pro Mini lecz nic nie szkodzi aby np testowo podłączyć też zamiast niej bardziej popularne Arduino Nano.  W tym celu zwieramy kawałkami przewodów wyjście D10 do A7 i D11do A6 i wkładamy jak na rysunku:

 

Oprogramowanie.

W kodzie źródłowym zawarte są wszystkie definicje i procedury niezbędne do obsługi pytki. 

Na samym początku musimy zdefiniować jakie Arduino wkładamy. Jeżeli jest to Nano pozostawiamy linię #define NANO_AS_MINI a jeżeli jest to oryginalne MINI - usuwamy ją.

obsługa funkcji jest bardzo prosta.

1. Obsługa przycisków K1..K4 i wejść IN1..IN8

W pętli loop() zamieszczamy funkcje:

  readINPUTS();
  readKEYS();

Pierwsza odczytuje stan wejść druga stan przycisków. Program filtruje odczytane dane eliminując drgania zestyków wprowadzając 50ms pętlę na eliminację drgań dlatego te funkcje powinny wykonywać się dość często. Gdybyśmy dodali je do timera np używając flexiTimer2 jak w LCD mógłby powstać problem z wykrywaniem i detekcją zbocza (Naciśniecie, Puszczenie) - jeżeli nie jest nam to potrzebne wykorzystujemy tylko stan 1/0 oczywiście można to umieścić w procedurze flexiTimera.

odczytane dane mogą mieć wartości

  • 0 - wejście niepodłączone lub przycisk nie naciśnięty . Wartość IO_LOW
  • 1 - wejście zawarte do masy lub naciśnięty przycisk. Wartość IO_HIGH
  • 2 - moment zwierania wejścia / naciskania przycisku  - zbocze narastające. Wartość IO_RISING
  • 3 - moment rozwierania wejścia / puszczenia przycisku  - zbocze opadające. Wartość IO_FALLING

 

wartości odczytujemy z tablic inValues i keysValues np:

 byte in1=inValues[0]; 
 byte key1=keysValues[0];

gdzie wartość 0 oznacza pierwsze wejście(IN1) lub przycisk(K1)  itd kolejne aż do 7 dla wejść i do 3 dla przycisków 7 - wejście IN8. 3- przycisk K4.

 

2. Obsługa LCD

 LCD włączamy lub wyłączamy  definiując 1 lub 0 w tej stałej:

#define USE_LCD 1

Jeżeli płytka ma obsługiwać wyświetlacz LCD musimy go często odświeżać gdyż segmenty cyfr nie wyświetlają się na stałe - wymagałoby to odrobinę więcej elektroniki co wiadomo nie jest na rękę w masowej produkcji "po taniości".

Wyświetlacz można obsługiwać w pętli loop lub używając timera np FlexiTimer2.h, którego użyłem w przykładzie.

Wyświetlacz może wyświetlać cyfry oraz symulować w przybliżeniu alfabet i niektóre znaki.

Niestety kropka nie jest w pełni obsługiwana. Jedynie dostępny jest dwukropek dla drugiego segmentu.

Segmenty numerowane są od 0. 0 to pierwszy segment 1 drugi itd..

 

Dostępne funkcje:

clearLCD(); - czyści ekran .


setLCDdigit(segment, value, dots); - ustawia w wybranym segmencie wartość liczbową.

segment - numer segmentu zaczynając od 0

value - może mieć wartość od 0 do 45 gdzie początkowe wartości to cyfry a kolejne litery. Na końcu są niektóre pozostałe znaki.

dots - parametr opcjonalny - wyświetla dwukropek na środku.

 

setLCDtext(char[]); - wypisuje tekst

parametrem jest tekst do wpisania np setLCDtext("TEST");

 

setLCDTime(hour, minute,dots ); - wyświetla godzinę i minutę lub minutę i sekunde wg uznania oraz opcjonalnie dwukropek


setLCDbyInt(intValue); - wyświetla liczbę całkowitą od -999 do 9999

Można także zdefiniować własne znaki. Aby to zrobić najpierw zobaczmy który segment za co odpowiada:

    --A--
    F---B
    --G--
    E---C
    --D--

    __  __   __  __
   |__||__|.|__||__|
   |__||__|'|__||__|

Każdy z 4 elementów wyświetlacza  składa się z 7 segmentów kolejno A,B,C,D,E,F,G

gdzie A,B,C to kolejne bity maski dla kodowanego znaku. A to najmniej ważny bit- nr.0  G - najbardziej nr.6 przykładowo w zapisie binarnym będzie to wyglądać tak 0bGFEDCBA

np aby ustawić na wyświetlaczu cyfrę 1 musimy zapalić segmenty B i C da to cyfrę 0b00000110

maska jest negacją tej cyfry gdyż aktywny segment wyświetlacza wysterowywany jest w negacji - świeci gdy jest ustawiony bit na 0

np:   mask= ~( 0b GFEDCBA);

Ósmy bit jest odpowiedzialny za kropkę, a w zasadzie za dwukropek i jest aktywny tylko dla drugiego segmentu. Stąd kropka nie jest obsługiwana.

setCustomChar(segment, mask, dots); - definiuje własny znak według maski w wybranym segmencie z opcjonalnym dwukropkiem.

byte setCustomChar(segment,  a,  b,  c, d,  e,  f,  g ,  dots ); - definiuje własny znak gdzie możemy wybrać które segmenty abcdefg  mają być włączone 0- wyłączony 1- włączony.
Dodatkowo funkcja zwraca obliczoną maskę np do późniejszego użytku.

 

3. Obsługa przekaźników

Do obsługi przekaźników zdefiniowałem kilka funkcj:

setRelay(relayNo); - włącza wybrany przekaźnik. Numeracja zaczyna się od 1. Przekaźnik pierwszy  wybieramy 1 drugi wybieramy 2

resetRelay(relayNo); - wyłącza wybrany przekaźnik.

setRelayAndOffRest(relayNo);  - włącza wybrany przekaźnik i wyłącza pozostałe

byte getRelay(relayNo); - zwraca stan wybranego przekaźnika 0 lub 1

clearRelays();  - wyłącza wszystkie przekaźniki

 Jeżeli numeracja od 1 nam nie odpowiada i chcemy numerować od 0 nie ma problemu. Należy w pliku lcdAndRelays.h znaleźć i usunąć wszystkie linie z kodem relayNo--;

 

 


 

Kod źródłowy można pobrać stąd: IO22D08.zip rozmiar ok. 7kB