int main(void) { // Enable watchdog (restart avr if program hangs for 2 seconds) wdt_enable(WDTO_2S); Buttons buttons; DHT22sensor sensor; //uart_init(UART_BAUD_SELECT(USART_BAUDRATE, F_CPU)); extConnector.Init(); // Initialize all connected devices //alarm.Init(OnAlarmStarted, OnAlarmEnded); alarm.ClearAllFlags(); sevSegMenu.Init(); ledIndicators.Init(); buttons.Init(); sensor.Init(); sensorRefreshTimer.Init(); sensorRefreshTimer.SetCounterTop(DHT22_REFRESHTIME); timerHum.Init(); timerTemp.Init(); speaker.InitSpeaker(); speaker.PlayTone(); //sensorResultAverageTemperature.Init(); //sensorResultAverageHumidity.Init(); MULTIPLEX_Setup(); Timer_Setup(); //ReadDefaultSettings(); done in readsettings if needed ReadSettings(); triacTemp.InitPorts(&TRIAC_TEMP_PORT, &TRIAC_TEMP_DDR, TRIAC_TEMP_PIN, ®SettingsTemp.normallyClosed.variable); triacHum.InitPorts(&TRIAC_HUM_PORT, &TRIAC_HUM_DDR, TRIAC_HUM_PIN, ®SettingsHum.normallyClosed.variable); DHT22result sensorResult = {0,0}; sei(); //alarm.SetAlarmFlag(AlarmType_SOFTWARE_FAIL); //DHT22result tempResult = {0,0}; while (1) { wdt_reset(); uint8_t sendSensorDataOverUart = 0; if (!sensorRefreshTimer.IsRunning()) { SensorResult sr = sensor.ReadSensor(&sensorResult); switch(sr) { case SensorOK: alarm.ClearAlarmFlag(AlarmType_SENSOR_FAILURE); bootCompleted = 1; // Enable regulation updates sendSensorDataOverUart = 1; sensorRefreshTimer.ResetCounter(); //sensorAverage.ProcessValue(&sensorResult); break; default: alarm.SetAlarmFlag(AlarmType_SENSOR_FAILURE); sprintf_P(buffor, PSTR("E%u"), sr); // Newline gets added in SendAlarmInfo extConnector.uPuts(buffor); //uart_puts SendAlarmInfo(); case SensorBusy: sensorRefreshTimer.AddTicks(20); // Reduce the error flood break; } } // If alarm is because of bad regulation, show normal menu instead of error code sevSegMenu.SetAlarm(alarm.GetActiveCriticalFlags()); // Beep the speaker if buttons are pressed ButtonEvent currentButtonEvent = buttons.ProcessInputs(); if (currentButtonEvent > BUTTON_MULTIPLE && currentButtonEvent < BUTTON_LEFT_RAPID ) { speaker.PlayTone(); } sevSegMenu.MainMenuUpdate(currentButtonEvent, &sensorResult); ////////////////////////////////////////////////////////////////////////// // Regulation //_delay_ms(1); RegulationResult resTemp, resHum; resTemp = RegulationUpdate(AlarmType_TEMPERATURE_REGULATION, &sensorResult); resHum = RegulationUpdate(AlarmType_HUMIDITY_REGULATION, &sensorResult); ////////////////////////////////////////////////////////////////////////// // Repaint LEDs sevSegMenu.TurnOnMenuLeds(); if (alarm.GetActiveFlags()) { ledIndicators.TurnOn(LED_Alarm); } if (triacTemp.GetState() || triacHum.GetState()) { ledIndicators.TurnOn(LED_Praca); } ledIndicators.PushChanges(); ////////////////////////////////////////////////////////////////////////// // Update UART if (sendSensorDataOverUart) { //snprintf_P(buffor, UART_BUFFER_SIZE, PSTR("T%.3u.%u H%.3u.%u "), //extConnector.uPuts(buffor); //snprintf_P(buffor, UART_BUFFER_SIZE, PSTR("T%.3u.%u H%.3u.%u G%u N%u\r\n"), int8_t tempRemainder = sensorResult.temperature % 10; if (tempRemainder < 0) { tempRemainder *= -1; } sprintf_P(buffor, PSTR("T%i.%i H%u.%u G%u N%u"), // Newline at the end is added in SendAlarmInfo sensorResult.temperature / 10, tempRemainder, sensorResult.humidity / 10, sensorResult.humidity % 10, resTemp, resHum); extConnector.uPuts(buffor); SendAlarmInfo(); } ProcessUartInput(); if (saveSettingsQueued) { saveSettingsQueued = 0; SaveSettings(); } } }