// USB seriova komunikace //================================================ //---------------------------------------------- // test, jestli pres USB seriovou komunikaci prisel nejaky pozadavek void test_ser_kom(void) { if (Serial.available()) { char funkce = Serial.read(); if (funkce == '?') // napoveda pro uzivatelske (bezne) funkce { ser_napoveda1(); } if (funkce == '#') // vstup do podmenu servisnich funkci (malo pouzivane) { servisni_funkce(); } if (funkce == '@') // vstup do podmenu tajnych funkci (prime rizeni systemu) { tajne_funkce(); } // ---- zacatek bloku R30s -- // ---- konec bloku R30s -- #ifndef senzor_nic if (funkce == USB_fce_1_01) //'v' { Serial.print(lng001); // Serial.print("Vlhkost: "); Serial.print(citelna_vlhkost(vlhkost())); Serial.println(" %"); } if (funkce == USB_fce_1_02) //'t' { unsigned int pom_teplota = teplota(false); Serial.print(lng002); // Serial.print("Teplota bez korekce: "); Serial.print(citelna_teplota(pom_teplota)); Serial.println(" 'C"); Serial.print(lng003); // Serial.print("Teplota s korekci podle tabulky: "); Serial.print(citelna_teplota(korekce_teploty(pom_teplota))); Serial.println(" 'C"); } #endif #ifdef senzor_BME if (funkce == USB_fce_1_03) //'p' { Serial.print(lng004); // Serial.print("Absolutni tlak (bez prepoctu na hladinu more): "); Serial.print(citelny_tlak(tlak())); Serial.println(" Pa"); } #endif if (funkce == USB_fce_1_05) // 'z' nastaveni zony (z 0 = SEC; z 1 = SELC) { delay(20); data = Serial.parseInt(); // precte nasledujici cislo (ignoruje pripadnou mezeru) Serial.print(lng005); // Serial.print("Nastavena zona "); if (data == 0) { leto = false; Serial.println(char_zima); // Serial.println("SEC "); } else { leto = true; Serial.println(char_leto); // Serial.println("SELC"); } EEPROM_update(8,leto); } if (funkce == USB_fce_1_04) // 'l' zobraz svetlo (bez korekce i s korekci) { unsigned int pom_svetlo = svetlo_1x(false,false); Serial.print(lng008); // Serial.print("Plosny jas bez korekce: "); Serial.print(pom_svetlo / 1000.0, 3); Serial.println(" mag/arcsec2 "); Serial.print(lng009); // Serial.print("Plosny jas s korekci podle tabulky: "); Serial.print(korekce_svetla(pom_svetlo) / 1000.0, 3); Serial.println(" mag/arcsec2 "); } if (funkce == USB_fce_1_06) // 'a' nastaveni automatickeho mereni { delay(20); byte pomprom = Serial.parseInt(); EEPROM_update(10,pomprom); automat = pomprom; MODdata[45] = automat; // interval automatickeho spousteni if (automat == 0) Serial.println(lng010); // Serial.println("Automat vypnuty"); else { Serial.print(lng011); // Serial.print("Automaticky spoustet mereni po "); Serial.print(automat); Serial.println(" min."); posledni_autospusteni = millis(); // prvni mereni se spusti okamzite mereni(6); } } #ifndef omezeni_funkci_5 if (pocet_cidel_svetla > 1 and funkce == USB_fce_1_07) // 'e' { byte pomprom = Serial.parseInt(); prepni_cidlo_svetla(pomprom); Serial.print(lng012); // Serial.print("Aktualne je aktivni cidlo: "); Serial.println(index_cidla_svetla); } #endif if (funkce == USB_fce_1_12) // 'c' zobrazi aktualni datum a cas { zobraz_RTC(true,true); } if (funkce == USB_fce_1_13) // 'i' informace o systemu (ulozene v EEPROM na adresach 0 az 19 ) { #ifndef omezeni_funkci_3 // tuto funkci je mozne kvuli uspore prostoru v PROGMEM vypnout char znak = Serial.peek(); if (znak == 'x') // specialni funkce pro identifikaci SQM-LU { Serial.println("i,00000002,00000003,00000001,00012345"); // Protocol number, Model number, Feature number,Serial number } else { sys_info(); } #else // protokol pro Unihedron je vypnuty sys_info(); #endif } if (funkce == USB_fce_1_14) // 'h' vypis hlavicky do terminalu pro pripad, kdy se v terminalu zobrazuji jen hodnoty, ale neni videt, co znamenaji { Serial.println(hlavicka); } if (funkce == USB_fce_1_15) // 'm' kompletni mereni s ulozenim do EEPROM (vysledek se nezobrazuje na displeji, jen se odesle do seriove linky) { mereni(4); if(dokoncene_mereni == 2) // mereni dokonceno { Serial.println(hlavicka); Serial.println(vystupni_retezec); } } #ifdef modul_LSM303DLHC if (funkce == USB_fce_1_20) // 'n' zmereni a zobrazeni aktualniho naklonu krabicky { float akt_naklon = (uhel() - 10000); // zjisteni aktualniho uhlu zvetseneho o 1000 stupnu v desetinach stupne a prevod na desetinne cislo Serial.print(lng229); // " Aktualni naklon: " Serial.println(akt_naklon/10.0 ,1); } #endif if (funkce == USB_fce_1_21) // 'x' jedno mereni osvetleni s vystupem v luxech vcetne nastaveni spravneho rozsahu - bez prumerovani { Serial.print(luxometr_1x()); Serial.println( "[lx]"); } #ifdef modul_LSM303DLHC if (funkce == USB_fce_1_22) // 's' zmeri azimut namireni cidla { int hodnota = zjisti_azimut(); Serial.print (lng269); // "Azimut: " Serial.println (hodnota); } #endif #ifndef omezeni_funkci_3 // tuto funkci je mozne kvuli uspore prostoru v PROGMEM vypnout if (funkce == USB_fce_1_24) // 'R ....' vypise posledni zaznam ve formatu pro SQM-LU { vypis_LU(); } #endif // ---------------------------------------------------------------------------- // S M A Z A T !! /* if (funkce == '=') // '=' testovaci vypocty pro svetlo { uint16_t ir, full; double mag_arcsec2; ir = 2158; full = 5320; byte conf = 0b100101; // again = 428.0; atime = 0b101 = 600ms float lux = TSL_calculateLux(conf, full, ir); Serial.print("lux= "); Serial.println(lux); mag_arcsec2 = log10(lux/108000UL)/-0.4; Serial.print("mag_arcsec2= "); Serial.println(mag_arcsec2); } if (funkce == '=') // '=' testovaci astro vypocty { Serial.print("Mistni cas: "); zobraz_RTC(true); astro_vypocty(); Serial.print("GEO sirka: "); Serial.println(GeoLat); Serial.print("GEO delka: "); Serial.println(GeoLon); Serial.print("casova zona: "); byte pomprom = EEPROM_read(8); Serial.print("UTC "); if (pomprom == 0) { if (zimni_posun >= 0) Serial.print('+'); Serial.print(zimni_posun); } else { if (letni_posun >= 0) Serial.print('+'); Serial.print(letni_posun); } Serial.println(' '); Serial.print("Elevace Slunce: "); Serial.println(Slu_elevace-90); Serial.print("Elevace Mesice: "); Serial.println(Mes_elevace-90); Serial.print("Osvetleni Mesice: "); Serial.println(Mes_osvit); Serial.print("Azimut Slunce: "); Serial.println(Slu_azimut); Serial.print("Azimut Mesice: "); Serial.println(Mes_azimut); } */ // ---------------------------------------------------------------------------- if (funkce == USB_fce_1_08) // 'r' cteni hodnot z EEPROM a jejich zobrazeni v terminalu { vypisove_funkce(); } if (funkce == USB_fce_1_16) // 'k' mereni a zobrazeni hodnot bez korekce { bezkorekcni_funkce(); } while (Serial.available()) Serial.read(); // pripadny zbytek dat v prijimacim bufferu se smaze } } //---------------------------------------------- //---------------------------------------------- void vypisove_funkce(void) // funkce zacinala znakem 'r' { delay(10); if (Serial.available()) // za znakem 'r' jeste neco nasleduje { char podfunkce = Serial.read(); if (podfunkce == USB_fce_1_09) // 'rp' = vypise posledni zaznam { vypis_EEPROM(65534,0); } if (podfunkce == USB_fce_1_10) // 'ra' = vypise vsechny zaznamy { vypis_EEPROM(65533,0); } if (podfunkce == USB_fce_1_19) // 'rh' = vypise vsechny zaznamy za poslednich 'cas_hloubka' hodin { unsigned int cas_hloubka = Serial.parseInt(); vypis_EEPROM(65530,cas_hloubka); } if (podfunkce == USB_fce_1_11) // 'rz' = vypise jeden zvoleny zaznam { unsigned int polozka = Serial.parseInt(); vypis_EEPROM(polozka,0); // polozky jsou indexovane od 0 (prvni zaznam na adrese 'min_EEPROM' ma index 0) } #ifndef omezeni_funkci_3 // tuto funkci je mozne kvuli uspore prostoru v PROGMEM vypnout if (podfunkce == USB_fce_1_23) // 'rx' = vypise jeden zvoleny zaznam ve formatu pro SQM-LU { vypis_LU(); } #endif } else // byla volana pouze funkce 'r' (vypis poslednich 100 zaznamu) { vypis_EEPROM(65535,0); } } //---------------------------------------------- //---------------------------------------------- void bezkorekcni_funkce(void) // funkce zacinala znakem 'k' { delay(10); if (Serial.available()) // za znakem 'k' jeste neco nasleduje { char podfunkce = Serial.read(); if (podfunkce == USB_fce_1_17) // 'ks' zobrazeni hodnoty svetla primo z cidla (bez kalibracni korekce) { Serial.print(lng013); // Serial.print("Plosny jas bez kalibracni korekce: "); mereni(8); if(dokoncene_mereni == 2) // mereni dokonceno { unsigned int pom_svetlo = (pole_EEPROM[5] * 256) + pole_EEPROM[6]; Serial.print(citelne_svetlo(pom_svetlo),3); Serial.println(" mag/arcsec2 "); } } #ifndef senzor_nic if (podfunkce == USB_fce_1_18) // 'kt' zobrazeni hodnoty teploty primo z cidla (bez kalibracni korekce) { Serial.print(lng014); // Serial.print("Teplota bez kalibracni korekce: "); unsigned int pom_teplota = teplota(false); Serial.print(pom_teplota); Serial.print(" = "); Serial.print(citelna_teplota(pom_teplota)); Serial.println("'C "); } #endif } } //---------------------------------------------- //---------------------------------------------- void servisni_funkce(void) // funkce zacinala znakem '#' { delay(10); if (Serial.available()) // za znakem '#' jeste neco nasleduje { char podfunkce = Serial.read(); if (podfunkce == '?') // "#?" = napoveda pro servisni funkce { ser_napoveda2(); } if (podfunkce == USB_fce_2_01) // "#T" = nastaveni casu { nastav_RTC(); zobraz_RTC(true); // po nastaveni casu se ulozeny cas hned zobrazi } if (podfunkce == USB_fce_2_02) // "#P" = nastaveni poctu prumerovani { delay(20); int pomprom = Serial.parseInt(); if (pomprom >0 and pomprom < 21) { EEPROM_update(11,pomprom); prumery = pomprom; MODdata[40] = prumery; // pocet prumerovani Serial.print(lng015); // Serial.print("Prumerovat "); Serial.print(prumery); Serial.println(lng016); // Serial.println(" mereni"); } else { Serial.print(lng006); // Serial.print("Vstup mimo rozsah "); Serial.println(lng017); // Serial.println("(1-20)"); } } if (podfunkce == USB_fce_2_03) // "#S" = nastaveni urovne pro vyhodnoceni stabilniho jasu { delay(20); rozhod_stab = Serial.parseInt(); EEPROM_update(16,rozhod_stab); MODdata[43] = rozhod_stab; // rozhodovaci uroven pro stabilni jas Serial.print(lng018); // Serial.print("Rozhodovaci uroven pro stabilni jas je nastavena na "); Serial.print(rozhod_stab / 10.0,1); Serial.println(" %"); } if (podfunkce == USB_fce_2_04) // "#I" = informace o poslednim serizeni casu a o automaticke casove korekci { RTC_info(); } if (podfunkce == USB_fce_2_05) // "#A" = nastaveni SLAVE adresy { delay(20); int pomprom = Serial.parseInt(); if (pomprom >0 and pomprom < 16) { byte puvodni_baudrate = (EEPROM_read(14) & 0b00110000); slave_addr = pomprom; pomprom = pomprom | puvodni_baudrate; EEPROM_update(14,pomprom); Serial.print(lng019); // Serial.print("SLAVE addr: "); Serial.println(pomprom & 0b00001111); MBslave.setID(slave_addr); // zmena ID pro modbusovou komunikaci MBslave.start(); } else { Serial.print(lng006); // Serial.print("Vstup mimo rozsah"); Serial.println(lng020); // Serial.println("(1-15)"); } } if (podfunkce == USB_fce_2_06) // "#C" = zapnuti, nebo vypnuti kontroly prijimaneho CRC bajtu { delay(20); byte param = Serial.parseInt(); byte adresa15 = EEPROM_read(15); // na adrese 15 v EEPROM je krome typu testu CRC ulozena i informace o zamknuti bocniho tlacitka if (param == 0) { pouzij_CRC = 0; Serial.println(lng021); // Serial.println("CRC se nekontroluje"); EEPROM_update(15, (adresa15 & 0b11111100)); // zachovaji se nejvyssi bity a bity 1 a 0 se nastavi na 0b00 } if (param == 1) { pouzij_CRC = 1; Serial.println(lng022); // Serial.println("CRC se testuje"); EEPROM_update(15, ((adresa15 & 0b11111100) | 0b00000001)); // zachovaji se nejvyssi bity a bity 1 a 0 se nastavi na 0b01 } if (param == 2) { pouzij_CRC = 2; Serial.println(lng023); // Serial.println("CRC se testuje, chyby se hlasi do USB seriove linky"); EEPROM_update(15, ((adresa15 & 0b11111100) | 0b00000010)); // zachovaji se nejvyssi bity a bity 1 a 0 se nastavi na 0b10 } } if (podfunkce == USB_fce_2_07) // "#O" = nastaveni oddelovacu pri vystupu zaznamu do terminalu, nebo na SD kartu { nastaveni_oddelovacu(); } if (podfunkce == USB_fce_2_12) // "#F" = format EEPROM { delay(20); if (Serial.available()) { char param = Serial.read(); if (param == USB_fce_2_13) // "#FS" SOFT format EEPROM { soft_format_EEPROM(); } if (param == USB_fce_2_14) // "#FH" HARD format EEPROM { hard_format_EEPROM(); } } } if (podfunkce == USB_fce_2_15) // "#U" = hranice svetla pro ukladani zaznamu { delay(20); int pomprom = Serial.parseInt(); if (pomprom < 255) { EEPROM_update(19,pomprom); hranice_ukladani = pomprom; MODdata[44] = hranice_ukladani; // hranice jasu pro ukladani do EEPROM Serial.print(lng024); // Serial.print("Do EEPROM se budou ukladat zaznamy s hodnotou plosneho jasu vetsi (tmavsi) nez "); Serial.print(hranice_ukladani / 10.0); Serial.println(" mag/arcsec2"); } else { Serial.print(lng006); // Serial.print("Vstup mimo rozsah "); Serial.println(lng025); // Serial.println("(0-255)"); } } if (podfunkce == USB_fce_2_16) // "#K" = zadavani polozek kalibracnich tabulek { delay(20); if (Serial.available()) { char param = Serial.read(); if (param == USB_fce_2_17) // "#KJ" Kalibrace svetla { vstup_kalibrace_svetla(); } if (param == USB_fce_2_18) // "#KT" Kalibrace teploty { vstup_kalibrace_teploty(); } } } if (podfunkce == USB_fce_2_19) // "#E" = Vypis nebo editace prednastavenych pozorovacich stanovist { delay(50); if (Serial.available()) { char param = Serial.read(); if (param == USB_fce_2_20 or param == USB_fce_2_21) // po "#ET" nebo "#EG" nasleduje index pozorovaciho stanoviste { int pomprom = Serial.parseInt(); // ocekava se znak '1' az '5' if (pomprom > 0 and pomprom < 6) // index je v povolenem intervalu 1 az 5 cokoliv jineho rusi funkci a pouze vypise aktualni nastaveni { if (param == USB_fce_2_20) // "#ETn " editace textu { if (Serial.available()) Serial.read(); // prvni znak (mezera) se zahodi byte ukazatel = 0; // ostatni se ulozi do EEPROM while (Serial.available() and ukazatel < 10) // nikdy se ale neprekroci 10 znaku { char param = Serial.read(); if (param < 32 or param > 126 ) param = 32; // mimo ASCII rozsah se nahrazuje znak mezerou EEPROM_write(ukazatel + 485 + (pomprom * 15) , param ); ukazatel++; } while (ukazatel < 10) // doplneni zbytku textu mezerami { EEPROM_write(ukazatel + 485 + (pomprom * 15) , 32 ); ukazatel++; } } if (param == USB_fce_2_21) // "#EGn " editace grafiky { byte ukazatel = 0; while (Serial.available() and ukazatel < 5 ) // uklada se maximalne 5 cisel { byte param = Serial.parseInt(); EEPROM_write(ukazatel + 495 + (pomprom * 15) , param ); ukazatel++; } while (ukazatel < 5) // doplneni zbytku znaku na displeji prazdnymi sedmisegmentovkami { EEPROM_write(ukazatel + 495 + (pomprom * 15) , 0 ); ukazatel++; } } } } } for (byte i = 1; i < 6 ; i++) // na zaver jakekoliv funkce #E se provede vypis { Serial.print (i); Serial.print (" - "); for (byte j = 0; j < 10 ; j++) { Serial.write (EEPROM_read( j + 485 + (i * 15))); } Serial.print (" - "); for (byte j = 0; j < 5 ; j++) { Serial.print (EEPROM_read( j + 495 + (i * 15))); Serial.print (" , "); D_pamet[4-j] = EEPROM_read( j + 495 + (i * 15)); } Serial.println(' '); aktualizuj_displej(); delay(1000); } } #ifdef modul_LSM303DLHC if (podfunkce == USB_fce_2_22) // "#N" = Naklonomer (s kompasem) { delay(20); if (Serial.available()) { char param = Serial.read(); if (param == USB_fce_2_23) // "#Nk" Kalibrace naklonomeru { kalibrace_naklon(); } if (param == USB_fce_2_24) // "#Ni" informace o nastavenych parametrech (offsety, krajni polohy) { naklonomer_info(true); } } } if (podfunkce == USB_fce_2_31) // "#M" = magnetometr (kompas) { delay(20); if (Serial.available()) { char param = Serial.read(); if (param == USB_fce_2_32) // "#Mk" Kalibrace kompasu { kalibrace_magnet(true); // true = vystup do seriove linky } } } #endif if (podfunkce == USB_fce_2_27) // "#X" = Kalibrace luxmetru { delay(20); if (Serial.available()) { char param = Serial.read(); int16_t luxkal = (Serial.parseFloat() + 0.005) * 100.0; // do EEPROM se bude ukladat cislo v rozsahu -32768 az +32767, takze maximalni mozne zadane cislo je +/- 327.67 if (param == USB_fce_2_28) // "#Xa" Kalibrace luxmetru - parametr 'a' { EEPROM_write_int(583,luxkal); } if (param == USB_fce_2_29) // "#Xb" Kalibrace luxmetru - parametr 'b' { EEPROM_write_int(585,luxkal); } if (param == USB_fce_2_30) // "#Xc" Kalibrace luxmetru - parametr 'c' { EEPROM_write_int(587,luxkal); } } lux_kal_a = ((int16_t)EEPROM_read_int(583)) / 100.0; // nacteni kalibracnich konstant pro luxmetr (v EEPROM mohou byt ulozena i zaporna cisla -32768 az +32767) lux_kal_b = ((int16_t)EEPROM_read_int(585)) / 100.0; lux_kal_c = ((int16_t)EEPROM_read_int(587)) / 10000000.0; Serial.print("lux_kal_a = "); Serial.println(lux_kal_a,2); Serial.print("lux_kal_b = "); Serial.println(lux_kal_b,2); Serial.print("lux_kal_c = "); Serial.println(lux_kal_c,7); } } while (Serial.available()) Serial.read(); // pripadny zbytek dat v prijimacim bufferu se smaze } //---------------------------------------------- //---------------------------------------------- void tajne_funkce(void) // funkce zacinala znakem '@' { delay(10); if (Serial.available()) // za znakem '@' jeste neco nasleduje { char podfunkce = Serial.read(); if (podfunkce == '?') // "@?" = napoveda pro tajne funkce { ser_napoveda3(); } #ifndef omezeni_funkci_5 if (podfunkce == USB_fce_3_01) // "@E" = test postupneho prepinani cidel na expanzni desce { prepni_cidlo_svetla(); Serial.print(lng012); // Serial.print("Aktualne je aktivni cidlo: "); Serial.println(index_cidla_svetla); } if (podfunkce == USB_fce_3_02) // "@X" = nastaveni poctu vstupu na expanzni desce (1-7) { unsigned int pomprom = Serial.parseInt(); if (pomprom < 7 and pomprom > 0) { EEPROM_update(17,pomprom); pocet_cidel_svetla = pomprom; Serial.print(lng026); // Serial.print("Zadany pocet vstupu pro cidla na expanzni desce: "); Serial.println(pocet_cidel_svetla); } else { Serial.print(lng006); // Serial.print("Vstup mimo rozsah "); Serial.println(lng027); // Serial.println("(0 az 7)"); } } #endif if (podfunkce == USB_fce_3_03) // "@R" = cteni z EEPROM { unsigned long adresa = Serial.parseInt(); adresa &= 0x1FFFF; // ochrana pred prekrocenim adresy (max = 128kB) byte readbajt = EEPROM_read(adresa); Serial.print("EEPROM["); Serial.print(adresa); Serial.print("] = 0b"); if (readbajt < 128) Serial.print('0'); if (readbajt < 64) Serial.print('0'); if (readbajt < 32) Serial.print('0'); if (readbajt < 16) Serial.print('0'); if (readbajt < 8) Serial.print('0'); if (readbajt < 4) Serial.print('0'); if (readbajt < 2) Serial.print('0'); Serial.print(readbajt,BIN); Serial.print(" = "); Serial.println(readbajt); if (adresa < 131071) { Serial.print("MSB["); Serial.print(adresa); Serial.print("] + LSB["); Serial.print(adresa + 1); Serial.print("] = (unsigned int) "); Serial.println(EEPROM_read_int(adresa)); } } if (podfunkce == USB_fce_3_04) // "@W" = zapis do EEPROM { unsigned long adresa = Serial.parseInt(); long wdata = Serial.parseInt(); adresa &= 0x1FFFF; // ochrana pred prekrocenim adresy (max = 128kB) Serial.print(lng028); // Serial.print(" puvodni: EEPROM["); Serial.print(adresa); Serial.print("] = "); Serial.print(EEPROM_read(adresa)); wdata &= 0xFF; // ochrana pred prekrocenim rozsahu dat (0 az 255) EEPROM_write(adresa, wdata); Serial.print(" <- "); Serial.println(EEPROM_read(adresa)); } if (podfunkce == USB_fce_3_05) // "@D" = obnoveni defaultnich hodnot { delay(20); if (Serial.available()) { char param = Serial.read(); if (param == USB_fce_3_06) // "@DS" obnoveni defaultnich kalibracnich hodnot svetla { default_kalibrace_svetla(); Serial.println(lng029); // Serial.println("Nastaveny defaultni kalibracni hodnoty pro cidlo jasu"); } if (param == USB_fce_3_07) // "@DT" obnoveni defaultnich kalibracnich hodnot teploty { default_kalibrace_teploty(); Serial.println(lng030); // Serial.println("Nastaveny defaultni kalibracni hodnoty pro teplotu"); } if (param == USB_fce_3_08) // "@DP" obnoveni defaultnich programovych konstant { default_parametry(); Serial.println(lng031); // Serial.println("Nastaveny defaultni parametry"); } if (param == USB_fce_3_06 or param == USB_fce_3_07 or param == USB_fce_3_08) // automaticky reset po prenastaveni kalibrace { podfunkce = USB_fce_3_10; } } } if (podfunkce == USB_fce_3_10) // "@@" = softwarovy RESET pres vyprseni WD timeru { SOFT_RESET(); } if (podfunkce == USB_fce_3_11) // "@G" = vypis dat z GPS modulu { delay(20); if (Serial.available()) { char podpodfunkce = Serial.read(); if (podpodfunkce == USB_fce_3_19) // "@Gs nnn" = nastaveni domaci zemepisne sirky pro astro vypocty { float zaokrouhleni; float pomprom = Serial.parseFloat(); if (pomprom <= 90 and pomprom >= -90) { if (pomprom < 0) zaokrouhleni = -0.05; else zaokrouhleni = 0.05; int zapis = ((pomprom + zaokrouhleni) * 10); EEPROM_write_int( eeaddr_GEO_lat , zapis); // zemepisna sirka pro astro vypocty unsigned int obsah_eeprom = EEPROM_read_int(eeaddr_GEO_lat); if (obsah_eeprom > 32767) { obsah_eeprom = 65536 - obsah_eeprom ; GeoLat = obsah_eeprom / -10.0; } else { GeoLat = obsah_eeprom / 10.0; } Serial.print(lng238); Serial.println(GeoLat,1); } else { Serial.println("Err: (-90.0 ... +90.0)"); } } if (podpodfunkce == USB_fce_3_20) // "@Gd nnn" = nastaveni domaci zemepisne delky pro astro vypocty { float zaokrouhleni; float pomprom = Serial.parseFloat(); if (pomprom <= 180 and pomprom >= -180) { if (pomprom < 0) zaokrouhleni = -0.05; else zaokrouhleni = 0.05; int zapis = ((pomprom + zaokrouhleni) * 10); EEPROM_write_int( eeaddr_GEO_lon , zapis); // zemepisna delka pro astro vypocty unsigned int obsah_eeprom = EEPROM_read_int(eeaddr_GEO_lon); if (obsah_eeprom > 32767) { obsah_eeprom = 65536 - obsah_eeprom ; GeoLon = obsah_eeprom / -10.0; } else { GeoLon = obsah_eeprom / 10.0; } Serial.print(lng239); Serial.println(GeoLon,1); } else { Serial.println("Err: (-180.0 ... +180.0)"); } } if (podpodfunkce == USB_fce_3_21) // "@Gz nn" = nastaveni domaci casove zony pro "zimni" cas { int pomprom = Serial.parseInt(); if (pomprom <= 12 and pomprom >= -12) { EEPROM_write( 489 , pomprom + 100); // prepocte se tak, aby se vzdycky ukladalo kladne cislo (pri cteni se 100 hned odecita) zimni_posun = pomprom; MODdata[41] = zimni_posun; // zimni posun casu Serial.print(lng244); // "Casovy posun zima/leto: " Serial.print(zimni_posun); Serial.print(" / "); Serial.println(letni_posun); } else { Serial.println("Err: (-12 ... +12)"); } } if (podpodfunkce == USB_fce_3_22) // "@Gl nn" = nastaveni domaci casove zony pro letni cas { int pomprom = Serial.parseInt(); if (pomprom <= 12 and pomprom >= -12) { EEPROM_write( 490 , pomprom + 100); // prepocte se tak, aby se vzdycky ukladalo kladne cislo (pri cteni se 100 hned odecita) letni_posun = pomprom; MODdata[42] = letni_posun; // letni posun casu Serial.print(lng244); // "Casovy posun zima/leto: " Serial.print(zimni_posun); Serial.print(" / "); Serial.println(letni_posun); } else { Serial.println("Err: (-12 ... +12)"); } } if (podpodfunkce == USB_fce_3_23) // "@Gp SEC SELC" = nastaveni popisku pro zimni a letni casovou zonu { delay(10); byte pozice = 0; // ulozi prvni 4 znaky (popis zimni zony) if (Serial.read() == ' ') { while (Serial.available() and pozice < 4) { char znak = Serial.read(); char_zima[pozice] = znak; char_Xzima[pozice] = znak; EEPROM_write(575 + pozice, znak); pozice ++; } char_Xzima[0] = '_'; byte pozice = 0; // ulozi zbyle 4 znaky (popis letni zony) while (Serial.available() and pozice < 4) { char znak = Serial.read(); char_leto[pozice] = znak; char_Xleto[pozice] = znak; EEPROM_write(579 + pozice, znak); pozice ++; } char_Xleto[0] = '_'; Serial.println(char_zima); Serial.println(char_leto); } else { Serial.print("Err (\"@Gp SEC SELC\")"); } } } else // za prikazem "@G" uz nic nenasledovalo { if (digitalRead(pin_EXT_ZAP) == internal_GPS) // testuje se jen v pripade, je je GPS zasunuta (/zapnuta) { gps(0); // jen zpbrazeni stavu GPS bez jakychkoliv operaci s RTC Serial.print("GPS LAT: "); Serial.print(GPS_lat); Serial.print(" = "); unsigned long pom_prom_gps = GPS_lat; if (pom_prom_gps > 180000000UL) { Serial.println("Err"); } else { if (pom_prom_gps > 90000000UL) { Serial.print("[N] "); pom_prom_gps = pom_prom_gps - 90000000UL; } else { Serial.print("[S] "); } Serial.print(pom_prom_gps/1000000); // cela cast stupnu pom_prom_gps = pom_prom_gps -(1000000 * (pom_prom_gps/1000000)); // vypocet desetinne casti Serial.print('.'); // desetinny oddelovac Serial.println(pom_prom_gps); // desetinna cast } Serial.print("GPS LON: "); Serial.print(GPS_lon); Serial.print(" = "); pom_prom_gps = GPS_lon; if (pom_prom_gps > 360000000UL) { Serial.println("Err"); } else { if (pom_prom_gps > 180000000UL) { Serial.print("[E] "); pom_prom_gps = pom_prom_gps - 180000000UL; } else { Serial.print("[W] "); } Serial.print(pom_prom_gps/1000000); // cela cast stupnu pom_prom_gps = pom_prom_gps -(1000000 * (pom_prom_gps/1000000)); // vypocet desetinne casti Serial.print('.'); // desetinny oddelovac Serial.println(pom_prom_gps); // desetinna cast } Serial.print("GPS ALT: "); Serial.print(GPS_alt); Serial.print(" = "); if (GPS_alt > 10000) { Serial.println("Err"); } else { Serial.print(GPS_alt-500); Serial.println(" [m]"); } Serial.print("GPS satelites: "); Serial.println(pole_GPS_I2C[17]); Serial.print("GPS HDoP: "); if (pole_GPS_I2C[18] == 255 or GPS_alt > 10000) { Serial.println("99.99 (Err)"); } else { Serial.println(pole_GPS_I2C[18] / 10.0); } Serial.print("GPS date time (UTC): "); if (pole_GPS_I2C[11] < 10) Serial.print('0'); Serial.print(pole_GPS_I2C[11]); Serial.print('.'); if (pole_GPS_I2C[10] < 10) Serial.print('0'); Serial.print(pole_GPS_I2C[10]); Serial.print('.'); Serial.print(pole_GPS_I2C[9] + 2000); Serial.print(' '); if (pole_GPS_I2C[12] < 10) Serial.print('0'); Serial.print(pole_GPS_I2C[12]); Serial.print(':'); if (pole_GPS_I2C[13] < 10) Serial.print('0'); Serial.print(pole_GPS_I2C[13]); Serial.print(':'); if (pole_GPS_I2C[14] < 10) Serial.print('0'); Serial.println(pole_GPS_I2C[14]); Serial.print("RTC date time (UTC): "); if (leto == true) casova_zona = letni_posun; else casova_zona = zimni_posun; zobraz_RTC(false); z_LOC_na_Astro_UTC(casova_zona); // z mistnich casovych udaju (LOC_den; LOC_hod ;.....) vypocte UTC datum a cas if (astro_UTC_den < 10) Serial.print('0'); Serial.print(astro_UTC_den); Serial.print('.'); if (astro_UTC_mes < 10) Serial.print('0'); Serial.print(astro_UTC_mes); Serial.print('.'); Serial.print(astro_UTC_rok); Serial.print(' '); if (astro_UTC_hod < 10) Serial.print('0'); Serial.print(astro_UTC_hod); Serial.print(':'); if (astro_UTC_min < 10) Serial.print('0'); Serial.print(astro_UTC_min); Serial.print(':'); if (LOC_sek < 10) Serial.print('0'); Serial.println(LOC_sek); Serial.print("GPS OK cnt: "); Serial.println(pole_GPS_I2C[8]); Serial.print("GPS status: "); Serial.print(pole_GPS_I2C[19]); Serial.print(" (data: "); if ((pole_GPS_I2C[19] & 0b00000001) == 1) Serial.print("OK"); else Serial.print("--"); Serial.print(" ; Time_SET: "); if ((pole_GPS_I2C[19] & 0b00000010) == 2) Serial.print("ON"); else Serial.print("OFF"); if ((pole_GPS_I2C[19] & 0b00000100) == 4) Serial.print(" ; Int."); else Serial.print(" ; Ext."); Serial.println(')'); Serial.print("ver_SW:"); gps_NMEA(2); Serial.println("NMEA:"); Serial.print(' '); gps_NMEA(0); Serial.print(' '); gps_NMEA(1); } else { Serial.println("GPS-OFF"); } } } if (podfunkce == USB_fce_3_12) // "@S n" = nastaveni rychlosti komunikace { // (aaaa = SLAVE adresa) // (0bxx00aaaa = 9600) // (0bxx01aaaa = 19200) // (0bxx10aaaa = 38400) // (0bxx11aaaa = 115200) delay(20); byte baudrate = Serial.parseInt(); if (baudrate < 4) { byte pomprom = EEPROM_read(14) & 0b00001111; // z EEPROM 14 se zachova pouze SLAVE adresa zarizeni baudrate = (baudrate << 4); // zadane baudrate se posune na bity 4 a 5 EEPROM_write(14, (pomprom | baudrate)); // spoji se s puvodni adresou a zapise se zpatky do EEPROM Serial.print("Baudrate: "); Serial.println(pole_baudrate[(baudrate >> 4)]); SOFT_RESET(); } } #ifndef omezeni_funkci_2 // tuto funkci je mozne kvuli uspore prostoru v PROGMEM uplne vypnout if (podfunkce == USB_fce_3_16) // "@/" prepinani moznosti zapisu do souboru "RTC_set.csv" { byte hodnota = EEPROM_read(15); if ((hodnota & 0b01000000) == 0) { hodnota = hodnota | 0b01000000; RTC_SD_DEBUG = true; Serial.println(lng215); // Zapis do 'RTC_set.csv' POVOLEN" } else { hodnota = hodnota & 0b10111111; RTC_SD_DEBUG = false; Serial.println(lng216); // Zapis do 'RTC_set.csv' ZAKAZAN" } EEPROM_write(15,hodnota); } #endif if (podfunkce == USB_fce_3_17) // "@P" povolit / zakazat pipani { byte hodnota = EEPROM_read(15); if ((hodnota & 0b00100000) == 0) { hodnota = hodnota | 0b00100000; mute_tone_bit = true; Serial.println(lng224); // pipani vypnuto } else { hodnota = hodnota & 0b11011111; mute_tone_bit = false; Serial.println(lng223); // Pipani povoleno } EEPROM_write(15,hodnota); tone_X(pin_bzuk,450, 20); // pri zakazanem pipani by mel byt piskak zticha, pri povolenem pipani piskne } #ifndef omezeni_funkci_2 // tuto funkci je mozne kvuli uspore prostoru v PROGMEM uplne vypnout if (podfunkce == USB_fce_3_15) // "@>" vypis souboru se zaznamem nastaveni RTC "RTC_set.csv" pres GPS do seriove linky { RTC_SD_READ(); } #endif if (podfunkce == USB_fce_3_18) // "@*" servisni vypis jednoho zaznamu v hexa formatu { unsigned long hodnota = Serial.parseInt(); Serial.print("adr. ["); Serial.print(hodnota); Serial.print("]: "); for (unsigned long eeaddr = hodnota; eeaddr < (hodnota + delka_zaznamu) ; eeaddr ++) { byte rd_hex = EEPROM_read(eeaddr); Serial.print("0x"); if (rd_hex < 16) Serial.print('0'); Serial.print(rd_hex,HEX); if (eeaddr < (hodnota + delka_zaznamu - 1) ) Serial.print(", "); } Serial.println(' '); } if (podfunkce == USB_fce_3_24) // "@Z" Zapis systemovych parametru na kartu { SD_sysMEM_WRITE(); } if (podfunkce == USB_fce_3_25) // "@O" Obnoveni systemovych parametru z karty { SD_sysMEM_READ(); } } while (Serial.available()) Serial.read(); // pripadny zbytek dat v prijimacim bufferu se smaze } //---------------------------------------------- //---------------------------------------------- // ---- zacatek bloku R30s -- // ---- konec bloku R30s -- //---------------------------------------------- // napoveda pro uzivatelske funkce (casto pouzivane) void ser_napoveda1(void) { Serial.println(lng036); // Serial.println("l ... zmer plosny jas - bez ukladani"); #ifndef senzor_nic Serial.println(lng037); // Serial.println("v ... zmer vlhkost - bez ukladani"); Serial.println(lng038); // Serial.println("t ... zmer teplotu - bez ukladani"); #endif #ifdef senzor_BME Serial.println(lng039); // Serial.println("p ... zmer tlak - bez ukladani"); #endif #ifdef modul_LSM303DLHC Serial.println(lng226); // Serial.println("n ... zobrazit aktualni naklon"); Serial.println(lng268); // Serial.println("s ... smer natoceni (azimut)"); #endif Serial.println(lng245); // Serial.println("x ... zmer osvetleni (lux) - bez ukladani"); Serial.println(lng040); // Serial.println("z 0 ... prepnout na SEC"); Serial.println(lng041); // Serial.println("z 1 ... prepnout na SELC"); Serial.println(lng042); // Serial.println("a nnn ... nastaveni automatickeho spousteni 0-255 minut"); #ifndef omezeni_funkci_5 if (pocet_cidel_svetla > 1) { Serial.println(lng043); // Serial.println("e n ... pri pouziti expanzni desky prepne na zvolene cidlo (1-7)"); } #endif Serial.println(lng044); // Serial.println("r ... vypis poslednich 100 zaznamu z EEPROM"); Serial.println(lng045); // Serial.println("rp ... vypis posledniho zaznamu z EEPROM"); Serial.println(lng046); // Serial.println("ra ... vypis vsech zaznamu z EEPROM"); Serial.println(lng047); // Serial.println("rz nnnnn ... vypis jednoho zvoleneho zazamu"); Serial.println(lng225); // Serial.println("rh nnnnn ... vypsat zaznamy z poslednich 'nnnnn' hodin"); Serial.println(lng048); // Serial.println("c ... aktualni cas"); Serial.println(lng049); // Serial.println("i ... informace o aktualnim nastaveni systemu"); Serial.println(lng050); // Serial.println("h ... zobrazeni hlavicky pro formatovany vystup"); Serial.println(lng051); // Serial.println("m ... spusteni vsech mereni se zapisem do EEPROM"); Serial.println(lng052); // Serial.println("ks ... kalibracni mereni jasu (vystup bez korekce)"); Serial.println(lng053); // Serial.println("kt ... kalibracni mereni teploty (vystup bez korekce)"); Serial.println(lng054); // Serial.println("#? ... napoveda pro servisni funkce"); } //---------------------------------------------- //---------------------------------------------- // napoveda pro servisni funkce void ser_napoveda2(void) { Serial.println(lng055); // Serial.println("#Tyyyymmddhhnnss ... nastaveni casu"); Serial.println(lng056); // Serial.println("#P nn ... nastaveni poctu prumerovani jasu (1-20)"); Serial.println(lng057); // Serial.println("#S nnn ... nastaveni urovne stability (0-255)"); Serial.println(lng058); // Serial.println("#I ... detailni informace o kalibraci vnitrnich hodin"); Serial.println(lng059); // Serial.println("#A nn ... nastaveni SLAVE adresy pro komunikaci (1-15)"); Serial.println(lng060); // Serial.println("#C 0 ... vypnuti CRC kontroly pro RS485"); Serial.println(lng061); // Serial.println("#C 1 ... zapnuti CRC kontroly pro RS485"); Serial.println(lng062); // Serial.println("#O? ... nastaveni oddelovacu"); Serial.println(lng063); // Serial.println("#FS ... SOFT format EEPROM"); Serial.println(lng064); // Serial.println("#FH ... HARD format EEPROM"); Serial.println(lng065); // Serial.println("#U ... hranice jasu pro ukladani - v desetinach mag/arcsec2 (0-255)"); Serial.println(lng066); // Serial.println("#KS n;x;y* ... zapis bodu do kalibracni tabulky jasu"); #ifndef senzor_nic Serial.println(lng067); // Serial.println("#KT n;x;y* ... zapis bodu do kalibracni tabulky teploty"); #endif #ifdef modul_LSM303DLHC Serial.println(lng227); // Serial.println("#Nk ... kalibrace naklonomeru"); Serial.println(lng230); // Serial.println("#Ni ... Info o naklonomeru"); Serial.println(lng266); // Serial.println("#Mk ... kalibrace magnetometru (kompasu)"); #endif Serial.println(lng212); // Serial.println("#E ... vypis pozorovacich stanovist"); Serial.println(lng213); // Serial.println("#ETn text ... editace textu u pozorovacich stanovist"); Serial.println(lng214); // Serial.println("#EGn g,g,g,g,g ... editace grafiky u pozorovacich stanovist"); Serial.println(lng248); // "#Xa nn ... kalibrace luxmetru - parametr 'a'" Serial.println(lng249); // "#Xb nn ... kalibrace luxmetru - parametr 'b'" Serial.println(lng263); // "#Xc nn ... kalibrace luxmetru - parametr 'c'" } //---------------------------------------------- //---------------------------------------------- // napoveda pro tajne funkce void ser_napoveda3(void) { Serial.println(lng068); // Serial.println("@W addr,data ... primy zapis do EEPROM"); Serial.println(lng069); // Serial.println("@R addr ... prime cteni z EEPROM"); #ifndef omezeni_funkci_5 Serial.println(lng070); // Serial.println("@E ... test postupneho prepinani cidel na expanzni desce"); Serial.println(lng071); // Serial.println("@X n ... nastaveni poctu vstupu na expanzni desce (1-7)"); #endif Serial.println(lng072); // Serial.println("@DS ... defaultni kalibracni hodnoty pro jas"); Serial.println(lng073); // Serial.println("@DT ... defaultni kalibracni hodnoty pro teplotu"); Serial.println(lng074); // Serial.println("@DP ... defaultni parametry systemu"); Serial.println(lng076); // Serial.println("@@ ... softwarovy RESET"); Serial.println(lng208); // Serial.println("@G ... vypis dat z GPS modulu"); Serial.println(lng240); // Serial.println("@Gs nnn ... domaci zemepisna sirka pro astro vypocty"); Serial.println(lng241); // Serial.println("@Gd nnn ... domaci zemepisna delka pro astro vypocty"); Serial.println(lng242); // Serial.println("@Gz nn ... domaci zimni casova zona"); Serial.println(lng243); // Serial.println("@Gl nn ... domaci letni casova zona"); Serial.println(lng246); // Serial.println("@Gp SEC SELC ... textovy popis pro zimni a letni casovou zonu"); Serial.println(lng209); // Serial.println("@S n ... rychlost seriove komunikace (0=9600; 1=19200; 2=38400; 3=115200)"); Serial.println(lng222); // Serial.println("@P ... povolit/zakazat pipani #ifndef omezeni_funkci_2 // tyto funkce je mozne kvuli uspore prostoru v PROGMEM uplne vypnout Serial.println(lng217); // Serial.println("@> ... vypis souboru RTC_set.csv"); Serial.println(lng218); // Serial.println("@/ ... povolit/zakazat zapis do souboru RTC_set.csv"); #endif Serial.println(lng270); // Serial.println("@Z ... Zapsat parametry na SD"); Serial.println(lng271); // Serial.println("@O ... Obnovit parametry z SD"); } //---------------------------------------------- //---------------------------------------------- void nastaveni_oddelovacu(void) { delay(20); char funkce = Serial.read(); boolean chyba = true; if (funkce == USB_fce_2_08) // #OO { Serial.print(lng077); // Serial.print("Oddelovac polozek: "); funkce = Serial.read(); if(funkce == '_') // "#OO_" { oddelovac_polozek = 0; Serial.println(lng078); // Serial.println("mezera"); chyba = false; } if(funkce == ',') // "#OO," { oddelovac_polozek = 1; Serial.println(lng079); // Serial.println("carka"); chyba = false; } if(funkce == ';') // "#OO;" { oddelovac_polozek = 2; Serial.println(lng080); // Serial.println("strednik"); chyba = false; } if(funkce == 't') // "#OOt" { oddelovac_polozek = 3; Serial.println(lng081); // Serial.println("tabulator"); chyba = false; } funkce = 'X'; // to jen aby se nevyhodnotila dalsi podminka } if (funkce == USB_fce_2_09) // "#O," { data = Serial.parseInt(); Serial.print(lng082); // Serial.print("Oddelovac desetinnych mist: "); if(data == 1) // "#O,1" { des_carka = true; Serial.println(lng079); // Serial.println("carka"); } else // "#O,0" { des_carka = false; Serial.println(lng083); // Serial.println("tecka"); } chyba = false; funkce = 'X'; // to jen aby se nevyhodnotila dalsi podminka } if (funkce == USB_fce_2_10) // "#O"" { data = Serial.parseInt(); if(data == 1) // "#O"1" { uzavirat_uvozovky = true; Serial.print(lng084); // Serial.print("Uzavirat"); } else // "#O"0" { uzavirat_uvozovky = false; Serial.print(lng085); // Serial.print("Neuzavirat"); } Serial.println(lng086); // Serial.println(" hodnoty do uvozovek"); chyba = false; funkce = 'X'; // to jen aby se nevyhodnotila dalsi podminka } if (funkce == USB_fce_2_11) // "#Oh" { data = Serial.parseInt(); Serial.print(lng087); // Serial.print("Na zacatku souboru se hlavicka vytvaret "); if(data == 1) // "#Oh1" { vytvaret_hlavicku = true; Serial.println(lng088); // Serial.println("bude."); } else // "#Oh0" { vytvaret_hlavicku = false; Serial.println(lng089); // Serial.println("nebude."); } chyba = false; } if (chyba == true) { Serial.println(lng090); // Serial.println("#O,1 ... des. oddelovac: carka"); Serial.println(lng091); // Serial.println("#O,0 ... des. oddelovac: tecka"); Serial.println(lng092); // Serial.println("#O\"1 ... uzavirat polozky do uvozovek"); Serial.println(lng093); // Serial.println("#O\"0 ... neuzavirat polozky do uvozovek"); Serial.println(lng094); // Serial.println("#Oh1 ... vytvaret hlavicky"); Serial.println(lng095); // Serial.println("#Oh0 ... nevytvaret hlavicky"); Serial.println(lng096); // Serial.println("#Oo_ ... oddelovac polozek: mezera"); Serial.println(lng097); // Serial.println("#Oo, ... oddelovac polozek: carka"); Serial.println(lng098); // Serial.println("#Oo; ... oddelovac polozek: strednik"); Serial.println(lng099); // Serial.println("#Oot ... oddelovac polozek: tabulator"); } else { bitWrite(oddelovaci_bajt , 2 , des_carka); bitWrite(oddelovaci_bajt , 3 , uzavirat_uvozovky); bitWrite(oddelovaci_bajt , 4 , vytvaret_hlavicku); oddelovaci_bajt = oddelovaci_bajt & 0b11111100; oddelovaci_bajt = oddelovaci_bajt | oddelovac_polozek ; if (des_carka == true and oddelovac_polozek == 1) Serial.println(lng100); // Serial.println("Varovani: oddelovac polozek i desetinnych mist je carka."); EEPROM_update(9 , oddelovaci_bajt); if (uzavirat_uvozovky == true) uvozovky = '"'; else uvozovky = ' '; if (des_carka == true) desod = ','; else desod = '.'; oddeleni_polozek(); // aktualizace hlavicky (a vystupniho retezce) s novymi oddelovaci polozek } } //---------------------------------------------- //---------------------------------------------- void vstup_kalibrace_svetla(void) { delay(50); // v jednom bloku kalibracnich dat budou maximalne 3 radky tabulky (to je maximalne 3*15 = 45 bajtu, takze se to cele vejde do bufferu ) for (byte i = 0 ; i < 15 ; i++) // vsech 15 pomocnych promennych pro kalibracni tabulku se nastavi mimo rozsah { kal_serial[i][0] = 65535; kal_serial[i][1] = 65535; } while (Serial.available()) { delay(1); byte pozice_v_tabulce = Serial.parseInt(); if (pozice_v_tabulce > 15 or pozice_v_tabulce < 1 ) { Serial.print(lng006); // Serial.print("Vstup mimo rozsah "); Serial.println(lng020); // Serial.println("(1 az 15)"); break; } unsigned int kal_mereno = Serial.parseInt(); if (kal_mereno > 24000) { Serial.print(lng006); // Serial.print("Vstup mimo rozsah "); Serial.println(lng102); // Serial.println("(merena hodnota max 24 mag/arcsec2 = 24000)"); break; } unsigned int kal_skutecne = Serial.parseInt(); if (kal_skutecne > 24000) { Serial.print(lng006); // Serial.print("Vstup mimo rozsah "); Serial.println(lng103); // Serial.println("(skutecna hodnota max 24 mag/arcsec2 = 24000)"); break; } kal_serial[pozice_v_tabulce-1][0] = kal_mereno; // polozky, ktere byly zadane, se prepisi z 65535 na zadane hodnoty (muzou to byt i nuly) kal_serial[pozice_v_tabulce-1][1] = kal_skutecne; if (Serial.available()) { char konec = Serial.read(); // precteni oddelovaciho stredniku nebo hvezdicky if (konec == '*') { Serial.println(lng104); // Serial.println("zadane kalibracni hodnoty pro plosny jas:"); Serial.println(lng105); // Serial.println("pozice - merena hodnota - (mag/arcsec2) - spravna hodnota - (mag/arcsec2)"); unsigned int posun = ((index_cidla_svetla-1) * 60) + 50; // podle aktualniho indexu cidla svetla se zvoli spravna oblast v EEPROM pro kalibracni tabulku for (byte i = 0 ; i < 15 ; i++) { if (kal_serial[i][0] != 65535 ) // ty polozky, ktere byly prepsane z 65535 na neco jineho se zapisi do EEPROM { kal_svetlo[i][0] = kal_serial[i][0]; kal_svetlo[i][1] = kal_serial[i][1]; kal_serial[i][0] = 65535; kal_serial[i][1] = 65535; Serial.print(i+1); Serial.print(" - "); if (kal_svetlo[i][0] * kal_svetlo[i][1] > 0) // obe zadane hodnoty do kalibracni tabulky byly nenulove { EEPROM_write_int(posun + (i * 4) , kal_svetlo[i][0]); EEPROM_write_int(posun + 2 + (i * 4) , kal_svetlo[i][1]); Serial.print( kal_svetlo[i][0]); Serial.print(" - ("); Serial.print( citelne_svetlo(kal_svetlo[i][0]),3); Serial.print(" mag/arcsec2) - "); Serial.print( kal_svetlo[i][1]); Serial.print(" - ("); Serial.print( citelne_svetlo(kal_svetlo[i][1]),3); Serial.println(" mag/arcsec2)"); } else // alespon 1 hodnota v kalibracnim bodu byla nulova, cely kalibracni bod se maze { EEPROM_write_int(posun + (i * 4) , 0); EEPROM_write_int(posun + 2 + (i * 4) , 0); kal_svetlo[i][0] = 0; kal_svetlo[i][1] = 0; Serial.println(lng210); // "kalibracni bod smazan" } } } while (Serial.available()) Serial.read(); // po hvezdicce se vsechno ostatni maze } } } test_korekcni_tabulky_svetla(); // zkontroluje spravne zadane udaje } //---------------------------------------------- //---------------------------------------------- void vstup_kalibrace_teploty(void) { delay(50); // v jednom bloku kalibracnich dat budou maximalne 4 radky tabulky (max 55 bajtu) for (byte i = 0 ; i < 15 ; i++) // vsech 15 pomocnych promennych pro kalibracni tabulku se nastavi mimo rozsah { kal_serial[i][0] = 65535; kal_serial[i][1] = 65535; } while (Serial.available()) { delay(1); byte pozice_v_tabulce = Serial.parseInt(); if (pozice_v_tabulce > 7 or pozice_v_tabulce < 1 ) { Serial.print(lng006); // Serial.print("Vstup mimo rozsah "); Serial.println(lng106); // Serial.println("(pozice 1 az 7)"); break; } unsigned int kal_mereno = Serial.parseInt(); if (kal_mereno > 10000) { Serial.print(lng006); // Serial.print("Vstup mimo rozsah "); Serial.println(lng107); // Serial.println("(merena hodnota max. 50'C = 10000)"); break; } unsigned int kal_skutecne = Serial.parseInt(); if (kal_skutecne > 10000 ) { Serial.print(lng006); // Serial.print("Vstup mimo rozsah "); Serial.println(lng108); // Serial.println("(zobrazena hodnota max. 50'C = 10000)"); break; } kal_serial[pozice_v_tabulce-1][0] = kal_mereno; // polozky, ktere byly zadane, se prepisi z 65535 na zadane hodnoty (muzou to byt i nuly) kal_serial[pozice_v_tabulce-1][1] = kal_skutecne; if (Serial.available()) { char konec = Serial.read(); // precteni oddelovaciho stredniku nebo hvezdicky if (konec == '*') { Serial.println(lng109); // Serial.println("zadane kalibracni hodnoty pro teplotu:"); Serial.println(lng110); // Serial.println("pozice / merena hodnota ('C) / zobrazena hodnota ('C)"); for (byte i = 0 ; i < 7 ; i++) { if (kal_serial[i][0] != 65535 ) { kal_teplota[i][0] = kal_serial[i][0]; kal_teplota[i][1] = kal_serial[i][1]; kal_serial[i][0] = 65535; kal_serial[i][1] = 65535; Serial.print(i+1); Serial.print(" / "); if (kal_teplota[i][0] * kal_teplota[i][1] > 0) // obe zadane hodnoty do kalibracni tabulky byly nenulove { EEPROM_write_int(20 + (i * 4) , kal_teplota[i][0]); EEPROM_write_int(22 + (i * 4) , kal_teplota[i][1]); Serial.print( kal_teplota[i][0]); // merena teplota Serial.print(" (= "); Serial.print( citelna_teplota(kal_teplota[i][0])); // (citelna merena teplota) Serial.print(" 'C) / "); Serial.print( kal_teplota[i][1]); // korekce Serial.print(" (="); Serial.print( citelna_teplota(kal_teplota[i][1])); // (zkorigovana (spravna) citelna teplota) Serial.println(" 'C)"); } else { EEPROM_write_int(20 + (i * 4) , 0); EEPROM_write_int(22 + (i * 4) , 0); kal_teplota[i][0] = 0; kal_teplota[i][1] = 0; Serial.println(lng210); // "kalibracni bod smazan" } } } while (Serial.available()) Serial.read(); // po hvezdicce se vsechno ostatni maze } } } test_korekcni_tabulky_teploty(); // zkontroluje spravne zadane udaje } //----------------------------------------------