From 274a84ba9852cc453d31c54f761ba18541f951a7 Mon Sep 17 00:00:00 2001 From: dakkar Date: Mon, 2 Apr 2018 16:53:40 +0100 Subject: trying to do BLE --- sensor/thermostat.ino | 138 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 121 insertions(+), 17 deletions(-) (limited to 'sensor/thermostat.ino') diff --git a/sensor/thermostat.ino b/sensor/thermostat.ino index 63f87f0..ba98158 100644 --- a/sensor/thermostat.ino +++ b/sensor/thermostat.ino @@ -1,36 +1,140 @@ +#include #include #include "SSD1306.h" #include "DHTesp.h" +#include "BLEDevice.h" + +static BLEUUID thermo_service_uuid("11111111-2222-3333-4444-000000000000"); +static BLEUUID thermo_temp_uuid("11111111-2222-3333-4444-000000000001"); +static BLEUUID thermo_time_uuid("11111111-2222-3333-4444-000000000002"); + +#define DEFAULT_SLEEP_TIME 60 +/* Conversion factor for micro seconds to seconds */ +#define uS_TO_S_FACTOR 1000000 SSD1306 display(0x3c, 5, 4); DHTesp dht; -void setup() { - dht.setup(13,DHTesp::AUTO_DETECT); +void show(String x) { + display.clear(); + display.drawString(0,0,x); + display.display(); +} + +class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { + public: + BLEAddress* pServerAddress; + + MyAdvertisedDeviceCallbacks() : + BLEAdvertisedDeviceCallbacks(), + pServerAddress(0) + {} + + void onResult(BLEAdvertisedDevice advertisedDevice) { + // We have found a device, let us now see if it contains the service we are looking for. + String results = "Found: \n"; + results += String(advertisedDevice.getAddress().toString().c_str()); + show(results); + + if (advertisedDevice.haveName() && advertisedDevice.getName() == "termostore") { + advertisedDevice.getScan()->stop(); + + pServerAddress = new BLEAddress(advertisedDevice.getAddress()); + + } // Found our server + } // onResult +}; // MyAdvertisedDeviceCallbacks + +void read_sensor(float* humidity, float* temperature) { + dht.setup(13,DHTesp::DHT11); + + while (1) { + delay(dht.getMinimumSamplingPeriod()); + *humidity = dht.getHumidity(); + *temperature = dht.getTemperature(); + + String data = ""; + data += *humidity; + data += " "; + data += *temperature; + data += " "; + data += dht.getStatusString(); + show(data); + if (dht.getStatus() != DHTesp::ERROR_TIMEOUT) return; + } +} + +uint32_t send_data_and_get_time(BLEAddress* pAddress,String* data) { + BLEClient* pClient = BLEDevice::createClient(); + show("Sc"); + pClient->connect(*pAddress); + show("SC"); + BLERemoteService* pThermoService = pClient->getService(thermo_service_uuid); + BLERemoteCharacteristic* pTemp = pThermoService->getCharacteristic(thermo_temp_uuid); + show("SCw"); + pTemp->writeValue(data->c_str(),data->length()); + show("SCWr"); + BLERemoteCharacteristic* pTime = pThermoService->getCharacteristic(thermo_time_uuid); + std::string next_time = pTime->readValue(); + show("SCWRd"); + pClient->disconnect(); + show("SCWRD"); + return String(next_time.c_str()).toInt(); +} + +void setup() { display.init(); display.connect(); - display.displayOn(); + BLEDevice::init(""); } void loop() { - delay(dht.getMinimumSamplingPeriod()); - float humidity = dht.getHumidity(); - float temperature = dht.getTemperature(); + display.displayOn(); + display.clear(); - if (dht.getStatus() == DHTesp::ERROR_TIMEOUT) return; + BLEScan* pBLEScan = BLEDevice::getScan(); + MyAdvertisedDeviceCallbacks* cb = new MyAdvertisedDeviceCallbacks(); + pBLEScan->setAdvertisedDeviceCallbacks(cb); + pBLEScan->setActiveScan(true); + show("s"); + BLEScanResults foundDevices = pBLEScan->start(30); - display.clear(); + if (cb->pServerAddress) { + show("S"); - String line; - line = "T:"; line += temperature; - display.drawString(0,0,line); - line = "H:"; line += humidity; - display.drawString(50,0,line); - display.drawString(0,10,dht.getStatusString()); + float humidity, temperature; + read_sensor(&humidity,&temperature); + String data = String(BLEDevice::getAddress().toString().c_str()) + " " + String(humidity) + " " + String(temperature) + "\n"; + show(data); + + int next_time = send_data_and_get_time(cb->pServerAddress,&data); + String nt = "Next time:";nt+=next_time; + display.drawString(0,20,nt);display.display(); + delay(2000); + esp_sleep_enable_timer_wakeup(next_time * uS_TO_S_FACTOR); + } + else { + display.drawString(0,0,"s!");display.display(); + String nt = "Next time:";nt+=DEFAULT_SLEEP_TIME; + display.drawString(0,20,nt);display.display(); + delay(2000); + esp_sleep_enable_timer_wakeup(DEFAULT_SLEEP_TIME * uS_TO_S_FACTOR); + } - display.drawProgressBar(5,25,120,10,int(temperature)); - display.drawProgressBar(5,40,120,10,int(humidity)); + esp_deep_sleep_start(); - display.display(); + /* display.clear(); */ + + /* String line; */ + /* line = "T:"; line += temperature; */ + /* display.drawString(0,0,line); */ + /* line = "H:"; line += humidity; */ + /* display.drawString(50,0,line); */ + /* display.drawString(0,10,dht.getStatusString()); */ + + /* display.drawProgressBar(5,25,120,10,int(temperature)); */ + /* display.drawProgressBar(5,40,120,10,int(humidity)); */ + + /* display.display(); */ } -- cgit v1.2.3