//Solar BLE Vario for XCTrack: ESP32 Arduino -> XIAO_ESP32C3 #include #include #include #include #include #define SCK D8 #define MISO D9 #define MOSI D10 #define SS D5 #define BAT A0 #define LED D1 #define BUFFER 64 BLEServer *pServer = NULL; BLECharacteristic * pTxCharacteristic; bool deviceConnected = false; bool oldDeviceConnected = false; uint8_t txValue[BUFFER] = ""; float pressure; float temperature; float battery; int blevel; int bcnt = 0; int bsize = 1200; #define SERVICE_UUID "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" // UART service UUID #define CHARACTERISTIC_UUID_RX "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" #define CHARACTERISTIC_UUID_TX "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" class MyServerCallbacks: public BLEServerCallbacks { void onConnect(BLEServer* pServer) { deviceConnected = true; }; void onDisconnect(BLEServer* pServer) { deviceConnected = false; } }; class MyCallbacks: public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) { std::string rxValue = pCharacteristic->getValue(); if (rxValue.length() > 0) { for (int i = 0; i < rxValue.length(); i++) { Serial.print(rxValue[i]); } Serial.println(); } } }; void setup() { Serial.begin(115200); Serial.println("Start"); pinMode(LED, OUTPUT); pinMode(SS, OUTPUT); // Init SPI SPI.begin(); SPI.setDataMode(SPI_MODE0); SPI.setBitOrder(MSBFIRST); SPI.setClockDivider(SPI_CLOCK_DIV16); // Test Presser Sensor digitalWrite(SS, LOW); SPI.transfer(0x80 | 0x0F); uint8_t test = SPI.transfer(0x00); digitalWrite(SS, HIGH); Serial.println(test); if (0xBD != test) { digitalWrite(LED, HIGH); delay(100); digitalWrite(LED, LOW); delay(100); } // Init Presser Sensor digitalWrite(SS, LOW); SPI.transfer(0x20); SPI.transfer(0xC0); //25Hz digitalWrite(SS, HIGH); // Smoothing digitalWrite(SS, LOW); SPI.transfer(0x21); SPI.transfer(0x40); //mode digitalWrite(SS, HIGH); digitalWrite(SS, LOW); SPI.transfer(0x2E); SPI.transfer(0xCF); //16moving average digitalWrite(SS, HIGH); // Create the BLE Device BLEDevice::init("XXXXXXXXXXXX"); // Create the BLE Server pServer = BLEDevice::createServer(); pServer->setCallbacks(new MyServerCallbacks()); // Create the BLE Service BLEService *pService = pServer->createService(SERVICE_UUID); // Create a BLE Characteristic pTxCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY); pTxCharacteristic->addDescriptor(new BLE2902()); BLECharacteristic * pRxCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE); pRxCharacteristic->setCallbacks(new MyCallbacks()); // Start the service pService->start(); // Start advertising pServer->getAdvertising()->start(); Serial.println("Waiting a client connection to notify..."); //Start Indicator digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); } void loop() { sensor(); // Battery Level (3.0V:0% -- 4.2V:100%) bcnt = (bcnt + 1) % bsize; if (bcnt == 0){ blevel = constrain(map(battery,300*7*bsize,420*7*bsize,1000,1110),1000,1100); battery = 0; } //Indicator digitalWrite(LED,HIGH); delay(1); digitalWrite(LED,LOW); // Data Transefer String buf; size_t len; buf = String("LK8EX1,") + String((int)pressure) + String(",0,9999,") + String((int)temperature) + String(",") + String(blevel); len = buf.length(); uint16_t checksum = 0, bi; for (uint8_t ai = 0; ai < len; ai++){ bi = (uint8_t)buf[ai]; checksum ^= bi; } buf = String("$") + buf + String("*") + String(checksum, HEX) + String("\n"); String buf1 = buf.substring(0,18); len = buf1.length(); buf1.getBytes(txValue, len + 1); pTxCharacteristic->setValue(txValue, len); pTxCharacteristic->notify(); buf1 = buf.substring(18); len = buf1.length(); buf1.getBytes(txValue, len + 1); pTxCharacteristic->setValue(txValue, len); pTxCharacteristic->notify(); Serial.print(buf); // disconnecting if (!deviceConnected && oldDeviceConnected) { delay(500); // give the bluetooth stack the chance to get things ready pServer->startAdvertising(); // restart advertising Serial.println("start advertising"); oldDeviceConnected = deviceConnected; } // connecting if (deviceConnected && !oldDeviceConnected) { oldDeviceConnected = deviceConnected; } // Interval delay(50); } void sensor() { // Read Data int i; uint8_t RegTbl[5]; for (int i = 0; i < 5; i++) { digitalWrite(SS, LOW); SPI.transfer(0x80 | (0x28 + i)); RegTbl[i] = SPI.transfer(0x00); digitalWrite(SS, HIGH); } // Pressure uint16_t lo = RegTbl[1] << 8 | RegTbl[0]; uint32_t hi = RegTbl[2] << 16; pressure = (hi + lo) / 40.96; // Temperature int temp = (RegTbl[4] << 8 | RegTbl[3]); if (temp >= 32768){temp -= 65536;} temperature = temp / 480.0 + 37.5; // Battery Voltage battery += analogRead(BAT); }