// This project implements the simulation of the reading a DHT sensor using an ESP32
// The source code is available on my git repo at : https://github.com/Bamamou/DHT11_ESP32.git
// the only difference is the sensor, Here; we use a DHT11 while in Platform io we use a DHT22
#include <DHT.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
// Set up the DHT sensor
DHT dht(4, DHT22);
float temperature ;
float humidity;
float tempF;
//int counter;
//BLE server name
#define bleServerName "DHT Server"
// Timer variables
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
bool deviceConnected = false;
// See the following for generating UUIDs:
// https://www.uuidgenerator.net/
#define SERVICE_UUID "91bad492-b950-4226-aa2b-4ede9fa42f59"
// Temperature Characteristic and Descriptor
#ifdef temperatureCelsius
BLECharacteristic TemperatureCelsiusCharacteristics("cba1d466-344c-4be3-ab3f-189f80dd7518", BLECharacteristic::PROPERTY_NOTIFY);
BLEDescriptor TemperatureCelsiusDescriptor(BLEUUID((uint16_t)0x2902));
#else
BLECharacteristic TemperatureFahrenheitCharacteristics("f78ebbff-c8b7-4107-93de-889a6a06d408", BLECharacteristic::PROPERTY_NOTIFY);
BLEDescriptor TemperatureFahrenheitDescriptor(BLEUUID((uint16_t)0x2902));
#endif
// Humidity Characteristic and Descriptor
BLECharacteristic HumidityCharacteristics("ca73b3ba-39f6-4ab3-91ae-186dc9577d99", BLECharacteristic::PROPERTY_NOTIFY);
BLEDescriptor HumidityDescriptor(BLEUUID((uint16_t)0x2903));
//Setup callbacks onConnect and onDisconnect
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
// Create the BLE Device
BLEDevice::init("DHT Server");
// Create the BLE Server
BLEServer *pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
//Setup callbacks onConnect and onDisconnect
BLEService *DHTService = pServer->createService(SERVICE_UUID);
// Create BLE Characteristics and Create a BLE Descriptor
// Temperature
#ifdef temperatureCelsius
DHTService->addCharacteristic(&TemperatureCelsiusCharacteristics);
TemperatureCelsiusDescriptor.setValue("DHT temperature Celsius");
TemperatureCelsiusCharacteristics.addDescriptor(&TemperatureCelsiusDescriptor);
#else
DHTService->addCharacteristic(&TemperatureFahrenheitCharacteristics);
TemperatureFahrenheitDescriptor.setValue("DHT temperature Fahrenheit");
TemperatureFahrenheitCharacteristics.addDescriptor(&TemperatureFahrenheitDescriptor);
#endif
// Humidity
DHTService->addCharacteristic(&HumidityCharacteristics);
HumidityDescriptor.setValue("DHT humidity");
HumidityCharacteristics.addDescriptor(&HumidityDescriptor);
// Start the service
DHTService->start();
// Start advertising
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pServer->getAdvertising()->start();
Serial.println("Waiting a client connection to notify...");
}
void loop() {
// put your main code here, to run repeatedly:
if (deviceConnected) {
if ((millis() - lastTime) > timerDelay) {
// Read temperature as Celsius (the default)
temperature = dht.readTemperature(false);
// Fahrenheit
tempF = dht.readTemperature(true);
// Read humidity
humidity = dht.readHumidity();
}
//Notify temperature reading from BME sensor
#ifdef temperatureCelsius
static char temperatureCTemp[6];
dtostrf(temp, 6, 2, temperatureCTemp);
//Set temperature Characteristic value and notify connected client
TemperatureCelsiusCharacteristics.setValue(temperatureCTemp);
TemperatureCelsiusCharacteristics.notify();
Serial.print("Temperature Celsius: ");
Serial.print(temp);
Serial.print(" ºC");
#else
static char temperatureFTemp[6];
dtostrf(temperature, 6, 2, temperatureFTemp);
//Set temperature Characteristic value and notify connected client
TemperatureFahrenheitCharacteristics.setValue(tempF);
TemperatureFahrenheitCharacteristics.notify();
Serial.print("Temperature Fahrenheit: ");
Serial.print(tempF);
Serial.print(" *F");
#endif
//Notify humidity reading from BME
static char humidityTemp[6];
dtostrf(humidity, 6, 2, humidityTemp);
//Set humidity Characteristic value and notify connected client
HumidityCharacteristics.setValue(humidityTemp);
HumidityCharacteristics.notify();
Serial.print(" - Humidity: ");
Serial.print(humidity);
Serial.println(" %");
lastTime = millis();
}
}
/*Serial.println("Data: "+ String(counter));
// Print the values of temperature in Celsus
Serial.print("Temperatue:\t");
Serial.print(dht.readTemperature(false));
Serial.println("C");
// Print the values of temperature in Fahrenheit
Serial.print("Temperatue:\t");
Serial.print(dht.readTemperature(true));
Serial.println("F");
// print Humidity in perscent
Serial.println("Humidity: \t"+String(humidity)+ "%");
// Print the values of the heat Index for both Units
Serial.print("Heat Index In Celsus: ");
Serial.println(dht.computeHeatIndex(temperature, humidity, false));
Serial.print("Heat Index In Fahrenheit: ");
Serial.println(dht.computeHeatIndex(temperature, humidity, true));
Serial.println(" ");
delay(1000); // this speeds up the simulation
counter++;
*/