141 lines
4.3 KiB
C++
141 lines
4.3 KiB
C++
#include <BLEDevice.h>
|
|
#include <BLEUtils.h>
|
|
#include <BLEServer.h>
|
|
// See the following for generating UUIDs:
|
|
// https://www.uuidgenerator.net/
|
|
|
|
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
|
|
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
|
|
|
|
#define LED_PIN 2
|
|
#define BTN_PIN 5
|
|
#define PILL_1_PIN 25
|
|
#define PILL_2_PIN 13
|
|
#define PILL_3_PIN 12
|
|
#define PILL_4_PIN 26
|
|
#define PILL_5_PIN 27
|
|
#define PILL_6_PIN 14
|
|
#define DETECT_PIN 18
|
|
|
|
int deviceConnected = false;
|
|
int waitingForUpdate = 0;
|
|
|
|
class MyCallbacks:public BLECharacteristicCallbacks {
|
|
void onConnect(BLEServer * pServer) {
|
|
deviceConnected = true;
|
|
Serial.println("device connected");
|
|
};
|
|
void onDisconnect(BLEServer * pServer) {
|
|
deviceConnected = false;
|
|
Serial.println("device disconnected");
|
|
}
|
|
void onWrite(BLECharacteristic * pCharacteristic) {
|
|
std::string value = pCharacteristic -> getValue();
|
|
if (value.length() > 0) {
|
|
Serial.print("*********");
|
|
Serial.print(value.c_str());
|
|
Serial.print("-");
|
|
Serial.print(atoi(value.c_str()));
|
|
Serial.print("-");
|
|
if (atoi(value.c_str()) == 1) {
|
|
digitalWrite(LED_PIN, HIGH);
|
|
Serial.print("LEDON");
|
|
} else if (atoi(value.c_str()) == 2) {
|
|
digitalWrite(LED_PIN, LOW);
|
|
Serial.print("LEDOFF");
|
|
} else if (atoi(value.c_str()) == 3) {
|
|
Serial.print("UPDATE_PILL_TRACK");
|
|
waitingForUpdate = 1;
|
|
} else {
|
|
Serial.println();
|
|
Serial.println(atoi(value.c_str()));
|
|
Serial.println();
|
|
}
|
|
Serial.println("*********");
|
|
}
|
|
}
|
|
};
|
|
|
|
BLECharacteristic * pCharacteristic;
|
|
|
|
|
|
void setup() {
|
|
Serial.begin(115200);
|
|
pinMode(LED_PIN, OUTPUT);
|
|
pinMode(PILL_1_PIN, INPUT_PULLUP);
|
|
pinMode(PILL_2_PIN, INPUT_PULLUP);
|
|
pinMode(PILL_3_PIN, INPUT_PULLUP);
|
|
pinMode(PILL_4_PIN, INPUT_PULLUP);
|
|
pinMode(PILL_5_PIN, INPUT_PULLUP);
|
|
pinMode(PILL_6_PIN, INPUT_PULLUP);
|
|
pinMode(BTN_PIN, INPUT_PULLUP);
|
|
pinMode(DETECT_PIN, INPUT_PULLUP);
|
|
digitalWrite(LED_PIN, LOW);
|
|
Serial.println("1- Download and install an BLE scanner app in your phone");
|
|
Serial.println("2- Scan for BLE devices in the app");
|
|
Serial.println("3- Connect to MyESP32");
|
|
Serial.println("4- Go to CUSTOM CHARACTERISTIC in CUSTOM SERVICE and write something");
|
|
Serial.println("5- See the magic =)");
|
|
BLEDevice::init("PILL_TRACKER");
|
|
BLEServer * pServer = BLEDevice::createServer();
|
|
BLEService * pService = pServer -> createService(SERVICE_UUID);
|
|
pCharacteristic = pService -> createCharacteristic(
|
|
CHARACTERISTIC_UUID,
|
|
BLECharacteristic::PROPERTY_READ |
|
|
BLECharacteristic::PROPERTY_WRITE |
|
|
BLECharacteristic::PROPERTY_NOTIFY
|
|
);
|
|
pCharacteristic -> setCallbacks(new MyCallbacks());
|
|
pCharacteristic -> setValue("Hello World");
|
|
pService -> start();
|
|
BLEAdvertising * pAdvertising = pServer -> getAdvertising();
|
|
pAdvertising -> start();
|
|
}
|
|
|
|
int prevVal = LOW;
|
|
int prevVal2 = LOW;
|
|
int getPillCount() {
|
|
int totalCount = 0;
|
|
if (digitalRead(DETECT_PIN) == LOW) {
|
|
Serial.println("PROBE_ATTACHED");
|
|
if (digitalRead(PILL_1_PIN) == LOW){totalCount++;Serial.println("25:FULL");}
|
|
if (digitalRead(PILL_2_PIN) == LOW){totalCount++;Serial.println("13:FULL");}
|
|
if (digitalRead(PILL_3_PIN) == LOW){totalCount++;Serial.println("12:FULL");}
|
|
if (digitalRead(PILL_4_PIN) == LOW){totalCount++;Serial.println("26:FULL");}
|
|
if (digitalRead(PILL_5_PIN) == LOW){totalCount++;Serial.println("27:FULL");}
|
|
if (digitalRead(PILL_6_PIN) == LOW){totalCount++;Serial.println("14:FULL");}
|
|
} else {
|
|
Serial.println("PROBE_DETACHED");
|
|
totalCount = 55;
|
|
}
|
|
return totalCount;
|
|
}
|
|
|
|
|
|
void loop() {
|
|
// put your main code here, to run repeatedly:
|
|
int currentVal = digitalRead(BTN_PIN);
|
|
if (currentVal != prevVal) {
|
|
prevVal = currentVal;
|
|
if (currentVal == HIGH) {
|
|
int value = 99;
|
|
pCharacteristic -> setValue((uint8_t *) & value, 4);
|
|
pCharacteristic -> notify();
|
|
}
|
|
else {
|
|
int value = 98;
|
|
pCharacteristic -> setValue((uint8_t *) & value, 4);
|
|
pCharacteristic -> notify();
|
|
}
|
|
}
|
|
if (waitingForUpdate == 1) {
|
|
Serial.println("************************************************************");
|
|
Serial.println("**************UPDATE AND SEND PILL COUNT********************");
|
|
Serial.println("************************************************************");
|
|
waitingForUpdate = 0;
|
|
int value = getPillCount();
|
|
pCharacteristic -> setValue((uint8_t *) & value, 4);
|
|
pCharacteristic -> notify();
|
|
}
|
|
}
|