Народ, для начала спрошу продолжать ли мне отписывать свои наработки для своего БП тут или создать отдельную тему? Может вы не хотите тут лишнего флуда видеть.
Ну а про свои наработки- подумал я и переписал код "чутка". Короче захотел убрать делеи и сделать более правильный алгоритм работы.
Вот код как ща есть- без перерывов цикла сделана только функция включения. Остальное потом допишу, а это для сравнения сколько нужно строк чтоб заменить 4 строки с делеем, но тем не менее так правильнее.
PHP код:
unsigned long time0 = 0;
unsigned long stage_timer = 0;
int in_progress = 0;
int stage = 0;
unsigned int accpower = 0;
int accpowercount = 0;
int accpoweravg = 1023;
void setup() {
//Arduino Pro-Micro
//21 = A3
//20 = A2
//19 = A1
//18 = A0
pinMode(18, OUTPUT); //Tablet button
pinMode(19, OUTPUT); //HUB power
pinMode(20, INPUT); //Tablet Screen action. Analog! If input >232 then screen on
pinMode(21, OUTPUT); //Tablet power
pinMode(10, OUTPUT); //Tablet power supply low if car bat level low
pinMode(A7, INPUT); //Car bat level (In bord PIN 6!!!) 541=11,91 **analogRead(A7) * (1.1 / 1023.0*20.50);
pinMode(8, INPUT); //Radio input
pinMode(9, INPUT); //ACC input
digitalWrite(21, LOW);
digitalWrite(19, LOW);
digitalWrite(18, LOW);
digitalWrite(10, LOW);
}
void loop() {
//Измеряем среднее значение напряжения автомобиля.
if ((millis() - time0) > 1000){
if (accpowercount == 60){
accpoweravg = accpower / 60;
accpowercount = 0;
accpower = 0;
}
else{
accpower = accpower + analogRead(A7);
accpowercount = accpowercount + 1;
}
time0 = millis();
}
if (in_progress == 0){
if ((digitalRead(8) == HIGH || digitalRead(9) == HIGH) && analogRead(20) < 400) mag_car_on(); //Если магнитола или зажигание включено, а питания на подсветке нету.
if (digitalRead(8) == LOW && digitalRead(9) == LOW && analogRead(20) > 400) power_off(); //Если магнитола выключена и зажигание выключено, но подсветка работает.
if (digitalRead(8) == LOW && digitalRead(9) == LOW && accpoweravg < 541) halt(); //Если магнитола и зажигание выключены и сел акумулятор, а отключение не выполнялось.
}
else {
if (in_progress == 1) mag_car_on();
if (in_progress == 2) power_off();
if (in_progress == 3) halt();
}
}
void mag_car_on(){
in_progress = 1;
digitalWrite(19, LOW);
digitalWrite(21, LOW);
//Клик кнопкой 300мс, после этого ждём 2с на стадии 3 проверяем включился ли планшет
//и если нет, то зажимаем кнопку на 3с, потом ждём 2с.
if (stage == 0) {
digitalWrite(18, HIGH);
stage = 1;
stage_timer = millis();
}
if (stage == 1 && (millis() - stage_timer) > 300) {
digitalWrite(18, LOW);
stage = 2;
stage_timer = millis();
}
if (stage == 2 && (millis() - stage_timer) > 2000) {
stage = 3;
}
if (stage == 3){
if (analogRead(20) > 400) {
stage = 0;
in_progress = 0;
}
else {
digitalWrite(18, HIGH);
stage = 4;
stage_timer = millis();
}
}
if (stage == 4 && (millis() - stage_timer) > 3000) {
digitalWrite(18, LOW);
stage = 5;
stage_timer = millis();
}
if (stage == 5 && (millis() - stage_timer) > 2000) {
stage = 0;
in_progress = 0;
}
}
void power_off(){
in_progress = 2;
BtnClick(300);
delay(4000);
digitalWrite(19, HIGH);
//проверить выключился или нет и если нет, то сбросить.
if (analogRead(20) > 400){
digitalWrite(10, HIGH);
delay(2000);
digitalWrite(10, LOW);
delay(10000);
}
in_progress = 0;
}
void halt(){
in_progress = 3;
digitalWrite(19, HIGH);
digitalWrite(21, HIGH);
in_progress = 0;
}
void BtnClick(int Interval) {
digitalWrite(18, HIGH);
delay(Interval);
digitalWrite(18, LOW);
delay(1000);
}
PS Нашёл неприятность, не знаю как в нексусе, а у леновы это есть.
Суть в том, что после "жёсткой" перезагрузки питанием через примерно 10 секунд экран планшета включается и показывает текущий заряд батареи!
И это держится ещё примерно 10 секунд.
Тоесть из за этого код выключения отработал и тут на тебе- экран загарелся и естественно код начал отрабатываться ещё раз с тем же "жёстким" ресетом.
Ну короче дальше всё по кругу! Вовремя нашёл это, а то в машине было бы весело после первого же зависания.
Поправил в своём коде на 30с, а в котором тут не правил.
В общем-то я код оттестировал и если интерестно, то могу окончательный вариант запостить.
PPS Не в тему, но может кто знает. Lenovo tab2 A7 при подключении флехи выдаёт сообщение
"OTG-диск готов к использованию
Изменить настройки памяти по умолчанию?"
Ну и отмена и ок. Как убрать эту табличку нафиг? А то в машине при подключении флехи/выхода из слипа/загрузки она вылетать будет! Задолбает же в ноль!