Ну в общем-то вот окончательный вариант:
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с и на стадии 2 проверяем включился ли планшет,
//и если нет, то зажимаем кнопку на 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) {
if (analogRead(20) > 400) {
stage = 0;
in_progress = 0;
}
else {
digitalWrite(18, HIGH);
stage = 3;
stage_timer = millis();
}
}
if (stage == 3 && (millis() - stage_timer) > 3000) {
digitalWrite(18, LOW);
stage = 4;
stage_timer = millis();
}
if (stage == 4 && (millis() - stage_timer) > 2000) {
stage = 0;
in_progress = 0;
}
}
void power_off(){
in_progress = 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) > 5000) {
digitalWrite(19, HIGH);
if (analogRead(20) < 400){
stage = 0;
in_progress = 0;
}
else {
digitalWrite(10, HIGH);
stage = 3;
stage_timer = millis();
}
}
if (stage == 3 && (millis() - stage_timer) > 2000) {
digitalWrite(10, LOW);
stage = 4;
stage_timer = millis();
}
if (stage == 4 && (millis() - stage_timer) > 30000) {
stage = 0;
in_progress = 0;
}
}
void halt(){
in_progress = 3;
digitalWrite(19, HIGH);
digitalWrite(21, HIGH);
in_progress = 0;
}