lundi 2 mai 2016

PROGRAMME OPEN ARDUINO pour BALLON AMATEUR 434 MHz FSK

 /* programme pour ballon avec ARDUINO UNO + NTX2B
     capteur de pression MPX5100
     PROGRAMME BALLONS F6AGV PRESSION V1-19(state 020516 BON)
     */
     //les librairies declarees
     #include <SoftwareSerial.h>
     #include <TinyGPS.h>
     //#include <SD.h>
     #include <OneWire.h>
     #include <util/crc16.h>

     // entree & sortie GPS & vitesse
     static const int RXPin=2, TXPin=3;
     static const uint16_t GPSBaud = 4800;

     //GPS
     TinyGPS gps;
     SoftwareSerial mySerial(RXPin, TXPin);
     char msg[80];
     int count =1;
     long lat, lon;
     unsigned long time;

     //carte memoire SD
     //File theFile;

     //radio
     char datastring[250];
     #define RADIOPIN 8
     #define INVERTPIN 9

     //initialisation Variables
     int val = 0;
     int pression_val = 0;
     int altitude_val = 0;
     int temperature_val = 0;
     int temperature_val_ext = 0;

     void setup() {
     Serial.begin(115200);
     mySerial.begin(GPSBaud);

     pinMode(10, OUTPUT);
     }

     //radio emettre des trames ou datas
     void rtty_txstring(char * string)
     {
     char c;
     c = *string++;
     while (c != '\0')
     {
    rtty_txbyte (c);
    c = *string++;
      }
    }

    void rtty_txbyte (char c)
    {
    int i;
    rtty_txbit(0); //start bit a zero
    for (i=0;i<7;i++)  //7 ou 8 bits
    {
    if (c&1) rtty_txbit(1);
    else rtty_txbit(0);
    c = c>>1;
    }
 
    rtty_txbit (1);  //stop bit
    rtty_txbit (1);  //stop bit
    }
 
    void rtty_txbit (int bit)
    {
    if (bit)
     {
      
    // niveau haut PIN 8 & bas PIN 9
       digitalWrite(RADIOPIN, HIGH);
       digitalWrite(INVERTPIN, LOW);
     }
     else
     {
     //niveau bas PIN 8 &  haut PIN 9
       digitalWrite(RADIOPIN, LOW);
       digitalWrite(INVERTPIN, HIGH);
     }
     delayMicroseconds(10000);
     delayMicroseconds(10150);
     }
    
     uint16_t gps_CRC16_checksum (char *string)
     {
       size_t i;
       uint16_t crc;
       uint8_t c;
       crc = 0xFFFF;
      
     //Calcul checksum ignoring the first two $$
     for (i=2; i < strlen(string); i++)
     {
       c = string[i];
       crc = _crc_xmodem_update (crc, c);
     }
     return crc;
     }
 
     //GPS trimble de M10
     void GPS()
     {
     if (mySerial.available()) {
       
     if(!gps.encode(mySerial.read())) return;
  
     gps.get_position(&lat, &lon, NULL);
     gps.get_datetime(NULL, &time, NULL);
  
     snprintf(msg, 80,
     "h = :%02li:%02li:%02li lat/lon = :%s%li.%05li,%s%li.%05li alt = :%li",
            time / 1000000, time / 10000 % 100, time / 100 % 100,
            (lat >= 0 ? "" : "-"), labs(lat / 100000), labs(lat % 100000),
            (lon >= 0 ? "" : "-"), labs(lon / 100000), labs(lon % 100000),
            gps.altitude() / 100
            );
            //Serial.println(msg);
            delay(1);
          }
       }
      
     // boucle infinie
     void loop() {
 
     for (unsigned long start = millis(); millis() - start < 1000;)
     GPS();
     // 6 capteurs analogiques resolution 10 bits
     // capteur de pression (0)
     int val0 = 0;
     int pression_val = 0;
     val0 = analogRead(0); //lire entree A0
     float tension = (val0*0.0048875);
     //calcul de la pression reelle
     //pression_val = (val0 * 1.217);
     pression_val = val0;
     //affichage pression sur moniteur
     //Serial.print("A0=");
     //Serial.print(val0);
     //Serial.print(',');
    
     // capteur de temperature interne (1)
     int val1 = 0;
     int temperature_int_val = 0;
     val1 = analogRead(1); //lire entree A1
     //calcul de la temperature int reelle
     temperature_int_val = val1;
     //Serial.print("A1=");
     //Serial.print(val1);
     //Serial.print(',');
 
     // capteur de temperature externe (2)
     int val2 = 0;
     int temperature_ext_val = 0;
     val2 = analogRead(2); //lire entree A2
     //calcul de la temperature ext reelle
     temperature_ext_val = val2;
     //Serial.print("A2=");
     //Serial.print(val2);
     //Serial.print(',');
 
     // capteur d' humidite (3)
     int val3 = 0;
     int humidite_val = 0;
     val3 = analogRead(3); //lire entree A3
     //calcul de l'humidite reelle
     humidite_val = val3;
     //Serial.print("A3=");
     //Serial.print(val3);
     //Serial.print(',');
 
     // capteur de temperature ballon solaire (4)
     int val4 = 0;
     int temperature_ballonSOL_val = 0;
     val4 = analogRead(4); //lire entree A4
     //calcul de la temperature ballonSOL
     temperature_ballonSOL_val = val4;
     //Serial.print("A4=");
     //Serial.print(val4);
     //Serial.print(',');
                
     // capteur de temperature ballon helium (5)
     int val5 = 0;
     int temperature_ballonHE_val = 0;
     val5 = analogRead(5); //lire entree A5
     //calcul de la temperature ballonHE
     temperature_ballonHE_val = val5;
     //Serial.print("A5=");
     //Serial.print(val5);
     //Serial.println(' ');
        
     // trame heure & minute & seconde 
     //snprintf(datastring, 250, "$$F6AGV,%02li:%02li:%02li,", time / 1000000, time /10000 % 100, time /100 % 100);
     //Serial.println(datastring);
     // trame lat & lon & alt
     //snprintf(datastring, 250, "$$F6AGV,%s%li.%05li,%s%li.%05li,%li,",
     //(lat >=0? "" : "-"), labs(lat /100000), labs(lat % 100000),
     //(lon >=0? "" : "-"), labs(lon /100000), labs(lon % 100000), gps.altitude() /100);

     //Serial.println(datastring);
     // trame capteur
     //snprintf(datastring, 250, "$$F6AGV,CAPT,%d,%d,%d,%d,%d,%d,",
     //pression_val, temperature_int_val, temperature_ext_val, humidite_val, temperature_ballonSOL_val, temperature_ballonHE_val);

     //Serial.print(datastring);

     // format de sortie RX:
     // trame complete
     snprintf(datastring, 250, "$$F6AGV,%02li:%02li:%02li,%s%li.%05li,%s%li.%05li,%li,%d,%d,%d,%d,%d,%d,",
         time / 1000000, time /10000 % 100, time /100 % 100,
         (lat >=0? "" : "-"), labs(lat /100000), labs(lat % 100000),
     (lon >=0? "" : "-"), labs(lon /100000), labs(lon % 100000), gps.altitude() /100,
     pression_val, temperature_int_val, temperature_ext_val, humidite_val, temperature_ballonSOL_val, temperature_ballonHE_val);

     // calcul checksum & incorporation trame 
     unsigned int CHECKSUM = gps_CRC16_checksum(datastring+2);
     char checksum_str[6];

     sprintf(checksum_str, "*%04X\n", CHECKSUM);
     strcat(datastring,checksum_str);
     //Serial.println(CHECKSUM);
     Serial.println(datastring);
     rtty_txstring (datastring);
     interrupts();

     delay(1);
     }

===========================
From :  Alain F6AGV
fichier ino sur demande via f6agv '@' free.fr  attention les versions se suivent et ne sont pas garanties comme définitives et exemptes d'erreurs...
un petit groupe informel s'est créé, au quatre coin de la France, vous pouvez suivre le mouvement ?
envoyez moi, votre version testée en vrai avec le NTX2B et un GPS.
Aujourd'hui, les tests ont repris et il y a des problèmes avec l'étage d'entrée de l'émetteur NTX2B, le
but est de moduler avec le maximum de pureté du signal UHF et adapter l'entrée du GPS qui pour
l'instant est alimenté en 3 volts...
A suivre,
Commentaires et critiques positives bienvenues...