summaryrefslogtreecommitdiff
path: root/sensor/thermostat.ino
diff options
context:
space:
mode:
Diffstat (limited to 'sensor/thermostat.ino')
-rw-r--r--sensor/thermostat.ino194
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);
+}