LORA_NACELLE.ino
2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// 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);
}