LORA_NACELLE.ino 2.77 KB
// Code contenu dans le module Lora Feather EMBARQUE dans la nacelle

#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 200
#define LED 13

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

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

void setup()
{
  pinMode(RFM95_RST, OUTPUT);
  digitalWrite(RFM95_RST, HIGH);
  while (!Serial); 
  Serial.begin(9600);
  delay(100);
  digitalWrite(RFM95_RST, LOW);
  delay(10);
  digitalWrite(RFM95_RST, HIGH);
  delay(10);
  while (!rf95.init()) {
  while (1);
  }
  // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250
  if (!rf95.setFrequency(RF95_FREQ)) {
  //Serial.println("setFrequency failed");
  while (1);

  serialFlush();
  }

  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 DES DONNEES A ENVOYER AU 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[TAILLE_RADIOPACKET-1] = 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 DES DONNEES AU SOL
  if (nb_envoi==0){ 
  rf95.send((uint8_t *)radiopacket, TAILLE_RADIOPACKET);
  rf95.waitPacketSent();
  digitalWrite(LED, HIGH);
  nb_envoi++;
  }

  
  //RECEPTION DES REQUETES PROVENANT DU SOL
  uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);
  if (rf95.waitAvailableTimeout(1000))
  {
  if (rf95.recv(buf, &len))
   {
    //ENVOI DE LA REQUETE VERS LA RASPBERRY
    Serial.println((char*)buf);     
   }
  }
  digitalWrite(LED, LOW);

  delay(200);
}