/** * Dryer */ #include "main.h" #include "i2c.h" #include "sensor.h" #include "rtos/rtos.h" #include "ssd1306xled/font6x8.h" #include "ssd1306xled/font8x16.h" #include "ssd1306xled/ssd1306xled.h" #include "ssd1306xled/ssd1306xledtx.h" #include "tinyavrlib/num2str.h" #include "string.h" /* Defines */ /* Variables */ static volatile struct { uint8_t newTempSet: 1; uint8_t AHT10state: 1; uint8_t rezerv: 6; } Flag; uint8_t TemperatureSetpoint; aht20_t Sensor; /* Function prototypes */ static void board_Init(void); static void checkTemperatureSetpoint(void); static void sensorStart(void); static void sensorGetData(void); static void LedOn(void); static void LedOff(void); int main(void) { /* Init all */ board_Init(); RTOS_Init(); I2C_Init(); AHT20_Init(); tdelay_ms(40); ssd1306_init(); /* Clear flags */ Flag.newTempSet = 1; Flag.AHT10state = 0; /* Set tasks */ RTOS_SetTask(checkTemperatureSetpoint, 5, 50); RTOS_SetTask(sensorStart, 50, 1000); RTOS_SetTask(sensorGetData, 800, 1000); RTOS_SetTask(LedOn, 1, 1000); RTOS_SetTask(LedOff, 201, 1000); ssd1306_clear(); // ssd1306tx_init(ssd1306xled_font6x8data, 0); ssd1306tx_stringxy((uint8_t const *)ssd1306xled_font8x16data, 0, 0, "Hello, World! :)"); // ssd1306_setpos(0, 3); // ssd1306tx_string("SSD1306xLED Library"); tdelay_ms(1000); ssd1306_clear(); ssd1306tx_stringxy((uint8_t const *)ssd1306xled_font8x16data, 1, 0, "Set:"); ssd1306tx_stringxy((uint8_t const *)ssd1306xled_font8x16data, 1, 3, " T:"); ssd1306tx_stringxy((uint8_t const *)ssd1306xled_font8x16data, 1, 5, " H:"); char buffer[9] = {0}; uint8_t digits = 0; /* Infinity loop */ do { if (Flag.newTempSet != 0) { Flag.newTempSet = 0; if (TemperatureSetpoint != 0) { digits = usint2decascii(TemperatureSetpoint, buffer); strncpy(buffer+5, " C \0", 4); ssd1306tx_stringxy((uint8_t const *)ssd1306xled_font8x16data, 40, 0, buffer+digits); } else { ssd1306tx_stringxy((uint8_t const *)ssd1306xled_font8x16data, 40, 0, " Off"); } } if (Flag.AHT10state == 0) { digits = usint2decascii(Sensor.Temperature, buffer); strncpy(buffer+5, " C\0", 3); ssd1306tx_stringxy((uint8_t const *)ssd1306xled_font8x16data, 40, 3, buffer+digits); digits = usint2decascii(Sensor.Humidity, buffer); strncpy(buffer+5, " %\0", 3); ssd1306tx_stringxy((uint8_t const *)ssd1306xled_font8x16data, 40, 5, buffer+digits); } else { //ssd1306tx_string("AHT10 error"); ssd1306tx_stringxy((uint8_t const *)ssd1306xled_font8x16data, 40, 3, "Error"); ssd1306tx_stringxy((uint8_t const *)ssd1306xled_font8x16data, 40, 5, " "); } RTOS_DispatchTask(); // nothing to do - sleep, wait for interrupt #if defined(__GNUC__) set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode(); #elif defined(__ICCAVR__) MCUCR = 1<