LORA_nacelle.ino 3.58 KB
// Code contenu dans le module Lora Feather EMBARQUE dans la nacelle


#include <SPI.h>
#include <RH_RF95.h>

/* for feather m0 */  
#define RFM95_CS 8
#define RFM95_RST 4
#define RFM95_INT 3

#define TAILLE_RADIOPACKET 20
#define LED 13

// Change to 434.0 or other frequency, must match RX's freq!
#define RF95_FREQ 434.0
// Singleton instance of the radio driver
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); // peut être à enlever avec rasp..
  Serial.begin(9600);
  delay(100);
  //Serial.println("Feather LoRa TX Test!");
  // manual reset
  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("LoRa radio init completed");
  // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM
  if (!rf95.setFrequency(RF95_FREQ)) {
  //Serial.println("setFrequency failed");
  while (1);

  serialFlush();
  }
 
  //Serial.print("Set Freq to: "); Serial.println(RF95_FREQ);
  // Defaults after init are 434.0MHz, 13dBm, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on
  // The default transmitter power is 13dBm, using PA_BOOST.
  // If you are using RFM95/96/97/98 modules which uses the PA_BOOST transmitter pin, then
  // you can set transmitter powers from 5 to 23 dBm:
  rf95.setTxPower(23, false);
}

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;
    }

  
  //Serial.println("Sending..."); delay(10);
  
  //ENVOI DES DONNEES AU SOL
  if (nb_envoi==0){ 
  rf95.send((uint8_t *)radiopacket, TAILLE_RADIOPACKET);
  rf95.waitPacketSent();
  //Serial.println("TX done"); delay(10);
  digitalWrite(LED, HIGH);
  nb_envoi++;
  }

  
  //RECEPTION DES REQUETES PROVENANT DU SOL
  uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
  uint8_t len = sizeof(buf);
  //Serial.println("Waiting for reply..."); delay(10);
  if (rf95.waitAvailableTimeout(1000))
  {
  // Should be a reply message for us now   
  if (rf95.recv(buf, &len))
   {
    //ENVOI DE LA REQUETE VERS LA RASPBERRY
    Serial.println((char*)buf);
    
    //Serial.print("RSSI: ");
    //Serial.println(rf95.lastRssi(), DEC);
       
  }
  else
  {
    //Serial.println("Receive failed");
  }
  }
  else
  {
  //Serial.println("No reply");
  }
  digitalWrite(LED, LOW);

  delay(200);
}