#include #include #define PWM_R 5 #define PWM_G 6 bool BlinkFlag = false; bool BlinkStat = true; uint8_t Level_R = 0; uint8_t Level_G = 0; unsigned long cur_ms = 0; unsigned long ms1 = 0; unsigned long ms2 = 0; unsigned long ms3 = 0; /** * Установка цвета идикатора и режима мигания */ void SetLed( uint8_t level, bool _blink ){ Level_G = level; Level_R = 255 - level; BlinkFlag = _blink; } /** * Функция определения напряжения питания устройства */ static int vccRead(byte us =250) { ADMUX = 1<250 ) ){ ms1 = cur_ms; if( BlinkFlag ){ if( BlinkStat ){ analogWrite(PWM_G,0); analogWrite(PWM_R,0); BlinkStat = false; } else { analogWrite(PWM_G,Level_G); analogWrite(PWM_R,Level_R ); BlinkStat = true; } } else { analogWrite(PWM_G,Level_G); analogWrite(PWM_R,Level_R ); } } // Контроль напряжения каждые 10сек if( (cur_ms < ms3 || (cur_ms - ms3) >10000 ) ){ ms3 = cur_ms; // Подбираем этот коэффициент при калибровки int Vcc = vccRead()/83; // Максимальное напряжение 4.2В if( Vcc > 42 )Vcc = 42; // Минимальное напряжение 3.3В if( Vcc < 33 )Vcc = 33; // Табличная функция цветов и режима мигания switch( Vcc ){ case 33 : SetLed(0,true);break; case 34 : SetLed(30,true);break; case 35 : SetLed(60,true);break; case 36 : SetLed(90,false);break; case 37 : SetLed(120,false);break; case 38 : SetLed(150,false);break; case 39 : SetLed(180,false);break; case 40 : SetLed(210,false);break; case 41 : SetLed(240,false);break; case 42 : SetLed(255,true);break; default : SetLed(129,true); } Serial.print("vcc="); Serial.print(vccRead()); Serial.println(" V"); } }