Доброго времени суток!
Из за капризности родного блока управления свечами накала решил собрать ему замену на ардуино. Но так как в программировании ноль появились некоторые затруднения в реализации, нужна ваша помощь. Использоваться будет ардуино нано. Скетч готовый уже был, но не понравился алгоритм работы и захотел его переделать.
Алгоритм работы должен быть такой:
1. При включении зажигания включается реле №1 и подает на свечи 12 вольт в течении от 0 до 6 секунд (в зависимости от выбранного алгоритма по температуре двигателя ). Свечи стоят на 6 вольт, при подаче на них 12 вольт происходит быстрый разогрев.

2. Затем при включении стартера через 0.5-1 сек. включается реле №2 которое подает на свечи 6 вольт в течении от 0 до 25 секунд (в зависимости от выбранного алгоритма по температуре двигателя ). При этом должен происходить контроль напряжения на свечах, при превышении значения 6,90 В отключалось реле №2 на 2 сек (если раньше не отключится по времени).
Вот и весь алгоритм

Не могу сообразить как реализовать в программе контроль запуска по стартеру и контроль по напряжению на свечах. В программе пока до первого варианта алгоритма, и наверняка есть какие то ошибки, и как мне кажется "delay()" там лишнии, но вот как использовать "millis()" не могу понять сколько не читал, че то с трудом все это дается Надеюсь на вашу помощь.

Вот схема по которой хочу собрать:
Нажмите на изображение для увеличения. 

Название:	WP_20161227_11_45_58_Pro.jpg 
Просмотров:	1004 
Размер:	131.6 Кб 
ID:	19106
Делители на сопротивлениях делал с запасом по напряжению.

Вот скетч:
Код:
int analogPinTEM = A0; // Анлоговый вход для считывания напряжения с делителя напряжения термодатчика
int analogPinST = A1; // Анлоговый вход для считывания напряжения с делителя напряжения стартера
float analogPinIN = A2; // Анлоговый вход для считывания напряжения с делителя напряжения для контроля напряж. на свечах
float Vout = 0; // Переменная для хранения значения напряжения в средней точки делителя напряжения термодатчика(0-5.0v)
int Vst = 0; // Переменная для хранения значения напряжения при запуске стартера
float Vin = 0; // Переменная для хранения значения напряжения на свечах (0-7.0v)
int t12 = 0; // Переменная для хранения времени работы реле 12v
int t6 = 0; // Переменная для хранения времени работы реле 6v
float R2 = 0; // Переменная для хранения значения сопротивления термодатчика R2 (датчик температуры двигателя)
int var = 0; // Переменная для хранения значения выбора варианта программы


void setup()
{
   pinMode(12, OUTPUT); // Выход на реле 12 вольт (реле 1)
   pinMode(6, OUTPUT); // Выход на реле 6 вольт (реле 2)
   pinMode(analogPinTEM, INPUT);
   pinMode(analogPinST, INPUT);
   pinMode(analogPinIN, INPUT);
   digitalWrite(12, LOW);
   digitalWrite(6, LOW);
   Serial.begin(9600);
 }

 

void loop()
{
   Vout = (5.0 / 1023.0) * analogRead(analogPinTEM); // Вычисляем напряжение в средней точки делителя (0-5.0)
   R2 = 10000 / ((5.0 / Vout) - 1); // Вычисляем сопротивление R2 (10000 это значение R1 10 кОм)
   Vst = (5.0 / 1023.0) * analogRead(analogPinST)*5.0; // Вычисляем напряжение на стартере (5.0 коэффициент делителя)
   Vin = (5.0 / 1023.0) * analogRead(analogPinIN)*5.0; // Вычисляем напряжение на свечах когда питаются от 6v (5.0 коэффициент делителя)
   Serial.print("Voltage: ");
   Serial.println(Vout); // Напряжения в средней точки делителя (0-5.0) для справки
   Serial.print("R: "); //
   Serial.print(R2); // Значение сопротивления R2 для справки
   Serial.println("Om");
   Serial.print("Voltage svechi: ");
   Serial.println(Vin); // Напряжение на свечах при питании на 6V, для справки


   delay(500); // Пауза пол сек, затем выбор алгоритма прогрева в зависимости от показаний температуры двигателя
   if (R2 > 8000) var = 1, t12 = 6000, t6 = 30000; //Если температура двигателя от чуть выше нуля и в минус до упора
   if ((R2 < 8000) && (R2 > 3200)) var = 2, t12 = 5000, t6 = 25000; // Если температура двигателя от 0 до +20 градусов
   if ((R2 < 3200) && (R2 > 1500)) var = 3, t12 = 4000, t6 = 10000; // Если температура двигателя от +20 до +40 градусов
   if ((R2 < 1500) && (R2 > 300)) var = 4, t12 = 3000, t6 = 3000; //Если температура двигателя от +40 до +80 градусов
   if (R2 < 300) var = 5, t12 = 0, t6 = 0; // Если температура двигателя от +80 градусов и выше до упора
   Serial.print("VAR: ");
   Serial.println(var);


         switch (var)
   {
       case 1:
       digitalWrite(12, HIGH); // Включаем реле быстрого нагрева свечей от 12v
       delay(t12); // Время быстрого нагрева от 12v
       digitalWrite(12, LOW);// Отключаем реле 12v
       delay(t6); // Время нагрева от 6v
         while (true) {};
         break;
	
	}
}