Итак, продолжаю ваять программную и аппаратную части. На текущий момент К ардуине на аналоговый пин подключён стандартный датчик напряжения (обычный делитель напряжения на резисторах). Теперь ардуина отслеживает напряжение аккумулятора (его значение берётся до стабилизатора UBEC 5v/5A).При этом, при включении, мишень автоматически определяет количество банок у подключённого Li-Po аккумулятора. К UBEC можно подключать 2S и 3S аккумуляторы. Исходя из этого я и написал алгоритм определения количества банок:
Код:
float koeff = 0.025635; //значение коэффициента при опорном напряжении 5,25, а при опорном напряжении 4,8 оно равно 0.021875
/*
* koeff = (опорное напряжение * ((R1+R2)/R2)) / 1024 = (4,48 * ((30000+7500)/7500))/1024 = 0,021875
* где R1 = 30000 Ом
* R2 = 7500 Ом
*/
byte Cell_Akk; // Количество ячеек в аккумуляторе
float Voltaj = 0; // уровень напряжения на аккумуляторе
...
//определение количества ячеек в Li-Po аккумуляторе
float Start_Volt = 0; // временная переменная напряжения
Start_Volt = analogRead(Voltaj_Pin) * koeff; //определение изначального напряжения на аккуме. Если стартовое напряжение 9,9-12,7v - это 3S аккум. Если 6,6-8,5v - 2S. Если напряжение иное - это или не Li-Po аккумулятор и количество ячеек выставляю = 0, или сильно просаженный Li-Po, что в любом случае будет активировать звуковое предупреждение.
Serial.print("Start Voltage = ");Serial.print(Start_Volt);Serial.println(" v");
if ((Start_Volt > 9.90) && (Start_Volt < 12.70)) Cell_Akk = 3;
else if ((Start_Volt > 6.60) && (Start_Volt < 8.50)) Cell_Akk = 2;
else Cell_Akk = 0;
Как видно, я заранее измерил напряжение на выходе UBEC, которое ардуина берёт как опорное, и оно равно 5,25v. Исходя из этого был рассчитан коэффициент для измерения напряжения. Ну и потом идёт опрос датчика напряжения и если данные с него выходят за ограничительные параметры, то активируется звуковое предупреждение.
Код:
float outputValue = 0;
outputValue = analogRead(Voltaj_Pin) * koeff;
// Если напряжение < 6.5v при 2-х ячейках аккумом или напряжение < 9.7v при 3-х ячейках, или количество ячеек не определено, то выводится предупреждение о низком заряде аккумулятора и мишень переводится в неактивный режим
if (((outputValue <= 6.50) && (Cell_Akk == 2)) || ((outputValue <= 9.70) && (Cell_Akk == 3)) || (Cell_Akk == 0))
{
PLAY_SOUND(12); //проигрываем звук Низкий заряд аккумулятора
delay (40);
while (digitalRead (MP3_svoboden) == LOW) //ждём, пока проигрывание закончится
{
delay (100); //даём ардуине чуток "отдышаться"
}
StartPause = millis(); // запись времени начала паузы
EndPause = false;
PAUSA(2000);
}
Также к ардуине на другой аналоговый пин был подключен регулятор громкости. В качестве оного использовался переменный резистор на 10 КОм.
Ну и ниже простой код обработки:
Код:
byte tempVol = map(analogRead(Vol_MP3_Pin), 0, 1023, 0, 30); // временная переменная громкости
if (tempVol >=29) tempVol = 29; // убираем дребезг 29-30 единиц в крайнем положении резистора
if (Volume != tempVol) // считываем данные с регулятора громкости
{
Volume = tempVol;
Serial.print ("Громкость ");Serial.print (Volume);Serial.println (" единиц.");
mp3_set_volume(Volume);
}