diff --git a/firmware/SensorLogger.cpp b/firmware/SensorLogger.cpp index 90a7061..8ef22f3 100644 --- a/firmware/SensorLogger.cpp +++ b/firmware/SensorLogger.cpp @@ -39,11 +39,19 @@ private: class SensorLoggerServerCallbacks : public BLEServerCallbacks { public: - void onConnect(BLEServer*) override {} + explicit SensorLoggerServerCallbacks(SensorLogger* logger) : logger_(logger) {} + + void onConnect(BLEServer*) override { + logger_->bluetoothConnected_ = true; + } void onDisconnect(BLEServer* server) override { + logger_->bluetoothConnected_ = false; server->startAdvertising(); } + +private: + SensorLogger* logger_; }; void SensorLogger::begin(uint8_t soilPin) { @@ -61,7 +69,7 @@ void SensorLogger::begin(uint8_t soilPin) { BLEDevice::init(bluetoothName_.c_str()); server_ = BLEDevice::createServer(); - server_->setCallbacks(new SensorLoggerServerCallbacks()); + server_->setCallbacks(new SensorLoggerServerCallbacks(this)); BLEService* service = server_->createService(kNusServiceUuid); BLECharacteristic* rxCharacteristic = service->createCharacteristic( kNusRxUuid, BLECharacteristic::PROPERTY_WRITE | BLECharacteristic::PROPERTY_WRITE_NR); @@ -94,6 +102,24 @@ bool SensorLogger::update() { return false; } +void SensorLogger::refreshSensors() { + SensorReading reading = {}; + sensors_event_t humidityEvent; + sensors_event_t temperatureEvent; + + if (aht20Ready) { + aht20.getEvent(&humidityEvent, &temperatureEvent); + reading.temperature = temperatureEvent.temperature; + reading.humidity = humidityEvent.relative_humidity; + } + if (bh1750Ready) { + reading.illuminance = bh1750.readLightLevel(); + } + reading.soilMoisture = analogRead(soilPin_); + reading.timestamp = latest_.timestamp; + latest_ = reading; +} + const SensorReading& SensorLogger::latest() const { return latest_; } @@ -102,6 +128,14 @@ bool SensorLogger::hasReading() const { return logCount_ != 0; } +const char* SensorLogger::bluetoothName() const { + return bluetoothName_.c_str(); +} + +bool SensorLogger::isBluetoothConnected() const { + return bluetoothConnected_; +} + size_t SensorLogger::logCount() const { return logCount_; } diff --git a/firmware/SensorLogger.h b/firmware/SensorLogger.h index adfe885..fedfff1 100644 --- a/firmware/SensorLogger.h +++ b/firmware/SensorLogger.h @@ -19,10 +19,13 @@ public: void begin(uint8_t soilPin); bool update(); + void refreshSensors(); const SensorReading& latest() const; bool hasReading() const; size_t logCount() const; bool getCurrentTime(char* buffer, size_t bufferSize) const; + const char* bluetoothName() const; + bool isBluetoothConnected() const; private: static constexpr unsigned long kMeasureIntervalMs = 3600000UL; @@ -46,8 +49,10 @@ private: unsigned long lastMeasure_ = 0; int64_t epochOffset_ = 0; bool timeSynchronized_ = false; + bool bluetoothConnected_ = false; String bluetoothName_; String commandBuffer_; friend class SensorLoggerCallbacks; + friend class SensorLoggerServerCallbacks; }; diff --git a/firmware/firmware.ino b/firmware/firmware.ino index 177b172..37f25b0 100644 --- a/firmware/firmware.ino +++ b/firmware/firmware.ino @@ -31,24 +31,32 @@ void updateDisplay() { char sensorLine[32]; char timeLine[24]; + if (sensorLogger.isBluetoothConnected()) { + u8g2.setDrawColor(1); + u8g2.drawBox(0, 0, 128, 10); + u8g2.setDrawColor(0); + } + u8g2.drawStr(0, 9, sensorLogger.bluetoothName()); + u8g2.setDrawColor(1); + if (sensorLogger.getCurrentTime(timeLine, sizeof(timeLine))) { - u8g2.drawStr(0, 9, timeLine); + u8g2.drawStr(0, 20, timeLine); } else { - u8g2.drawStr(0, 9, "RTC: --/--/-- --:--:--"); + u8g2.drawStr(0, 20, "RTC: --/--/-- --:--:--"); } snprintf(sensorLine, sizeof(sensorLine), "Log: %u", static_cast(sensorLogger.logCount())); - u8g2.drawStr(0, 20, sensorLine); + u8g2.drawStr(0, 31, sensorLine); snprintf(sensorLine, sizeof(sensorLine), "T:%5.1fC H:%5.1f%%", reading.temperature, reading.humidity); - u8g2.drawStr(0, 32, sensorLine); + u8g2.drawStr(0, 42, sensorLine); snprintf(sensorLine, sizeof(sensorLine), "Light: %6.1f lx", reading.illuminance); - u8g2.drawStr(0, 44, sensorLine); + u8g2.drawStr(0, 53, sensorLine); snprintf(sensorLine, sizeof(sensorLine), "Soil: %4u", reading.soilMoisture); - u8g2.drawStr(0, 56, sensorLine); + u8g2.drawStr(0, 64, sensorLine); u8g2.sendBuffer(); return; } @@ -171,6 +179,7 @@ void loop() { if ((!bluetoothConnected || !musicPlaying) && (newReading || now - lastDisplayUpdate >= 1000UL)) { lastDisplayUpdate = now; + sensorLogger.refreshSensors(); updateDisplay(); } } \ No newline at end of file