#include #include #include #include #include #include "Nano100Series.h" #include "adc.h" #include "gpio.h" #include "pwm.h" #include "timer.h" #include "uart.h" #include "sys.h" #include "clk.h" #include "EEPROM_Emulate.h" #include "My_define.h" uint32_t Read_Data(uint8_t index, uint8_t *data); uint32_t Write_Data(uint8_t index, uint8_t data); uint8_t page_data[EEP_SIZE]; uint8_t Test_Fan1_Speed, Test_Fan2_Speed; uint8_t Test_Fan1_Ven_1_dan, Test_Fan1_Ven_2_dan, Test_Fan1_Ven_3_dan, Test_Fan1_Ven_4_dan, \ Test_Fan1_Air_1_dan, Test_Fan1_Air_2_dan, Test_Fan1_Air_3_dan, Test_Fan1_Air_4_dan,\ Test_Fan1_Bypass_1_dan, Test_Fan1_Bypass_2_dan, Test_Fan1_Bypass_3_dan, Test_Fan1_Bypass_4_dan; uint8_t Test_Fan2_Ven_1_dan, Test_Fan2_Ven_2_dan, Test_Fan2_Ven_3_dan, Test_Fan2_Ven_4_dan,\ Test_Fan2_Air_1_dan, Test_Fan2_Air_2_dan, Test_Fan2_Air_3_dan , Test_Fan2_Air_4_dan,\ Test_Fan2_Bypass_1_dan, Test_Fan2_Bypass_2_dan, Test_Fan2_Bypass_3_dan, Test_Fan2_Bypass_4_dan; /* 히스테리시스 프리셋(임계+데드밴드) <-> page_data (EEPROM 영역 43~127) */ static void Hyst_To_Page(void) { uint8_t pp, k, o; page_data[EEP_HYST_PRESET] = Hyst_Preset; for(pp = 0; pp < 3; pp++) { page_data[EEP_HYST_DB_BASE + 0 + pp] = (uint8_t)Co2_Db[pp]; page_data[EEP_HYST_DB_BASE + 3 + pp] = (uint8_t)Pm25_Db[pp]; page_data[EEP_HYST_DB_BASE + 6 + pp] = (uint8_t)Pm10_Db[pp]; page_data[EEP_HYST_DB_BASE + 9 + pp] = (uint8_t)Voc_Db[pp]; for(k = 0; k < 4; k++) { o = (uint8_t)(pp * 8 + k * 2); page_data[EEP_THR_CO2_BASE + o] = (uint8_t)(Co2_Thr[pp][k] >> 8); page_data[EEP_THR_CO2_BASE + o + 1] = (uint8_t)(Co2_Thr[pp][k] & 0xFF); page_data[EEP_THR_VOC_BASE + o] = (uint8_t)(Voc_Thr[pp][k] >> 8); page_data[EEP_THR_VOC_BASE + o + 1] = (uint8_t)(Voc_Thr[pp][k] & 0xFF); page_data[EEP_THR_PM25_BASE + pp * 4 + k] = (uint8_t)Pm25_Thr[pp][k]; page_data[EEP_THR_PM10_BASE + pp * 4 + k] = (uint8_t)Pm10_Thr[pp][k]; } } } static void Hyst_From_Page(void) { uint8_t pp, k, o; if(page_data[EEP_HYST_PRESET] > 2) return; /* 미초기화(0xFF) -> 컴파일 기본값 유지 */ Hyst_Preset = page_data[EEP_HYST_PRESET]; for(pp = 0; pp < 3; pp++) { Co2_Db[pp] = page_data[EEP_HYST_DB_BASE + 0 + pp]; Pm25_Db[pp] = page_data[EEP_HYST_DB_BASE + 3 + pp]; Pm10_Db[pp] = page_data[EEP_HYST_DB_BASE + 6 + pp]; Voc_Db[pp] = page_data[EEP_HYST_DB_BASE + 9 + pp]; for(k = 0; k < 4; k++) { o = (uint8_t)(pp * 8 + k * 2); Co2_Thr[pp][k] = (uint16_t)(((uint16_t)page_data[EEP_THR_CO2_BASE + o] << 8) | page_data[EEP_THR_CO2_BASE + o + 1]); Voc_Thr[pp][k] = (uint16_t)(((uint16_t)page_data[EEP_THR_VOC_BASE + o] << 8) | page_data[EEP_THR_VOC_BASE + o + 1]); Pm25_Thr[pp][k] = page_data[EEP_THR_PM25_BASE + pp * 4 + k]; Pm10_Thr[pp][k] = page_data[EEP_THR_PM10_BASE + pp * 4 + k]; } } } void init_process(void) { uint16_t i; uint8_t eep_error = 0; union { uint32_t u32_val ; uint8_t u8_val[4] ; } tran ; for(i=0; i<20; i++)Tx_roomcon232_buffer[i] = 0; for(i=0; i<20; i++)Tx_display_buffer[i] = 0; for(i=0; i<20; i++)Tx_homenet_buffer[i] = 0; for(i=0; i>8); page_data[EEP_FILTER_CLEAN_HOUR_L] = (uint8_t)(Filter_timer_clean&0x00FF); page_data[EEP_FILTER_CHANGE_HOUR_H] = (uint8_t)((Filter_timer_change&0xFF00)>>8); page_data[EEP_FILTER_CHANGE_HOUR_L] = (uint8_t)(Filter_timer_change&0x00FF); page_data[EEP_SOJA_CHANGE_HOUR_H] = (uint8_t)((Soja_timer_change&0xFF00)>>8); page_data[EEP_SOJA_CHANGE_HOUR_L] = (uint8_t)(Soja_timer_change&0x00FF); page_data[EEP_BLACKOUT_POWER_ON] = Power_On; page_data[EEP_BLACKOUT_RUN_MODE] = Run_Mode; page_data[EEP_BLACKOUT_FAN_MODE] = Fan_Mode; Hyst_To_Page(); /* 히스테리시스 임계/데드밴드/프리셋 기본값 저장 */ for(i=0; i= 99.9)Ret = 99.9; return(Ret); } // LNTK103FF #define T_a 3.08197700643E-002 #define T_b 8.77312053750E+002 #define T_c -3.17755936684E+003 #define T_d 5.62092429082E+003 #define T_e -5.86906412922E+003 #define T_f 3.82840309167E+003 #define T_g -1.57651548838E+003 #define T_h 3.97983185914E+002 #define T_i -5.61894921403E+001 #define T_j 3.39457675113E+000 #define PowerSupplyVoltage 3.300 // float Temperature_Conversion(float V) { return( T_a + T_b*V + T_c*V*V + T_d*V*V*V + T_e*V*V*V*V + T_f*V*V*V*V*V + T_g*V*V*V*V*V*V +\ T_h*V*V*V*V*V*V*V + T_i*V*V*V*V*V*V*V*V + T_j*V*V*V*V*V*V*V*V*V ); } ////////////////////////////////////////////////////////////// // ADC Power Input float VoltageConversion(unsigned int in_data) { return((float)((float)in_data) * (PowerSupplyVoltage / 4095)); } //========================================================================== float Humidity_Read(uint16_t data) { float Retf, fTmp; fTmp = VoltageConversion(data); if(fTmp < 0.1)Retf = 0; else Retf = Humidity_Conversion(fTmp)*10; return(Retf); } float Temperature_Read(uint16_t data) { float Retf, fTmp; fTmp = VoltageConversion(data); Retf = Temperature_Conversion(fTmp) ; // return(Retf); } float Float_Aeverage_calculator(float val, float * array_val) { uint8_t i; float max = -10000; float min = 10000; float sum = 0; float Rval = 0; for(i=9; i>0; i--) { *(array_val+i) = *(array_val+i-1); } *array_val = val; for(i=0; i<10; i++) { if(array_val[i] >= max) { max = array_val[i]; } if(array_val[i] <= min) { min = array_val[i]; } sum += array_val[i]; } Rval = (float)((sum - max - min)/8); return(Rval); } uint16_t Aeverage_calculator(uint16_t val, uint16_t * array_val) { uint8_t i; uint16_t max = 0; uint16_t min = 10000; uint32_t sum = 0; uint16_t Rval = 0; for(i=9; i>0; i--) { *(array_val+i) = *(array_val+i-1); } *array_val = val; for(i=0; i<10; i++) { if(array_val[i] >= max) { max = array_val[i]; } if(array_val[i] <= min) { min = array_val[i]; } sum += array_val[i]; } Rval = (uint16_t)((sum - max - min)/8); return(Rval); } uint16_t Current_Read(uint16_t adc_current) { return adc_current; } extern volatile uint8_t ADC_Complete; volatile uint8_t Err_Code = 0; uint16_t adc_result = 0; uint16_t Main_Current; signed int Out_Temperature = 0; signed int In_Temperature = 0; uint8_t Sen_Pos = 0; int16_t Volum1_value = 0, Volum2_value = 0; float Avr_Temperature_1[10]={0,0,0,0,0,0,0,0,0,0}; float Avr_Temperature_2[10]={0,0,0,0,0,0,0,0,0,0}; uint16_t Avr_Vol_1[10]={0,0,0,0,0,0,0,0,0,0}; uint16_t Avr_Vol_2[10]={0,0,0,0,0,0,0,0,0,0}; uint16_t Avr_Current[10]={0,0,0,0,0,0,0,0,0,0}; uint8_t Temp_sensor_error = 0; void ADC_Sensing(void) { float fTmp = 0; signed int sTmp = 0; uint16_t uTmp = 0; if(ADC_Complete == 1) { ADC_Complete = 0; adc_result = ADC_GET_CONVERSION_DATA(ADC, 4); // in uTmp = Aeverage_calculator(adc_result, Avr_Current); Main_Current = Current_Read(uTmp); //////////// in /* adc_current = ADC_GET_CONVERSION_DATA(ADC, 0); // in fTmp = Temperature_Read(adc_result); if(fTmp < 0) fTmp *= 1.05; sTmp = (signed int)fTmp; if((sTmp > 85) || (sTmp < -40)) { Temp_sensor_error |= 1; In_Temperature = 100; } else { sTmp = Float_Aeverage_calculator(sTmp, Avr_Temperature_1); Temp_sensor_error &= ~1; if(sTmp >= 85)In_Temperature = 85; else if(sTmp <= -20)In_Temperature = -20; else In_Temperature = sTmp; } */ //////////// out adc_result = ADC_GET_CONVERSION_DATA(ADC, 1); // out fTmp = Temperature_Read(adc_result); if(fTmp < 0) fTmp *= 1.05; sTmp = (signed int)fTmp; if((sTmp > 85) || (sTmp < -40)) { Temp_sensor_error |= 2; Out_Temperature = 100; } else { sTmp = Float_Aeverage_calculator(sTmp, Avr_Temperature_2); Temp_sensor_error &= ~2; if(sTmp >= 85)Out_Temperature = 85; else if(sTmp <= -20)Out_Temperature = -20; else Out_Temperature = sTmp; } //if(Temp_sensor_error)Err_Code |= ERROR_TEMP_SENSOR; //else Err_Code &= ~ERROR_TEMP_SENSOR; ////////////// vol 1 adc_result = ADC_GET_CONVERSION_DATA(ADC, 2); //fTmp = Aeverage_calculator(adc_result, Avr_Vol_2); Volum1_value = 125 - (signed int)((float)adc_result/4.095/4) + 50; // -100 ~ 100 //////////////// vol 2 adc_result = ADC_GET_CONVERSION_DATA(ADC, 3); //fTmp = Aeverage_calculator(adc_result, Avr_Vol_1); Volum2_value = 125 - (signed int)((float)adc_result/4.095/4) + 50; // -100 ~ 100 } ADC_START_CONV(ADC); } void EEP_Save_process(void) { uint8_t i; /* (구 PC메뉴용 Test_Fan -> s_FAN 복사 제거 : 대시보드 CTRL_VSP 로 설정한 s_FAN 값을 그대로 저장) */ page_data[EEP_FAN1_VEN_1_DAN] = s_FAN1_VEN_1_DAN; page_data[EEP_FAN1_VEN_2_DAN] = s_FAN1_VEN_2_DAN; page_data[EEP_FAN1_VEN_3_DAN] = s_FAN1_VEN_3_DAN; page_data[EEP_FAN1_VEN_4_DAN] = s_FAN1_VEN_4_DAN; page_data[EEP_FAN1_AIR_1_DAN] = s_FAN1_AIR_1_DAN; page_data[EEP_FAN1_AIR_2_DAN] = s_FAN1_AIR_2_DAN; page_data[EEP_FAN1_AIR_3_DAN] = s_FAN1_AIR_3_DAN; page_data[EEP_FAN1_AIR_4_DAN] = s_FAN1_AIR_4_DAN; page_data[EEP_FAN1_BYPASS_1_DAN] = s_FAN1_BYPASS_1_DAN; page_data[EEP_FAN1_BYPASS_2_DAN] = s_FAN1_BYPASS_2_DAN; page_data[EEP_FAN1_BYPASS_3_DAN] = s_FAN1_BYPASS_3_DAN; page_data[EEP_FAN1_BYPASS_4_DAN] = s_FAN1_BYPASS_4_DAN; page_data[EEP_FAN2_VEN_1_DAN] = s_FAN2_VEN_1_DAN; page_data[EEP_FAN2_VEN_2_DAN] = s_FAN2_VEN_2_DAN; page_data[EEP_FAN2_VEN_3_DAN] = s_FAN2_VEN_3_DAN; page_data[EEP_FAN2_VEN_4_DAN] = s_FAN2_VEN_4_DAN; page_data[EEP_FAN2_AIR_1_DAN] = s_FAN2_AIR_1_DAN; page_data[EEP_FAN2_AIR_2_DAN] = s_FAN2_AIR_2_DAN; page_data[EEP_FAN2_AIR_3_DAN] = s_FAN2_AIR_3_DAN; page_data[EEP_FAN2_AIR_4_DAN] = s_FAN2_AIR_4_DAN; page_data[EEP_FAN2_BYPASS_1_DAN] = s_FAN2_BYPASS_1_DAN; page_data[EEP_FAN2_BYPASS_2_DAN] = s_FAN2_BYPASS_2_DAN; page_data[EEP_FAN2_BYPASS_3_DAN] = s_FAN2_BYPASS_3_DAN; page_data[EEP_FAN2_BYPASS_4_DAN] = s_FAN2_BYPASS_4_DAN; page_data[EEP_FILTER_CLEAN_HOUR_H] = (uint8_t)((Filter_timer_clean&0xFF00)>>8); page_data[EEP_FILTER_CLEAN_HOUR_L] = (uint8_t)(Filter_timer_clean&0x00FF); page_data[EEP_FILTER_CHANGE_HOUR_H] = (uint8_t)((Filter_timer_change&0xFF00)>>8); page_data[EEP_FILTER_CHANGE_HOUR_L] = (uint8_t)(Filter_timer_change&0x00FF); page_data[EEP_SOJA_CHANGE_HOUR_H] = (uint8_t)((Soja_timer_change&0xFF00)>>8); page_data[EEP_SOJA_CHANGE_HOUR_L] = (uint8_t)(Soja_timer_change&0x00FF); page_data[EEP_BLACKOUT_POWER_ON] = Power_On; page_data[EEP_BLACKOUT_RUN_MODE] = Run_Mode; page_data[EEP_BLACKOUT_FAN_MODE] = Fan_Mode; Hyst_To_Page(); /* 히스테리시스 임계/데드밴드/프리셋 저장 (대시보드 0x06/0x07/0x0D) */ for(i=0; i= 4000)Filter_timer_change = 0; if(Soja_timer_change >= 20000)Soja_timer_change = 0; return(1); } void Reserve_Time_Update(uint8_t rtime) { if(Roomcon_connect_mode == 0) { Set_Reserve_timer_sec = (uint32_t)rtime * 3600; Reserve_timer_sec = Set_Reserve_timer_sec; Pre_Reserve_hour = rtime; } else { if(rtime != Pre_Reserve_hour) { Set_Reserve_timer_sec = (uint32_t)rtime * 3600; Pre_Reserve_hour = rtime; } } } extern uint8_t Power_On; extern volatile uint8_t Run_Mode, Fan_Mode; void Power_off_process(uint8_t set) { uint8_t i = 0; Reserve_hour = 0; Pre_Reserve_hour = 0; Reserve_timer_sec = 0; Fan_Mode = 0; Run_Mode = 0; Power_On = 0; for(i=1; i<7; i++)Diffuser_Power[i] = 0; //////diffuser off if(set == 1) { Set_Reserve_timer_sec = 0; Set_Run_Mode = 0; Set_Fan_Mode = 0; } } uint8_t BlackOut_Power_On = 0; uint8_t BlackOut_Run_Mode = 0; uint8_t BlackOut_Fan_Mode = 0; void Pre_Mode_Control(void) { uint8_t i; if((BlackOut_Power_On != Power_On)||(BlackOut_Run_Mode != Run_Mode)||(BlackOut_Fan_Mode != Fan_Mode)) { page_data[EEP_BLACKOUT_POWER_ON] = Power_On; page_data[EEP_BLACKOUT_RUN_MODE] = Run_Mode; page_data[EEP_BLACKOUT_FAN_MODE] = Fan_Mode; for(i=EEP_BLACKOUT_POWER_ON; i