Не могу разобраться, направьте на путь.

Graflught
Offline
Зарегистрирован: 16.02.2022

Умные люди, помогите со скетчем. Знаний маловато пока. Правила форума прочет для новичков, дураком быть готов)). Хочу добавить на другие порты кнопки с заранее записанной памятью, на 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;
  }
}
  
 

 

b707
Offline
Зарегистрирован: 26.05.2017

"это рабочий скетч" - и начинается с ключевого слова case ? - это на каком языке программирования?

b707
Offline
Зарегистрирован: 26.05.2017

Пытаетесь добавлять свое - оно ругается? - как ругается. матом?  Цитируйте ошибки, которые вам пишет компилятор. А еще лучше - попытайтесь сами вникнуть в сообщения компилятора, они весьмаинформативны - там написано в какой строке ошибка, в чем она заключается, а иногда даже как исправить.

Я вижу, в чем у вас ошибка - но надо чтобы и вы увидели.

 

Graflught
Offline
Зарегистрирован: 16.02.2022

Может не так выразился, рабочая часть скетча.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Часть скетча не может быть рабочей.

Graflught
Offline
Зарегистрирован: 16.02.2022

b707 пишет:

Пытаетесь добавлять свое - оно ругается? - как ругается. матом?  Цитируйте ошибки, которые вам пишет компилятор. А еще лучше - попытайтесь сами вникнуть в сообщения компилятора, они весьмаинформативны - там написано в какой строке ошибка, в чем она заключается, а иногда даже как исправить.

Я вижу, в чем у вас ошибка - но надо чтобы и вы увидели.

 

Попробую найти. Спасибо. Я строитель по образованию, представьте у меня спросит новичок строящий дом себе лично, правильно ли он делает или нет), а я ему отвечу, у тебя стена обвалиться через 10 лет, но я хочу чтобы ты сам это понял.

rkit
Offline
Зарегистрирован: 23.11.2016

Graflught пишет:

представьте у меня спросит новичок строящий дом себе лично, правильно ли он делает или нет), а я ему отвечу, у тебя стена обвалиться через 10 лет, но я хочу чтобы ты сам это понял.

А что ты ему ответишь, интересно? Пойдешь рисовать ему новый правильный проект? Идивидуально бесплатно научишь класть кирпич?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Graflught пишет:
представьте у меня спросит новичок строящий дом себе лично, правильно ли он делает или нет), а я ему отвечу, у тебя стена обвалиться через 10 лет, но я хочу чтобы ты сам это понял.

Сравнение неуместно. Здесь хоббийный форум. Могут помочь тому, кто хочет научиться сам (кому важно самому понять). Все остальные посылаются в коммерческий раздел.

b707
Offline
Зарегистрирован: 26.05.2017

Graflught пишет:

я хочу чтобы ты сам это понял.

я вам написал, чтобы выложили сообщения компилятора. Где они? Я вижу ошибку - но вдруг она не единственная и даже не главная? Всегда лучше на компилятор ориентироваться.

И не надо передергивать - я не предлагаю ждать 10 лет, пока все само развалится - по вашей аналогии я предлагаю прямо сейчас взять отвес и убедится. что стена кривая.

Вам нужно прочитать диагностику компилятора и разобраться, в чем ошибка. Если что не будет непонятно - спрашивайте, но только по конкретным ошибкам. а не вообще

UB3AFB
UB3AFB аватар
Offline
Зарегистрирован: 25.01.2017

Если не ошибаюсь, это код автоматического телеграфного ключа. Приведите исходный код полностью. И кто автор.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

вот так точно скомпилируется, но будет ли работать не знаю )))
 

#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 };

boolean check_break()
{
  if (digitalRead(straightPin) == LOW || digitalRead(LPin) == LOW || digitalRead(RPin) == LOW)
  {
    return true;
  }
  else
  {
    return false;
  }
}

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 )
}

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 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;
}



// ==================================
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;

      case AUTOMATIC_CALLSIGN:
        if (lastMode == CALLSIGN)
        {
         // Делаем паузу при повторе
         send_pause_element(6);
        }
        lastMode = CALLSIGN;
        send_pause_element(2);
        runFlag = true;
        if (runFlag) runFlag = send_char('7');
        if (runFlag) runFlag = send_char('3');
        keyerState = IDLE;
        break;
    } // end Case
  }
}

 

Graflught
Offline
Зарегистрирован: 16.02.2022

Да спасибо работает, компилируется. Буду разбираться, направили на путь. 73 только  не передает из памяти, 1 кнопка задействована.

Graflught
Offline
Зарегистрирован: 16.02.2022

UA3AMY

UB3AFB
UB3AFB аватар
Offline
Зарегистрирован: 25.01.2017

Понял.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я до CASE пока еще не добрался, не было нужды, надо читать )))