{"id":343,"date":"2025-12-02T10:43:09","date_gmt":"2025-12-02T07:43:09","guid":{"rendered":"https:\/\/ta9ea.com\/?p=343"},"modified":"2025-12-02T10:43:09","modified_gmt":"2025-12-02T07:43:09","slug":"arduino-tekrarlayici-kontrol-cihazi","status":"publish","type":"post","link":"https:\/\/ta9ea.com\/?p=343","title":{"rendered":"Arduino Tekrarlay\u0131c\u0131 Kontrol Cihaz\u0131"},"content":{"rendered":"<p><span dir=\"auto\">ARC-01&#8217;in beta s\u00fcr\u00fcm y\u00fckseltmesi, Arduino Nano&#8217;nun radyo yay\u0131n\u0131 i\u00e7in tekrarlay\u0131c\u0131 kontrol\u00fc.<\/span><\/p>\n<p><span dir=\"auto\">PTT, ses sinyalini (COS) tamamlayabilir veya dijital DC sinyalini ba\u015fka bir (SQ\/O) g\u00f6stergesine aktarabilir ve ayn\u0131 zamanda bir programla (program arac\u0131l\u0131\u011f\u0131yla) birka\u00e7 bit aras\u0131nda ba\u011flant\u0131 kurabilir.<\/span><\/p>\n<p><span dir=\"auto\">\u0130lk \u00f6nce geleneksel bir deneyime sahip olmak i\u00e7in\u00a0<\/span><strong><span dir=\"auto\">bir \u015feyler yapmaya \u00e7al\u0131\u015f\u0131n<\/span><\/strong><span dir=\"auto\">\u00a0. \u00c7al\u0131\u015ft\u0131rma i\u015flemi\u00a0, &#8220;PTT&#8217;yi kullanarak&#8221; k\u0131sa bir s\u00fcre i\u00e7inde (COS ile) ba\u015fka bir DC ses sinyali bile\u015feninin (Baofeng) kullan\u0131m\u0131yla ilgili bir g\u00f6sterge olarak kullan\u0131labilir\u00a0<\/span><strong><span dir=\"auto\">.<\/span><\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-344 size-large\" src=\"https:\/\/ta9ea.com\/wp-content\/uploads\/2025\/12\/sch_nova-1024x664.png\" alt=\"\" width=\"800\" height=\"519\" \/> <img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-345 size-large\" src=\"https:\/\/ta9ea.com\/wp-content\/uploads\/2025\/12\/p_20220518_154932-1024x623.jpg\" alt=\"\" width=\"800\" height=\"487\" \/><\/p>\n<p><span dir=\"auto\">Ses sinyali FET&#8217;e aittir; program\u0131 ba\u015flatmak i\u00e7in radyoyu a\u00e7\u0131n. FET,\u00a05 V&#8217;ye kadar bir de\u011fere\u00a0<\/span><strong><span dir=\"auto\">sahiptir<\/span><\/strong><span dir=\"auto\">\u00a0(iste\u011fe ba\u011fl\u0131). mant\u0131ksal \u201c1\u201d.<\/span><\/p>\n<p><span dir=\"auto\">Ayr\u0131ca, en az miktarda ses kayd\u0131 yapma olana\u011f\u0131n\u0131z var ve ayr\u0131ca rezervasyon yapt\u0131rman\u0131z gerekiyorsa, ARC-01&#8217;de ayn\u0131 d\u00fczeltmeyi de yapabilirsiniz. Mikrofonlar, mV&#8217;nin mV RMS ile ayn\u0131 \u015fekilde olmas\u0131n\u0131 sa\u011flamak i\u00e7in bir sinyal \u00fcretir. Bu, VOX&#8217;un bu \u015fekilde\u00a0<\/span><strong><span dir=\"auto\">i\u015flenmesini<\/span><\/strong><span dir=\"auto\">\u00a0sa\u011flar .<\/span><\/p>\n<p><span dir=\"auto\">Povezivanje&#8217;nin radyo yay\u0131n\u0131, yeni bir konektora i\u00e7in uygun bir sistemdir. \u0130kili bir \u015fekilde veya ba\u015fka bir \u015fekilde anten almak istiyorsan\u0131z, CEO&#8217;nuz VF&#8217;nin\u00a0yeni bir proje i\u00e7in g\u00fczel bir tema (krajnje va\u017ena)\u00a0<\/span><strong><span dir=\"auto\">olu\u015fturaca\u011f\u0131n\u0131\u00a0<\/span><\/strong><strong><span dir=\"auto\">d\u00fc\u015f\u00fcn\u00fcyor<\/span><\/strong><span dir=\"auto\">\u00a0. Podrazumeva, NF kablosunun, VF ba\u011flant\u0131lar\u0131n\u0131n ve anten ba\u011flant\u0131s\u0131n\u0131n yan\u0131 s\u0131ra daha fazla veri aktar\u0131m\u0131 i\u00e7in de ayn\u0131 kontrole sahiptir.<\/span><\/p>\n<p><strong><span dir=\"auto\">ARC-01 9\u202612 V<\/span><\/strong><span dir=\"auto\">\u00a0DC&#8217;de\u00a0\u00e7al\u0131\u015f\u0131yor<\/span><mark class=\"has-inline-color has-vivid-red-color\"><\/mark><span dir=\"auto\">. 8V\u202614V ile farkl\u0131 ba\u011flant\u0131 se\u00e7enekleri\u00a0<\/span><strong><span dir=\"auto\">mevcuttur<\/span><\/strong><mark class=\"has-inline-color has-vivid-red-color\"><strong>\u00a0<\/strong><\/mark><span dir=\"auto\">krajnosti. G\u00fc\u00e7 kayna\u011f\u0131 40 mA&#8217;dir. Bu, hem \u00e7ok kaliteli hem de\u00a0<\/span><strong><span dir=\"auto\">haz\u0131r<\/span><\/strong><span dir=\"auto\">\u00a0bir USB ba\u011flant\u0131s\u0131n\u0131n temel ilkesidir\u00a0.<\/span><\/p>\n<p><span dir=\"auto\">Kontrol (tekrarlay\u0131c\u0131) \u2013 radi, testrane funkcije, mada \u0107emo se tek grati. COS, Baofeng UV5R, UVB5 ve UV-82&#8217;yi test etmi\u015ftir. Opsiyonel se\u00e7enekler, SQO, bir \u00fcr\u00fcn ve hizmet modeli olarak kabul edilir ve bu, birka\u00e7 tane daha sat\u0131n al\u0131nmas\u0131 gereken bir \u015feydir.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-346 size-large\" src=\"https:\/\/ta9ea.com\/wp-content\/uploads\/2025\/12\/p_20220518_181523-1024x707.jpg\" alt=\"\" width=\"800\" height=\"552\" \/><\/p>\n<p>Program\u0131n\u0131z, tekrarlanan parametrelerle ilgili olarak \u00e7ok \u00e7e\u015fitlidir: CW tan\u0131mlay\u0131c\u0131 periyodik olarak, maksimum d\u00fczeyde maksimum seviye ve \u00f6n y\u00fckleme veya \u00f6n y\u00fckleme i\u00e7in &#8220;bip&#8221; sesi duyulur. Program, yorum yapmak ve eklemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre class=\"lang:arduino decode:true \">#include &lt;EEPROM.h&gt;\n\nconst byte ON = HIGH; \/\/1\nconst byte OFF = LOW; \/\/0\nconst byte COS = A0;\nconst byte SQO = 3;\nconst int ADC_LIMIT = 550;\n\n\/\/PODESAVANJA, PARAMETRI:\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nunsigned long ID_PERIOD_LNG = 1800;\/\/ 'A' Period izmedju emitovanja neizazvane identifikacije. U SEKUNDAMA.\nunsigned long ID_ANSWER_LNG = 900; \/\/ 'B' Minimalno trajanje perioda zatvorenog skvelca posle koga repetitor na sledece okidanje odgovara identifikacijom. U SEKUNDAMA.\nunsigned long ID_COURTESY_LNG = 10; \/\/ 'C' Minimalno vreme od poslednje emisije do emitovanja periodicne identifikacije. U SEKUNDAMA.\nunsigned long SQUELCH_TAIL_LNG = 1400; \/\/ 'D' Vreme od zatvaranja skvelca do otpustanja PTT. U MILISEKUNDAMA!\nunsigned long MAX_AIR_TIME_LNG = 180; \/\/ 'E' Maksimalno trajanje perioda na predaji. U SEKUNDAMA.\nunsigned long MINIMUM_BREAK_1_LNG = 5; \/\/ 'F' Minimalno trajanje prekida izmedju emisija koji resetuje brojac MAX_AIR_TIME_LNG. U SEKUNDAMA.\nunsigned long COOLING_OFF_LNG = 300; \/\/ 'G' Period zastite posle iskljucenja po isteku MAX_AIR_TIME_LNG. U SEKUNDAMA.\nunsigned long MINIMUM_BREAK_2_LNG = 5; \/\/ 'H' Minimalno trajanje perioda zatvorenog skvelca pre nastavka rada posle perioda zastite. U SEKUNDAMA.\nint SQL_SENSE_MIN_LNG = 50; \/\/ 'I' Za \"okidanje\" i \"drzanje\" repetitora nebitne su promene stanja skvelca koje traju krace od SQL_SENSE_MIN_LNG. U MILISEKUNDAMA!\nbyte BEEP_ENABLED = OFF; \/\/ 'J' Bip na kraju relacije\n\nconst char MESSAGE_ID [] = {0x1d, 0xc, 0x3f, 0x18, 0xc, 0x02}; \/\/'YU0VUE'. Promeniti pozivni znak po zelji.\nconst char MESSAGE_RESET [] = {0x0a, 0x02, 0x08, 0x02, 0x03}; \/\/'RESET'\nconst char MESSAGE_BK [] = {0x11, 0x0d}; \/\/'BK', kad prekida rad po isteku MAX_AIR_TIME_LNG\nconst char MESSAGE_DE [] = {0x09, 0x02}; \/\/'DE'\nconst char MESSAGE_R [] = {0x0a}; \/\/'R'\n\n\/\/CW parametri:\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nconst int DIT = 95; \/\/Za promenu brzine SAMO OVAJ RED treba menjati. Duza tacka - manja CW brzina, i obrnuto.\nconst int DAH = DIT * 3; \/\/Trajanje crte\nconst int FREQ = 750; \/\/Frekvencija CW tona\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\/\/Pinovi:\nconst byte _DCinVolts = A6; \/\/Za dijagnostiku.\nconst byte _5VRailVolts = A7; \/\/Za dijagnostiku.\nconst byte _IdToneOut = A5; \/\/CW tonski izlaz, za ID i druge poruke\nconst byte _PttOut = A4; \/\/Pin PTT za TX, izlaz, active HIGH\nconst byte _RxSqlLed = A3; \/\/LED koja pokazuje kada je skvelc otvoren, izlaz\nconst byte _RxAudioToTx = A2; \/\/Kad je LOW, RX audio spojen je na TX MIC. \nconst byte _PullUpDown = 7;\nconst byte _ShifterVoltOut = 4; \/\/Izlaz, bice suvisno u sledecoj verziji, jer ce se napon za konvertor nivoa uzimati iz DX-3\nconst byte _JumperEE = 8; \/\/Dzamper. Ako se ne koristi dodatni GSM-uredjaj, ovaj dzamper neka UVEK bude POSTAVLJEN.\n\nconst byte _InPin = COS; \/\/OVDE IZABRATI ulazni pin tj. nacin kako se indicira otvoren skvelc. COS: DC komponenta iz audio-signala. SQO: gotov DC signal, digitalno HIGH ili LOW.\nbyte SQUELCH_OPEN = LOW; \/\/OVDE IZABRATI stanje na _InPin kada je skvelc otvoren. Za SQO moze biti HIGH ili LOW. Za COS ovo nema znacaja. \n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/PODESAVANJA, PARAMETRI - KRAJ\n\n#define _ptt_state digitalRead(_PttOut)\n\nunsigned long id_period_start;\nunsigned long id_answer_start;\nunsigned long id_courtesy_start; \nunsigned long max_air_time_start; \nunsigned long minimum_break_1_start;\nunsigned long squelch_open_start; \nunsigned long squelch_closed_start;\n\nbyte SQUELCH_CLOSED;\nbyte answer_with_id_now;\nbyte sql_prev_state;\nbyte sql_now_open;\nbyte last_isr_result;\n\nvoid setup() {\n\n\tDDRB = 0x00;\n\tPORTB = 0xFF;\n\tDDRD = 0x00;\n\tPORTD = 0xFF;\n\tDDRC = 0x00;\n\tPORTC = 0b000010; \n\n\tdelay(500);\n\n\tpinMode(_PttOut, OUTPUT);\n\n\tdigitalWrite(_RxSqlLed, LOW);\t\n\tpinMode(_RxSqlLed, OUTPUT);\n\n\tdigitalWrite(_ShifterVoltOut, LOW);\n\tpinMode(_ShifterVoltOut, OUTPUT);\n\n\tPassRXAudio(); \/\/Postavi pin u pocetno stanje\n\n\t\/\/ADC malo ubrzan:\n\tbitSet(ADCSRA,ADPS2);\n\tbitSet(ADCSRA,ADPS1);\n\tbitClear(ADCSRA, ADPS0); \/\/ delitelj \/64  250kHz\n\tanalogReference (INTERNAL);\n\tfor (int i=0; i&lt;10; i++) {\n\t\tint ii = analogRead(COS);\n\t}\n\n\tif (_InPin == SQO) { \/\/Ako se se koristi gotov DC signal koji indicira otvoren skvelc (SQO)\n\t\tdigitalWrite(_InPin, LOW); \/\/Iskljuci pull-up na _InPin\n\t\tpinMode(_PullUpDown, OUTPUT);\n\t\tdigitalWrite(_PullUpDown, !SQUELCH_OPEN);  \/\/Ako je SQUELCH_OPEN HIGH, tj. ako je aktivno stanje HIGH, pin _PullUpDown davace pull-down, i obrnuto\n\t}\n\n\tSQUELCH_CLOSED = !SQUELCH_OPEN;\n\tsql_prev_state = 0;\n\tsql_now_open = 0;\n\n\t\n\t\/\/Prijem s USARTa, makar pokusaj: \n\t\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\tchar param_str[8]; \n\tchar ALL_LETTERS [10] = {0x06, 0x11, 0x15, 0x09, 0x02, 0x14, 0x0b, 0x10, 0x04, 0x1e}; \/\/Morze kodovi za oznake parametara, od 'A' do 'J'\n\tchar starting_letter[1];\n\tunsigned long starting_serial_time = millis();\n\n\tSerial.begin(19200); \n\tdigitalWrite(_ShifterVoltOut, HIGH); \/\/Napon za konvertor nivoa, bice suvisno u sledecoj verziji\n\tSerial.println(\"k\");\n\n\tstarting_letter[0] = 0;\n\tbyte char_pos = 0;\n\t\n\twhile ((millis() - starting_serial_time &lt; 50) &amp;&amp; (starting_letter[0] &lt; '0')) { \n\t\twhile (Serial.available()) {\n\t    \tparam_str[char_pos] = Serial.read(); \/\/Cita bajt po bajt\n\t    \t\n\t    \tif (param_str[char_pos] == '#') { \n\t    \t\tparam_str[char_pos] = '\\0';\n\t            starting_letter[0] = param_str[0]; \/\/Prvo slovo stringa s porta, oznaka parametra\n\t            if (starting_letter[0] &gt;= 'A')  { \/\/Ako je ovo reset s promenom parametara, ako je prvo slovo 'A', 'B'...\n\t            \tparam_str[0] = '0'; \/\/ Zbog kasnijeg pretvaranja stringa u int\n\t    \t\t\tparam_str[1] = '0'; \/\/  \t\t\t\n\t    \t\t}\n\t    \t\tbreak;\n\t    \t}\t\n\t    \telse char_pos++;\t\t\n\t    }\n\t}\n\n\tdigitalWrite(_ShifterVoltOut, LOW); \n\n\tInitParametersAndList(starting_letter[0], param_str); \n\n\tSerial.end();\n\t\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/Prijem s USARTa i odgovor listom parametara - KRAJ\n\n\t\n\t\/\/Da bi na dalje sve bilo u milisekundama, zbog millis():\n\tID_PERIOD_LNG *= 1000;\n\tID_ANSWER_LNG *= 1000;\n\tID_COURTESY_LNG *=1000;\n\tMAX_AIR_TIME_LNG *=1000; \n\tMINIMUM_BREAK_1_LNG *=1000;\n\tCOOLING_OFF_LNG *=1000;\n\tMINIMUM_BREAK_2_LNG *= 1000;\n\t\n\tmax_air_time_start = millis();\n\tanswer_with_id_now = OFF;\n\n\tStopRXAudio();\n\tGoTransmit();  \n\n\tif (starting_letter[0] &gt;= 'A') { \/\/Ako je menjan parametar SMS-porukom \n\t\tstarting_letter[0] = ALL_LETTERS[starting_letter[0] - 'A']; \/\/Kod za CW\n\t\tPlayMessage (MESSAGE_R, sizeof(MESSAGE_R));\n\t\tPlayMessage (starting_letter, sizeof(starting_letter)); \n\t}\t\n\telse { \/\/ Ako NIJE menjan parametar SMS-porukom\n\t\tPlayMessage(MESSAGE_DE, sizeof(MESSAGE_DE));\n\t\tPlayMessage(MESSAGE_ID, sizeof(MESSAGE_ID));\n\t\tPlayMessage(MESSAGE_RESET, sizeof(MESSAGE_RESET));\n\t}\n\n\tdelay(SQUELCH_TAIL_LNG);\n\tGoReceive();\n\tPassRXAudio(); \/\/Na ulaz MIC predajnika od sada je spojen i audio iz prijemnika.\n\n\tid_period_start = millis();\n\n    \/\/TIMER1:\n    \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n  \tTCCR1A = 0x00;\n  \tTCCR1B = 0x00;\n   \tbitSet (TCCR1B, CS11); \/\/delitelj 8, period 33ms\n   \tbitSet(TIMSK1, TOIE1);\n  \t\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n}\n\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  GLAVNA PETLJA  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\nvoid loop() {\n\n\tsql_now_open = TheVerdict();\n\n\tif (sql_now_open != sql_prev_state) {\n\t\tif (sql_now_open &amp;&amp; !_ptt_state) squelch_open_start = millis(); \/\/Ako je upravo otvoren skvelc \n\t\tif (!sql_now_open &amp;&amp; _ptt_state) squelch_closed_start = millis(); \/\/Ako je upravo zatvoren skvelc \n\t}\n\n\telse { \/\/Ako je stanje skvelca nepromenjeno\n\n\t\tif (sql_now_open) {  \/\/Ako skvelc stoji otvoren\n\n\t\t\tif ((millis() - squelch_open_start &gt;= SQL_SENSE_MIN_LNG) &amp;&amp; !_ptt_state) { \/\/Ako je skvelc upravo dovoljno dugo bio otvoren da \"okine\" repetitor\n\t\t\t\tGoTransmit(); \/\/Repetitor je \"okinut\", reemitovace se audio iz prijemnika\n\t\t\t\tif (millis() - id_answer_start &gt;= ID_ANSWER_LNG)  answer_with_id_now = ON; \/\/A mozda ce potom biti odgovoreno sa CW ID\n\t\t\t}\n\n\t\t\tif ((millis() - max_air_time_start &gt;= MAX_AIR_TIME_LNG) &amp;&amp; _ptt_state) {  \/\/Ako je istekao period MAX_AIR_TIME_LNG \n\t\t\t\tStopRXAudio();\n\t\t\t\tPlayMessage(MESSAGE_BK, sizeof (MESSAGE_BK)); \/\/Kuca 'BK'\n\t\t\t\tGoReceive();\n\t\t\t\tPassRXAudio();\n\t\t\t\tdelay(COOLING_OFF_LNG); \/\/Repetitor ce biti van funkcije tokom ovog vremena\n\n\t\t\t\tfor (unsigned long i = 0; i &lt; MINIMUM_BREAK_2_LNG; i++) { \/\/Posle perioda zastite COOLING_OFF_LNG, da skvelc obavezno bude zatvoren jos tokom perioda MINIMUM_BREAK_2_LNG\n\t\t\t\t\tsql_now_open = TheVerdict(); \n\t\t\t\t\tif (sql_now_open) i = 0;\n\t\t\t\t\tdelay(1);\n\t\t\t\t} \n\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\telse { \/\/Ako skvelc stoji zatvoren\n\n\t\t\tif (_ptt_state) { \/\/Ako je na predaji\t\n\n\t\t\t\tif (millis() - squelch_closed_start &gt;= SQL_SENSE_MIN_LNG) { \/\/Ako je skvelc upravo dovoljno dugo bio zatvoren...\n\t\t\t\t\t\n\t\t\t\t\tdelay(SQUELCH_TAIL_LNG);\n\t\t\t\t\tif (BEEP_ENABLED) SoundBeep();\n\t\t\t\t\t\n\t\t\t\t\tid_answer_start = millis(); \/\/Resetuje odbrojavanje do ID_ANSWER_LNG, za odziv identifikacijom\n\t\t\t\t\tGoReceive(); \/\/Vrati se na prijem\n\t\t\t\t}\n\t\t\t}\t  \t\n\n\t\t\telse { \/\/Ako je na prijemu\n\n\t\t\t\tif ((millis() - id_period_start &gt;= ID_PERIOD_LNG) &amp;&amp; (millis() - id_courtesy_start &gt;= ID_COURTESY_LNG)) { \n\t\t\t\t\t\/\/CW ID: ako je isteklo vreme ID_PERIOD_LNG i ako je proslo dovoljno vremena od zadnje emisije (ID_COURTESY_LNG)\n\t\t\t\t\tGoTransmit();\n\t\t\t\t\tPlayMessage(MESSAGE_DE, sizeof(MESSAGE_DE)); \n\t\t\t\t\tPlayMessage(MESSAGE_ID, sizeof(MESSAGE_ID));\/\/Kuca CW ID repetitora\n\t\t\t\t\tdelay(SQUELCH_TAIL_LNG); \/\/I ovde ceka toliko pre nego sto dozvoli novo otvaranje skvelca\n\t\t\t\t\tGoReceive();\n\t\t\t\t\t\n\t\t\t\t\tid_period_start = millis(); \/\/Resetuje tajmer\/brojac\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t}\n\n\tsql_prev_state = sql_now_open;\n} \n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  GLAVNA PETLJA - KRAJ\n\n\nvoid GoReceive() { \/\/Prelazak na prijem\n\tif (answer_with_id_now == ON) { \/\/Ako treba da odgovori identifikacijom\n\t\tAnswerWithID();\n\t\tanswer_with_id_now = OFF;\n\t}\n\tminimum_break_1_start = millis();\n\tid_courtesy_start = millis();\n\tdigitalWrite(_PttOut, LOW);\n}\n\nvoid GoTransmit() { \/\/Prelazak na predaju\n\tdigitalWrite(_PttOut, HIGH);\n\tif (millis() - minimum_break_1_start &gt;= MINIMUM_BREAK_1_LNG) max_air_time_start = millis();\n}\n\nvoid SoundBeep() { \/\/'Roger beep'\n\ttone(_IdToneOut, 600, 100);\n\tdelay(200);\n}  \n\nvoid AnswerWithID() {\n\tdelay(1500);\n\tPlayMessage(MESSAGE_DE, sizeof(MESSAGE_DE));\n\tPlayMessage(MESSAGE_ID, sizeof(MESSAGE_ID)); \/\/Kuca CW ID repetitora\n\tid_period_start = millis();\n\tdelay(SQUELCH_TAIL_LNG); \n}\n\nvoid StopRXAudio() { \/\/Hardver 1.0. Ne menjati.\n\tdigitalWrite(_RxAudioToTx, HIGH); \n\tpinMode(_RxAudioToTx, OUTPUT);\n} \n\nvoid PassRXAudio() { \/\/Hardver 1.0. Ne menjati.\n\tpinMode(_RxAudioToTx, INPUT); \n\tdigitalWrite(_RxAudioToTx, LOW); \n} \n\nvoid EEWriteInt(int address, int value) {\n\tEEPROM.write(address, highByte(value));\n\tEEPROM.write(address + 1, lowByte(value));\n}\n\nint EEReadInt(int address) {\n\tint word = word(EEPROM.read(address), EEPROM.read(address + 1));\n\treturn word;\n}\n\n\nISR (TIMER1_OVF_vect) { \/\/Traje duze oko 56us ako je COS\n\tif (_InPin == COS) last_isr_result = (analogRead(COS) &gt; ADC_LIMIT);\n\telse last_isr_result = (digitalRead(_InPin) == SQUELCH_OPEN);\n\n\tdigitalWrite(_RxSqlLed, last_isr_result);\n}\n\nbyte TheVerdict() {\n\tbyte result;\n\tif (_InPin == COS) result = last_isr_result;\n\telse result = (digitalRead(_InPin) == SQUELCH_OPEN); \n\treturn result;\n}\n\nvoid InitParametersAndList(byte starting_letter, char param_str []) {\n\n\tbyte eeb;\n\tint eei;\n\tint ee_addr;\n\tbyte sq;\n\n\tif (starting_letter &gt;= 'A') { \/\/Ako je ovo reset radi promene parametra\n\t\tee_addr = (starting_letter - 'A') * 2; \/\/Parametri su u EEPROMu od adrese 0, pocev od 'A', po dva bajta\n\t\t\n\t\tif (starting_letter == 'J') EEPROM.write(ee_addr, param_str[2] == 'D'); \n\t\telse EEWriteInt(ee_addr, atoi(param_str));\n\t}\n\n\tif ((starting_letter &gt;= '0') || digitalRead(_JumperEE)) { \/\/Ako je povezan s DX-3 ili ako je uklonjen dzamper koristice vrednosti parametara iz EEPROMa (ako su validne).\n\n\t\tee_addr = 0;\/\/'A'\n\t\teei = EEReadInt(ee_addr); \n\t\tif ((eei &gt;= 300) &amp;&amp; (eei &lt;= 3600)) ID_PERIOD_LNG = eei;\n\t\telse EEWriteInt(ee_addr, ID_PERIOD_LNG);\n\t\t\n\t\tee_addr +=2;\n\t\teei = EEReadInt(ee_addr); \/\/'B'\n\t\tif ((eei &gt;= 300) &amp;&amp; (eei &lt;= 1800)) ID_ANSWER_LNG = eei;\n\t\telse EEWriteInt(ee_addr, ID_ANSWER_LNG);\n\n\t\tee_addr +=2;\n\t\teei = EEReadInt(ee_addr); \/\/'C'\n\t\tif ((eei &gt;= 1) &amp;&amp; (eei &lt;= 300)) ID_COURTESY_LNG = eei;\n\t\telse EEWriteInt(ee_addr, ID_COURTESY_LNG);\n\n\t\tee_addr +=2;\t\n\t\teei = EEReadInt(ee_addr); \/\/'D'\n\t\tif ((eei &gt;= 50) &amp;&amp; (eei &lt;= 5000)) SQUELCH_TAIL_LNG = eei;\n\t\telse EEWriteInt(ee_addr, SQUELCH_TAIL_LNG);\n\n\t\tee_addr +=2;\n\t\teei = EEReadInt(ee_addr); \/\/'E'\n\t\tif ((eei &gt;= 60) &amp;&amp; (eei &lt;= 600)) MAX_AIR_TIME_LNG = eei;\n\t\telse EEWriteInt(ee_addr, MAX_AIR_TIME_LNG);\n\n\t\tee_addr +=2;\n\t\teei = EEReadInt(ee_addr); \/\/'F'\n\t\tif ((eei &gt;= 1) &amp;&amp; (eei &lt;= 60)) MINIMUM_BREAK_1_LNG = eei;\n\t\telse EEWriteInt(ee_addr, MINIMUM_BREAK_1_LNG);\n\n\t\tee_addr +=2;\n\t\teei = EEReadInt(ee_addr); \/\/'G'\n\t\tif ((eei &gt;= 60) &amp;&amp; (eei &lt;= 600)) COOLING_OFF_LNG = eei;\n\t\telse EEWriteInt(ee_addr, COOLING_OFF_LNG);\n\n\t\tee_addr +=2;\n\t\teei = EEReadInt(ee_addr); \/\/'H'\n\t\tif ((eei &gt;= 2) &amp;&amp; (eei &lt;= 60)) MINIMUM_BREAK_2_LNG = eei;\n\t\telse EEWriteInt(ee_addr, MINIMUM_BREAK_2_LNG);\n\n\t\tee_addr +=2;\n\t\teei = EEReadInt(ee_addr); \/\/'I'\n\t\tif ((eei &gt;= 10) &amp;&amp; (eei &lt;= 300)) SQL_SENSE_MIN_LNG = eei;\n\t\telse EEWriteInt(ee_addr, SQL_SENSE_MIN_LNG);\n\n\t\tee_addr +=2;\n\t\teeb = EEPROM.read(ee_addr); \/\/'J'\n\t\tif ((eeb == 0) || (eeb == 1)) BEEP_ENABLED = eeb;\n\t\telse EEPROM.write(ee_addr, BEEP_ENABLED);\n\n\t}\n\n\tif (starting_letter == '1') { \/\/Ako je ovo po naredbi RESET\n\t\tSerial.println(\"Napajanje\");\n\t\tSerial.print(\"DC ulaz \");\n\t\tfloat voltage = ((17.276 * (float(analogRead(_DCinVolts)) + 0.5)) \/ 1024) + 0.74; \/\/delitelj 10k\/680R, dioda M7, VREF = 1.1V\n\t\tSerial.print(voltage, 1);\n\t\tSerial.println(\" V\");\n\n\t\tSerial.print(\"Nano \");\n\t\tvoltage = (6.4382 * (float(analogRead(_5VRailVolts)) + 0.5)) \/ 1024; \/\/delitelj 3k3\/680R, VREF = 1.1V\n\t\tSerial.print(voltage, 1);\n\t\tSerial.println(\" V\");\n\t\tSerial.println();\n\n\t\tif (_InPin == COS) {\n\t\t\tSerial.print (\"A0 (COS) \");\n\t\t\tint a = analogRead(COS);\n\t\t\tvoltage = (1.1 * (a + 0.5)) \/ 1024;\n\t\t\tif (a &gt; 1020) {\n\t\t\t\tSerial.println(\"&gt;= 1.10 V\");\t\n\t\t\t}\n\t\t\telse {\n\t\t\t\tSerial.print(voltage, 2);\t\n\t\t\t\tSerial.println(\" V\");\n\t\t\t}\n\t\t\tsq = (a &gt; ADC_LIMIT); \/\/Da li je skvelc otvoren\n\t\t}\n\t\telse {\n\t\t\tSerial.print(\"D3 (SQO)  '\");\n\t\t\tSerial.print(digitalRead(SQO));\n\t\t\tsq = (digitalRead(SQO) == SQUELCH_OPEN);\n\t\t\tSerial.println(\"'\");\n\t\t}\n\n\t\tSerial.print(\"Skvelc \");\n\t\tif (sq) Serial.println(\"otvoren\");\n\t\telse Serial.println(\"zatvoren\");\n\t\t\n\t\tSerial.println();\n\t\tSerial.print(\"A2 (RXAudio)  '\");\n\t\tSerial.print(digitalRead(_RxAudioToTx));\n\t\tSerial.println(\"'\");\n\t\tSerial.print(\"#\");\n\t}\n\telse {\t\n\t\t\/\/PARAMETRI za DX-3, OBAVEZNO u ovom formatu.\n\t\t\/\/'A'...'I' - maksimalno po cetiri cifre:\n\t\t\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\t\tSerial.print(\"A \");\t\t\t\t\t\t\/\/\n\t\tSerial.println(ID_PERIOD_LNG); \t\t\t\/\/\n\t\tSerial.print(\"B \");\t  \t\t\t\t\t\/\/\n\t\tSerial.println(ID_ANSWER_LNG); \t\t\t\/\/\n\t\tSerial.print(\"C \");\t\t \t\t\t\t\/\/\n\t\tSerial.println(ID_COURTESY_LNG); \t\t\/\/\n\t\tSerial.print(\"D \");\t\t\t\t\t\t\/\/\n\t\tSerial.println(SQUELCH_TAIL_LNG); \t\t\/\/\n\t\tSerial.print(\"E \");\t\t\t\t\t\t\/\/\n\t\tSerial.println(MAX_AIR_TIME_LNG); \t\t\/\/\n\t\tSerial.print(\"F \");\t\t\t\t\t\t\/\/\n\t\tSerial.println(MINIMUM_BREAK_1_LNG); \t\/\/\n\t\tSerial.print(\"G \");\t\t\t\t\t\t\/\/\n\t\tSerial.println(COOLING_OFF_LNG); \t\t\/\/\n\t\tSerial.print(\"H \");\t\t\t\t\t\t\/\/\n\t\tSerial.println(MINIMUM_BREAK_2_LNG); \t\/\/\n\t\tSerial.print(\"I \");\t\t\t\t\t\t\/\/\n\t\tSerial.println(SQL_SENSE_MIN_LNG); \t\t\/\/\n\t\tSerial.print(\"J \");\t\t\t\t\t\t\/\/\n\t\tSerial.print(BEEP_ENABLED); \t\t\t\/\/\n\t\tSerial.print(\"#\"); \t\t\t \t\t\t\/\/\n\t\t\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\t}\n\n}\n\n\nvoid PlayMessage(const char message [], size_t msg_length) {\n\n\tint character_pos; \n\tchar temp; \n\tbyte lsb;\n\n\tdelay(DIT*4);\n\n\tfor (character_pos = 0; character_pos &lt; msg_length; character_pos ++) { \n\n\t\ttemp = message[character_pos]; \/\/Uzimace temp, karakter po karakter\n\n\t\tfor (int i = 0;  temp &gt; 1 ; i++) { \n\t\t\tlsb = bitRead(temp, 0); \/\/Uzima nulti bit, tj. krajnji bit desno\n\t\t\tdelay(DIT); \/\/Pauza izmedju elemenata\n\n\t\t\tif (lsb) { \/\/Ako je bit 1\n\t\t\t\ttone(_IdToneOut, FREQ, DAH); \/\/kuca crtu\n\t\t\t\tdelay(DAH); \/\/Zato sto se tone() izvrsava asinhrono\n\t\t\t}\n\n\t\t\telse { \/\/Ako je bit 0\n\t\t\t\ttone(_IdToneOut, FREQ, DIT); \/\/kuca tacku\n\t\t\t\tdelay(DIT);\n\t\t\t}\n\t\t\t\n\t\t\ttemp = temp &gt;&gt; 1;  \/\/Pomera u desno, tj. odseca krajnji bit desno\n\t\t}\n\n\t\tdelay(DAH); \/\/Pauza izmedju karaktera\n\t}\n\n\tdelay(DAH);\n\n}\n\n\/*\nKodovi Morzeovih znakova, za promenu sadrzaja poruka:\n\n    0x06 \ta\n    0x11 \tb\n    0x15 \tc\n    0x09 \td\n    0x02 \te\n    0x14 \tf\n    0x0b \tg\n    0x10 \th\n    0x04 \ti\n    0x1e \tj\n    0x0d \tk\n    0x12 \tl\n    0x07 \tm\n    0x05 \tn\n    0x0f \to\n    0x16 \tp\n    0x1b \tq\n    0x0a \tr\n    0x08 \ts\n    0x03 \tt\n    0x0c \tu\n    0x18 \tv\n    0x0e \tw\n    0x19 \tx\n    0x1d \ty\n    0x13 \tz\n    0x3f\t0\n    0x3e \t1\n    0x3c \t2\n    0x38 \t3\n    0x30 \t4\n    0x20 \t5\n    0x21 \t6\n    0x23 \t7\n    0x27 \t8\n    0x2f \t9\n    0x29 \t\/\n    0x68\tSK\n    0x2a\tAR\n    *\/<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ARC-01&#8217;in beta s\u00fcr\u00fcm y\u00fckseltmesi, Arduino Nano&#8217;nun radyo yay\u0131n\u0131 i\u00e7in tekrarlay\u0131c\u0131 kontrol\u00fc. PTT, ses sinyalini (COS) tamamlayabilir veya dijital DC sinyalini ba\u015fka bir (SQ\/O) g\u00f6stergesine aktarabilir [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":345,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,3],"tags":[],"class_list":["post-343","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ardu","category-hamrad"],"_links":{"self":[{"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/wp\/v2\/posts\/343","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ta9ea.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=343"}],"version-history":[{"count":0,"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/wp\/v2\/posts\/343\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ta9ea.com\/index.php?rest_route=\/"}],"wp:attachment":[{"href":"https:\/\/ta9ea.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=343"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ta9ea.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=343"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ta9ea.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}