pill_tracker/embedded/main/main.ino
2021-01-17 02:44:54 +00:00

168 lines
4.7 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 totalIntact = 0;
if(digitalRead(DETECT_PIN) == LOW) {
Serial.println("PROBE_ATTACHED");
if(digitalRead(PILL_1_PIN) == LOW){totalIntact++;Serial.println("25:FULL");}
if(digitalRead(PILL_2_PIN) == LOW){totalIntact++;Serial.println("13:FULL");}
if(digitalRead(PILL_3_PIN) == LOW){totalIntact++;Serial.println("12:FULL");}
if(digitalRead(PILL_4_PIN) == LOW){totalIntact++;Serial.println("26:FULL");}
if(digitalRead(PILL_5_PIN) == LOW){totalIntact++;Serial.println("27:FULL");}
if(digitalRead(PILL_6_PIN) == LOW){totalIntact++;Serial.println("14:FULL");}
}
else {
Serial.println("PROBE_DETACHED");
totalIntact = 55;
}
return totalIntact;
}
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();
}
}