Mikroprocesorowy sterownik pieczarkarni
Transkrypt
Mikroprocesorowy sterownik pieczarkarni
Grzegorz Podolewski 128203
Wrocław, 14.VI.2008
Mikroprocesorowy
sterownik pieczarkarni
Przedmiot: Wizualizacja danych sensorycznych (ARE4355P)
Prowadzący: dr inż. Bogdan Kreczmer
1) Wprowadzenie
Celem projektu było skonstruowanie, wykonanie i zamontowanie dedykowanego sterownika
obsługującego dwie pieczarkarnie. Projekt rozpocząłem składać rok temu. Urządzenie zostało
podzielone na dwie części. Sterownik zainstalowany na obiekcie, oraz terminal – połączony
magistralą EIA485 - umożliwiający zdalne programowanie sterownika i wizualizację
mierzonych wielkości. Głównym celem projektu było jednak pokazanie sponsorom (czyt.
rodzicom), że ich pieniądze, wyłożone na moją edukację, nie poszły na marne Niestety
projekt nie został ukończony z braku czasu. Brakuje funkcji zczytującej numery ID czujników
na szynie 1-wire. Bez adresowania można podpiąć tylko jeden czujnik w tej chwili.
2) Terminal
Elektronika terminala została oparta na mikrokontrolerze ATmega8L firmy ATMEL - dzięki
temu została uproszczona do absolutnego minimum. Schemat ideowy urządzenia przedstawia
rysunek nr 1.
Rys. nr 1: Schemat ideowy terminala
Widzimy tutaj standardowy blok zasilający oparty na układzie LM7805. Z lewej strony
mikrokontrolera znajduje się gniazdo ISP. Jest to gniazdo najpopularniejszego programatora
szeregowego zgodnego z STK200/300, umożliwiającego programowanie mikrokontrolera w
układzie (In System Programming), który notabene także zmontowałem na użytek tego
projektu, ale ponieważ jest to ogólnie dostępna konstrukcja, dlatego nie zamieszczam jego
schematu. Programator komunikuje się z mikrokontrolerem poprzez magistralę SPI. Ponad
gniazdem ISP znajduje się kwarc, oraz prymitywny - ale spełniający swoje zadanie - układ
resetu. Zdecydowanie ciekawiej sprawa wygląda z drugiej strony mikrokontrolera. IC7 to
gniazdo wyświetlacza LCD 2x16 znaków opartego na standardowym sterowniku HD44780 z braku wolnych pinów dane są przesyłane po 4 bity. Dodatkowo do mikrokontrolera
podpięta jest 5-cio przyciskowa klawiatura, oraz dwie diody sygnalizacyjne, w tym jedna
dwukolorowa. Mikrokontroler odbiera i wysyła dane poprzez moduł USART. Sama
transmisja informacji natomiast odbywa się poprzez magistrale EIA485 (ciągle znaną jako
RS485). Zamiast standardowego układu MAX485 (konwerter TTL <=> EIA485)
wykorzystałem tańszy odpowiednik o oznaczeniu SN75176. Układy te są przystosowane do
pacy half-duplex'owej. Mikrokontroler ustawiając logiczną 1 lub 0 na dodatkowym pinie,
określa, czy układ nadaje lub odbiera. Teoretycznie można w ten sposób transmitować na
odległość ponad 1km. W projekcie odległość do sterownika wynosi około 100m. Dodatkowe
układy scalone tworzą konwerter EIA232 <=> EIA485, umożliwiający podpięcie się na
magistralę komputera klasy PC. W założeniu komputer ma czasami zastępować terminal.
Wyjaśnienia wymaga tylko użycie układu scalonego NE555, który z upływającym czasem
jest ciągle powszechnie używany. Pracuje on jako przerzutnik monostabilny wyzwalany
sygnałem danych odbieranych z portu szeregowego. SN5176 działa jako odbiornik i przełącza
się na nadawanie tylko w momencie nadejścia danych z MAX232, po czym wraca ponownie
do odbierania. Rysunek nr 2 przedstawia schemat montażowy urządzenia, oraz płytkę
terminala zaprojektowaną w programie Eagle 4.
Rys. nr 2: Płytka terminala i konwertera EIA232/EIA485 wraz ze schematem montażowym.
Klawiatura, diody i wyświetlacz LCD zostały podpięte do płytki poprzez złącze PIN 2x10.
Część odpowiedzialna za współprace układu z komputerem została oddzielona ostatecznie od
terminala ze względu na elastyczność. Mając taką przystawkę podpiętą do magistrali - od
strony sterownika - można podłączyć ją do laptopa i obserwować pomiary z czujników, oraz
sterować bezpośrednio jego pracą, bez wymontowywania terminala. Poza tym komputer jest
przewidziany tylko jako dodatkowa opcja, a na stałe będzie podłączony tylko terminal.
Konwerter sygnałów jest jednak ujęty w części poświęconej terminalowi, ponieważ jego
(wraz z komputerem) głównym celem jest tymczasowe zastępowanie terminala.
Wykaz części:
IC1: LM7805
IC2, IC3: SN75176 (SMD)
IC4: MAX232
IC5: NE555
IC6: ATmega8L
IC7: LCD 2x16 (HD44780)
R1: 15kΩ
R2, R3, R5: 750Ω
R4: 120Ω
R6: 3,9kΩ
C1, C2, C7, C10: 100nF
C3, C4: 22pF
C8, C9: 10nF
C11, C12, C13, C14: 10μF
C5: 470μF
C6: 100μF
Q: 8MHz
B1: mostek Gretz’a 1A
D1: BAT43
D2: dwukolorowa LED
D3: LED
TR1: standardowy 9V 1A
F1: bezpiecznik 250mA
X1: gniazdo DSUB9
X2: gniazdo 4xChinch
S1 - S6: microswitch monostabilny
S7: bistabilny
S8: 230V AC bistabilny
gniazdo PIN 2x5
gniazdo PIN 2x10
Z powodu sporej ilości opcji, którymi musiał dysponować terminal, początkowo zakładałem
wykorzystanie mikrokontrolera ATmega16 i sporej klawiatury. Wielkość urządzenia skłoniła
mnie jednak do zaprojektowania czegoś małego, ale mam nadzieję, także funkcjonalnego. Na
rysunku nr 3 widzimy panel przedni terminala.
Rys. nr 3: Panel przedni terminala
Zielony przycisk to zasilanie główne. Szary odpowiada za dołączenie zasilania do
wyświetlacza LCD - ponieważ przez ponad 95% czasu jest on nieużywany, więc można go
odłączyć zmniejszając zużycie energii. Zapalona dioda na symbolu wiatraka informuje, że jest
on w danej chwili włączony. Zielona dioda na symbolu telefonu oznacza nadawanie,
czerwona odbiór, a pomarańczowa błąd w transmisji. Na LCD na przemian (co 4s) pojawia
się napis:
CO2:wartość1
RH:wartość2%
T: wartość3 wartość4 wartość5 wartość6 wartość7
, oraz:
H:wartość8 FUNKCJA:wartość9 (wartość10)
wartość11
W tej kolejności oznaczają one wartość: dwutlenku węgla, wilgotności, 4 x temperatury,
temperatury na zewnątrz, numeru pieczarkarni, funkcji sterowania (o tym poniżej), oraz
ewentualnie numer błędu. Błędy rozróżniane są tylko dwa: nie ma połączenia ze
sterownikiem, lub sterownik nie ma połączenia z jakimś czujnikiem. Żeby wyjaśnić znaczenie
"wartość11" muszę najpierw przedstawić całe menu terminala. Zielony przycisk klawiatury
wyzwala przerwanie zewnętrzne i wchodzimy do menu. Terminal przestaje zajmować się
wszystkim i bada tylko stan pozostałych 4 przycisków. Strzałkami poruszamy się po menu.
Zielony przycisk służy jedynie do potwierdzania nowych ustawień. Struktura menu:
Zielony przycisk
Ustawienia
Nr hali
1
2
PC
Tak
Nie
Sterownik
Timer
Włącz
PWM
Odliczanie
CO2
Temp.
xx:xx
xxxx
xx
xx:xx
xx:xx
Wyłącz
Regu.
Rys. nr 4: Schemat menu terminala.
Żegna nas komunikat: Ustawienia zapisane. Nowe parametry za każdym razem są zapisywane
do pamięci EEPROM. Po resecie, lub chwilowym zaniku napięcia układ sam powróci do
ostatnich ustawień. W przedstawionych wyżej strukturze można odczytywać "wartość11"
jako nastawy sterownika, w postaci konkretnych wartości, natomiast "wartość9" jako
wybraną opcję. Zmontowany układ został przedstawiony na rysunku nr 5.
Rys. nr 5: Zdjęcie uruchomionego modułu terminala.
3) Sterownik
Sterownik miał działać w oparciu o algorytm PID, okazało się jednak, iż warunki panujące w
pieczarkarni nie pozwalają na jego zastosowanie. Przy suficie tunelu - o powierzchni 150m 2 znajduje się podziurawiony foliowy rękaw o średnicy 0.5m, który jest jednym końcem
podłączony do silnika z wiatrakiem o mocy 600W. Nawiew takim rękawem ma sens tylko
wtedy, jeśli dokonuje się cyrkulacja powietrza w całej pieczarkarni, a żeby tego dokonać
silnik musi pracować na 100%. Dlatego ostatecznie sterownik zostanie oparty na regulatorze
dwustawnym. Pisze w czasie przyszłym, ponieważ algorytm sterownika istnieje do tej pory
niestety tylko na papierze. Część schematu odpowiedzialna za sterowanie mocą została
zaczerpnięta z czasopisma Elektronika dla Wszystkich czerwiec 2002 - artykuł poświęcony
kitowi AVT2623. Są tam przedstawione dwie podstawowe metody sterowania urządzeniami
mocy, które obrazuje rysunek nr 6.
Rys. nr 6: Zasada regulacji fazowej i grupowej. Zaczerpnięte z EdW.
W obu metodach - do załączania urządzenia zasilanego napięciem zmiennym 230V wykorzystujemy triak. Regulacja fazowa polega na zmianie opóźnienia załączenia triaka po
przejściu napięcia sieci przez zero. Jest to bardzo prosta i tania metoda, ale jej dużym
mankamentem jest generowanie zakłóceń elektromagnetycznych. Regulację grupową
możemy z dużym przybliżeniem porównać do regulacji PWM stosowaną w obwodach prądu
stałego. Odbiornik energii jest zasilany grupami przebiegów sinusoidalnych, załączanych w
momencie przejścia napięcia sieci przez zero. Metoda jest teoretycznie wolna od zakłóceń
elektromagnetycznych jednak jest ona przeznaczona tylko do urządzeń grzewczych. Żeby
wykorzystać ją do sterowania silników prądu zmiennego, należy zadać duży krok powyżej
10%. Część elektroniczna została pokazana na rysunku nr 7. Górna część to standardowy
układ zasilający. W środku znajduje się układ detekcji przejścia napięcia sieci przez zero.
Mostek Gretz'a i dioda Zenera 15V tworzą dodatkowy układ zasilający. Tranzystor T2 nie
przewodzi tylko wtedy, kiedy napięcie sieci jest niższe od około 1,2V. Dioda w strukturze
transoptora włącza się tylko na krótki moment generując szpilki o częstotliwości 100Hz
podawane na nóżkę mikrokontrolera. Na samym dole widzimy typowy układ sterowania
triakiem podłączany bezpośrednio do mikrokontrolera poprzez optotriak, którego zadaniem
jest izolacja galwaniczna części cyfrowej od obwodu sieci. Taki układ pozwala na
zaimplementowanie cyfrowego algorytmu PID. W przypadku jednak regulacji dwustawnej gdzie czasy przełączania będą rzędu minut - stosowanie układu detekcji przejścia napięcia
sieci przez zero wydaje się bezcelowe. Dlatego w projekcie ograniczę się do zastosowania
pary triak-optotriak, na każdą pieczarkarnię. Schemat ideowy jest w zasadzie identyczny jak
terminala z tym, że zamiast wyświetlacza LCD i klawiaturki mamy dwie pary triaków.
Rys. nr 7: Schemat ideowy modułu sterowania dmuchawą. Zaczerpnięte z EdW.
Na koniec pozostaje zająć się kwestią oczujnikowania. W przypadku temperatury
mamy bardzo szeroki asortyment spowodowany tym, iż są one najczęściej używane
i ich techniki wytwarzania są najbardziej rozwinięte. Ja wybrałem układy firmy
Dallas DS18b20. Są to cyfrowe termometry oparte na magistrali 1-wire.
Teoretycznie można oddalić czujniki na odległość kilkudziesięciu metrów - tutaj
będą one oddalone o około 20m. Zaletą takiego rozwiązania jest podłączenie
wszystkich czujników na jednym przewodzie podciągniętym do zasilania
rezystorem 4,7kΩ. Obrazuje to rysunek nr 8.
Rys. nr 8: Schemat podłączenia czujników temperatury DS18b20.
Cała trudność polega na odpowiednim oprogramowaniu mikrokontrolera. Najpierw trzeba
napisać funkcję odczytujące unikalne numery każdego układu. Potem dopiero można
odpytywać poszczególne układy i otrzymywać informację na temat temperatury. Czujniki są
skalibrowane i posiadają rozdzielczość 0.1oC. Ich cena wynosi zaledwie 5zł. Czujniki cyfrowe
mierzące wilgotność względną powietrza kosztują ponad 100zł i działają na troszkę innej
magistrali danych. Dlatego zdecydowałem się na dużo tańszy czujnik analogowy odporny na
kondensacje pary wodnej RHU1050. Zostanie on podłączony do cyfrowego przetwornika A/C
DS2450, dedykowanego magistrali 1-wire. Tym sposobem nie będzie konieczna programowa
obsługa innej magistrali danych, ani wbudowanego w mikroprocesor przetwornika A/C.
Rys. nr 9: Sposób podłączenia czujnika RHU1050.
Największy problem stanowiło jednak znalezienie odpowiedniego czujnika badającego
stężenie CO2 w powietrzu. Najtańsze czujniki elektrochemiczne w cenie cyfrowych
czujników wilgotności, charakteryzują się 20% błędem i małą odpornością na czas - powinny
być co jakiś czas ponownie kalibrowane. Dodatkowo nie są one odporne na kondensację pary
wodnej. Jedynym sensownym rozwiązaniem w przypadku produkcji grzybów - gdzie stężenie
CO2 ma duży wpływ na szybkość dojrzewania - jest zastosowanie czujników NDIR (NonDispersive InfraRed). Są to czujniki dużo dokładniejsze od elektrochemicznych i ponieważ do
pomiaru CO2 zastosowano - jak sama nazwa wskazuje - podczerwień, są one odporne na
kondensację pary wodnej. Metoda pomiaru (rysunek nr 9) polega na wykorzystaniu
chemicznych właściwości niektórych gazów.
Rys. nr 10: Metoda pomiaru stężenia CO2 podczerwienią.
Okazuje się, że pewne gazy nie przepuszczają określonego pasma podczerwieni. Każdy taki
gaz blokuje pewną specyficzna długość fali. Czym większe stężenie gazu, reagującego na
daną długość fali, tym mniej promieniowania dociera do czujnika. Czujniki CO2 to tak
naprawdę zwykłe odbiorniki podczerwieni z określonym filtrem. Ponieważ dioda nadawcza
może być ulokowana w różnej odległości, pod różnymi kątami, oraz dochodzą czynniki
zakłócające, należy na początku skalibrować układ. Najlepszym rozwiązaniem wydaje się
zamontowanie całego toru podczerwieni w specjalnej zaciemnionej rurce i okresowe
przepompowywanie powietrza mechanizmem z pompki do mierzenia ciśnienia za 30 zł.
PerkinElmer oferuje kilka rodzajów czujników NDIR - najtańsze za 180zł. Producent
proponuje od razu wstępny projekt wzmacniacza dla tego typu czujników - rysunek nr 10.
Rys. nr 11: Proponowany schemat bloku wzmacniającego sygnał z czujnika.
Ja zdecydowałem się na model TPS2534. Projekt wzmacniacza wymaga jeszcze
wykalibrowania. Wyjście zostanie połączone ze wspomnianym już przetwornikiem A/C firmy
Dallas. Kostka ta posiada 4 wejścia, ale każde z wejść można zaprogramować jako wyjście
cyfrowe, co mam zamiar wykorzystać do włączania pompki przepompowującej powietrze
przez rurkę z czujnikiem CO2.
4) Oprogramowanie
Program na terminal został napisany w asemblerze. Zostawiłem tylko te funkcje, które będą
przydatne do przedstawienia projektu. Terminal ignoruje żądanie pomiaru. W razie
wystąpienia błędu na szynie 1-wire zapala się czerwona dioda. Przy odebraniu każdego bajtu
danych na chwile zapala się zielona dioda. Na wyświetlaczu jest zawsze wynik ostatniego
pomiaru. Listing:
.INCLUDE "m8def.inc"
.EQU SYS_FREQ
= 8
.EQU K_LCD
= DDRC
.EQU O_LCD
= PORTC
.EQU LCD_RS
= 0
.EQU LCD_EN
= 1
.EQU LCD_DB4
= 5
.EQU LCD_DB5
= 4
.EQU LCD_DB6
= 3
.EQU LCD_DB7
= 2
.CSEG
.ORG 0
rjmp Reset
.ORG URXCaddr
rjmp Odebrany
Powitanie:
.db "Reg", POL_S, "pieczarkarni
PODOLEWSKI 2008", ZNAK_KONCA
Spacje:
.db "
", ZNAK_KONCA
Stopnie: .db "", POL_K, "C
", ZNAK_KONCA
Reset:
cli
ldi R17, high(RAMEND)
ldi R16, low(RAMEND)
out SPH, R17
out SPL, R16
ldi R16, 0b00111111
out DDRC, R16
ldi R16, 0b01110100
out DDRD, R16
ldi R16, 0b00000111
out PORTB, R16
ldi R16, 0b10001100
out PORTD, R16
rcall
Ini_LCD
ldi ZH, high(Polskie_znaki<<1)
ldi ZL, low(Polskie_znaki<<1)
rcall
Zapisz_CGRAM
ldi ZH, high(Powitanie<<1)
ldi ZL, low(Powitanie<<1)
rcall
Pokaz_ciag_LCD
ldi R16, high(51) ; 9600bps
out UBRRH, R16
ldi R16, low(51)
out UBRRL, R16
ldi R16, (1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(1<<TXCIE)
out UCSRB, R16
ldi R16, (1<<URSEL)|(0<<UMSEL)|(0<<USBS)|(1<<UPM1)|
(1<<UCSZ1)|(1<<UCSZ0)
out UCSRC, R16
ldi R20, 0
cbi PORTD,
PD2
; sterowanie duplexem
sei
Main:
;pusto poniewaz program dziala na przerwaniach
rjmp Main
.INCLUDE "czekaj_ms.inc"
.INCLUDE "czekaj_us.inc"
.INCLUDE "lcd.inc"
Odebrany:
sbi PORTD, DDD5
ldi R16, 1
ldi R17, 10
rcall czekaj_ms
cbi PORTD, DDD5
rcall UART_receive
reti
UART_receive:
sbis UCSRA,
RXC
rjmp UART_receive
in
R16, UDR
inc R20
ldi R17,
'a'
cpse
R16,
R17
rjmp skok1
ldi R20, 0
;obsluga zdarzenia 'a'
skok1:
ldi R17,
'e'
cpse
R16,
R17
rjmp skok2
ldi R20, 0
;obsluga zdarzenia 'a'
sbi PORTD,
DDD4
skok2:
ldi R17, 1
cpse R20, R17
rjmp skok3
mov R18, R16
skok3:
ldi R17, 2
cpse R20, R17
rjmp skok4
mov R19, R16
ldi R20, 0
cbi PORTD,
DDD4
rcall Czysc_LCD
ldi ZH, high(Spacje<<1)
ldi ZL, low(Spacje<<1)
rcall Pokaz_ciag_LCD
mov R16, R18
rcall Zapisz_LCD
mov R16, R19
rcall Zapisz_LCD
ldi ZH, high(Stopnie<<1)
ldi ZL, low(Stopnie<<1)
rcall Pokaz_ciag_LCD
skok4:
ret
Program sterownika został napisany w języku C. Biblioteka 1-wire została napisana w oparciu
o noty katalogowe firmy Dallas. Sterownik po odebraniu żądania pomiaru, wykonuje go i
wysyła znak 'e' w przypadku nie wykrycia czujnika, lub wartość temperatury w 2 bajtach.
Dodatkowo sterownik ma na stałe wpisaną wartość temperatury przy której ma włączać
triaka. Zamieszczam tylko listing pliku głównego:
#include
#include
#include
#include
#define
#define
#define
#define
<avr/io.h>
<avr/interrupt.h>
<avr/iom8.h>
"one_wire.inc"
CPU_Hz
BAUD
UBRR_
ZAROWKA_
8000000ul
9600ul
CPU_Hz/(16ul*BAUD)-1
27
void UART_TXD(unsigned char data){
while ( !( UCSRA & (1<<UDRE)) );
UDR = data;
}
void UART_INIT(unsigned int ubrr){
DDRD |= _BV(2);
UBRRH = (unsigned char) (ubrr>>8);
UBRRL = (unsigned char) ubrr;
UCSRC = (1<<URSEL)|(0<<UMSEL)|(0<<USBS)|(1<<UPM1)|
(1<<UCSZ1)|(1<<UCSZ0);
UCSRB = (1<<RXEN)|(1<<TXEN);
}
int main(void) {
unsigned char ggg1, msb, lsb, temp, d1, d2, zarowka;
DDRB |= _BV(1);
PORTB |= _BV(1);
// off
PORTB &= ~_BV(0);
//D0 niepodciągnięty (1-wire)
zarowka = ZAROWKA_;
UART_INIT(UBRR_);
while(1){
UCSRB = (1<<RXEN)|(0<<TXEN);
PORTD &= ~_BV(2);
while ( !( UCSRA & (1<<RXC)) );
ggg1=UDR;
if (ggg1 == 'a'){
UCSRB = (0<<RXEN)|(1<<TXEN);
PORTD |= _BV(2);
if (ow_reset() == 0){
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
waitms(250);
//105ms
waitms(250);
waitms(250);
waitms(250);
waitms(250);
waitms(250);
waitms(250);
waitms(250);
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
lsb = read_byte();
msb = read_byte();
lsb = lsb >> 4;
msb &= 0x0F;
msb = msb << 4;
temp = lsb | msb;
d2 = temp / 10 + 48;
UART_TXD(d2);
waitms(250);
d1 = temp % 10 + 48;
UART_TXD(d1);
waitms(250);
if (temp >
PORTB
if (temp <
PORTB
zarowka)
&=~_BV(1);
zarowka)
|= _BV(1);
//histereza 1 stopien
// on
// off
}
else{
d1 = 'e';
UART_TXD(d1);
waitms(250);
}
}
}
return 0;
}
Program na PC został skompilowany przy użyciu g++ ( z opcją -Wall ) w wersji 4.1. W tym
miejscu zamieszczam tylko program, który wysyła żądanie pomiaru i wyświetla na
standardowym wyjściu wynik pomiaru lub 0 w przypadku błędu. Są za to odpowiedzialne 2
funkcje. Pierwsza inicjalizuje port szeregowy, a druga wysyła żądanie pomiaru i odbiera
wartość wysłaną ze sterownika. W tej chwili pisze proste klasy w Qt 4.4 odpowiedzialne za
wizualizację wyników. Kompletny kod przedstawię przy prezentacji sterownika. Listing:
#include
#include
#include
#include
#include
#include
<sys/types.h>
<sys/stat.h>
<fcntl.h>
<unistd.h>
<stdio.h>
<string.h>
#include
#include
#include
#include
<termios.h>
<time.h>
<ctype.h>
<values.h>
int SetCom(int fd){
struct termios tds;
tcgetattr(fd, &tds);
for (int i=0; i < NCCS; i++) tds.c_cc[i] = 0;
tds.c_iflag |= (INPCK | ISTRIP | IGNBRK);
tds.c_iflag &= ~(IXON | IXANY | IXOFF);
tds.c_oflag &= ~OPOST;
tds.c_cflag &= ~(CSTOPB | PARODD | CSIZE);
tds.c_cflag |= CREAD | CLOCAL | CS8 | PARENB;
tds.c_lflag = NOFLSH;
if (cfsetispeed(&tds,B9600)) { printf("*** Blad 2\n");}
if (cfsetospeed(&tds,B9600)) { printf("*** Blad 3\n");}
return tcsetattr(fd,TCSANOW,&tds);
}
int pomiar(int fd2){
int
ilosc, ilosc_odb, hlp, wynik;
char
s, *s1, w1, w2;
s = 'a';
s1 = &s;
if ((ilosc = write(fd2,s1,1)) == 0);
if (ilosc < 0) { printf("Nie mozna wyslac znaku\n");}
hlp=0;
while(hlp<2){
ilosc_odb = read(fd2,s1,1);
if (ilosc_odb == 1){
hlp++;
if(hlp == 1) w1 = *s1;
else w2 = *s1;
if (w1 == 'e'){
w1 = '0';
w2 = '0';
hlp = 2;
}
}
}
wynik = (int(w1)-48)*10+int(w2)-48;
return wynik;
}
int main(){
int fd, wynik2;
if ((fd = open("/dev/ttyS0",O_RDWR | O_NONBLOCK | O_NDELAY)) <
0){
printf("Port COM1 jest niedostepny!\n");
}
SetCom(fd);
fcntl(fd, F_SETFL, FNDELAY);
wynik2 = pomiar(fd);
printf("%d\n", wynik2);
close(fd);
return 0;
}
5) Podsumowanie i perspektywy
Zdaje sobie sprawę z tego, iż dokumentacja jest troszkę uboga. Kompletny moduł sterownika
zamierzam złożyć w wakacje. Zamontowanie urządzenia na obiekcie wiąże się dodatkowo z
wieloma testami, ponieważ sprzęt musi być przede wszystkim niezawodny. Dlatego i tak nie
zdążyłbym napisać kompletnego i przede wszystkim niezawodnego oprogramowania w sesji.
Jeśli cały projekt się sprawdzi to rozważam jeszcze zamianę wyświetlacza LCD na 4x16
znaków, oraz w przypadku dużej awaryjności linii, optoizolacji. Ponieważ okazało się, że
terminal będzie zamontowany w skrzynce na ścianie rozważam też możliwość zamontowania
kontaktronu i kluczy analogowych, które umożliwią automatyczne włączanie i wyłączanie
terminala przy otwieraniu i zamykaniu drzwiczek. Natomiast najważniejszą sprawą w tej
chwili jest napisanie algorytmu identyfikującego podpięte pod magistrale urządzenia, aby
można było podpiąć dowolną ich ilość, oraz zmontowanie płytki z czujnikami wilgotności i
CO2.
6) Bibliografia
−noty
katalogowe poszczególnych producentów,
na www.elektroda.pl,
−czasopisma: Elektronika dla Wszystkich i Elektronika Praktyczna.
−forum