// контакт вывода на "ключевание" #define CW_PIN 13 // контакт вывода звука #define CW_AUDIO_KEYER_PIN 10 // частота звука для контроля #define CW_AUDIO_FREQUENCY 880 // базова длина "точки", определяет скорость передачи сообщения #define CW_TICK_TIME_MILLISECONDS 70 // контакт PTT #define CW_PTT_PIN 9 // контакт для подключения датчика температуры DS18B20 #define TMP_PIN A1 // контакт для подключения реле управления вентилятором обдува радиостанции #define FAN_PIN 5 // контакт для подключения реле управления питанием радиостанции #define TRX_PIN 6 // температура включения вентилятора обдува #define TMP_FAN_ON 40 // предельная температура передатчика, при которой прекращается передача #define TMP_MAX 70 // температура передатчика, при которой разрешается работа на передачу, после отключения #define TMP_MIN 50 // время повтора сообщения, секунды #define TIME_RPT 180 int t_tick = CW_TICK_TIME_MILLISECONDS; // Length of dot, dash, between characters, between words // Динна точки, тире, между символами, между словами int t_dot = t_tick * 1; int t_dash = t_tick * 3; int t_between_char = t_tick * 3; int t_between_words = t_tick * 7; String st_beacon; unsigned long last_time; boolean fan_on, trx_off; int current_temp; void setup() { // раздел начальных "динамических" установок last_time = 0; current_temp = 20; // переменные по умолчанию переводим в "безопасное" состояние fan_on = true; trx_off = true; // строка, которую будет выдавать маяк st_beacon = "CQ CQ CQ DE BEACON UN8FF LOC MO82JM BAND 4M"; } void loop() { // вся обработка ограничений по температуре вначале // так как возможно выключение контроллера и включение при горячем передатчике // считываем показания датчика температуры current_temp = 20; // проверяем условие для включения вентилятора обдува // и обозначаем переменную, в дальнейшем для индикации и прочего if (current_temp > TMP_FAN_ON) { fan_on = true; } else { fan_on = false; } // управление выводом включения вентилятора обдува if (fan_on) { digitalWrite(FAN_PIN, HIGH); } else { digitalWrite(FAN_PIN, LOW); } // проверяем условие для отключения передатчика // если перегрелся, то отключаем и запрещаем работу на передачу if (current_temp > TMP_MAX) { trx_off = true; } // если температура передатчика ниже разрешенной после перегрева, то разрешаем включать передатчик if (current_temp < TMP_MIN) { trx_off = false; } // управление выводом отключения передатчика if (trx_off) { digitalWrite(TRX_PIN, HIGH); } else { digitalWrite(TRX_PIN, LOW); } // если прошло достаточно времени, то начинаем передавать сообщение if ((millis() - last_time) > (TIME_RPT*1000) || last_time == 0 ) { last_time = millis(); // если передатчик еще не остыл, после перегрева, то не разрешаем передачу if (!trx_off) { // включаем режим передачи // для радиостанций с необходимостью нажатия PTT digitalWrite(CW_PTT_PIN, HIGH); // выдаем строку текста посимвольно кодом Морзе int st_len = st_beacon.length(); for (int i=0; i