#pragma once #include #include #include #include #include #include #include #define CARD_TYPE_CLIMATE 0x03 #define AC_SENSOR_TYPE_NONE 0x00 #define AC_SENSOR_TYPE_DHT22 0x01 #define AC_SENSOR_TYPE_DS18B20 0x02 #define AC_SENSOR_READ_INTERVAL 5000 #define AC_SENSOR_READ_TIMEOUT 250 struct ClimateCardData { uint8_t ac_temperature; uint8_t ac_mode; uint8_t ac_fan_speed; }; struct AirConditioner { uint8_t max_temperature; uint8_t min_temperature; uint8_t modes; char **mode_names; uint8_t fan_speeds; char **fan_speed_names; uint16_t ****infraredCodes; }; // This requires 3 bytes of FRAM class ClimateCard : public ExpansionCard { public: ClimateCard(uint8_t ir_pin); ~ClimateCard(); bool begin(AirConditioner ac, uint8_t sensor_type, uint8_t sensor_pin); bool begin(AirConditioner ac); void loop(); void bindFRAM(FRAM *fram, uint16_t fram_address); void setFRAMAutoSave(bool autoSave); void saveStateToFRAM(); void loadStateFromFRAM(); void setTemperature(uint8_t temperature); uint8_t getTemperature(); void setMode(uint8_t mode); uint8_t getMode(); void setFanSpeed(uint8_t fan_speed); uint8_t getFanSpeed(); float getRoomTemperature(); float getHumidity(); uint8_t getSensorType(); void registerChangeCallback(std::function callback); void registerSensorCallback(std::function callback); uint8_t getType(); private: // Sensor objects // We use pointers here because we don't know which sensor will be used DHTNEW *dht; DS18B20 *ds18b20; // Callbacks std::vector> callbacks; std::vector> sensor_callbacks; // Update functions void updateSensor(); void updateAirConditioner(); // IR variables IRsend irsender; uint8_t ir_pin; // Air conditioner variables AirConditioner ac; ClimateCardData state; // Sensor variables uint8_t sensor_type; uint8_t sensor_pin; float humidity; float room_temperature; // FRAM variables FRAM *fram; uint8_t fram_address; bool fram_auto_save; };