/* 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...
Aucun commentaire:
Enregistrer un commentaire