Показать сообщение отдельно
Старый 24.09.2015, 00:45   #61
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 39
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
Question

покритикуйте новый скетч, еще не заливал в машину.
Тут СПОЙЛЕРЫ есть на форуме?!

// ver23.09.2249
//D8 pin - (PLANSHpin pin)(выход 5в логический) (выключает питание планшета!(R13-R14))
//D7 pin - самозапитка (AKB pin) (выход 5в логический)


/*ноги ардуины*/
int PLANSHpin = 8; //управление на выключатель питания БАТАРЕИ планшета через управляющую ногу ss\sd1
//0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)
int AKBpin = 7; //управление транзюком самозапитки блока питания VT2
//1 = есть самозапитка; 0 = нет самозапитки
int OTGpin = 10; //управление транзюком OTG VT3
//1 = есть масса на OTG; 0 = нет массы на OTG
int SLEEPpin = 11; //управление транзюком сна VT4 (на датчик холла))
//1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)
int POGOpin = 9; //управление транзюком питания +5V (VT5) на пого пин, чтоб планшет думал, что идет зарядка
//1 = нет 5V на POGO; 0 = есть 5V на POGO
int REMpin = 12; // //управление транзюком VT7 и через него VT6 = выход сигнала REM (+12v) НЕ АКТИВИРОВАЛ В СКЕТЧЕ, на плате распаяно.
//0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM

/*логические переменные, используемые в коде*/
int flagACC = 0; //признак включенного зажигания
int flagAKB = 0; // признак заряженной батареи
int flagHALL = 0; //флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = 0;
unsigned long pauseTimeAKB = 0;
unsigned long pauseTimeHALL = 120000; // время паузы перед морганием экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин

void setup()
{
// put your setup code here, to run once:
pinMode(PLANSHpin, OUTPUT);
pinMode(AKBpin, OUTPUT);
pinMode(OTGpin, OUTPUT);
pinMode(SLEEPpin, OUTPUT);
pinMode(POGOpin, OUTPUT);
pinMode(13, OUTPUT); //светодиодик на плате ардуины
analogReference(INTERNAL); //перевод напряжения делителя на внутреннее значение 1,1В ( для повышения точности замера Uacc и Uakb)
// Serial.begin(1200);
}


void loop()
{
int Uacc = analogRead (A7); //Читаем напругу с делителя R10-R11
int Uakb = analogRead (A6); //Читаем напругу с делителя R2-R3
float U_acc_real = Uacc * (1.1 / 1023.0*17.2); //Вычисляем реальное напряжение +ACC на входе делителя (A7) 17.2=поправка на погрешность делителя. обкатывать только на реальном питании от 12В! при питании от ЮСБ 5,0В плавают
float U_akb_real = Uakb * (1.1 / 1023.0*17.1); //Вычисляем реальное напряжение +30 на входе делителя (A6)
//Serial.print("U_akb_real = ");Serial.println(U_akb_real);
//Serial.print("U_acc_real = ");Serial.println(U_acc_real);

// кусок кода ниже нужен для того, чтобы при включении и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.
if (millis()>pauseTimeHALL && flagHALL == 0) //проверка отсчета при холодном старте
{flagHALL = 1;}
// if (flagHALL == 0 && flagACC == 1){flagHALL = 1;} // надо ли этот кусок кода тут?! Я ХЗ, пусть будет. но скорее не надо.




// блок ACC
if (U_acc_real>= 12 && flagACC == 0 && flagAKB == 1) //проверка напруги АСС и АКБ при флаге ACC = 0
{

flagACC = 1; //ВКлючили зажигание
pauseTimeACC = millis();
//сразу после включения зажигания даём минус на Y-OTG и плюс +5V на POGO или USB.
digitalWrite(OTGpin, 1); //включаем минус на Y-OTG (8 pin PW1) (включается хаб? и звуковая карта)
digitalWrite(POGOpin, 0); //включаем +5V (3 pin PW1 = POGO) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)

}
if (millis()-pauseTimeACC>=2000 && flagACC == 1) // пауза 2c после включения ACC и потом делать следующ(пока включено ACC):
{
digitalWrite(SLEEPpin, 0); //вЫключаем минус на упр SLEEP (7 pin PW1) = включаем экран
// REM УПРАВЛЕНИЕ РАСКОММЕНТИТЬ и протестировать
//digitalWrite(REMpin, 1); // даем + на управление VT7, тот дает минус на управление VT6, а VT6 выдаёт +12V на выход (PW1 - 13 pin))

pauseTimeACC = 0;
}

if (U_acc_real< 12 && flagACC == 1)
{
flagACC = 0; //Выключили зажигание
pauseTimeACC = millis();
pauseTimeAKB = millis(); // сброс времени для отсчета отключения самозапитки



// REM УПРАВЛЕНИЕ РАСКОММЕНТИТЬ и протестировать
//digitalWrite(REMpin, 0); // даем - на управление VT7, тот убирает за счет подтяжки R24 минус на управление VT6, а VT6 убирает +12V на выход (PW1 - 13 pin))
}

if (millis()-pauseTimeACC>=4000 && flagACC == 0) //пауза 4c после вЫключения ACC и потом делать следующ:
{

digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(POGOpin, 1); //вЫключаем +5V (3 pin PW1 = POGO)
pauseTimeACC = 0;
if (flagHALL==1){digitalWrite(SLEEPpin, 1);} else {digitalWrite(SLEEPpin, 0);} //включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)
}




// .. блок АКБ
if (U_akb_real>=12 && flagAKB == 0) //проверка +30 и флага акб
{
digitalWrite(AKBpin, 1); // включаем самозапитку

digitalWrite(PLANSHpin, 1); //включаем питание на батарею планшета (ss\sd1)
flagAKB = 1;
}
if (U_akb_real<12 && flagAKB == 1) // ситуация, когда сел при работе ардуины аккумулятор
{
flagAKB = 0;

}

if (millis()-pauseTimeAKB>=6000 && flagAKB == 0) // если севший аакумулятор
{ // пауза 6c
digitalWrite(PLANSHpin, 0); //вЫключаем питание на батарею планшета (ss\sd1)
digitalWrite(AKBpin, 0); //выключаем AKBpin, при этом пропадает питание через полевик на KIW, система ПОЛНОСТЬЮ обесточивается
delay (3000); // задержка для аппаратного выключения
}

if (flagAKB == 1 && flagACC == 0) //ситуация, когда норм акб и давно выключили зажигание (ACC)
{
if (millis()-pauseTimeAKB>=10800000 && flagAKB == 1) // если давно выключили ACC
{ // пауза (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч)
digitalWrite(AKBpin, 0); //выключаем AKBpin, при этом пропадает питание через полевик на KIW, система ПОЛНОСТЬЮ обесточивается
digitalWrite(PLANSHpin, 0); //вЫключаем питание на батарею планшета (ss\sd1)
delay (3000); // задержка для аппаратного выключения
}
}

if (flagAKB ==0 ){digitalWrite(13, 0);} else {digitalWrite(13, 1);}; // индикация напруги батареи на ардуинине.

}
oleg707 вне форума   Ответить с цитированием