Od kiedy zajmuje się elektronika, każdą wykonaną płytkę PCB wytrawiałem albo w umywalce albo w jakiejś kuwecie (dla kota 🙂 ) dlatego postanowiłem wykonać profesjonalną wytrawiarkę do płytek PCB. Planowanie trwało kilka miesięcy lat i nigdy nie potrafiłem się zmusić aby zrobić kolejny krok. W końcu postanowiłem się za to zabrać i tak powstała moja wytrawiarka. Poniżej zamieszczam pliki projektu z corela, pliki eagle oraz kod źródłowy.
Akwarium
Budowę rozpocząłem od poskładania akwarium do trawienia. Ma ono wymiary (330 x 257 x 30 mm) i mieści około 1,5 litra roztworu. Akwarium zbudowane jest z plexi. Ściana tylna to plexi mleczna gr.5mm, boczne to przezroczyste plexi gr. 10mm, a ściana przednia to również przezroczysta plexi o gr. 5mm. Tylna ściana służy za podświetlenie akwarium. Dokładniej mówiąc za tylną ścianka umieszczonych jest kilka pasków taśmy LED (przyklejonych do tylnej ściany obudowy).
W bocznych ściankach akwarium wycięte są otwory o średnicy 10mm w których umieszczone są szklane rurki (rurki pochodzą z grzałek do piekarników – zakupiłem kilka takich razem z grzałką). W górnej rurce umieszczony jest czujnik temperatury, natomiast w dolnej – grzałka. Po bokach akwarium, w celu dociśnięcia oringów uszczelniających szklane rurki dołożone zostały kawałki plexi które dla pewności zostały uszczelnione LOCTITE (klejem do uszczelniania silników) a później przykręcone do bocznych ścianek. Nie dodawałem kolejnej rurki która miała by służyć za napowietrzanie. Zamiast tego w dolnej ściance akwarium, która jest grubości 10mm postanowiłem wywiercić (prawie przez całą długość) bardzo długi otwór (fi 4mm) a od góry tego otworu co 20mm dziurki wiertłem 0,7mm. Bardzo fajnie służy to za napowietrzanie roztworu a do tego w przypadku zlewania płynu z akwarium poprzez rurkę roztwór w całości przez nią się zlewa. Ciężko to wszytko wyjaśnić słowami – zachęcam do obejrzenia zdjęć i filmiku.
Obudowa
Obudowa wykonana jest z czarnej plexi grubości 5mm. Założenia projektowe były takie aby obudowa była zrobiona ze plexi 3mm ale panowie w sklepie gdzie ją zamawiałem pomylili grubości. Skutkowało to tym że dostałem plexi 5mm i niestety musiałem niektóre elementy skracać. Teraz uważam że dobrze się stało bo plexi 5mm jest solidniejsza i cała obudowa (pomimo że jest troszkę cięższa) lepiej się prezentuje .
Boczne ściany obudowy wyszlifowałem papierem ściernym aby ładnie zamaskować miejsce klejenia. W bocznej prawej ścianie umieszczony jest wyłącznik oraz gniazdo do podłączenia przewodu zasilającego. Tylna plexi jest przykręcona na kilkanaście śrub M3. Wyfrezowane są w niej także otwory na których całą wytrawiarka może wisieć np. na ścianie. Przednia strona obudowy posiada otwory na umieszczenie przycisków oraz diod sygnalizacyjnych czy też wyświetlacza temperatury. Jest w niej także wywiercony otwór przez który wyprowadzony jest zaworek z wężykiem do spuszczania roztworu do zewnętrznego pojemnika.
Na dole przedniej ściany obudowy po obu stronach wywiercone są otwory – przechodzą one przez całą grubość wytrawiarki na ścianę tylną. Otwory te przeznaczone są do mocowania nóżek. Przekłada się przez nie jedną część nogi a z drugiej strony przykręca część drugą. Długo myślałem jak wykonać ewentualne nogi lub mocowanie aby wytrawiarka (która jest stosunkowo wąska) bezpiecznie stała na stole i takie rozwiązanie wydało mi się najrozsądniejsze.
Panel czołowy / przyciski:
Panelem czołowym jest przezroczysta samoprzylepna folia na której nadrukowane są opisy. Dodatkowo w calu eliminacji ewentualnego starcia napisów a od strony druku naklejona jest kolejna przezroczysta folia. Zapewnia to ochronę przez ścieraniem napisów. Białe tło panelu czołowego wykonane jest z samoprzylepnego papieru. Kolejność sklejania folii oraz papieru aby wykonać panel czołowy jest następująca: (od spodniej strony)
- Samoprzylepny papier w którym wycięte są otwory w miejscach gdzie mają być przyciski oraz diody sygnalizacyjne i wyświetlacz temperatury, (najpierw nadrukowałem sobie obrys tych elementów i dopiero wyciąłem je z papieru,
- Przezroczysta folia samoprzylepna na której nadrukowane są opisy.
- Przezroczysta folia samoprzylepna w celu ochrony opisów przed ścieraniem.
Całość bardzo ładnie się prezentuje i daje pełny komfort użytkowania.
Przyciski: Planowałem wykonać przyciski z mlecznej transparentnej plexi do których w miejscach styku z mikro przyciskami doklejone byłyby elementy dystansujące. Ale pomysł okazał się trudny do wykonania technicznie. Dlatego poprosiłem kolegę o wydrukowanie przycisków na drukarce 3D. Okazał się to trafny wybór bo znacznie ułatwiło mi to pracę a do tego przyciski są idealnie spasowane z obudową. Do przycisków nie są wymagane żadne elementy sprężynujące. Za pełne cofanie się przycisku wystarczy stopień odbijania mikro wyłączników oraz to że przyciski przyklejone są do folii panelu czołowego.
Elektronika (schematy, PCB, połączenia)
Wytrawiarka została wykonana w całości wg. mojego pomysłu i projektu. Jedyną rzeczą co do której nie mogę sobie w pełni rościć praw to kod źródłowy mikro-kontrolera. Niestety nie mam jeszcze takiej wiedzy i dostatecznego doświadczenia w programowaniu abym nie musiał się w pewnych sytuacjach posiłkować dostępnymi w internecie pomocami. Korzystałem przede wszystkim z pomocy i wiedzy zawartej na stronie http://www.mirekk36.blogspot.com (myślę że autor się nie obrazi że wstawiam tu odnośnik do jego strony 🙂 ).
Poniżej zamieszczam schemat ideowy, projekt obu PCB oraz kod źródłowy programu.
Schemat ideowy (w sekcji ZASILANIE umieszczony jest prostokąt opisany jako Ładowarka 12v / 1A – jest to fabryczna płytka zasilacza / ładowarki do detektorów gazów niebezpiecznych posiadająca właśnie takie parametry [12V/1A] i do tego z zabezpieczeniem przeciw zwarciowym. Mam takich ładowarek kilkanaście i są idealne do zasilania różnych urządzeń).
PCB (płytki drukowane wykonywałem metoda termo transferu a wytrawiały się w akwarium tej wytrawiarki. Po sklejeniu akwarium musiałem sprawdzić jego szczelność więc zamontowałem grzałkę, podłączyłem napowietrzacz oraz czujnik temperatury z multimetra i przeprowadziłem proces trawienia.)
Kod źródłowy (Kod źródłowy nie jest powalający. Jestem przekonany że użyte funkcje, zmienne i w ogóle cały kod można skrócić i napisać prościej i/lub bardziej czytelniej. Jednak programowania dopiero się uczę i taki styl pisania kodu (ze wszystkimi opisami itp.) jest dla mnie zrozumiały. Przy pisaniu kodu korzystam z książek Mirka (http://mirekk36.blogspot.com/), dlatego też w kodzie użyta została jego funkcja do obsługi przycisków oraz lekko zmodyfikowana funkcja do obsługi wyświetlacza 7-mio segmentowego.)
Plik c:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 |
/* /* * main.c * * Created on: 26 maj 2016 * Author: WUJEK */ #include <avr/io.h> // dołączenie głównego systemowego pliku nagłówkowego #include <avr/interrupt.h> // dołączenie pl. nagłówkowego potrzebnego do obsł. przerwań #include <avr/pgmspace.h> // dołączenie pl. nagłówkowego potrzebnego do odczytu danych zawartych w pamięci programu FLASH #include <util/delay.h> // dołączenie pl. nagłówkowego potrzebnego do obsł. przerwań #include "main.h" // dołączenie pl. nagłówkowego z informacjami o podlaczonych pinach #include "1Wire/ds18x20.h" // dołączenie pl. nagłówkowego potrzebnego do obslugi czujnika temperatury //#include <avr/wdt.h> //Funkcja SuperDebounce do obsługi pojedynczych klawiszy void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN, uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait, void (*push_proc)(void), void (*rep_proc)(void) ); //___Funkcje które zostaną wywołane gdy wciśnięty zostanie jakiś klawisz void F_TEMP_PLUS(void); void F_TEMP_MINUS(void); void f_A_ALL_OFF(void); void F_ALL_OFF(void);//Funkcja wyłączenia WSZYSTKICH przyciskÓW void F_PR_ON(void);//Funkcja załączenia przycisku PR - Przygotowanie roztworu void F_PT_ON(void); void F_T_ON(void); void F_TR_ON(void); void f_led_init(void); void f_led_show(void); void f_termostat(void); void f_napowietrzacz (void); void f_led_swich(void); void f_start_buzzer(uint8_t buzzer, uint16_t buzzer_p_biip, uint16_t buzzer_dl_biip); void f_error(uint8_t kod_error); //Funkcje do obsługi klawisza wł/wy napowietrzacz oraz podswietlenie w trybie ręcznym void F_NAPOWIETRZACZ_ON(void) {NAPOWIETRZACZ_TOG;}//TOG - dlatego aby plynniej wł/wy napowietrzacz void F_NAPOWIETRZACZ_OFF(void) {NAPOWIETRZACZ_OFF;} void F_PODSWIETLENIE_ON(void) {PODSWIETLENIE_TOG;} void F_PODSWIETLENIE_OFF(void) {PODSWIETLENIE_OFF;} //Funkcje wywoływania funkcji zalanie z klawisza superdobleonce void F_ZALANIE(void) {f_error(3);} /*********************************************** ********* * GOWNA FUNKCJA PROGRAMU * *********** ************************************************/ int main(void) { //___Ustawienie kierunkow portow //wyjścia DDRA |= DEBUGER | BUZZER; //ustawienie kierunku pinu portu debuger, buzzera DDRB |= PODSWIETLENIE; //ustawienie kierunku pinu portu podswietlenia DDRC |= LED_PR | LED_PT | LED_T | LED_TR; //diody LED przyciskow DDRD |= GRZALKA | NAPOWIETRZACZ; //ustawienie kierunku pinu portu grzalki, napowietrzacza //wejścia DDRA &= ~(KL_TR_N | KL_TR_P |KL_TR_PLUS | KL_TR_MINUS ); //Potencjometr ustawiania temp, klawisz wł/wy napowietrzacz DDRB &= ~(KL_PR|KL_PT|KL_T|KL_TR); //Klawisze główne DDRD &= ~(CZ_ZALAN);//Czujnik zalania //podciądanie wejśc do VCC PORTA |= KL_TR_N | KL_TR_P |KL_TR_PLUS | KL_TR_MINUS ;//Klawisz wł/wy napowietrzacz PORTB |= KL_PR|KL_PT|KL_T|KL_TR; //Klawisze główne PORTD |= CZ_ZALAN;//Czujnik zalania //___Timer programowy – inicjalizacja przerwania co 10ms TCCR2 |= (1<<WGM21); // tryb pracy CTC TCCR2 |= (1<<CS22);//|(1<<CS21)|(1<<CS20); // preskaler = 1024 OCR2 = 125; // przerwanie porównania co 1000ms TIMSK |= (1<<OCIE2); // Odblokowanie przerwania CompareMatch //___Uruchomienie ADC //wewnętrzne napiecie odniesienia 2,56V //tryb pojedynczej konwersji //preskaler 128 // //wejście PIN7 // //wynik do prawej |(1<<MUX2) | (1<<MUX1)| (1<<MUX0); //Ustawienie wejścia pomiaru na PIN7 // ADCSRA = (1<<ADEN) |(1<<ADIE) //właczenie ADC | włączenie przerwań // |(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) //preskaler 128 // |(1<<ADSC); //Uruchomienie pierwszej konwersji // ADMUX = (1<<REFS1) | (1<<REFS0) //Ustawienie wewnętrznego napiecia odniesienie 2,56 // |(1<<MUX2) | (1<<MUX1)| (1<<MUX0); //Ustawienie wejścia pomiaru na PIN7 f_led_init(); //Wywołanie funkcji wyswietlacza LED sei(); //Zezwolenie na przerwania /********************************************* ********* * GOWNA PETLA PROGRAMU * *********** *********************************************/ while(1){ f_A_ALL_OFF(); f_led_show();//wywołanie funkcji wyświetlacza LED f_termostat();//wywołanie funkcji termostatu f_napowietrzacz ();//wywołanie funkcji napowietrzacza SuperDebounce(&k9, &PIND, CZ_ZALAN, 5, 500, F_ZALANIE, F_ZALANIE ); if(OK){//jezeli OK=0; to zablokuj działanie funkcji switch (funkcja){ case 1://funkcja przygotowanie roztworu SuperDebounce(&k1, &PINB, KL_PR, 50, 500, F_PR_ON, F_ALL_OFF ); break; case 2://funkcja przygotowanie trawienie SuperDebounce(&k2, &PINB, KL_PT, 50, 500, F_PT_ON, F_ALL_OFF ); break; case 3://funkcja trawienie SuperDebounce(&k3, &PINB, KL_T, 50, 500, F_T_ON, F_ALL_OFF ); break; case 4://funkcja tryb ręczny SuperDebounce(&k4, &PINB, KL_TR, 50, 500, F_TR_ON, F_ALL_OFF ); SuperDebounce(&k5, &PINA, KL_TR_N, 25, 1000, F_NAPOWIETRZACZ_ON, F_NAPOWIETRZACZ_OFF ); SuperDebounce(&k6, &PINA, KL_TR_P, 25, 1000, F_PODSWIETLENIE_ON, F_PODSWIETLENIE_OFF ); SuperDebounce(&k7, &PIND, KL_TR_PLUS, 25, 1000, F_TEMP_PLUS, F_TEMP_PLUS ); SuperDebounce(&k8, &PIND, KL_TR_MINUS, 25, 1000, F_TEMP_MINUS, F_TEMP_MINUS ); break; default://jeżli zadna funkcja nie pracuje SuperDebounce(&k1, &PINB, KL_PR, 50, 500, F_PR_ON, F_ALL_OFF ); SuperDebounce(&k2, &PINB, KL_PT, 50, 500, F_PT_ON, F_ALL_OFF ); SuperDebounce(&k3, &PINB, KL_T, 50, 500, F_T_ON, F_ALL_OFF ); SuperDebounce(&k4, &PINB, KL_TR, 50, 500, F_TR_ON, F_ALL_OFF ); SuperDebounce(&k6, &PINA, KL_TR_P, 25, 1000, F_PODSWIETLENIE_ON, F_PODSWIETLENIE_OFF ); break; } }//koniec warunku / sprawdzanie błedów }//KONIEC PETLI GLOWNEJ }//KONIEC GOWNEJ FUNKCJI PROGRAMU void F_TEMP_PLUS(void) { tr_temp++; flag_F_TEMP=1; odlicz=5; tr_wysw=1; f_start_buzzer(1,0,50); } void F_TEMP_MINUS(void) { tr_temp--; flag_F_TEMP=1; odlicz=5; tr_wysw=1; f_start_buzzer(1,0,50); } void F_PR_ON(void) { // if(funkcja == 1){return;}//Jeżeli działa już ta funkcja to jej ponownie nie wywołuj tr_wysw=0; temp_zadana = temp_zadana_PR; tryb_led=1; czas_funkcji = czas_funkcji_PR; tryb_termostatu = 1; tryb_napowietrzania = 1; f_start_buzzer(1,0,50); SEKUNDA=0; MINUTA=0; funkcja=1; PODSWIETLENIE_ON; } void F_PT_ON(void) { if(funkcja == 2){return;}//Jeżeli działa już ta funkcja to jej ponownie nie wywołuj tr_wysw=0; temp_zadana = temp_zadana_PT; tryb_led=2; czas_funkcji = czas_funkcji_PT; tryb_termostatu = 2; tryb_napowietrzania = 2; f_start_buzzer(1,0,50); SEKUNDA=0; MINUTA=0; funkcja=2; PODSWIETLENIE_ON; } void F_T_ON(void) { if(funkcja == 3){return;}//Jeżeli działa już ta funkcja to jej ponownie nie wywołuj tr_wysw=3; temp_zadana = temp_zadana_T; tryb_led=3; czas_funkcji = czas_funkcji_T; tryb_termostatu = 3; tryb_napowietrzania = 3; f_start_buzzer(1,0,50); SEKUNDA=0; MINUTA=0; funkcja=3; PODSWIETLENIE_ON; } void F_TR_ON(void) { if(funkcja == 4){return;}//Jeżeli działa już ta funkcja to jej ponownie nie wywołuj // tr_wysw=1; // temp_zadana = temp_zadana_TR; //nie ma domyślnej temp zadanej w funkcji TR tryb_led=4; // czas_funkcji = czas_funkcji_TR; //Nie ma domyślnego czasu trwania funkcji TR tryb_termostatu = 4; tryb_napowietrzania = 4; f_start_buzzer(1,0,50); SEKUNDA=0; MINUTA=0; funkcja=4; PODSWIETLENIE_ON; } //Funkcja wyłączenia WSZYSTKICH funkcji void F_ALL_OFF(void) { if(funkcja == 0){return;}//Jeżeli działa już ta funkcja to jej ponownie nie wywołuj tr_wysw=0; temp_zadana = 0; tryb_led=0; czas_funkcji = 0; tryb_termostatu = 0; tryb_napowietrzania = 0; osiag_zad_temp = 0; f_start_buzzer(1,0,300); SEKUNDA=0; MINUTA=0; funkcja=0; PODSWIETLENIE_OFF; } //Funkcja automatycznego wyłączenia WSZYSTKICH funkcji void f_A_ALL_OFF(void) { // SuperDebounce(&k9, &PIND, CZ_ZALAN, 500, 500, F_ZALANIE, F_ZALANIE );//na razie nie działa bo cały czas jest zwarte do GND //automatyczne wyłaczanie funkcji po upłynieciu określonego czasu od osiągnięcia temp. if(osiag_zad_temp) { if(licz_czas_funkcji == czas_funkcji){ licz_czas_funkcji = 0; F_ALL_OFF(); //wyłaczenia funkcji } } // if(PIND & (1<<CZ_ZALAN)){DEBUGER_ON;}else {DEBUGER_OFF;} } /*___Funkcja SuperDebounce do obsługi pojedynczych klawiszy *************** * AUTOR: Mirosław Kardaś * ZALETY: * - nie wprowadza najmniejszego spowalnienia * - posiada funkcję REPEAT (powtarzanie akcji dla dłużej wciśniętego przycisku) * - można przydzielić różne akcje dla trybu REPEAT i pojedynczego kliknięcia * - można przydzielić tylko jedną akcję wtedy w miejsce drugiej przekazujemy 0 (NULL) * * Wymagania: * Timer programowy utworzony w oparciu o Timer sprzętowy (przerwanie 100Hz) * * Parametry wejściowe: * * *key_state - wskaźnik na zmienną w pamięci RAM (1 bajt) - do przechowywania stanu klawisza * *KPIN - nazwa PINx portu na którym umieszczony jest klawisz, np: PINB * key_mask - maska klawisza np: (1<<PB3) * rep_time - czas powtarzania funkcji rep_proc w trybie REPEAT * rep_wait - czas oczekiwania do przejścia do trybu REPEAT * push_proc - wskaźnik do własnej funkcji wywoływanej raz po zwolenieniu przycisku * rep_proc - wskaźnik do własnej funkcji wykonywanej w trybie REPEAT **************************************************************************************/ void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN, uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait, void (*push_proc)(void), void (*rep_proc)(void) ) { enum {idle, debounce, go_rep, wait_rep, rep}; if(!rep_time) rep_time=20; if(!rep_wait) rep_wait=150; uint8_t key_press = !(*KPIN & key_mask); if( key_press && !*key_state ) { *key_state = debounce; Timer1 = 15; } else if( *key_state ) { if( key_press && debounce==*key_state && !Timer1 ) { *key_state = 2; Timer1=5; } else if( !key_press && *key_state>1 && *key_state<4 ) { if(push_proc) push_proc(); /* KEY_UP */ *key_state=idle; } else if( key_press && go_rep==*key_state && !Timer1 ) { *key_state = wait_rep; Timer1=rep_wait; } else if( key_press && wait_rep==*key_state && !Timer1 ) { *key_state = rep; } else if( key_press && rep==*key_state && !Timer1 ) { Timer1 = rep_time; if(rep_proc) rep_proc(); /* KEY_REP */ } } if( *key_state>=3 && !key_press ) *key_state = idle; } //___Funkcja wykonująca są podczas wystąpienia błędu void f_error(uint8_t kod_error) { F_ALL_OFF();//wyłaczenie wszystkich funkcji tryb_led=5; //wygaszenie wszystkich klawiszy tr_wysw = 2; if(kod_error == 1) {led_1 = 11; led_2 = 1;} //Kod błędu F1 - błąd / uszkodzenie czujnika if(kod_error == 2) {led_1 = 11; led_2 = 2;} //Kod błędu F2 - błąd / uszkodzenie grzałki if(kod_error == 3) {led_1 = 11; led_2 = 3;} //Kod błędu F3 - błąd / zalanie f_start_buzzer(1,0,1000); //Ustawienie czasu buzzera / bardzo długi biiiip OK = 0; //zablokowanie pętli głównej programu if(kod_error > 0){return;}//Jeżeli działa już ta funkcja to jej ponownie nie wywołuj } //___Definicja funkcji inicjalizującej pracę z wyświetlaczem multipleksowanym oraz czujnika temperatury void f_led_init(void) { LED_DATA_DIR = 0xFF; // wszystkie piny portu C jako WYJŚCIA(katody) LED_DATA = 0xFF; // wygaszenie wszystkich katod – stan wysoki ANODY_DIR |= ZNAK1 | ZNAK2; // 4 piny portu A jako WYJŚCIA (anody wyświetlaczy) ANODY_PORT |= ZNAK1 | ZNAK2; // wygaszenie wszystkich wyświetlaczy - anody } //___Definicja funkcji wyświetlającej temperaturę na LED void f_led_show(void){ //Obsługa czujnika temperatury - sprawdzamy ile czujników widocznych jest na magistrali czujniki_cnt = search_sensors(); //___Bieżące sprawdzanie temperatury - wysłanie zapytania do czujnika DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL ); //___Bieżące sprawdzanie temperatury - odczyt danych z czujnika i przypisanie do zmiennej if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &subzero, &cel, &cel_fract_bits) ){} else f_error(1); aktualna_temp = cel; //przypisanie aktualnej temp do zmiennej //Ustawienie trybu wyświetlenia temperatury (z czujnika, z ADC, lub z funkcji obsługi błędów) switch (tr_wysw){ case 1: //obsługa w trybie recznym dziesiatki = tr_temp / 10;; jednosci = tr_temp % 10; kropka=1; //zapal kropkę na wyświetlaczu break; case 2: //obsługa z funkcji błędów dziesiatki = led_1; jednosci = led_2; kropka=1; //zapal kropkę na wyświetlaczu break; default: //obsługa z czujnika temperatury kropka=0; if(funkcja){ dziesiatki = cel / 10; jednosci = cel % 10; }else{ if(MRYGACZ){ dziesiatki = cel / 10; jednosci = cel % 10; }else{ dziesiatki = 0; jednosci = 11; } } break; } } //___Definicja funkcji termostatu void f_termostat(void) { switch (tryb_termostatu){ case 1: //obsługa w funkcji przygotowanie roztworu (PR) if (!osiag_zad_temp && (aktualna_temp < temp_zadana + histeraza) ) { GRZALKA_ON; } else { GRZALKA_OFF; osiag_zad_temp=1;} if(!osiag_zad_temp && MINUTA == czas_do_awari_grzalki) f_error(2);//wywołaj funkcję błedu jeśli w ustawionym czasie nie osiagnięto zadanej temp break; case 2: //obsługa w funkcji przygotowanie roztworu (PT) if (aktualna_temp < temp_zadana + histeraza) {GRZALKA_ON; } else {GRZALKA_OFF; osiag_zad_temp=1;} if (osiag_zad_temp){ if(SEKUNDA == 29 || SEKUNDA == 59){flag_1=0;} if((SEKUNDA == 30 || SEKUNDA == 60) && flag_1 == 0){ flag_1=1; f_start_buzzer(3,50,100);} } if(!osiag_zad_temp && MINUTA == czas_do_awari_grzalki) f_error(2);//wywołaj funkcję błedu jeśli w ustawionym czasie nie osiagnięto zadanej temp break; case 3: //obsługa w funkcji przygotowanie roztworu (T) if (aktualna_temp < temp_zadana + histeraza) {GRZALKA_ON; } else { GRZALKA_OFF; osiag_zad_temp=1; if(SEKUNDA == 59){flag_1=0;} if((SEKUNDA == 60) && flag_1 == 0){ flag_1=1; f_start_buzzer(2,50,100);} } if(!osiag_zad_temp && MINUTA == czas_do_awari_grzalki) f_error(2);//wywołaj funkcję błedu jeśli w ustawionym czasie nie osiagnięto zadanej temp break; case 4: //obsługa w trybie ręcznym if (aktualna_temp < tr_temp + histeraza) GRZALKA_ON; else GRZALKA_OFF; break; default: GRZALKA_OFF; break; } } //___Definicja funkcji napowietrzania void f_napowietrzacz (void){ switch (tryb_napowietrzania){ case 1: NAPOWIETRZACZ_ON; break; case 2: //załącz / wyłącz co 15s if( (SEKUNDA > 14 && SEKUNDA < 30) || SEKUNDA > 44) {NAPOWIETRZACZ_OFF;} else NAPOWIETRZACZ_ON; break; case 3: //załącz na co 30s if(SEKUNDA < 30) NAPOWIETRZACZ_ON; else NAPOWIETRZACZ_OFF; break; case 4: //załącz po wcisnieciu klawisza napowietrzania // funkcja uruchamiająca napowietrzacz jest w while break; default: NAPOWIETRZACZ_OFF; break; } } //___Definicja funkcji obsługi led przycisków void f_led_swich(void) { switch (tryb_led) { case 1: //Funkcja przygotowanie roztworu LED_PR_TOG; LED_PT_OFF; LED_T_OFF; LED_TR_OFF; break; case 2: //Funkcja przygotowanie trawienia LED_PR_OFF; LED_PT_TOG; LED_T_OFF; LED_TR_OFF; break; case 3: //Funkcja trawienie LED_PR_OFF; LED_PT_OFF; LED_T_TOG; LED_TR_OFF; break; case 4: //Funkcja trybu ręcznego LED_PR_OFF; LED_PT_OFF; LED_T_OFF; LED_TR_TOG; break; case 5: //Funkcja przygotowanie roztworu LED_PR_OFF; LED_PT_OFF; LED_T_OFF; LED_TR_OFF; break; default: LED_PR_ON; LED_PT_ON; LED_T_ON; LED_TR_ON; break; } } //___Definicja funkcji obsługi buzzera void f_start_buzzer(uint8_t buzzer, uint16_t buzzer_p_biip, uint16_t buzzer_dl_biip){ /* buzzer - ile pikniec buzzera * buzzer_p_biip - długośc przerwy między piknięciami * buzzer_dl_biip - długośc czasu pikniecia buzzera * * czas_buzzera - długiśc generowanego dzwieku buzzera - zmienna volatile obsługiwana w przerwaniu * */ if(flag_2 > 0)return; buzzer_ile = buzzer; //przpisanie ilosci pikniec do zmiennej volatile buzzer_p = buzzer_p_biip+1; //przpisanie ilosci pikniec do zmiennej volatile czas_buzzera = buzzer_dl_biip; //przpisanie ilosci pikniec do zmiennej volatile flag_2 = 1; //ustawienie flagi buzzera aby nie pikał ciągle } //___Funkcja uruchamiająca buzzer co określony czas podczas pracy funkcji ISR(TIMER2_COMP_vect) { //___Obsługa wyświetlacza 7-LED static uint8_t licznik=1; // zmienna do przełączania kolejno anod wyrwietlacza if(licznik==1){ PORTD &= ~(1<<PD7); //zeruje bit 0 portu D - wyłącza wyświetlacz nr 1 PORTD |= (1<<PD6); //ustawia bit 1 portu D - włącza wyświetlacz nr 2 LED_DATA = pgm_read_byte( &cyfry[dziesiatki] ); } else { PORTD &= ~(1<<PD6); //ustawia bit 0 portu D - wyłącza wyświetlacz nr 1 PORTD |= (1<<PD7); //zeruje bit 1 portu D - włącza wyświetlacz nr 2 LED_DATA = pgm_read_byte( &cyfry[jednosci] ); //potrzebne do wyświetlania kropki przy wyswietlaniu temp zadanej z potencjometra if(kropka) LED_DATA &= pgm_read_byte( &cyfry[12] ); } // operacje cyklicznego przesuwania bitu zapalającego anody w zmiennej licznik licznik <<= 1; // przesunięcie zawartości bitów licznika o 1 w lewo if(licznik>2) licznik = 1; // jeśli licznik większy niż 8 to ustaw na 1 //___Obsługa czasu trwania dzwięku generowanego przez buzzer // if(czas_buzzera > 0) {czas_buzzera--; BUZZER_ON; }else{ BUZZER_OFF; } if(buzzer_ile > 0){ if(buzzer_flag2 < 1){buzzer_ile1[buzzer_ile] = czas_buzzera; buzzer_p_biip_v1[buzzer_ile] = buzzer_p;} if(czas_buzzera > 0) {buzzer_flag2 = 1; if(czas_buzzera==1){buzzer_flag=1;} BUZZER_ON;czas_buzzera--;} if(buzzer_p > 0 && buzzer_flag==1){if(buzzer_p==1){buzzer_flag=2;} BUZZER_OFF; buzzer_p--; } if(buzzer_flag==2){ czas_buzzera = buzzer_ile1[buzzer_ile]; buzzer_p = buzzer_p_biip_v1[buzzer_ile]; buzzer_flag=0; buzzer_flag2 = 0; if(buzzer_ile == 1){flag_2=0;} buzzer_ile--;} } //___Odliczanie czasu if(!Timer_sekunda){ Timer_sekunda=1000; f_led_swich(); //wywołanie funkcji obsługi LED przycisków SEKUNDA++; MRYGACZ ^=1; odlicz--; if(SEKUNDA == 60) {SEKUNDA=0; MINUTA++; licz_czas_funkcji++;} if(MINUTA == 60) {MINUTA=0;}//Wyzerowanie minut po upłynięciu godziny if(kod_error > 0) DEBUGER_ON; else DEBUGER_TOG;//mrygaj diodą jeśli ok, jeśli bład to świec ciągle if (flag_F_TEMP==1){if(odlicz == 0){flag_F_TEMP=0; tr_wysw=0;}}//do obslugi wyswietlania ustawien temp w tr recznym } //___Programowy timer uint16_t n,t; n = Timer1; /* 100Hz Timer1 */ if (n) Timer1 = --n; //Timer odliczania sekundy t = Timer_sekunda; if (t) Timer_sekunda = --t; } |
Plik h:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
/* * d_led.h * * Created on: 2010-03-30 * Autor: Mirosław Kardaś * Modyfikacja: Wujek */ #ifndef _main_h // dyrektywy zabezpieczające przed wielokrotnym dołączaniem #define _main_h // tego samego pliku nagłówkowego jeśli będzie dołączany w wielu różnych plikach programu /****************************************************************** * ZMIENNE KUNFUGUROWANE * PRZEZ * UŻYTKOWNIKA *****************************************************************/ uint16_t czas_funkcji_PR = 10;// 10 min uint16_t temp_zadana_PR = 48;// st/C uint16_t czas_funkcji_PT = 5;// 5 min uint16_t temp_zadana_PT = 42;// st/C uint16_t czas_funkcji_T = 15;// 15 min uint16_t temp_zadana_T = 40;// st/C uint8_t tr_temp = 40;//domyslna temp termostatu w TR volatile uint16_t czas_do_awari_grzalki = 25;//25 min ??????????? /****************************************************************** ****************************************************************** *****************************************************************/ //___DEFINICJE STAŁYCH - PRZYPISANIE DO PINÓW PORTÓW //Debuger #define DEBUGER (1<<PA5) //PORT DETEKCJI ZERA #define DEBUGER_ON PORTA |= DEBUGER // makrodefinicja – załączenie DEBUGER #define DEBUGER_OFF PORTA &= ~DEBUGER // makrodefinicja – wyłączenie DEBUGER #define DEBUGER_TOG PORTA ^= DEBUGER // makrodefinicja – zmiana stanu diody DEBUGER /////////////////////////////////////////////////////////////////////////////////////////// //Grzałka #define GRZALKA (1<<PD3) //PORT GRZAŁKI #define GRZALKA_ON PORTD |= GRZALKA // makrodefinicja – załączenie grzałki #define GRZALKA_OFF PORTD &= ~GRZALKA // makrodefinicja – wyłączenie grzałki //Napowietrzacz #define NAPOWIETRZACZ (1<<PD4) //PORT NAPOWIETRZACZA #define NAPOWIETRZACZ_ON PORTD |= NAPOWIETRZACZ //makrodefinicja – załączenie napowietrzacza #define NAPOWIETRZACZ_OFF PORTD &= ~NAPOWIETRZACZ //makrodefinicja – wyłączenie napowietrzacza #define NAPOWIETRZACZ_TOG PORTD ^= NAPOWIETRZACZ //makrodefinicja – cykliczne załączanie napowietrzacza //Buzzer #define BUZZER (1<<PA4) //PORT buzzera #define BUZZER_ON PORTA |= BUZZER //makrodefinicja – załączenie buzzera #define BUZZER_OFF PORTA &= ~BUZZER //makrodefinicja – wyłączenie buzzera #define BUZZER_TOG PORTA ^= BUZZER //makrodefinicja - alarm buzzera //Podświetlenie #define PODSWIETLENIE (1<<PB4) //PORT buzzera #define PODSWIETLENIE_ON PORTB |= PODSWIETLENIE //makrodefinicja – załączenie podswietlenia #define PODSWIETLENIE_OFF PORTB &= ~PODSWIETLENIE //makrodefinicja – wyłączenie podswietlenia #define PODSWIETLENIE_TOG PORTB ^= PODSWIETLENIE //makrodefinicja – cykliczne załączanie podswietlenia //Diody LED przycisków #define LED_PR (1<<PA0) // definicja pinu do którego podłączona jest dioda przycisku - przygotowanie roztworu #define LED_PR_ON PORTA |= LED_PR // makrodefinicja – załączenie led przycisku #define LED_PR_OFF PORTA &= ~LED_PR // makrodefinicja – wyłączenie led przycisku #define LED_PR_TOG PORTA ^= LED_PR // makrodefinicja – zmiana stanu diody przycisku #define LED_PT (1<<PA1) // definicja pinu do którego podłączona jest dioda przycisku - przygotowanie trawienia #define LED_PT_ON PORTA |= LED_PT // makrodefinicja – załączenie led przycisku #define LED_PT_OFF PORTA &= ~LED_PT // makrodefinicja – wyłączenie led przycisku #define LED_PT_TOG PORTA ^= LED_PT // makrodefinicja – zmiana stanu diody przycisku #define LED_T (1<<PA2) // definicja pinu do którego podłączona jest dioda przycisku - trawienie #define LED_T_ON PORTA |= LED_T // makrodefinicja – załączenie led przycisku #define LED_T_OFF PORTA &= ~LED_T // makrodefinicja – wyłączenie led przycisku #define LED_T_TOG PORTA ^= LED_T // makrodefinicja – zmiana stanu diody przycisku #define LED_TR (1<<PA3) // definicja pinu do którego podłączona jest dioda przycisku - tryb ręczny #define LED_TR_ON PORTA |= LED_TR // makrodefinicja – załączenie led przycisku #define LED_TR_OFF PORTA &= ~LED_TR // makrodefinicja – wyłączenie led przycisku #define LED_TR_TOG PORTA ^= LED_TR // makrodefinicja – zmiana stanu diody przycisku //Zmienne do wyświetlacza 7-LED #define LED_DATA PORTC // port z podłączonymi segmentami #define LED_DATA_DIR DDRC // rejestr kierunku portu ANOD wyświetlaczy #define ANODY_PORT PORTD // port z podłączonymi anodami- 4 bity najmłodsze #define ANODY_DIR DDRD // rejestr kierunku portu anod wyświetlaczy #define ZNAK1 (1<<PD7) // ZNAK1 oznacza bit nr.6 portu D - załączanie wyświetlacza #define ZNAK2 (1<<PD6) // ZNAK2 oznacza bit nr.7 portu D - załączanie wyświetlacza #define MASKA_ANODY (ZNAK1|ZNAK2) // Do wyłaczania obu znaków jednocześnie #define SEG_A (1<<0) // Przypisanie portow do segmentow #define SEG_B (1<<1) #define SEG_C (1<<2) // a #define SEG_D (1<<3) // f b #define SEG_E (1<<4) // g #define SEG_F (1<<5) // e c #define SEG_G (1<<6) // d #define SEG_DP (1<<7) #define NIC 10 //Zmienne przyciskow #define KL_PR (1<<PB0) //PRZYCISK - Przygotowanie roztworu #define KL_PT (1<<PB1) //PRZYCISK - Przygotowanie trawienia #define KL_T (1<<PB2) //PRZYCISK - Trawienie #define KL_TR (1<<PB3) //PRZYCISK - Tryb reczny #define KL_TR_N (1<<PA6) //PRZYCISK - Włączanie / Wyłęczanie napowietrzacza w Trybie recznym #define KL_TR_P (1<<PA7) //PRZYCISK - Włączanie / Wyłęczanie podswietlenia w Trybie recznym #define KL_TR_PLUS (1<<PD0) //PRZYCISK - Zwiekszenie temperatury w trybie recznym #define KL_TR_MINUS (1<<PD1) //PRZYCISK - Zmiejszenie temperatury w trybie recznym #define CZ_ZALAN (1<<PD2) //CZUJNIK ZALANIA - pin do ktorego podlaczony jest czujnik zalania //Flagi przycisków volatile uint8_t flag_F_TEMP; //Flaga przycisku - Przygotowanie roztworu //Zmienne potrzebne do działania funkcji SuperDebounce uint8_t k1; // zmienne pomocnicze do przechowywania stanów klawiszy uint8_t k2; uint8_t k3; uint8_t k4; uint8_t k5; uint8_t k6; uint8_t k7; uint8_t k8; uint8_t k9; //Zmienne potrzebne do obsługi timerow programowych volatile uint16_t Timer1,Timer_sekunda, SEKUNDA, MRYGACZ, MINUTA, odlicz; volatile uint16_t licz_czas_funkcji=0;//zmienna potrzebna do zliczania czasu w obsłudze automatycznego zliczania funkcji volatile uint16_t licz_czas_awari=0; volatile uint16_t czas_funkcji = 0;//czas pracy danej funkcji w ms //Zmienna do obsługi buzzera volatile uint8_t buzzer_ile = 0; //ile pikniec buzzera volatile uint16_t buzzer_p = 0; //czas przerwy miedzy piknieciami volatile uint16_t czas_buzzera = 0; //czas pracy buzzera w ms volatile uint16_t buzzer_p_biip_v1[5]; volatile uint16_t buzzer_ile1[5]; volatile uint16_t flag_1 = 0; volatile uint16_t flag_2 = 0; volatile uint16_t buzzer_flag = 0; volatile uint16_t buzzer_flag2 = 0; //Zmienne potrzebne do czujnika //Czujnik podłączony jest do pinu PD5 uint8_t subzero, cel, cel_fract_bits; // znak, stopnie, stopnie po przecinku uint8_t czujniki_cnt; // ilość czujników na magistrali //Zmienne do wyswietlania temperatury volatile uint8_t aktualna_temp; volatile uint8_t temp_zadana = 0; //ustawienie temperatury zadanej do stabilizacji / termostatu volatile uint8_t histeraza = 1; //wartośc histerazy w funkcji termostatu volatile uint8_t osiag_zad_temp = 0; //flaga osiągnięcia zadanej temperatury volatile uint8_t tr_wysw;//tryb wyświetlacza - potrzebne do przełączania trybu wyświetlacza volatile uint8_t tryb_termostatu; volatile uint8_t tryb_napowietrzania; volatile uint8_t tryb_led;//tryb pracy led przycisków volatile uint8_t dziesiatki; volatile uint8_t jednosci; volatile uint8_t led_1; volatile uint8_t led_2; volatile uint8_t kropka=0;//potrzebne do wyswietlenia kropki przy wyswietlaniu temp zadanej z potencjometra //Zmienne potrzebne do obsługi funkcji i warunków volatile uint8_t funkcja; //zmienna potrzebna do obsługi switch volatile uint8_t OK = 1;//potrzebna do blokowania działania programu w przypadku awarii volatile uint8_t kod_error;//zmienna potrzebna do wywoływania fuknji błedów //___Definicja tablicy zawierającej definicje bitowe cyfr LED - do wyświetlacza 7-LED const uint16_t cyfry[16] PROGMEM = { ~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F), // 0 ~(SEG_B|SEG_C), // 1 ~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G), // 2 ~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G), // 3 ~(SEG_B|SEG_C|SEG_F|SEG_G), // 4 ~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G), // 5 ~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G), // 6 ~(SEG_A|SEG_B|SEG_C|SEG_F), // 7 ~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G), // 8 ~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G), // 9 0xFF, // 10 - NIC (puste miejsce) ~(SEG_A|SEG_E|SEG_F|SEG_G), // 11 - Litera "F" ~(SEG_DP) // 12 - kropka }; #endif // koniec _main_h |
Opis działania:
Po załączeniu wytrawiarki przełącznikiem umieszczonym po prawej stronie obudowy na wyświetlaczu temperatury pojawia się aktualna temperatura roztworu a co 1s. wyświetlany jest napis OF informujący o tym że żadna funkcja nie jest uruchomiona. Podświetlone zostają także wszystkie klawisze funkcyjne. W tym momencie wytrawiarka jest gotowa do pracy i można (po zalaniu roztworu do kuwety) uruchomić jakąś funkcję. Można także przyciskając przycisk „Podświetlenie” załączyć podświetlenie kuwety. Po załączeniu jakiejś funkcji przycisk który ją uruchamiał zaczyna migać a reszta przycisków jest wyłączona. Po dłuższym naciśnięciu przycisku uruchomionej funkcji zostaje ona wyłączona. W trybie pracy ręcznej po za wyżej opisanym zachowaniem przycisku funkcyjnego mamy do dyspozycji przyciski regulacji temp. roztworu, przycisk załączania napowietrzania oraz przycisk podświetlenia kuwety. Każda z funkcji po za funkcją pracy ręcznej pracuje w ustalonym na sztywno czasie – zostaje wyłączona. O stanie pracy grzałki oraz napowietrzania informują podświetlane napisy pod wyświetlaczem.
Funkcja „TRAWIENIE” – jest to funkcja do przeprowadzania procesu trawienia PCB. Po jej uruchomieniu roztwór zostaje podgrzany do temp. 40 st.C a napowietrzacz pracuje z częstotliwością co 15s. (15s. załączony, 15s. wyłączony). Podświetlenie zostaje załączone. Na wyświetlaczu wyświetlana jest aktualna temp. roztworu. Ta funkcja wykorzystywana jest do faktycznego procesu trawienia. Po osiągnieciu ustalonej temperatury fukncja odlicza do 15 min. po czym zostaje wyłączona.
Funkcja „PRZYGOTOWANIE ROZTWORU” – jest to funkcja do przeprowadzania mieszania i przygotowania roztworu. Można zalać kuwetę wodą i dodać zgranulowany środek trawiący i przy użyciu tej funkcji całość wymieszać i przygotować do późniejszego użycia. Po uruchomieniu tej funkcji roztwór zostaje podgrzany do temp. 48 st.C a napowietrzacz pracuje w trybie ciągłym. Podświetlenie zostaje załączone. Na wyświetlaczu temp. wyświetlana jest aktualna temp. roztworu. Po osiagnieciu ustalonej temperatury grzałka zostaje wyłączona a napowietrzacz pracuje nadal (w celu schłodzenia roztworu) – po odczekaniu 10 minut funkcja zostaje wyłączona.
Funkcja „PRZYGOTOWANIE TRAWIENIA” – jest to funkcja do przygotowania roztworu przed trawieniem. Po uruchomieniu tej funkcji roztwór zostaje podgrzany do temp. 42 st.C a napowietrzacz pracuje z częstotliwością co 30s. (30s. załączony, 30s. wyłączony). Podświetlenie zostaje załączone a na wyświetlaczu temp. wyświetlana jest aktualna temp. roztworu. Po podgrzani roztworu do temp. 42 st.C i odczekaniu 5 min. funkcja zostaje wyłączona. Po zakończeniu działania tej funkcji można włożyć do kuwety PCB, które ma być wytrawione i uruchomić funkcję TRAWIENIE. Ustawienie w tej funkcji poczatkowej temp. na 42 st. C przyspiesza proces trawienia w pierwszej fazie wytrawiania PCB. Po około 5 min. roztwór schładza się do zalecanej temperatury 40 st. C.
Funkcja „PRZYGOTOWANIE TRAWIENIA” – jest to funkcja do przeprowadzania trawienia na ustawianiach przygotowanych przez użykowanika. Można dowolnie ustawić działanie termostatu w zakresie od 0 do 50 st. C. Włączać lub wyłączać napowietrzenie oraz podświetlenie. W trybie pracy tej funkcji nie jest monitorowany jej czas jej pracy – nie wyłączy się samoczynnie.
Zabezpieczenia:
Po za oczywiście szczelnością kuwety, (sprawdziłem ją poprzez podgrzanie wody nawet do 70 st.C), zabezpieczeniem jest również czujnik zalania. Wykonałem go z zwykłych drutów miedzianych umieszczonych w gąbce która ma ewentualnie chłonąć wyciekający roztwór. (roztwór środka trawiącego dość łatwo przewodzi prąd – dlatego po testach okazało się że nie potrzeba żadnego wzmocnienia sygnału z elektrod). Elektrody (gąbki z drucikami) umieszczone są po obu stronach kuwety oraz pod nią. Nawet niewielka ilość wyciekającego roztworu powinna uruchomić kod błędu – E3 – zalanie.
Kolejnym zabezpieczeniem jest programowe sprawdzanie poprawności działania czujnika temperatury (kod błędu E1) oraz poprawność działania grzałki (E2). Poprawność działania grzałki realizowana jest poprzez sprawdzanie zmian temperatury w czasie. Jeżeli w ciągu 25 min. temperatura nie osiągnie zadanej przez funkcje wartości to zostanie wyświetlony kod błędu.
W każdym przypadku wystąpienie ERROR`U grzałka, napowietrzacz, wszystkie klawisze oraz ich podświetlenie zostają wyłączone.
Poniżaj zamieszczam zdjęcia wykonane w trakcie budowy wytrawiarki:
film