AntiGuide: ArduinoV21ino



PagePrincipale :: DerniersChangements :: ParametresUtilisateur :: Vous êtes 216.73.216.173 :: Signaler un abus :: le: 20251204 05:29:46
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));   }
}