diff options
Diffstat (limited to 'sensor/thermostat.ino')
-rw-r--r-- | sensor/thermostat.ino | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/sensor/thermostat.ino b/sensor/thermostat.ino new file mode 100644 index 0000000..4ab3833 --- /dev/null +++ b/sensor/thermostat.ino @@ -0,0 +1,194 @@ +#include <string> +#include <Wire.h> +#include "SSD1306.h" +#include "DHTesp.h" +#include <esp_bt.h> +#include "BLEDevice.h" +#include "Ticker.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 NO_SERVER_SLEEP_TIME 60 +#define ON_ERROR_SLEEP_TIME 30 +#define WATCHDOG_SECONDS 30 +/* Conversion factor for micro seconds to seconds */ +#define uS_TO_S_FACTOR 1000000 + +#define BLE_POWER ESP_PWR_LVL_P7 +// #define BLE_POWER ESP_PWR_LVL_N14 + +SSD1306 display(0x3c, 5, 4); +DHTesp dht; + +void show(String x) { + display.clear(); + display.drawString(0,0,x); + display.display(); +} + +class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { + public: + BLEAddress* pServerAddress; + + MyAdvertisedDeviceCallbacks() : + BLEAdvertisedDeviceCallbacks(), + pServerAddress(0) + {} + + ~MyAdvertisedDeviceCallbacks() { if (pServerAddress) delete pServerAddress; } + + void onResult(BLEAdvertisedDevice advertisedDevice) { + // We have found a device, let us now see if it contains the service we are looking for. + if (advertisedDevice.haveName() && advertisedDevice.getName() == "termostore") { + advertisedDevice.getScan()->stop(); + + pServerAddress = new BLEAddress(advertisedDevice.getAddress()); + + } // Found our server + } // onResult +}; // MyAdvertisedDeviceCallbacks + +void enable_sensor(bool enable) { + pinMode(12,OUTPUT); + digitalWrite(12,enable ? HIGH : LOW); + delay(500); +} + +bool read_sensor(float* humidity, float* temperature) { + dht.setup(13,DHTesp::DHT11); + + int tries=0;bool ret=false; + while (!ret && ++tries<10) { + 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) ret = true; + } + return ret; +} + +uint32_t send_data_and_get_time(BLEAddress* pAddress,String* data) { + BLEClient* pClient = BLEDevice::createClient(); + show("Sc"); + bool ok = pClient->connect(*pAddress); + if (!ok) { + show("connect fail"); + return ON_ERROR_SLEEP_TIME; + } + String status = "SC"; + status += pClient->getPeerAddress().toString().c_str(); + show(status); + try { + BLERemoteService* pThermoService = pClient->getService(thermo_service_uuid); + if (!pThermoService) { + show("NO SERVICE"); + return 60; + } + BLERemoteCharacteristic* pTemp = pThermoService->getCharacteristic(thermo_temp_uuid); + if (!pTemp) { + show("NO TEMP CHAR"); + return 60; + } + show("SCw"); + pTemp->writeValue(data->c_str(),data->length()); + show("SCWr"); + BLERemoteCharacteristic* pTime = pThermoService->getCharacteristic(thermo_time_uuid); + if (!pTime) { + show("NO TIME CHAR"); + return 60; + } + std::string next_time = pTime->readValue(); + show("SCWRd"); + pClient->disconnect(); + show("SCWRD"); + return String(next_time.c_str()).toInt(); + } + catch (...) { + show("Fail"); + pClient->disconnect(); + return ON_ERROR_SLEEP_TIME; + } +} + +void setup() { + display.init(); + display.connect(); + display.displayOn(); + display.clear(); + show("setup"); + BLEDevice::init(""); + esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_ADV, BLE_POWER); + esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_SCAN, BLE_POWER); + esp_ble_tx_power_set(ESP_BLE_PWR_TYPE_DEFAULT, BLE_POWER); + show("setup+bt"); + enable_sensor(true); + show("setup+bt+sensor"); +} + +void teardown_and_sleep(int next_time) { + enable_sensor(false); + //BLEDevice::uninit(); + //esp_wifi_stop(); + delay(2000); + esp_sleep_enable_timer_wakeup(next_time * uS_TO_S_FACTOR); + esp_deep_sleep_start(); +} + +void watchdog_cb() { + show("watchdog"); + teardown_and_sleep(ON_ERROR_SLEEP_TIME); +} + +void loop() { + Ticker watchdog_timer; + watchdog_timer.attach(WATCHDOG_SECONDS,watchdog_cb); + + BLEScan* pBLEScan = BLEDevice::getScan(); + MyAdvertisedDeviceCallbacks* cb = new MyAdvertisedDeviceCallbacks(); + pBLEScan->setAdvertisedDeviceCallbacks(cb); + pBLEScan->setActiveScan(true); + show("s"); + BLEScanResults foundDevices = pBLEScan->start(30); + int next_time; + + if (cb->pServerAddress) { + show("S"); + + float humidity, temperature; + bool ok = read_sensor(&humidity,&temperature); + if (ok) { + String data = String(BLEDevice::getAddress().toString().c_str()) + " " + String(humidity) + " " + String(temperature) + "\n"; + show(data); + + next_time = send_data_and_get_time(cb->pServerAddress,&data); + } + else { + show("no thermo"); + next_time=ON_ERROR_SLEEP_TIME; + } + } + else { + display.drawString(0,0,"s!");display.display(); + next_time = NO_SERVER_SLEEP_TIME; + } + + delete cb; + + String nt = "Next time:";nt+=next_time; + display.drawString(0,20,nt);display.display(); + teardown_and_sleep(next_time); + + show("woken up"); + delay(2000); +} |