mardi 19 avril 2016

PROJET BALLON OPEN du BHAF avec un ARDUINO UNO (1)





























































































PROGRAMME  BALLON_PRESSION version actuelle au 20 avril 2016  :  V1-11
Ce programme fonctionne sans erreur avec un éditeur 1.6.1 ou 1.6.8.
Par rapport au plan ci-dessus, il reste à incorporer :
-- la carte mémoire SD
-- faire fonctionner le GPS
-- le sous programme servo
-- le sous programme relais
-- le sous programme RX
-- utiliser les 6 capteurs analogiques
.......   

 /* programme pour ballon avec ARDUINO UNO + NTX2B
capteur de pression MPX5100
*/
//les librairies
#include <SoftwareSerial.h>
#include <TinyGPS.h>
//#include <SD.h>
#include <OneWire.h>
#include <util/crc16.h>

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

//carte memoire
//File theFile;

//radio
char datastring[80];
#define RADIOPIN 8

//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(4800);

pinMode(10, OUTPUT);
}

//radio emettre des trames
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
       digitalWrite(RADIOPIN, HIGH);
     }
     else
     {
       //niveau bas
       digitalWrite(RADIOPIN, LOW);
     }
     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
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(lat % 100000),
            gps.altitude() / 100
            );
            Serial.println(msg);
            delay(1);
          }
       }
//boucle

void loop() {
 
  for (unsigned long start = millis(); millis() - start < 1000;)
  GPS();
 
  //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(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(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(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(val3);
  Serial.print(',');
 
  //capteur de temperature ballonSOL (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(val4);
  Serial.print(',');
 
  //capteur de temperature ballonHe (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(val5);
  Serial.println(' ');

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),
pression_val, temperature_int_val, temperature_ext_val, humidite_val, temperature_ballonSOL_val, temperature_ballonHE_val);

unsigned int CHECKSUM = gps_CRC16_checksum(datastring);
char checksum_str[6];

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

delay(1);

}

===============================
Versions de 1 à 11 sur demande, si vous voulez les versions ultérieures plus rapidement
contactez moi, merci de votre attention à ce projet open source.


GPS gratuit sur M10 , sans démonter le boitier.  Rouge = + 3,3 volts, Noir = masse 0 volt, Jaune =
sortie NMEA GPGGA (broche 5 avec soudure de fil émaillé très fin sous gaine grise. 

Le 22 avril :  vous êtes très nombreux à avoir consulté cette page. Merci.
Si vous avez des difficultés pour installer les bibliothèques, je peux vous communiquer celles
qui tournent avec ce programme. Vous devez le mettre en service sans erreur de compilation,
car il tourne sans problème sur un UNO.
N'hésitez pas à me donner des commentaires, des critiques, des conseils, je suis loin d'être
un expert en langage Arduino !
La mise en œuvre de ce  logiciel est OPEN, ça veut dire que vous pouvez le compléter, à condition
de suivre le plan qui est le suivant :

-- la carte mémoire SD
-- faire fonctionner le GPS
-- le sous programme servo
-- le sous programme relais
-- le sous programme RX
-- utiliser les 6 capteurs analogiques

Votre vitesse à programmer est sans doute supérieure à la mienne ! hi !
Le travail actuel est de mettre au point la réception d'un GPS avec un Arduino et de compléter le programme ci-dessus V1-11 avec  les enseignements apportés avec cette réception GPS.
Suivre avec PROGRAMME_LIRE_GPS...
Le sous programme servo est testé, mais pas encore incorporé à V1-11.

=================================

Vous pouvez m'envoyer votre solution à ce programme et elle pourrait être publiée ici.

A suivre,
From :  f6agv '@' free.fr   BHAF 

Aucun commentaire:

Enregistrer un commentaire