Commit 5ce46bb4aff2a0386b0cfb78a244146306033013
0 parents
fichier ESP32
Showing
2 changed files
with
220 additions
and
0 deletions
Show diff stats
1 | +++ a/README.md |
1 | +++ a/unwheezeSketch2.ino | ||
@@ -0,0 +1,220 @@ | @@ -0,0 +1,220 @@ | ||
1 | +#include <BLEDevice.h> | ||
2 | +#include <BLEServer.h> | ||
3 | +#include <BLEUtils.h> | ||
4 | +#include <BLE2902.h> | ||
5 | + | ||
6 | +#include <Arduino.h> | ||
7 | + | ||
8 | +//info capteur | ||
9 | +#define LENG 31 //0x42 + 31 bytes equal to 32 bytes | ||
10 | +unsigned char buf[LENG]; | ||
11 | + | ||
12 | +//pin ESP32 : | ||
13 | +const int SetPin = 5; | ||
14 | +const int redLED = 14; | ||
15 | +const int yellowLED = 16; | ||
16 | + | ||
17 | +//info bluetooth | ||
18 | +BLECharacteristic *pCharacteristic; | ||
19 | +bool deviceConnected = false; | ||
20 | + | ||
21 | +//variables globales : | ||
22 | +std::string rxValue; | ||
23 | +float PM10 = 0; | ||
24 | +float PM5 = 0; | ||
25 | +float CO2 = 0; | ||
26 | +int PM01Value=0; | ||
27 | +int PM2_5Value=0; | ||
28 | +int PM10Value=0; | ||
29 | + | ||
30 | +// UUIDs: | ||
31 | +// https://www.uuidgenerator.net/ | ||
32 | +#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" | ||
33 | +#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" | ||
34 | +#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" | ||
35 | + | ||
36 | +class MyServerCallbacks: public BLEServerCallbacks { | ||
37 | + void onConnect(BLEServer* pServer) { | ||
38 | + deviceConnected = true; | ||
39 | + digitalWrite(redLED,HIGH); | ||
40 | + }; | ||
41 | + | ||
42 | + void onDisconnect(BLEServer* pServer) { | ||
43 | + deviceConnected = false; | ||
44 | + digitalWrite(redLED,LOW); | ||
45 | + } | ||
46 | +}; | ||
47 | + | ||
48 | +class MyCallbacks: public BLECharacteristicCallbacks { | ||
49 | + void onWrite(BLECharacteristic *pCharacteristic) { | ||
50 | + //std::string rxValue = pCharacteristic->getValue(); | ||
51 | + rxValue = pCharacteristic->getValue(); | ||
52 | + if (rxValue.length() > 0) { | ||
53 | + Serial.println("*********"); | ||
54 | + Serial.print("Received Value: "); | ||
55 | + | ||
56 | + for (int i = 0; i < rxValue.length(); i++) { | ||
57 | + Serial.print(rxValue[i]); | ||
58 | + } | ||
59 | + | ||
60 | + Serial.println(); | ||
61 | + | ||
62 | + // Do stuff based on the command received from the app | ||
63 | + if (rxValue.find("A") != -1) { | ||
64 | + Serial.println("stop measure!"); | ||
65 | + } | ||
66 | + else if (rxValue.find("B") != -1) { | ||
67 | + Serial.println("measure!"); | ||
68 | + } | ||
69 | + Serial.println(); | ||
70 | + Serial.println("*********"); | ||
71 | + } | ||
72 | + } | ||
73 | +}; | ||
74 | + | ||
75 | + | ||
76 | +void setup() { | ||
77 | + //bluetooth | ||
78 | + Serial.begin(9600); | ||
79 | + pinMode(yellowLED,OUTPUT); | ||
80 | + pinMode(SetPin, OUTPUT); | ||
81 | + pinMode(redLED,OUTPUT); | ||
82 | + | ||
83 | + //Création du device BLE | ||
84 | + BLEDevice::init("MyESP32"); | ||
85 | + | ||
86 | + //Création du serveur BLE | ||
87 | + BLEServer *pServer = BLEDevice::createServer(); | ||
88 | + pServer->setCallbacks(new MyServerCallbacks()); | ||
89 | + | ||
90 | + //Création du service BLE | ||
91 | + BLEService *pService = pServer->createService(SERVICE_UUID); | ||
92 | + | ||
93 | + //Création du BLE characteristic | ||
94 | + pCharacteristic = pService->createCharacteristic( | ||
95 | + CHARACTERISTIC_UUID_TX, | ||
96 | + BLECharacteristic::PROPERTY_NOTIFY | ||
97 | + ); | ||
98 | + | ||
99 | + pCharacteristic->addDescriptor(new BLE2902()); | ||
100 | + | ||
101 | + BLECharacteristic *pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX,BLECharacteristic::PROPERTY_WRITE); | ||
102 | + | ||
103 | + pCharacteristic->setCallbacks(new MyCallbacks()); | ||
104 | + | ||
105 | + //Lancement du service | ||
106 | + pService->start(); | ||
107 | + | ||
108 | + //Start advertising | ||
109 | + pServer->getAdvertising()->start(); | ||
110 | + Serial.println("Waiting a client connection to notify..."); | ||
111 | + digitalWrite(SetPin, LOW); | ||
112 | +} | ||
113 | + | ||
114 | +void loop() | ||
115 | +{ | ||
116 | + if (deviceConnected) | ||
117 | + { | ||
118 | + while(rxValue!="B") | ||
119 | + { | ||
120 | + delay(100); | ||
121 | + } | ||
122 | + digitalWrite(SetPin, HIGH); | ||
123 | + digitalWrite(yellowLED,HIGH); | ||
124 | + rxValue="A"; | ||
125 | + delay(5000); | ||
126 | + | ||
127 | + | ||
128 | + //commence à lire quand il detecte 0x42 | ||
129 | + if(Serial.find(0x42)) | ||
130 | + { | ||
131 | + //récupération de la trame envoyée par le capteur | ||
132 | + Serial.readBytes(buf,LENG); | ||
133 | + if(buf[0] == 0x4d) | ||
134 | + { | ||
135 | + if(checkValue(buf,LENG)) | ||
136 | + { | ||
137 | + PM01Value=transmitPM01(buf); //récupère le taux de PM1 dans la trame | ||
138 | + PM2_5Value=transmitPM2_5(buf);//récupère le taux de PM2.5 dans la trame | ||
139 | + PM10Value=transmitPM10(buf); //récupère le taux de PM10 dans la trame | ||
140 | + Serial.println(PM10Value); | ||
141 | + } | ||
142 | + } | ||
143 | + } | ||
144 | + //on converti ces valeurs en string : | ||
145 | + char txString[20]; | ||
146 | + //de taille 4 car le capteur mesure entre 0 et 500 normalement. | ||
147 | + char PM10String[4]; | ||
148 | + dtostrf(PM10Value, 3, 0, PM10String); //float_val, min_width:1, digits_after_decimal, char_buffer | ||
149 | + char PM5String[4]; | ||
150 | + dtostrf(PM2_5Value, 3, 0, PM5String); | ||
151 | + char CO2String[4]; | ||
152 | + dtostrf(PM01Value, 3, 0, CO2String); | ||
153 | + | ||
154 | + txString[0]=PM10String[0]; | ||
155 | + txString[1]=PM10String[1]; | ||
156 | + txString[2]=PM10String[2]; | ||
157 | + txString[3]='-'; | ||
158 | + txString[4]=PM5String[0]; | ||
159 | + txString[5]=PM5String[1]; | ||
160 | + txString[6]=PM5String[2]; | ||
161 | + txString[7]='-'; | ||
162 | + txString[8]=CO2String[0]; | ||
163 | + txString[9]=CO2String[1]; | ||
164 | + txString[10]=CO2String[2]; | ||
165 | + txString[11]='-'; | ||
166 | + | ||
167 | + pCharacteristic->setValue(txString); | ||
168 | + //envoie de la string | ||
169 | + pCharacteristic->notify(); | ||
170 | + Serial.print("message envoyé : "); | ||
171 | + Serial.print(txString); | ||
172 | + } | ||
173 | + delay(100); | ||
174 | + digitalWrite(SetPin, LOW); | ||
175 | + digitalWrite(yellowLED,LOW); | ||
176 | +} | ||
177 | + | ||
178 | + | ||
179 | + | ||
180 | + | ||
181 | +//fonctions de gestion de la trame reçue par le capteur : | ||
182 | +char checkValue(unsigned char *thebuf, char leng) | ||
183 | +{ | ||
184 | + char receiveflag=0; | ||
185 | + int receiveSum=0; | ||
186 | + | ||
187 | + for(int i=0; i<(leng-2); i++){ | ||
188 | + receiveSum=receiveSum+thebuf[i]; | ||
189 | + } | ||
190 | + receiveSum=receiveSum + 0x42; | ||
191 | + | ||
192 | + if(receiveSum == ((thebuf[leng-2]<<8)+thebuf[leng-1])) //check the serial data | ||
193 | + { | ||
194 | + receiveSum = 0; | ||
195 | + receiveflag = 1; | ||
196 | + } | ||
197 | + return receiveflag; | ||
198 | +} | ||
199 | + | ||
200 | +int transmitPM01(unsigned char *thebuf) | ||
201 | +{ | ||
202 | + int PM01Val; | ||
203 | + PM01Val=((thebuf[3]<<8) + thebuf[4]); | ||
204 | + return PM01Val; | ||
205 | +} | ||
206 | + | ||
207 | +int transmitPM2_5(unsigned char *thebuf) | ||
208 | +{ | ||
209 | + int PM2_5Val; | ||
210 | + PM2_5Val=((thebuf[5]<<8) + thebuf[6]); | ||
211 | + return PM2_5Val; | ||
212 | +} | ||
213 | + | ||
214 | +int transmitPM10(unsigned char *thebuf) | ||
215 | +{ | ||
216 | + int PM10Val; | ||
217 | + PM10Val=((thebuf[7]<<8) + thebuf[8]); | ||
218 | + return PM10Val; | ||
219 | +} | ||
220 | + |