#include <SPI.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#define Servicio_UUID "00001809-0000-1000-8000-00805F9B34FB"
#define Caracteristica_UUID "00002A1C-0000-1000-8000-00805F9B34FB"
const uint16_t pinSCK = 13;
const uint16_t pinMOSI = 11;
const uint16_t pinMISO = 12;
const uint16_t pinCS = 10;
const uint8_t REGISTRO_ID = 0xD0;
const uint8_t REGISTRO_CONTROL_DE_MEDICION = 0xF4;
const uint8_t REGISTRO_CONTROL_TIEMPO_DE_ESPERA = 0xF5;
const uint8_t REGISTRO_TEMPERATURA_MSB = 0xFA;
const uint8_t REGISTRO_TEMPERATURA_LSB = 0xFB;
const uint8_t REGISTRO_TEMPERATURA_XLSB = 0xFC;
const uint8_t VALOR_ID = 0x58;
const uint8_t VALOR_CONTROL_DE_MEDICION = 0x27;
const uint8_t VALOR_CONFIGURACION_TIEMPO_DE_ESPERA = 0xA0;
uint8_t ValorLeido;
unsigned long TiempoAnterior;
unsigned long TiempoActual;
uint8_t ValorCrudoTemperaturaMSB;
uint8_t ValorCrudoTemperaturaLSB;
uint8_t ValorCrudoTemperaturaXLSB;
uint32_t ValorCrudoTemperatura;
float Temperatura;
BLECharacteristic *pCharacteristic;
void setup() {
SPI.begin(pinSCK,pinMOSI,pinMISO,pinCS);
pinMode(pinCS, OUTPUT);
digitalWrite(pinCS,HIGH);
do{
ValorLeido = spi_read(REGISTRO_ID);
if(ValorLeido == VALOR_ID){
Serial.println("Dirección ID confirmada");
}else{
Serial.println("Dirección ID no concordante. Intentando nuevamente.");
delay(1000);
}
}while(ValorLeido != VALOR_ID);
spi_write(REGISTRO_CONTROL_DE_MEDICION,VALOR_CONTROL_DE_MEDICION);
spi_write(REGISTRO_CONTROL_TIEMPO_DE_ESPERA,VALOR_CONFIGURACION_TIEMPO_DE_ESPERA);
BLEDevice::init("MyESp32");
BLEServer *pServer = BLEDevice::createServer();
BLEService *pService = pServer->createService(Servicio_UUID);
BLECharacteristic *pCharacteristic = pService->createCharacteristic(Caracteristica_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE);
pCharacteristic->setValue("Bluetooth low energy configurado!");
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(Servicio_UUID);
pAdvertising->setScanResponse(true);
pAdvertising->setMinPreferred(0x06);
pAdvertising->setMinPreferred(0x12);
BLEDevice::startAdvertising();
TiempoAnterior = millis();
Serial.println("Configuración completada");
}
void loop() {
TiempoActual = millis();
if(TiempoActual - TiempoAnterior >= 1000){
ValorCrudoTemperaturaMSB = spi_read(REGISTRO_TEMPERATURA_MSB);
ValorCrudoTemperaturaLSB = spi_read(REGISTRO_TEMPERATURA_LSB);
ValorCrudoTemperaturaXLSB = spi_read(REGISTRO_TEMPERATURA_XLSB);
ValorCrudoTemperatura = ValorCrudoTemperaturaMSB<<12 | ValorCrudoTemperaturaLSB<<4 | ValorCrudoTemperaturaXLSB>>4;
Temperatura = compensa_temperatura(ValorCrudoTemperatura);
pCharacteristic->setValue(Temperatura);
}
}
void spi_write(uint8_t reg, uint8_t data){
digitalWrite(pinCS,LOW); //Se inicia la comunicación
SPI.transfer(reg);
SPI.transfer(data);
digitalWrite(pinCS,HIGH); //Se finaliza la comunicación
}
uint8_t spi_read(uint8_t reg){
digitalWrite(pinCS,LOW);
SPI.transfer(reg);
ValorLeido = SPI.transfer(0x00);
digitalWrite(pinCS,HIGH);
return ValorLeido;
}
float compensa_temperatura(uint32_t ValorCrudoTemperatura){
return ValorCrudoTemperatura/(double)32;
}