LORA_terrestre.ino 3.21 KB
/*Programme implanté dans le module FEATHER Adafruit restant au sol*/
#include <SPI.h>
#include <RH_RF95.h>

 //constantes pour ce module feather   
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 3

//taille des paquets Lora envoyés à chaque émission
#define TAILLE_RADIOPACKET 100

// Définition de la fréquence
#define RF95_FREQ 434.0
// Configuration 
RH_RF95 rf95(RFM95_CS, RFM95_INT);

#define LED 13



//Fonction vidage du buffer série
void serialFlush(){
  //pinMode(LED, OUTPUT);
  while(Serial.available() > 0) {
    char t = Serial.read();
  }
}

void setup()
{
pinMode(LED, OUTPUT);
pinMode(RFM95_RST, OUTPUT);
digitalWrite(RFM95_RST, HIGH);
while (!Serial);
Serial.begin(9600); //liaison série 
delay(100);
digitalWrite(RFM95_RST, LOW);
delay(10);
digitalWrite(RFM95_RST, HIGH);
delay(10);
while (!rf95.init()) {
Serial.println("LoRa radio init failed");
while (1);
}
Serial.println("Projet IMA Ballon atmospherique - 2017 ");
// Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250
if (!rf95.setFrequency(RF95_FREQ)) {
Serial.println("setFrequency failed");
while (1);
serialFlush();

}
Serial.print("Set Freq to: "); Serial.println(RF95_FREQ);

rf95.setTxPower(23, false); //Puissance d'émission à 23 dBm

}

//variables servant à ne pas envoyer deux fois la même chaîne
int nb_envoi; 
uint8_t radiopacket[TAILLE_RADIOPACKET] ="null"; //Chaîne contenant la requête à envoyer à la nacelle 
uint8_t radiopacket_tmp[TAILLE_RADIOPACKET]="null";

void loop()
  {
    //DECLARATION VARIABLES ET INITIALISATION
  char caractere_lu = 0; //caractere à lire
  int caractere_dispo = 0; // nombre de caracteres dispo dans le buffer
  int i_chaine = 0; //indique l'endroit où on doit écrire dans la chaîne
 
  memcpy(radiopacket_tmp,radiopacket,TAILLE_RADIOPACKET);

  //LECTURE REQUETE SUR PORT SERIE "SOL"
  caractere_dispo = Serial.available(); 

  while(caractere_dispo > 0) //tant qu'il y a des caractères à lire
    {
        caractere_lu = Serial.read(); //on lit le caractère
        radiopacket[i_chaine] = caractere_lu;
        Serial.print(caractere_lu); //puis on le renvoi à l’expéditeur tel quel
        caractere_dispo = Serial.available(); //on relit le nombre de caractères dispo
        i_chaine++;
    }
    radiopacket[i_chaine] = 0;  //  marquage fin du packet 

    //si la donnée reçu est différente de la précédente
    if(memcmp(radiopacket,radiopacket_tmp,TAILLE_RADIOPACKET)!=0){
      nb_envoi = 0;
    }

    
   //ENVOI REQUETE 
   if (nb_envoi==0){    
    rf95.send((uint8_t *)radiopacket, sizeof(radiopacket));
    Serial.print("Envoi commande\n");
    nb_envoi++;   
    }
    
    //LECTURE DONNEES VENANT DE LA NACELLE 
    if (rf95.available())
      {
       uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
       uint8_t len = sizeof(buf);
         if (rf95.recv(buf, &len))
          {
            digitalWrite(LED, HIGH);
            Serial.print("Reception: ");
            Serial.println((char*)buf);

            //Puissance du signal lors de la dernière réception (en dBm)
            Serial.print("RSSI: ");
            Serial.println(rf95.lastRssi(), DEC);
            }
          else
            {
              Serial.println("Receive failed");
              }
        }
     delay(100);
}