ArduinoV21
/*
V21
This example code is in the public domain.
*/
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
// output (default: huggly sound by digital output)
#define WIRED 0 // output bit suare signal (for direct wires external FSK henerator)
#define TONE 0 // use Arduino internal tone generator
// HMI
#define TICTAC 1 // led blink at 1 HZ
#define VISU 0 // output bit on led (at very slow rate)
// tests & debug
#define TEST 0 // continous 0/1
#define FASTTEST 0 // output FTEST bit
#define FTEST 0 // bit générated by TEST/FASTTEST
#define DEBUG 0 // some debug info on com port
#define DELAY 1 // between bits
// ascii format
#define BITS 8 // 8 // 8
#define STOPBITS 2 //2 // 2
//paramètres
#define STOPAFT -2 // nb de CARACTERES avant arret; -2 for unlimited
#define BAUDS 300 // bits par seconde
// autres à ne pas modifier
#define led 13
#define bip 12
char texte[]="Bonjour Monsieur le Directeur\r\n";
int lettre=0;
// compteurs
long ctsec=0; // compte les loop avant de changer de " pour clignotement diode (VISU)
long ctbit=0; // compte les tours avant de passer au bit suivant
int f=0; // bit en cours (0 ou 1)
// frequencies
// http://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-V.21-198811-I!!PDF-E&type=items
// channel No. 1 (FA = 1180 Hz and Fz = 980 Hz);
// channel No. 2 (FA = 1850 Hz and Fz= 1650 Hz).
#define F0 1180 // V21 bit 0
#define F1 980 // V21 bit 1
long hz[2]={F0,F1}; // frequences (not used if WIRED)
uint32_t sec=65000; // dummy, will be computed at startup
uint32_t periode=0; // ## loops ny bit (will br computrd)
uint32_t ctonde=0; //
uint32_t onde=0;
// the setup routine runs once when you press reset:
byte byt,bits;
uint32_t depart=0;
int etalonnage=1;
int stopaft=STOPAFT;
void setup() {
texte[0]=128;
Serial.begin(9600);
Serial.println("[tx V21]");
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
pinMode(bip, OUTPUT);
digitalWrite(bip,HIGH);
periode=sec/BAUDS;
Serial.println(periode);
Serial.println(hz[0]);
Serial.println(hz[1]);
Serial.print(" nb de car:");
Serial.println(stopaft);
Serial.print(" bauds:");
Serial.println(BAUDS);
Serial.print(" lon:");
Serial.println(1+BITS+STOPBITS);
if (stopaft>0) {
Serial.print(" prevu (ms) :");
Serial.println(1000L*( stopaft*(1+BITS+STOPBITS))/BAUDS) ;
}
bits=0;
depart=millis();
etalonnage=1;
digitalWrite(bip,HIGH);
if (FASTTEST) for (int j=0;j<3;j=j+1) {
tone(bip,50);
delay(10);
tone(bip,100);
delay(10);
noTone(bip);
}
}
void mytone(int f01) {
int fu=f01;
if (TEST) fu=FTEST;
ctbit=0;
// Serial.print(" mytone mise a f=");Serial.println(f01);
// if (VISU && (f==f0) ) digitalWrite(led, HIGH);
if (VISU ) digitalWrite(led, fu);
if (TONE && !WIRED) {
tone(bip,hz[fu]);
}else if (WIRED) {
digitalWrite (bip,fu);
}else {
onde=sec/hz[fu];
ctonde=0;
}
}
// the loop routine runs over and over again forever:
void loop() {
if (FASTTEST) return; // done in setup!
if (stopaft==-1) { // end of string or STOPAFT
Serial.print("TERMINE nb de ms: ");
Serial.print(millis()-depart);
Serial.print(" chars count:");
Serial.println(lettre);
stopaft=-3;
}
if (stopaft<=-3) { //quiet
if (TONE) {
noTone(bip);}
else {
digitalWrite(bip,HIGH);}
return; // no more led blinking
}
ctsec=ctsec+1;
ctbit=ctbit+1;
if (etalonnage && millis()-depart>1000) {
uint32_t elap=millis()-depart;
sec=sec*elap/1000;
Serial.print("sec mis a ");Serial.println(sec);
etalonnage=false;
depart=millis();
return;
}
if (etalonnage) return;
if (!WIRED && !TONE && onde>0){
ctonde=ctonde+1;
// Serial.print("count=");Serial.print(stopaft);Serial.print(" onde=");Serial.print(onde);Serial.print(" ct=");Serial.println(ctonde);
if (ctonde>onde){
ctonde=0;
if (!etalonnage) {
digitalWrite(bip, !digitalRead(bip));
if (DEBUG){ Serial.print("[");Serial.print(digitalRead(bip));Serial.print("]");}
}
}
}
if (ctbit>periode) { // changement de baud et de bit!
f=0;
if (DELAY>0){if (TONE) noTone(bip); delay(DELAY);}
// Serial.print ("bits=");Serial.println(bits);
if (bits==0) {
if (lettre>=strlen(texte)) lettre=0 ;
/*{stopaft=-1;Serial.println("STOP fuin de chaine ");return;}*/
byt=texte[lettre]; // charger une lettre
lettre=lettre+1;
if (DEBUG) Serial.println();
if (stopaft>=0) stopaft=stopaft-1; // décompte des caracteres emeis
if (stopaft>=0 && DEBUG) {
Serial.print(" stopaft=");Serial.print(stopaft+1);Serial.print(" envoyer:");Serial.print(byt);Serial.print("-------------------");
}
if (stopaft>=0 && DEBUG) { Serial.print("lu:");Serial.print(byt);}
}
// changer de bit:
int bold=byt;
if (bits >0 && bits<=BITS) {
// Serial.print("encours:");Serial.print(byt);
if (byt>=128) f=1;
byt=byt+byt;
// Serial.println(byt);
}
if (bits>BITS) f=1;
if (DEBUG){
Serial.println();
Serial.print("bit:");
Serial.print(bits);
Serial.print(" decale:");Serial.print(bold);
Serial.print(" f:");
Serial.println(f);
}
bits=bits+1;
if (bits > BITS+STOPBITS) bits=0;
mytone(f);
}
if (ctsec>sec/2){
/*
if (DEBUG) {
Serial.println(ctsec);
Serial.println(millis()-depart);
}
*/
// depart=millis();
ctsec=0;
if (TICTAC) digitalWrite(led, !digitalRead(led)); }
}