//============================================================================================ // // Jednoduche testovaci podprogramy pro zkouseni samostatnych casti HW // // verze: 22.10.2023 // // (Test cidel DHT zatim nevyzkouseny) // //============================================================================================ //#define internal_GPS true // odkomentovat v pripade pouziti vnitrni GPS #define internal_GPS false // odkomentovat v pripade, ze vnitrni GPS pouzita nebude (zustava moznost externi GPS) #include // knihovna pro I2C komunikaci #include // knihovna pro cidlo vlhkosti, teploty a tlaku Adafruit_BME280 cidlo_BME; #define I2C_ADDR_EEPROM_RW_0 0b1010000 // I2C adresa EEPROM pro cteni a zapis dat pro bunky 0 az 65535 (adresovaci piny v LOW) #define I2C_ADDR_EEPROM_RW_1 0b1010001 // I2C adresa EEPROM pro cteni a zapis dat pro bunky nad 65535 (adresovaci piny v LOW) byte I2C_ADDR; // podle aktualni adresy zapisovane, nebo ctene bunky se nastavuje I2C adresa EEPROM #define I2C_ADDR_GPS 0x17 // I2C adresa pridavneho modulu pro GPS #define I2C_ADDR_KOMPAS 0b0011110 // I2C adresa naklonomeru a kompasu pro LSM303 #define I2C_ADDR_NAKLON 0b0011001 #define OUT_X_L_A 0x28 #define CTRL_REG1_A 0x20 #define CTRL_REG4_A 0x23 #define CRA_REG_M 0x00 #define CRB_REG_M 0x01 #define MR_REG_M 0x02 #define DLHC_OUT_X_H_M 0x03 boolean last_status; byte err = 0; #define pin_dis_CLK PB12 // piny pro komunikaci s displejem #define pin_dis_DIN PB13 byte D_pamet[5]; // V tomto poli se bitove uchovava aktualni stav vsech rozsvicenych segmentu #define pin_refu PB0 // pin pro referencni napeti pro kontrolu stavu baterie #define pin_AD_BAT PA0 // pin pro testovani napeti baterie #define pin_bzuk PB1 // pin pro piskak (pasivni) #define pin_DATA_RDY PB11 // pin pro zjistovani pripojeneho EXT zarizeni nebo signal o dostupne vnitni GPS #define pin_tl_up PA15 // ovladaci tlacitka #define pin_tl_dn PB3 #define pin_tl_ok PB4 #define pin_TS PA14 #define pin_LED_R PA1 // cervena LED pro verzi bez displeje #define pin_LED_G PB8 // zelena LED pro verzi bez displeje #define pin_LED_B PB9 // modra LED pro verzi bez displeje #define pin_SD_CS PA4 // CS na SD karte #define pin_karta_IN PB10 // pin pro test zasunute karty ve druhe verzi plosnaku #define pin_DERE PB15 // pin pro prepinani smeru vysilani #include "SdFat.h" // nova knihovna pro praci s SD kartou #include "sdios.h" SdFat sd; // pro SD kartu SdFile soubor; boolean open_OK; // pomocna promenna, jestli funguje zapis na kartu (jestli je zasunuta karta) unsigned int max_EEPROM30; //!! pro spec rezim (r30s) - kapacita osazene pameti char pole_GPS_NMEA[] = "$GPRMC,110109.00,A,4926.67723,N,01421.99214,E,0.521,,311220,,,A*72 + nejaka rezerva @\0"; // pole, do ktereho budou stahovat neupravene NMEA zpravy z GPS modulu byte dis_popisy[70][5] = // graficke definice 5-znakovych textu na displej { { 120, 121, 109, 120, 0} , // "tESt " [0] { 0, 56, 121, 94, 0} , // " LEd " [1] test LED { 0, 125, 115, 109, 0} , // " 6P5 " [2] test GPS { 28, 118, 121, 56, 0} , // "uHEL " [3] test naklonomeru { 121, 121, 115, 80, 92} , // "EEPro" [4] test EEPROM { 124, 121, 121, 115, 0} , // "bEEP " [5] test piskaku { 0, 30, 119, 109, 0} , // " JA5 " [6] test svetlomeru (TSL) { 0, 124, 55, 121, 0} , // " bME " [7] test BME280 { 0, 119, 94, 57, 0} , // " AdC " [8] test A/D prevodniku { 120, 56, 119, 57, 0} , // "tLAC " [9] test tlacitek { 0, 102, 127, 109, 0} , // " 485 " [10] test RS485 { 0, 4, 91, 57, 0} , // " i2C " [11] sken I2C { 0, 109, 94, 0, 0} , // " 5d " [12] test SD karty { 0, 121, 118, 120, 0} , // " EXt " [13] test externiho kontaktu { 121, 121, 64, 79, 63} , // "EE-30" [14] test EEPROM 30 { 57, 92, 55, 115, 119} , // "CoMPA" [15] test kompasu LSM303 { 94, 118, 120, 3, 3} , // "dHt11" [16] test vlhkomeru DHT 11 { 94, 118, 120, 91, 91} , // "dHt22" [17] test vlhkomeru DHT 22 { 0, 80, 120, 88, 0} // " rtc " [18] test RTC }; #include // knihovna pro OneWire komunikaci (cidlo vlhkosti) #include // knihovna pro cidlo vlhkosti a teploty DHT11 / DHT22 #define pin_DHT PB14 DHT cidlo_DHT11(pin_DHT, DHT11); // inicializace DHT11 DHT cidlo_DHT22(pin_DHT, DHT22); // inicializace DHT22 #include "RTClock.h" RTClock rtclock (RTCSEL_LSE); time_t tt; tm_t mtt; int LOC_hod, LOC_den, LOC_mes, LOC_min, LOC_sek; // promenne, ktere obsahuji aktualni cas v RTC (mistni cas) unsigned int LOC_rok ; // rok (od 1970) byte LOC_dvt; // den v tydnu (po ... ne) String dny[] = {"--", "Po" , "Ut" , "St" , "Ct" , "Pa" , "So" , "Ne"}; // pro vypis nazvu dni pro indexy 1 (pondeli) az 7 (nedele) (0 se nepouzije) volatile unsigned int zakmity = 0; // pocitadlo zakmitu v interruptech volatile unsigned long prvni_zmena = 0; // cas prvni zjistene zmeny stavu v mikrosekundach volatile unsigned long posledni_kmit = 0; // cas posledniho zjisteneho zakmitu v mikrosekundach volatile unsigned int tlacitko = 0; // testovani, ze bylo stisknute nejake tlacitko, nebo ze se 10 sekund nic nestisklo volatile unsigned long start_testu = 0; volatile unsigned long trvani_testu = 0; // po prvnim pruchodu interruptem se zkrati 20-sekundovy interval cekani na stisk tlacitka na 2 sekundy mereni zakmitu void setup(void) { Serial.begin(9600); Serial2.begin(9600); Wire.begin(); afio_cfg_debug_ports(AFIO_DEBUG_NONE); // zprovozneni JTAG pinu jako obycejnych GPIO (PB3 = tlacitko "DOLU"; SWSCK = TimeStamp; SWDIO = HW test baterie ) pinMode(pin_dis_CLK, OUTPUT); pinMode(pin_dis_DIN, OUTPUT); pinMode(pin_AD_BAT , INPUT_ANALOG); pinMode(pin_refu , INPUT_ANALOG); pinMode(pin_tl_up, INPUT_PULLUP); pinMode(pin_tl_dn, INPUT_PULLUP); pinMode(pin_tl_ok, INPUT_PULLUP); pinMode(pin_TS , INPUT_PULLUP); pinMode(pin_DERE, OUTPUT); pinMode(pin_karta_IN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(pin_tl_up), interUP, CHANGE); attachInterrupt(digitalPinToInterrupt(pin_tl_dn), interDN, CHANGE); attachInterrupt(digitalPinToInterrupt(pin_tl_ok), interOK, CHANGE); attachInterrupt(digitalPinToInterrupt(pin_TS ), interTS, CHANGE); pinMode(pin_LED_R, OUTPUT); analogWrite(pin_LED_R , 255); // LED ma spolecnou anodu, takze se zhasina pomoci 100% PWM pinMode(pin_LED_G, OUTPUT); analogWrite(pin_LED_G , 255); // LED ma spolecnou anodu, takze se zhasina pomoci 100% PWM pinMode(pin_LED_B, OUTPUT); analogWrite(pin_LED_B , 255); // LED ma spolecnou anodu, takze se zhasina pomoci 100% PWM #if internal_GPS pinMode(pin_DATA_RDY, INPUT); // pri pouziti vnitrni GPS se pin pri vypnute GPS pridrzuje odporem v LOW #else pinMode(pin_DATA_RDY, INPUT_PULLUP); // pri pouziti vnejsi GPS se nezapojeny pin pridrzuje odporem v HIGH #endif pinMode(pin_bzuk,OUTPUT); while (! Serial); help(); while(Serial.available()) Serial.read(); } void loop(void) { if (Serial.available()) { char znak = Serial.read(); if(znak == 'a') sken_i2c(); if(znak == 'b') test_adc(); if(znak == 'c') test_eeprom(); if(znak == 'd') test_eeprom30(); if(znak == 'e') test_piskak(); if(znak == 'f') test_bme(); if(znak == 'g') test_tsl(); if(znak == 'h') test_displej(); if(znak == 'i') test_ext(); if(znak == 'j') cyk_interrupt(); if(znak == 'k') test_led(); if(znak == 'l') test_SD(); if(znak == 'm') test_485(); if(znak == 'n') test_GPS(); if(znak == 'o') test_kompas_lsm303(); if(znak == 'p') test_dht11(); if(znak == 'q') test_dht22(); if(znak == 'r') test_rtc(); if(znak == 's') nastav_rtc(); if (err != 0) { Wire.begin(); err = 0; } while (Serial.available()) Serial.read(); delay(1000); help(); } } void help() { zobraz_text(0); // "tESt " Serial.println("=============== M E N U ==================="); Serial.println("a .... sken I2C"); Serial.println("b .... test A/D"); Serial.println("c .... test EEPROM 128k"); Serial.println("d .... test extra EEPROM (r30s)"); Serial.println("e .... test piskak"); Serial.println("f .... test BME280"); Serial.println("g .... test TSL2591"); Serial.println("h .... test displej"); Serial.println("i .... test EXT kontaktu"); Serial.println("j .... test tlacitek"); Serial.println("k .... test LED"); Serial.println("l .... test SD karty"); Serial.println("m .... test linky RS485"); Serial.println("n .... test GPS"); Serial.println("o .... test kompasu a naklonomeru LSM303"); Serial.println("p .... test vlhkomeru DHT11"); Serial.println("q .... test vlhkomeru DHT22"); Serial.println("r .... test RTC"); Serial.println("s .... nastaveni hodnot do RTC"); Serial.println("==========================================="); }