Не могу разобраться, направьте на путь.
- Войдите на сайт для отправки комментариев
Ср, 16/02/2022 - 13:26
Умные люди, помогите со скетчем. Знаний маловато пока. Правила форума прочет для новичков, дураком быть готов)). Хочу добавить на другие порты кнопки с заранее записанной памятью, на 1 порт все работает, начинаю пытаться по аналогии добавлять еще порты -ругается. Принцип такой при нажатии pinD4 начинает передавать телеграфом ранее записанные знаки, pinD5 другие знаки.
case AUTOMATIC_CQ: if (lastMode == CQCALLSIGN) { // Делаем паузу при повторе send_pause_element(6); } lastMode = CQCALLSIGN; send_pause_element(2); boolean runFlag = true; if (runFlag) runFlag = send_char('R'); if (runFlag) runFlag = send_char('0'); keyerState = IDLE; break; } // end Case } } boolean send_char(byte cw_char) { keyerState = AUTOMATIC_SENDING; switch (cw_char) { case 'A': return send_the_dits_and_dahs(".-"); case 'B': return send_the_dits_and_dahs("-..."); case 'C': return send_the_dits_and_dahs("-.-."); case 'D': return send_the_dits_and_dahs("-.."); case 'E': return send_the_dits_and_dahs("."); case 'F': return send_the_dits_and_dahs("..-."); case 'G': return send_the_dits_and_dahs("--."); case 'H': return send_the_dits_and_dahs("...."); case 'I': return send_the_dits_and_dahs(".."); case 'J': return send_the_dits_and_dahs(".---"); case 'K': return send_the_dits_and_dahs("-.-"); case 'L': return send_the_dits_and_dahs(".-.."); case 'M': return send_the_dits_and_dahs("--"); case 'N': return send_the_dits_and_dahs("-."); case 'O': return send_the_dits_and_dahs("---"); case 'P': return send_the_dits_and_dahs(".--."); case 'Q': return send_the_dits_and_dahs("--.-"); case 'R': return send_the_dits_and_dahs(".-."); case 'S': return send_the_dits_and_dahs("..."); case 'T': return send_the_dits_and_dahs("-"); case 'U': return send_the_dits_and_dahs("..-"); case 'V': return send_the_dits_and_dahs("...-"); case 'W': return send_the_dits_and_dahs(".--"); case 'X': return send_the_dits_and_dahs("-..-"); case 'Y': return send_the_dits_and_dahs("-.--"); case 'Z': return send_the_dits_and_dahs("--.."); case '0': return send_the_dits_and_dahs("-----"); case '1': return send_the_dits_and_dahs(".----"); case '2': return send_the_dits_and_dahs("..---"); case '3': return send_the_dits_and_dahs("...--"); case '4': return send_the_dits_and_dahs("....-"); case '5': return send_the_dits_and_dahs("....."); case '6': return send_the_dits_and_dahs("-...."); case '7': return send_the_dits_and_dahs("--..."); case '8': return send_the_dits_and_dahs("---.."); case '9': return send_the_dits_and_dahs("----."); } return true; } boolean send_the_dits_and_dahs(char const * cw_to_send) { for (int x = 0; x < 12; x++) { switch (cw_to_send[x]) { case '.': if (!send_dit()) return false; break; case '-': if (!send_dah()) return false; break; default: x = 12; break; } } send_pause_element(2); return true; } boolean send_dit() { static long ktimer; ktimer = ditTime * (key_weight / 50.0); // Пищим digitalWrite(KEYpin, HIGH); tone(ST_Pin, key_tone); ktimer += millis(); byte loopDit = 1; while (loopDit) { if (check_break()) return false; if (millis() > ktimer) { // Отключаем звук digitalWrite(KEYpin, LOW); noTone(ST_Pin); loopDit = 0; } } send_pause_element(1); return true; } boolean send_dah() { static long ktimer; ktimer = ditTime * (3 * (key_weight / 50.0)); // Dash Time+Weight // Пищим digitalWrite(KEYpin, HIGH); tone(ST_Pin, key_tone); ktimer += millis(); byte loopDah = 1; while (loopDah) { if (check_break()) return false; if (millis() > ktimer) { // Отключаем звук digitalWrite(KEYpin, LOW); noTone(ST_Pin); loopDah = 0; } } send_pause_element(1); return true; } boolean send_pause_element(int length) { static long ktimer; ktimer = ditTime * (length * (kte - (key_weight / 50.0))); ktimer += millis(); while (millis() <= ktimer) { if (check_break()) return false; } return true; } boolean check_break() { if (digitalRead(straightPin) == LOW || digitalRead(LPin) == LOW || digitalRead(RPin) == LOW) { return true; } else { return false; } } Это рабочий скетч, ниже что пытаюсь сделать я.
#define Speed_Pin A0 // Speed #define Tone_Pin A1 // Tone #define Weight_Pin A2 // Weight #define LPin 8 // Left Paddle Input #define RPin 9 // Right Paddle Input #define straightPin 6 // Straight key #define callsignPin 5 // Callsign #define cqcallsignPin 4 // CQcall #define KEYpin 11 #define ST_Pin 12 // Sidetone Output #define DIT_L 0x01 // Dit latch #define DASH_L 0x02 // Dash latch #define DIT_PROC 0x04 // Dit is being processed #define IAMBICB 0x10 // 0: Iambic A, 1: Iambic B // All of PP5VX's fingers are here... #define MIN_WPM 10 // Min Speed ( ...all keyers begins here - try 13 or 15, is my advice ! ) #define DefaWPM 35 // Default Speed ( ...Default Speed for me, of course: But NOT IMPLEMENTED here ) #define MAX_WPM 75 // Max Speed ( ...top speed that for some is too high - but here is my choice ) // All of PP5VX's fingers are here... #define MIN_WGT 40 // Min Weight: 40% ( ...remember that "chompy" CW ? This is it ! ) #define DefaWGT 50 // Default Weight: 50% ( ...normal weight, for normal people ) #define MAX_WGT 75 // Max Weight: 75% ( ...the "big gun" weight, it's funny with 1 kW ) // All of PP5VX's fingers are here... #define MIN_HZ 400 // Min Tone ( ...I don't like low frequencies on CW, but is your choice ) #define DefaHZ 500 // Default Tone ( ...the mostly used tone frequency in whole World ! ) #define MAX_HZ 700 // Max Tone ( ...no one use above this to do **real** CW on the Bands ! LOL ) unsigned long ditTime; unsigned char keyerControl, keyerState, lastMode; unsigned int key_speed, key_weight, key_tone; unsigned int kte = 2.3; // boolean straightKeyPressed = false; enum KSTYPE { IDLE, CHK_DIT, CHK_DASH, KEYED_PREP, KEYED, INTER_ELEMENT, AUTOMATIC_CALLSIGN, AUTOMATIC_SENDING, AUTOMATIC_CQ }; enum LASTMODE { ELECTROINC_KEY, STRAIGHT_KEY, CALLSIGN, CQCALLSIGN }; void update_PaddleLatch() { if (digitalRead(LPin) == LOW) keyerControl |= DIT_L; // DITS on TIP ( Stereo Plug ) if (digitalRead(RPin) == LOW) keyerControl |= DASH_L; // DASHES on RING ( Stereo Plug ) } // ================================== void setup() { pinMode(LPin, INPUT_PULLUP); // Left = DITS ( Getting RFI here ? Use a 100nF to GND ) pinMode(RPin, INPUT_PULLUP); // Right = DASHES ( Getting RFI here ? Use a 100nF to GND ) pinMode(straightPin, INPUT_PULLUP); // Middle :) = straight key ( Getting RFI here ? Use a 100nF to GND ) pinMode(callsignPin, INPUT_PULLUP); pinMode(cqcallsignPin, INPUT_PULLUP); pinMode(ST_Pin, OUTPUT); digitalWrite(ST_Pin, LOW); pinMode(KEYpin, OUTPUT); digitalWrite(KEYpin, LOW); keyerState = IDLE; keyerControl = IAMBICB; ReadParameters(); } // ==================================================================== // All of PP5VX's fingers are here... // ==================================================================== void ReadParameters() { key_speed = map(analogRead(Speed_Pin), 10, 1000, MIN_WPM, MAX_WPM); key_tone = map(analogRead(Tone_Pin), 10, 1000, MIN_HZ, MAX_HZ); key_weight = map(analogRead(Weight_Pin), 10, 1000, MIN_WGT, MAX_WGT); //key_speed = DefaWPM; //key_tone = DefaHZ; //key_weight = DefaWGT; ditTime = 1200 / key_speed; } // Some of PP5VX's fingers are here... void loop() { static long ktimer; if (digitalRead(straightPin) == LOW) { if (straightKeyPressed == false) // && keyerState != INTER_ELEMENT { // Обнуляем от электронного ключа keyerState = IDLE; keyerControl = IAMBICB; ktimer = 0; // Пищим простым ключом digitalWrite(KEYpin, HIGH); tone(ST_Pin, key_tone); straightKeyPressed = true; lastMode = STRAIGHT_KEY; } } else { // Ключ не нажат if (straightKeyPressed == true) { // Отключаем звук digitalWrite(KEYpin, LOW); noTone(ST_Pin); straightKeyPressed = false; lastMode = STRAIGHT_KEY; } if (digitalRead(callsignPin) == LOW) { digitalWrite(KEYpin, LOW); noTone(ST_Pin); straightKeyPressed = false; keyerState = AUTOMATIC_CALLSIGN; } if (digitalRead(cqcallsignPin) == LOW) { digitalWrite(KEYpin, LOW); noTone(ST_Pin); straightKeyPressed = false; keyerState = AUTOMATIC_CQ; } // Стандартная логика электронного ключа // ReadParameters(); switch (keyerState) { case IDLE: if ((digitalRead(LPin) == LOW) || (digitalRead(RPin) == LOW) || (keyerControl & 0x03)) { update_PaddleLatch(); keyerState = CHK_DIT; } ReadParameters(); break; case CHK_DIT: if (keyerControl & DIT_L) { keyerControl |= DIT_PROC; ktimer = ditTime * (key_weight / 50.0); // Dit Time+Weight keyerState = KEYED_PREP; } else keyerState = CHK_DASH; break; case CHK_DASH: if (keyerControl & DASH_L) { ktimer = ditTime * (3 * (key_weight / 50.0)); // Dash Time+Weight keyerState = KEYED_PREP; } else keyerState = IDLE; break; case KEYED_PREP: //} lastMode = ELECTROINC_KEY; // Пищим digitalWrite(KEYpin, HIGH); tone(ST_Pin, key_tone); ktimer += millis(); keyerControl &= ~(DIT_L + DASH_L); keyerState = KEYED; break; case KEYED: if (millis() > ktimer) { // Отключаем звук digitalWrite(KEYpin, LOW); noTone(ST_Pin); // ktimer = millis() + ditTime; // If you don't use Weight Control ktimer = millis() + ditTime * (kte - (key_weight / 50.0)); // Weight Control here keyerState = INTER_ELEMENT; } else if (keyerControl & IAMBICB) update_PaddleLatch(); break; case INTER_ELEMENT: update_PaddleLatch(); if (millis() > ktimer) { if (keyerControl & DIT_PROC) { keyerControl &= ~(DIT_L + DIT_PROC); keyerState = CHK_DASH; } else { keyerControl &= ~(DASH_L); keyerState = IDLE; } } break; case AUTOMATIC_CQ: if (lastMode == CQCALLSIGN) { // Делаем паузу при повторе send_pause_element(6); } lastMode = CQCALLSIGN; send_pause_element(2); boolean runFlag = true; if (runFlag) runFlag = send_char('R'); if (runFlag) runFlag = send_char('0'); keyerState = IDLE; break; } // end Case } } case AUTOMATIC_CALLSIGN: if (lastMode == CALLSIGN) { // Делаем паузу при повторе send_pause_element(6); } lastMode = CALLSIGN; send_pause_element(2); boolean runFlag = true; if (runFlag) runFlag = send_char('7'); if (runFlag) runFlag = send_char('3'); keyerState = IDLE; break; } // end Case } } boolean send_char(byte cw_char) { keyerState = AUTOMATIC_SENDING; switch (cw_char) { case 'A': return send_the_dits_and_dahs(".-"); case 'B': return send_the_dits_and_dahs("-..."); case 'C': return send_the_dits_and_dahs("-.-."); case 'D': return send_the_dits_and_dahs("-.."); case 'E': return send_the_dits_and_dahs("."); case 'F': return send_the_dits_and_dahs("..-."); case 'G': return send_the_dits_and_dahs("--."); case 'H': return send_the_dits_and_dahs("...."); case 'I': return send_the_dits_and_dahs(".."); case 'J': return send_the_dits_and_dahs(".---"); case 'K': return send_the_dits_and_dahs("-.-"); case 'L': return send_the_dits_and_dahs(".-.."); case 'M': return send_the_dits_and_dahs("--"); case 'N': return send_the_dits_and_dahs("-."); case 'O': return send_the_dits_and_dahs("---"); case 'P': return send_the_dits_and_dahs(".--."); case 'Q': return send_the_dits_and_dahs("--.-"); case 'R': return send_the_dits_and_dahs(".-."); case 'S': return send_the_dits_and_dahs("..."); case 'T': return send_the_dits_and_dahs("-"); case 'U': return send_the_dits_and_dahs("..-"); case 'V': return send_the_dits_and_dahs("...-"); case 'W': return send_the_dits_and_dahs(".--"); case 'X': return send_the_dits_and_dahs("-..-"); case 'Y': return send_the_dits_and_dahs("-.--"); case 'Z': return send_the_dits_and_dahs("--.."); case '0': return send_the_dits_and_dahs("-----"); case '1': return send_the_dits_and_dahs(".----"); case '2': return send_the_dits_and_dahs("..---"); case '3': return send_the_dits_and_dahs("...--"); case '4': return send_the_dits_and_dahs("....-"); case '5': return send_the_dits_and_dahs("....."); case '6': return send_the_dits_and_dahs("-...."); case '7': return send_the_dits_and_dahs("--..."); case '8': return send_the_dits_and_dahs("---.."); case '9': return send_the_dits_and_dahs("----."); } return true; } boolean send_the_dits_and_dahs(char const * cw_to_send) { for (int x = 0; x < 12; x++) { switch (cw_to_send[x]) { case '.': if (!send_dit()) return false; break; case '-': if (!send_dah()) return false; break; default: x = 12; break; } } send_pause_element(2); return true; } boolean send_dit() { static long ktimer; ktimer = ditTime * (key_weight / 50.0); // Пищим digitalWrite(KEYpin, HIGH); tone(ST_Pin, key_tone); ktimer += millis(); byte loopDit = 1; while (loopDit) { if (check_break()) return false; if (millis() > ktimer) { // Отключаем звук digitalWrite(KEYpin, LOW); noTone(ST_Pin); loopDit = 0; } } send_pause_element(1); return true; } boolean send_dah() { static long ktimer; ktimer = ditTime * (3 * (key_weight / 50.0)); // Dash Time+Weight // Пищим digitalWrite(KEYpin, HIGH); tone(ST_Pin, key_tone); ktimer += millis(); byte loopDah = 1; while (loopDah) { if (check_break()) return false; if (millis() > ktimer) { // Отключаем звук digitalWrite(KEYpin, LOW); noTone(ST_Pin); loopDah = 0; } } send_pause_element(1); return true; } boolean send_pause_element(int length) { static long ktimer; ktimer = ditTime * (length * (kte - (key_weight / 50.0))); ktimer += millis(); while (millis() <= ktimer) { if (check_break()) return false; } return true; } boolean check_break() { if (digitalRead(straightPin) == LOW || digitalRead(LPin) == LOW || digitalRead(RPin) == LOW) { return true; } else { return false; } }
"это рабочий скетч" - и начинается с ключевого слова case ? - это на каком языке программирования?
Пытаетесь добавлять свое - оно ругается? - как ругается. матом? Цитируйте ошибки, которые вам пишет компилятор. А еще лучше - попытайтесь сами вникнуть в сообщения компилятора, они весьмаинформативны - там написано в какой строке ошибка, в чем она заключается, а иногда даже как исправить.
Я вижу, в чем у вас ошибка - но надо чтобы и вы увидели.
Может не так выразился, рабочая часть скетча.
Часть скетча не может быть рабочей.
Пытаетесь добавлять свое - оно ругается? - как ругается. матом? Цитируйте ошибки, которые вам пишет компилятор. А еще лучше - попытайтесь сами вникнуть в сообщения компилятора, они весьмаинформативны - там написано в какой строке ошибка, в чем она заключается, а иногда даже как исправить.
Я вижу, в чем у вас ошибка - но надо чтобы и вы увидели.
представьте у меня спросит новичок строящий дом себе лично, правильно ли он делает или нет), а я ему отвечу, у тебя стена обвалиться через 10 лет, но я хочу чтобы ты сам это понял.
А что ты ему ответишь, интересно? Пойдешь рисовать ему новый правильный проект? Идивидуально бесплатно научишь класть кирпич?
Сравнение неуместно. Здесь хоббийный форум. Могут помочь тому, кто хочет научиться сам (кому важно самому понять). Все остальные посылаются в коммерческий раздел.
я хочу чтобы ты сам это понял.
я вам написал, чтобы выложили сообщения компилятора. Где они? Я вижу ошибку - но вдруг она не единственная и даже не главная? Всегда лучше на компилятор ориентироваться.
И не надо передергивать - я не предлагаю ждать 10 лет, пока все само развалится - по вашей аналогии я предлагаю прямо сейчас взять отвес и убедится. что стена кривая.
Вам нужно прочитать диагностику компилятора и разобраться, в чем ошибка. Если что не будет непонятно - спрашивайте, но только по конкретным ошибкам. а не вообще
Если не ошибаюсь, это код автоматического телеграфного ключа. Приведите исходный код полностью. И кто автор.
вот так точно скомпилируется, но будет ли работать не знаю )))
Да спасибо работает, компилируется. Буду разбираться, направили на путь. 73 только не передает из памяти, 1 кнопка задействована.
UA3AMY
Понял.
я до CASE пока еще не добрался, не было нужды, надо читать )))