Помощь с кодом: запуск котла автомобильного подогревателя с помощью SIM800L
- Войдите на сайт для отправки комментариев
Чт, 04/02/2016 - 21:19
Уже недель бьюсь, никак не могу понять где загвоздка (работает как хочет, только не так как нужно).
//Настройки #include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); // RX, TX int ch = 0; String val = ""; unsigned long ENGINE_WARM_TIME = 30000; //В миллисекундах время работы подогревателя после запуска 1200000 миллисекунд = 20 минут // select pins for input const int sharging_in = 5; //d5 запустилась помпа const int power_in = 6; //d6 когда повернул ключ // select pins for output const int engine_out = 12; //d12 пуск подогревателя const int pechka_out = 8; //d8 цепи вторичного питания печка, фары итд // variable for actual mode int actual_mode = 0; // 2-подогреватель запущен int left_start_try = 0; // переменная для хранения остатка числа попыток запуска unsigned long last_start_time = 0; //время в тысячных секунды когда был запущен подогреватель void setup() { delay(2000); //время на инициализацию модуля Serial.begin(9600); //скорость порта mySerial.begin(9600); mySerial.println("AT+CLIP=1"); //включаем АОН delay(100); mySerial.println("AT+CMGF=1"); //режим кодировки СМС - обычный (для англ.) delay(100); mySerial.println("AT+CSCS=\"GSM\""); //режим кодировки текста delay(100); mySerial.println("AT+CNMI=2,2"); //отображение смс в терминале сразу после приема (без этого сообщения молча падают в память) pinMode(sharging_in, INPUT); // enable input digitalWrite(sharging_in, LOW); //generator LOW normaly pinMode(power_in, INPUT); digitalWrite (power_in, LOW); pinMode(engine_out, OUTPUT); // enable output digitalWrite(engine_out, LOW); //set digital 0 pinMode(pechka_out, OUTPUT); // enable output digitalWrite(pechka_out, LOW); //set digital 0 //---- конец настройки входов и выходов контроллера -------------- } void loop() { if (mySerial.available()) //если GSM модуль что-то послал нам, то { while (mySerial.available()) { //сохраняем входную строку в переменную val ch = mySerial.read(); val += char(ch); delay(10); } if (val.indexOf("RING") > -1) { //если звонок обнаружен, то проверяем номер if ((val.indexOf("79202600606") > -1) && (actual_mode < 2 )) { //если номер звонящего наш и если двигатель не запущен. Укажите свой номер без "+" mySerial.println("ATH0"); //разрываем связь val = ""; check_start(); //Управляем режимом запуска }} else // иначе { val = ""; check_for_shutdown(); //Управляем режимом ожидания окончания прогрева }}} //------------------конец основного кода ----------------- //---- а дальше идут используемые функции и подфункции -------------- void check_start() { if (sharging_in == LOW && left_start_try == 0) { left_start_try = 3; // указываем что нужно попытаться трижды запустить подогреватель } if ( left_start_try > 0 ) { do_start(); // пытаемся запустить подогреватель left_start_try = left_start_try - 1; //уменьшаем число попыток if (left_start_try == 0 ) actual_mode = 2; // заканчиваем попытки запустить движок } } // конец процедуры старта void do_start() { //тут будет запуск подогревателя // delay(3000); // останавливаем код на 3 секунды чтобы помпа включилась //----------------------------------------------------------------------------------- digitalWrite(engine_out, HIGH); delay(5000); if (digitalRead(sharging_in) == HIGH) //еще раз смотрим что зарядка пошла { actual_mode = 2; //Запоминаем что движок запущен last_start_time = millis(); // запоминаем время запуска движка } else { digitalWrite(engine_out, LOW); //выключаем зажигание чтбы разблокировать реле стартера digitalWrite(pechka_out, LOW); //выключаем печку фары итд delay (3000); } } void check_for_shutdown() { //сюда мы попадаем когда контроллер считает что движок работает if (digitalRead(sharging_in) == LOW) //проверяем что движок случайно не заглох do_shutdown(); else digitalWrite(pechka_out, HIGH); //включаем печку фары итд //тут будем контролировать чтоб если забыли машинку заведенной она не молотила до скончания бензобака а выключалась через какоето время if (actual_mode != 0) //значит не выключили заглохший двигатель только что { // милисекунды в ардуино обнуляются каждые 49 суток // для того чтобы в случае если запуск произошел в течении последних 20 минут до обнуления мотор не молотил еще 49 суток // нужно обнулить и время старта, при этом мотор максимум будет прогреваться вдвое больше обычного if (millis() < last_start_time) { last_start_time = 0; } if (millis() > last_start_time + ENGINE_WARM_TIME) // если текущее время больше чем время старта + время прогрева { do_shutdown(); left_start_try = 0; // и больше не заводим } if (digitalRead (power_in) == HIGH) { do_shutdown(); left_start_try = 0; // и больше не заводим } } } void do_shutdown() { digitalWrite(pechka_out, LOW); //выключаем печку фары итд digitalWrite(engine_out, LOW); //вырубаем зажигание actual_mode = 0; // движок выключили запомним это last_start_time = 0; // ну и забудем о том что он был включен }
Как нужно? Как хочет? "Догадайся мол сама"! Не буду догадываться - мне не нужно!
Если Вам нужно, будьте добры описать чего Вы хотите, и что реально получаете.
Извините пожалуйста.
Хотел бы, что бы при звонке и определении номера шел запуск котла (при условии что он уже не запущен и что не включено зажигание) и последующее включение печки. Число попыток запуска котла 3. Если они израсходуются то попытки прекращаются. Контроль запуска котла осуществляется + от помпы (возможно что кончится топливо, или акб разрядится, тогда контроллер котла сам отключит подогреватель), ардуино при этом должна сбрасывать число попыток.
Забыл еще. Когда я прихожу в авто, а котел еще запущен, то при повороте ключа (т.е. включении зажигания), котел должен выключаться.
В общем как то так, еще раз прошу прощения.
Позвольте маленько покритикую:
Для того, чтоб не путаться где и что, весь код всегда отрабатывается отдельными модулями, если это необходимо, используются вставки вывода отладочной информации, причем индикация может быть какой угодно, сериал, светодиод и т.д. Сложно сразу весь код в целом проверить на ошибки, тем более, что его выполнение зависит от внешних сигналов.
Помпа управляется ШИМом, что означает не просто взяла и включилась, а идет последовательность импульсов с изменяющейся при необходимости скважностью.
Вот это включилась помпа:?
Или пошла зарядка:?
Выключение котла при повороте ключа зажигания: тут возможны проблемы, например Бинар(думаю и Вэбасто так же), полсе нажатия кнопки стоп, останавливает подачу топлива и начинает продув камеры сгорания, это длится какое то время, до минуты, может и больше, не помню точно. Дак вот особенность именно Бинара, при остановке котла, активируется панель его управления и начинает моргать индикатор сигнализирующий об остановке, если в момент отображения индикации завести авто, все настройки сбрасываются, как при отключении питания. Аппаратный косяк Бинара, может в последних версиях его уже устранили.