//********************************************************* // Programmas sākums // Jambiskā CW atslēga, // ideja no 2009. gada Septembra QEX žurnāla // Richards Chapmens, KC4IFB // YL2FD adaptācija //********************************************************* #define SPEEDIN 0 // analogā ieeja CW ātruma potenciometram R1 #define DOTIN 2 // D2 ieeja - punkti #define DASHIN 5 // D5 ieeja - svītras #define KEYOUT 11 // D11 izeja uz optronu CW uz transiveri #define TONEPIN 4 // D4 izeja uz zummeri // tehniski lielumi - telegrāfa manipulatora lasīšnai: #define IDLE 0 // gaida #define DASH 1 // atskaņo svītras #define DOT 2 // atskaņo punktus #define DELAY 3 // iztur intervālu starp simboliem int sensorPin = A0; // Ātruma potenciometra ieeja int dotLength; // Programmas mainīgie lielumi int dotVal; // un to sākotnējās vērtības int dashVal; int oldDotVal; int oldDashVal; int speedDial; int currEltEndTime; int currElt; int nextElt; int lastElt; int time; int dit = 56; int dah = 3 * dit; int wdsp = 7 * dit; int Soundtone = 400; // skaņas tonis Hercos void setup() { pinMode(KEYOUT, OUTPUT); //definē ieejas un izejas pinMode(DOTIN, INPUT); pinMode(DASHIN, INPUT); digitalWrite(KEYOUT, LOW); // ieslēdz iekšējos rezistorus drošākai manipulācijai digitalWrite(DOTIN, HIGH); digitalWrite(DASHIN, HIGH); // Inicializē manipulatora stāvokļa mainīgos lastElt = IDLE; currElt = IDLE; nextElt = IDLE; time = millis(); currEltEndTime = time; } void loop() { dotLength = ((analogRead(sensorPin) * (65. / 1023.) + 35)); //load CW message WPM // nolasa manipulatoru: oldDotVal = dotVal; oldDashVal = dashVal; dotVal = digitalRead(DOTIN); dashVal = digitalRead(DASHIN); time = millis(); /********************************** Dažādi manipulatora stāvokļi **********************************/ switch (currElt) { case DASH: if ((dotVal == LOW) && (nextElt == IDLE)) { nextElt = DOT; } if (time >= currEltEndTime) { lastElt = DASH; currElt = DELAY; currEltEndTime = time + dotLength; } digitalWrite(KEYOUT, HIGH); tone(TONEPIN, Soundtone); break; case DOT: if ((dashVal == LOW) && (nextElt = IDLE)) { nextElt = DASH; } if (time >= currEltEndTime) { lastElt = DOT; currElt = DELAY; currEltEndTime = time + dotLength; } digitalWrite(KEYOUT, HIGH); tone(TONEPIN, Soundtone); break; case IDLE: if ((dotVal == LOW) && (dashVal == HIGH)) { lastElt = IDLE; currElt = DOT; currEltEndTime = time + dotLength; } else if ((dotVal == HIGH) && (dashVal == LOW)) { lastElt = IDLE; currElt = DASH; currEltEndTime = time + 3 * dotLength; } else if ((dotVal == LOW) && (dashVal == LOW) && (nextElt == IDLE)) { lastElt = IDLE; currElt = DOT; nextElt = DASH; currEltEndTime = time + 3 * dotLength; } digitalWrite(KEYOUT, LOW); noTone(TONEPIN); break; case DELAY: if (time >= currEltEndTime) { currElt = nextElt; if (currElt == DOT) { currEltEndTime = time + dotLength; } else if (currElt == DASH) { currEltEndTime = time + 3 * dotLength; } lastElt = DELAY; nextElt = IDLE; } if ((lastElt == DOT) && (dashVal == LOW) && (nextElt == NULL)) { nextElt = DASH; } else if ((lastElt == DASH) && (dotVal == LOW) && (nextElt == NULL)) { nextElt = DOT; } digitalWrite(KEYOUT, LOW); noTone(TONEPIN); break; default: noTone(TONEPIN); digitalWrite(KEYOUT, LOW); break; } } // Programmas beigas // ***************************************************************************************