#include // контакт вывода на "ключевание" #define CW_PIN 11 // контакт вывода звука #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 12 // контакт для подключения реле управления вентилятором обдува радиостанции #define FAN_PIN 5 // контакт для подключения реле управления питанием радиостанции #define TRX_PIN 6 // температура включения вентилятора обдува #define TMP_FAN_ON 40 // предельная температура передатчика, при которой прекращается передача #define TMP_MAX 50 // температура передатчика, при которой разрешается работа на передачу, после отключения #define TMP_MIN 70 // время повтора сообщения, секунды #define TIME_RPT 300 OneWire ds(TMP_PIN); 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; // переменные для процедуры поиска и опроса датчика температуры byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; float celsius; void setup() { // определяем назначение портов pinMode(CW_PIN, OUTPUT); pinMode(CW_PTT_PIN, OUTPUT); pinMode(FAN_PIN, OUTPUT); pinMode(TRX_PIN, OUTPUT); // раздел начальных "динамических" установок last_time = 0; current_temp = 20; // переменные по умолчанию переводим в "безопасное" состояние fan_on = true; trx_off = true; // строка, которую будет выдавать маяк st_beacon = "CQ CQ CQ DE BEACON UN8FF LOC MO82JM BAND 4M"; // Serial.begin(9600); } void loop() { // Serial.println("Begin"); // вся обработка ограничений по температуре вначале // так как возможно выключение контроллера и включение при горячем передатчике // ищем датчик температуры и получаем из него данные // поцедура взята из библиотечного примера if ( !ds.search(addr)) { ds.reset_search(); delay(250); return; } // the first ROM byte indicates which chip switch (addr[0]) { case 0x10: type_s = 1; break; case 0x28: type_s = 0; break; case 0x22: type_s = 0; break; default: return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end delay(700); // maybe 750ms is enough, maybe not present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for ( i = 0; i < 9; i++) { data[i] = ds.read(); } // Convert the data to actual temperature int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { // "count remain" gives full 12 bit resolution raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); // at lower res, the low bits are undefined, so let's zero them if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms } celsius = (float)raw / 16.0; // конец поиска датчика температуры // считываем показания датчика температуры current_temp = int(celsius); // Serial.print("T = "); // Serial.println(current_temp); // проверяем условие для включения вентилятора обдува // и обозначаем переменную, в дальнейшем для индикации и прочего 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