Доброго времени суток!
Из за капризности родного блока управления свечами накала решил собрать ему замену на ардуино. Но так как в программировании ноль появились некоторые затруднения в реализации, нужна ваша помощь. Использоваться будет ардуино нано. Скетч готовый уже был, но не понравился алгоритм работы и захотел его переделать.
Алгоритм работы должен быть такой:
1. При включении зажигания включается реле №1 и подает на свечи 12 вольт в течении от 0 до 6 секунд (в зависимости от выбранного алгоритма по температуре двигателя ). Свечи стоят на 6 вольт, при подаче на них 12 вольт происходит быстрый разогрев.
2. Затем при включении стартера через 0.5-1 сек. включается реле №2 которое подает на свечи 6 вольт в течении от 0 до 25 секунд (в зависимости от выбранного алгоритма по температуре двигателя ). При этом должен происходить контроль напряжения на свечах, при превышении значения 6,90 В отключалось реле №2 на 2 сек (если раньше не отключится по времени).
Вот и весь алгоритм ![Радость](images/smilies/smile.png)
Не могу сообразить как реализовать в программе контроль запуска по стартеру и контроль по напряжению на свечах. В программе пока до первого варианта алгоритма, и наверняка есть какие то ошибки, и как мне кажется "delay()" там лишнии, но вот как использовать "millis()" не могу понять сколько не читал, че то с трудом все это дается
Надеюсь на вашу помощь.
Вот схема по которой хочу собрать:
![Нажмите на изображение для увеличения.
Название: WP_20161227_11_45_58_Pro.jpg
Просмотров: 1009
Размер: 131.6 Кб
ID: 19106](http://compcar.ru/forum/attachment.php?s=708d4fae63c1bfb34204a00de93b0f1a&attachmentid=19106&d=1482823322&thumb=1)
Делители на сопротивлениях делал с запасом по напряжению.
Вот скетч:
Код:
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;
}
}