Bonjour Jay M
ok je l'ai retiréCitation:
Il reste le display.clear(); dans la loop
mais j'ai toujours un temps de "retard" d'env 1.3s et je ne vois pas du tout
quel en est la cause
Version imprimable
Bonjour Jay M
ok je l'ai retiréCitation:
Il reste le display.clear(); dans la loop
mais j'ai toujours un temps de "retard" d'env 1.3s et je ne vois pas du tout
quel en est la cause
essayez avec ce code en installant la bibliothèque OneButton (dispo dans la recherche de bibliothèques). ça simplifie la gestion des boutons
lors de l'appui sur un bouton ça envoie 1 ou 2
lors du double click ça envoie 11 ou 22
lors d'un appui long ça envoie 1D au début puis 1F à la fin ou 2D et 2F pour l'autre bouton
(je n'ai pas testé mais ça devrait compiler je pense)
Code:
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 #include <LoRa.h> #include <OneButton.h> // http://www.mathertel.de/Arduino/OneButtonLibrary.aspx const byte pinBouton1 = 32; const byte pinBouton1 = 33; OneButton sw1(pinBouton1); OneButton sw2(pinBouton2); void loraMessage(const char * message) { LoRa.beginPacket(); LoRa.println(message); LoRa.endPacket(); } // CALLBACKS BOUTON 1 void sw1Click() {loraMessage("1");} void sw1DoubleClick() {loraMessage("11");} void sw1DebutLong() {loraMessage("1D");} void sw1FinLong() {loraMessage("1F");} // CALLBACKS BOUTON 2 void sw2Click() {loraMessage("2");} void sw2DoubleClick() {loraMessage("22");} void sw2DebutLong() {loraMessage("2D");} void sw2FinLong() {loraMessage("2F");} // CODE PRINCIPAL void setup() { pinMode(SW1, INPUT_PULLUP); pinMode(SW2, INPUT_PULLUP); Serial.begin(115200); while (!Serial) yield(); Serial.println("LoRa Sender"); if (!LoRa.begin(433E6)) { // 433E6 ou 915E6 suivant région Serial.println("Starting LoRa failed!"); while (true) yield(); } sw1.attachClick(sw1Click); sw1.attachDoubleClick(sw1DoubleClick); sw1.attachLongPressStart(sw1DebutLong); sw1.attachLongPressStop(sw1FinLong); sw2.attachClick(sw2Click); sw2.attachDoubleClick(sw2DoubleClick); sw2.attachLongPressStart(sw2DebutLong); sw2.attachLongPressStop(sw2FinLong); } void loop() { sw1.tick(); sw2.tick(); }
il bloque juste la compil sur çà :
cannot convert 'OneButton' to 'uint8_t {aka unsigned char}' for argument '1' to 'void pinMode(uint8_t, uint8_t)'Code:
1
2 pinMode(sw1, INPUT_PULLUP); pinMode(sw2, INPUT_PULLUP);
EDIT :
j'ai modifié en :
pinMode(pinBouton1, INPUT_PULLUP);
pinMode(pinBouton2, INPUT_PULLUP);
et j'ai rajouté la prise en compte de
pour permettre le démarrage de LoRaCode:#include <SPI.h>
par contre comment afficher le message envoyé qvp ?
effectivement il fallait utiliser le numéro des pins (copier coller malheureux depuis votre code alors que j'avais changé le nom des variables)
il me semble que SPI est inclus automatiquement, mais ça ne coûte rien de le rajouter
pour la réception, un truc tout simple comme cela (tapé ici, donc à tester) devrait fonctionner
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include <SPI.h> #include <LoRa.h> void setup() { Serial.begin(115200); while (!Serial) yield(); if (!LoRa.begin(433E6)) { // 433E6 ou 915E6 suivant région Serial.println("Starting LoRa failed!"); while (true) yield(); } Serial.println("LoRa Receiver"); } void loop() { int packetSize = LoRa.parsePacket(); if (packetSize) { Serial.print("Message: "); while (LoRa.available())Serial.write(LoRa.read()); Serial.println(); } }
à minima, il lui faut impérativement lui donner le raccordement pour valider la prise en compte du LoRa :Citation:
il me semble que SPI est inclus automatiquement, mais ça ne coûte rien de le rajouter
j'ai donc maintenant codé la réceptionCode:LoRa.setPins(nss, rst, dio0);
Il me reste donc à effectuer les actions liées à chaque bouton
par ex :
Bouton 1 :
il est actif si = 1 ou 11 ou 12 ( j'ai du changer 1F ne passait pas )
il est inactif si = autre
donc en "recupérant" dans "val"
je dois pouvoir traiter les cas précitésCode:
1
2
3
4 int inChar = LoRa.read(); inString += (char)inChar; val = inString.toInt();
mais je n'arrive pas à voir "val" tandis que le terme "message" s'affiche avec la bonne valeur (?)
Code:
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 #include <SPI.h> #include <LoRa.h> /* Wemos Pins **************************SX1278 Pins GND GND 3.3V**************************************VCC D8**GIO15*********************************NSS D7**GIO13*********************************MOSI D6**GIO12*********************************MISO D5**GIO14*********************************SCK D0**GIO16*********************************RST D2**GIO4**********************************DIO0 */ #define nss 15 #define rst 16 #define dio0 4 const int LED1 = D1; // indicator LED const int LEDBTN1 = D3; // relay 1 String inString = ""; // string to hold input int val = 0; int pValue = 0; int lValue = 0; int SyncWord = 0x22; void setup() { Serial.begin(115200); while (!Serial) yield(); ///////////////////////////////////////////////////////////// LoRa.setPins(nss, rst, dio0); if (!LoRa.begin(433E6)) { // 433E6 ou 915E6 suivant région Serial.println("Starting LoRa failed!"); while (true) yield(); } /* LoRa.setSpreadingFactor(12); // ranges from 6-12,default 7 see API docs LoRa.setSignalBandwidth(62.5E3); // for -139dB (page - 112) LoRa.setCodingRate4(8); // for -139dB (page - 112) */ //LoRa.setSyncWord(SyncWord); // ranges from 0-0xFF, default 0x12, see API docs Serial.println("LoRa Receiver"); /////////////////////////////////////////////////////////// pinMode(LED1,OUTPUT); pinMode(LEDBTN1,OUTPUT); digitalWrite(LED1 , LOW); digitalWrite(LEDBTN1 , LOW); } void loop() { int packetSize = LoRa.parsePacket(); if (packetSize) { Serial.print("Message: "); while (LoRa.available()) { Serial.write(LoRa.read()); //Serial.println(""); int inChar = LoRa.read(); inString += (char)inChar; val = inString.toInt(); digitalWrite(LED1 , HIGH); delay(50); digitalWrite(LED1 , LOW); delay(50); } inString = ""; } Serial.println(val); lValue = val; if( pValue != lValue) { pValue = lValue; switch (val) { case 1: digitalWrite(LEDBTN1 , HIGH); delay(10); break; case 11: digitalWrite(LEDBTN1 , HIGH); delay(10); break; case 12: digitalWrite(LEDBTN1 , HIGH); delay(10); break; default: digitalWrite(LEDBTN1 , LOW); delay(10); break; } } delay(50); }
bon les messages semblent passer correctement c'est déjà cela
si vous voulez stocker le message dans un buffer, il ne faut pas l'imprimer puis après essayer de lire (ça lit l'entrée suivante). il faut tout charger dans un buffer puis décoder (ou décoder au fil de l'eau)
essayez cela pour commencer
Code:
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 #include <SPI.h> #include <LoRa.h> #define nss 15 #define rst 16 #define dio0 4 void setup() { Serial.begin(115200); while (!Serial) yield(); LoRa.setPins(nss, rst, dio0); if (!LoRa.begin(433E6)) { // 433E6 ou 915E6 suivant région Serial.println("Starting LoRa failed!"); while (true) yield(); } Serial.println("LoRa Receiver"); } void loop() { int packetSize = LoRa.parsePacket(); if (packetSize) { char buffer[packetSize + 1]; // +1 pour mettre un caractère nul à la fin size_t position = 0; // on récupère le message dans le buffer while (LoRa.available()) buffer[position++] = (char)LoRa.read(); // <== EDIT, rajout du = manquant // on termine le message (on suppose que c'est de l'ASCII) buffer[position]* = '\0'; // On imprime le message Serial.print("J'ai reçu : "); Serial.println(buffer); // ensuite on peut jouer avec le buffer de différentes façons switch (buffer[0]) { case '1': Serial.print("C'était le bouton 1"); break; case '2': Serial.print("C'était le bouton 2"); break; default: Serial.print("bouton inconnu"); break; } if (packetSize > 1) { switch (buffer[1]) { case '1': case '2': Serial.print(" et c'était un double click"); break; case 'D': Serial.print(" et c'était un début d'appui long"); break; case 'F': Serial.print(" et c'était une fin d'appui long"); break; default: Serial.print(" et je ne sais pas trop à quoi ça correspond"); break; } } Serial.printl(); // on pourrait aussi comparer directement if (strcmp(buffer, "1") == 0) Serial.println("Appui simple sur le bouton 1"); else if (strcmp(buffer, "2") == 0) Serial.println("Appui simple sur le bouton 2"); else if (strcmp(buffer, "11") == 0) Serial.println("Appui double sur le bouton 1"); // etc etc etc } }
merci encore Jay M
j'ai une erreur compil sur cette ligne
Code:while (LoRa.available()) buffer[position++] (char)LoRa.read();
Que j'ai corrigée comme çàCitation:
C:\Users\Utilisateur\Documents\Arduino\sketch_dec09c\sketch_dec09c.ino: In function 'void loop()':
sketch_dec09c:22:49: error: expected primary-expression before 'char'
while (LoRa.available()) buffer[position++](char)LoRa.read();
^
sketch_dec09c:22:53: error: expression cannot be used as a function
while (LoRa.available()) buffer[position++](char)LoRa.read();
^
sketch_dec09c:22:54: error: expected ';' before 'LoRa'
while (LoRa.available()) buffer[position++](char)LoRa.read();
^
Plusieurs bibliothèque trouvées pour "SPI.h"
Utilisé : C:\Users\Utilisateur\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\SPI
Non utilisé : C:\Users\Utilisateur\Documents\Arduino\libraries\SPI-master
Plusieurs bibliothèque trouvées pour "LoRa.h"
Utilisé : C:\Users\Utilisateur\Documents\Arduino\libraries\LoRa
Non utilisé : C:\Users\Utilisateur\Documents\Arduino\libraries\arduino-LoRa-master
Utilisation de la bibliothèque SPI version 1.0 dans le dossier: C:\Users\Utilisateur\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\SPI
Utilisation de la bibliothèque LoRa version 0.8.0 dans le dossier: C:\Users\Utilisateur\Documents\Arduino\libraries\LoRa
exit status 1
expected primary-expression before 'char'
çà compile mais çà fait de drôle chose après ...désoléCode:while (LoRa.available()) buffer[position++],(char)LoRa.read();
EDIT :
Mille pardons , j'ai corrigé comme suit :
et çà marche beaucoup mieuxCode:while (LoRa.available()) buffer[position++]=(char)LoRa.read();
Bonjour,
Il y a sans doute un opérateur d'affectation qui s'est perdu quelque part.
oui il manquait le `=` (je tape le code directement dans le forum donc...)
à affiner au niveau des messages, les tests que j'avais proposés correspondant aux anciens messages 1, 11, 1D et 1F (et pareil avec 2) ==> si vous les avez changés, il faut modifier en conséquence
et le switch / case était faux, c'est pas 0 et 1 qu'il faut tester mais 1 et 2 bien sûr
Code:
1
2
3
4
5 switch (buffer[0]) { case '1': Serial.print("C'était le bouton 1"); break; case '2': Serial.print("C'était le bouton 2"); break; default: Serial.print("bouton inconnu"); break; }
Bonjour Jay M
Juste un retour pour vous remercier pour votre patience et votre aide
j'ai juste modifié le support du récepteur en passant sous un TTGO Lora en lieu et place d'un Wemos
( j'avais besoin une LED supplémentaire sur le récepteur et un bouton supplémentaire sur l'émetteur pour l'accusé de réception)
Les deux modules semblent se "causer" et je mets en copie les 2 deux
Émetteur
RécepteurCode:
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 #include <LoRa.h> #include <SPI.h> #include <OneButton.h> // http://www.mathertel.de/Arduino/OneButtonLibrary.aspx #define SCK 5 // GPIO5 -- SX1278's SCK #define MISO 19 // GPIO19 -- SX1278's MISO #define MOSI 27 // GPIO27 -- SX1278's MOSI #define SS 18 // GPIO18 -- SX1278's CS #define RST 14 // GPIO14 -- SX1278's RESET #define DI0 26 // GPIO26 -- SX1278's IRQ(Interrupt Request) #define BAND 433E6 const byte pinBouton1 = 32; const byte pinBouton2 = 33; const byte pinBouton3 = 13; OneButton sw1(pinBouton1); int value1; OneButton sw2(pinBouton2); int value2; OneButton sw3(pinBouton3); int value3; void loraMessage(const char * message) { LoRa.beginPacket(); LoRa.println(message); LoRa.endPacket(); } // CALLBACKS BOUTON 1 void sw1Click() {loraMessage("1");} void sw1DoubleClick() {loraMessage("11");} void sw1DebutLong() {loraMessage("1D");} void sw1FinLong() {loraMessage("1F");} // CALLBACKS BOUTON 2 void sw2Click() {loraMessage("2");} void sw2DoubleClick() {loraMessage("21");} void sw2DebutLong() {loraMessage("2D");} void sw2FinLong() {loraMessage("2F");} // CALLBACKS BOUTON 3 void sw3Click() {loraMessage("3");} void sw3DoubleClick() {loraMessage("31");} void sw3DebutLong() {loraMessage("3D");} void sw3FinLong() {loraMessage("3F");} // CODE PRINCIPAL void setup() { pinMode(pinBouton1, INPUT_PULLUP); pinMode(pinBouton2, INPUT_PULLUP); pinMode(pinBouton3, INPUT_PULLUP); Serial.begin(115200); while (!Serial) yield(); SPI.begin(SCK,MISO,MOSI,SS); LoRa.setPins(SS,RST,DI0); Serial.println("LoRa Sender"); if (!LoRa.begin(433E6)) { // 433E6 ou 915E6 suivant région Serial.println("Starting LoRa failed!"); while (true) yield(); } // BTN1 sw1.attachClick(sw1Click); sw1.attachDoubleClick(sw1DoubleClick); sw1.attachLongPressStart(sw1DebutLong); sw1.attachLongPressStop(sw1FinLong); // BTN2 sw2.attachClick(sw2Click); sw2.attachDoubleClick(sw2DoubleClick); sw2.attachLongPressStart(sw2DebutLong); sw2.attachLongPressStop(sw2FinLong); // BTN3 sw3.attachClick(sw3Click); sw3.attachDoubleClick(sw3DoubleClick); sw3.attachLongPressStart(sw3DebutLong); sw3.attachLongPressStop(sw3FinLong); } void loop() { sw1.tick(); sw2.tick(); sw3.tick(); }
Un grand merci encoreCode:
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
113
114
115
116
117 #include <LoRa.h> #include <SPI.h> // LoRa definition #define SCK 5 // GPIO5 -- SX1278's SCK #define MISO 19 // GPIO19 -- SX1278's MISO #define MOSI 27 // GPIO27 -- SX1278's MOSI #define SS 18 // GPIO18 -- SX1278's CS #define RST 14 // GPIO14 -- SX1278's RESET #define DI0 26 // GPIO26 -- SX1278's IRQ(Interrupt Request) #define BAND 433E6 // LED definition #define LED1 32 #define LED2 33 #define LED3 13 bool Flag = 0; //***************************** // SETUP //***************************** void setup() { Serial.begin(115200); while (!Serial) yield(); SPI.begin(SCK,MISO,MOSI,SS); LoRa.setPins(SS,RST,DI0); Serial.println("LoRa Receiver"); if (!LoRa.begin(433E6)) { // 433E6 ou 915E6 suivant région Serial.println("Starting LoRa failed!"); while (true) yield(); } pinMode(LED_BUILTIN, OUTPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); digitalWrite(LED_BUILTIN, LOW); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); } //****************************** // LOOP //****************************** void loop() { int packetSize = LoRa.parsePacket(); if (packetSize) { char buffer[packetSize + 1]; // +1 pour mettre un caractère nul à la fin size_t position = 0; // on récupère le message dans le buffer while (LoRa.available()) buffer[position++]=(char)LoRa.read(); digitalWrite(LED_BUILTIN ,HIGH); delay(10); digitalWrite(LED_BUILTIN , LOW); delay(10); // on termine le message (on suppose que c'est de l'ASCII) buffer[position]*= '\0'; // On imprime le message Serial.print("Reception: "); Serial.println(buffer); // ensuite on peut jouer avec le buffer de différentes façons switch (buffer[0]) { case '1': Serial.println("Btn 1"); digitalWrite(LED1,HIGH); delay(500); digitalWrite(LED1,LOW); delay(10); Flag = 1; break; case '2': Serial.println("Btn 2"); digitalWrite(LED2,HIGH); delay(500); digitalWrite(LED2,LOW); delay(10); Flag = 1; break; case '3': Serial.println("Btn 3"); digitalWrite(LED3,LOW); delay(10); Flag = 0; break; default: break; } if (packetSize > 1) { switch (buffer[1]) { case '1': Serial.print("Double click"); break; case 'D': Serial.print("Début d'appui long"); break; case 'F': Serial.print("Fin d'appui long"); break; default: break; } } if (Flag) { digitalWrite(LED3,HIGH); //delay(000); } else { digitalWrite(LED3,LOW); //delay(500); } } }
Je clôture
Bravo
Juste une remarque, je pense que la classe OneButton fait cela pour vous
A priori vous devez pouvoir l’enleverCode:
1
2
3 pinMode(pinBouton1, INPUT_PULLUP); pinMode(pinBouton2, INPUT_PULLUP); pinMode(pinBouton3, INPUT_PULLUP);
Ok Mille Mercis Jay M