-
Notifications
You must be signed in to change notification settings - Fork 0
/
ESP32_RUN-SPD.ino
153 lines (103 loc) · 3.23 KB
/
ESP32_RUN-SPD.ino
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <Arduino.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <BLE2902.h>
// подключен к контакту GPIO34 (ADC1_CH6)
const int inputPin = 34;
const int ledPIN = 23;
unsigned char data[4] = {0, 0, 0, 0};
float lastChars[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int light = 0;
int maxLight = 1500;
int numTurn = 0;
int count_zamer = 10;
int segment = 750; //75cm
unsigned long lastMillis = 0;
unsigned long currentMillis = 0;
unsigned long RPMtime = 0;
float RPMspeed = 0;
unsigned long oldTic = 0;
byte fakePos[1] = {1};
bool _BLEClientConnected = false;
#define RSCService BLEUUID((uint16_t)0x1814)
BLECharacteristic RSCMeasurementCharacteristics(BLEUUID((uint16_t)0x2A53), BLECharacteristic::PROPERTY_NOTIFY);
BLECharacteristic sensorPositionCharacteristic(BLEUUID((uint16_t)0x2A5D), BLECharacteristic::PROPERTY_READ);
BLEDescriptor RSCDescriptor(BLEUUID((uint16_t)0x2901));
BLEDescriptor sensorPositionDescriptor(BLEUUID((uint16_t)0x2901));
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
_BLEClientConnected = true;
};
void onDisconnect(BLEServer* pServer) {
_BLEClientConnected = false;
}
};
void InitBLE() {
BLEDevice::init("RUN-SPD");
// CBLE Server
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// Do some BLE Setup
BLEService *pRSC = pServer->createService(RSCService);
pRSC->addCharacteristic(&RSCMeasurementCharacteristics);
RSCDescriptor.setValue("Send all your RCSM rubbish here");
RSCMeasurementCharacteristics.addDescriptor(&RSCDescriptor);
RSCMeasurementCharacteristics.addDescriptor(new BLE2902());
pRSC->addCharacteristic(&sensorPositionCharacteristic);
pServer->getAdvertising()->addServiceUUID(RSCService);
pRSC->start();
pServer->getAdvertising()->start();
}
void setup() {
Serial.begin(115200);
pinMode(ledPIN, OUTPUT);
digitalWrite(ledPIN, HIGH);
InitBLE();
}
void loop()
{
light = analogRead(inputPin);
//light = random(298,302);
//Serial.println(light);
//delay(500);
if(light < maxLight) {
if(numTurn < count_zamer) {
if((millis() - lastMillis) > 50) {
currentMillis = millis();
RPMtime = millis() - lastMillis;
lastChars[numTurn] = (float) segment / ((float) RPMtime);
lastMillis = currentMillis;
numTurn++;
}
} else {
numTurn = 0;
}
}
if((millis() - oldTic) > 50 ) {
RPMspeed = FindMax(lastChars, 10);
//Serial.println("TEST");
static char outstr[4];
dtostrf(RPMspeed,4, 2, outstr);
String outlow = String(outstr[2]) + String(outstr[3]);
int speed2 = map(outlow.toInt(), 0, 99, 0, 255);
data[0] = 4; //Running
data[1] = speed2;
data[2] = (int) RPMspeed;
//data[3] = spm;
RSCMeasurementCharacteristics.setValue(data,4);
RSCMeasurementCharacteristics.notify();
sensorPositionCharacteristic.setValue(fakePos, 1);
oldTic = millis();
}
}
float FindMax(float* mass,int count)
{
if (count < 1)
return 0;
float arr_max=mass[0];
for(int i = 1; i <= count; i++){
arr_max = max(arr_max, mass[i]);
}
return arr_max;
}