Включение и запуск
- Войдите на сайт для отправки комментариев
Здравствуйте уважвемые форумчане. Большая к вам просьба, напривить в нужное русло ибо я совсем новичок, но усердно стараюсь изучать програмирование ардуинки. Нужна реализация включение зажигания и запуск двигателя нажатием на одну кнопку на дисплее nextion. попробую пошагово обьяснить. На дисплее только одна кнопка, которая переает в ардуинку код нажатия и отжатия кнопки (в дисплей не лезем)
1. Включение и отключение зажигания зажигания - нажанл на кнопку включилось зажигание, повторгое нажатие отключает его.
2. пуск двигателя - Включем зажигание нажатием кнопки на дисплее, жмем педаль тормоза и держим, нажимая эту кнопку еще раз и запускаем двигатель.
3. остановка двигателя
По первому варианту я смог сделать используя if else. но реализуя пуск двигателя тем же методом - начинается дурдом. Пуск стартера должен быть либо по времени либо пока не отпуститшь зажатую кнопку на дисплее. В общем в любом случае я запутался. Использую блок реле для ардуинки что бы включать нужное в автомобиле.
Как и каким методом это можно более правильнее реализовать используя ардуинку? просто направьте - буду изучать. От примеров конечно тоже не откажусь) . заранее спасибо
Когда включаете зажигание в первом пункте меняете состояние "системы" с 0 на 1 (например).
Крутитесь в лупе (ну или где-то там еще) и ждете нажатия на "кнопку". Как только нажали проверяете состояние системы, если 1 то надо завести, а для этого надо проверить чтобы тормоз был зажат и вот если это все выполнено то запоминаете начальное millis, включаете реле на запуск и изменяете состояние системы с 1 на 2. Далее опять же в лупе смотрите если состояние системы 2 и millis-начальное millis меньше, например, 3000 то ждем дальше, если больше то выключаем стартер и переводим систему в состояние 3 (завелась).
Это в самом простом случае, а так надо следить чтобы она реально завелась, например, по оборотам двигателя. Ну и предусмотреть возвраты в другие состояния. Ну и если надо крутить стартер пока кнопка зажата добавить, я не знаю как там у некстион реализован тач.
Сигнал из дисплея о нажатии кнопки такой - 65 0 1 1 ffff ffff ffff, если кнопку отпустить то такой - 65 0 1 0 ffff ffff ffff.
В общем я скинул тот код что я написал. Как добавляю включение стартера, не хочет работать корректно. И по поводу millis - не могу понять как он работает и задержку включенного стартера не могу оформить. Я еще скорее всего с переменными что то намудрил, ведь можно использовать не только int.
#include <SoftwareSerial.h> #include <Nextion.h> SoftwareSerial nextion(2, 3); Nextion smartCar(nextion, 9600); int relay2 = 5; //реле зажигания int relay3 = 6; //реле стартера int brake = 8; //нажатие педали тормоза void setup() { Serial.begin(9600); / smartCar.init(); pinMode(relay2, OUTPUT); //выход для реле зажигания pinMode(relay3, OUTPUT); //выход для реле стартера pinMode(brake, INPUT); //вход для педали тормоза digitalWrite(relay2, HIGH); //подтягивающий резистор на плюс digitalWrite(relay3, HIGH); //подтягивающий резистор на плюс digitalWrite(brake, LOW); //подтягивающий резистор на минус } void loop() { String message = smartCar.listen(); //проверяет сообщение //if(message != "") Serial.println(message); //выводит сообщение на монитор порта //------------ ВКЛЮЧЕНИЕ/ОТКЛЮЧЕНИЕ ЗАЖИГАНИЯ И СТАРТЕРА------------ if(message == "65 0 1 1 ffff ffff ffff" && digitalRead(relay2) == HIGH) { digitalWrite(relay2, LOW); smartCar.sendCommand("p0.pic=1"); } else if(message == "65 0 1 1 ffff ffff ffff" && digitalRead(relay2) == LOW) { digitalWrite(relay2, HIGH); smartCar.sendCommand("p0.pic=0"); } //-------------------- ПУСК СТАРТЕРА -------------------- if(message == "65 0 1 1 ffff ffff ffff" && digitalRead(relay2) == LOW && digitalRead(brake) == HIGH) { digitalWrite(relay3, LOW); smartCar.sendCommand("p0.pic=2"); } else if(message == "65 0 1 0 ffff ffff ffff" && digitalRead(relay2) == LOW && digitalRead(relay3) == LOW) { digitalWrite(relay3, HIGH); smartCar.sendCommand("p0.pic=1"); } }Я искренне надеюсь, что все это не будет ездить по дорогам общего пользования.
Я искренне надеюсь, что все это не будет ездить по дорогам общего пользования.
это будет бомбить Туву грузовыми космолётами.
Я искренне надеюсь, что все это не будет ездить по дорогам общего пользования.
Если пытался чем то помочь, то неудачно... ПО-мойму я писал уже, что новичок и что изучаю все постепенно. Лучше бы нормально указал на ошибки или просто молчал, чем пустыми словами тему забивал.
ну ваш скетч лучше написать так
/**/ //----------------------------- #include <SoftwareSerial.h> #include <Nextion.h> SoftwareSerial nextion(2, 3); Nextion smartCar(nextion, 9600); const byte Rel2Pin = 5; //реле зажигания const byte Rel3Pin = 6; //реле стартера const byte brakelPin = 8; //нажатие педали тормоза bool Rel2, Rel3, brake1; //----main()---------------------------------------- void setup() { Serial.begin(9600); / smartCar.init(); pinMode(Rel2Pin, OUTPUT); //выход для реле зажигания digitalWrite(Rel2Pin, Rel2 = 1); //подтягивающий резистор на плюс pinMode(Rel3Pin, OUTPUT); //выход для реле стартера digitalWrite(Rel3Pin,Rel3=1);; //подтягивающий резистор на плюс pinMode(brakelPin, INPUT); //вход для педали тормоза digitalWrite(brakelPin, brake1=0); //подтягивающий резистор на минус } void loop() { String message = smartCar.listen(); //проверяет сообщение //if(message != "") Serial.println(message); //выводит сообщение на монитор порта //------------ ВКЛЮЧЕНИЕ/ОТКЛЮЧЕНИЕ ЗАЖИГАНИЯ И СТАРТЕРА------------ if (message == "65 0 1 1 ffff ffff ffff" && Rel2) { digitalWrite(Rel2Pin, Rel2 = 0); smartCar.sendCommand("p0.pic=1"); } else if (message == "65 0 1 1 ffff ffff ffff" && !Rel2) { digitalWrite(Rel2Pin, Rel2 = 1); smartCar.sendCommand("p0.pic=0"); } //-------------------- ПУСК СТАРТЕРА -------------------- if (message == "65 0 1 1 ffff ffff ffff" && !Rel2 && brakel) { digitalWrite(Rel3Pin,Rel3=0);; smartCar.sendCommand("p0.pic=2"); } else if (message == "65 0 1 0 ffff ffff ffff" && !Rel2 && !Rel3) { digitalWrite(Rel3Pin,Rel3=1);; smartCar.sendCommand("p0.pic=1"); } }ну ваш скетч лучше написать так
Спасибо.
При проверке скетча, программа ссылалась на 42 строку brake1, я исправил еденичку и ошибка пропала. Залил, работало только включение и отключение реле зажигания. Судя потому что в 21 строке brake1=0, то в 42 строке исправил на !brake1 (я же жму на педаль тормоза). Залил, при нажатии на кнопку сразу на секунду срабатывает реле стартера и одновременно включается реле зажигания. с 47-50 строки убрал else, залил, при нажатии срабатывает сразу два реле. Ребят, может для реле стартера сделать отключение по таймеру через millis? Я просто как не пытался, не могу понять как правильно работать с millis(
Из меня плохой советчик. 1) у меня нет nextion 2) мой стиль не понятен для новичка, а значит бесполезен вам http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
В самом простом варианте должно быть что-то типа такого. Но тут еще работать и работать. Надо проверять что двигатель реально завелся (по датчику масла или оборотам или как угодно).
#include <SoftwareSerial.h> #include <Nextion.h> SoftwareSerial nextion(2, 3); Nextion smartCar(nextion, 9600); #define waitStartTime = 3000; int relay2 = 5; //реле зажигания int relay3 = 6; //реле стартера int brake = 8; //нажатие педали тормоза byte smartCarState = 0; unsigned long startTime = 0; void setup() { Serial.begin(9600); / smartCar.init(); pinMode(relay2, OUTPUT); //выход для реле зажигания pinMode(relay3, OUTPUT); //выход для реле стартера pinMode(brake, INPUT); //вход для педали тормоза digitalWrite(relay2, HIGH); //подтягивающий резистор на плюс digitalWrite(relay3, HIGH); //подтягивающий резистор на плюс digitalWrite(brake, LOW); //подтягивающий резистор на минус } void loop() { // smartCarState // 0 - init state // 1 - IGN state // 2 - START state // 3 - WORK car String message = smartCar.listen(); //проверяет сообщение if(message == "65 0 1 1 ffff ffff ffff") { switch(smartCarState) { case 0: // начальное состояние, включаем зажигание digitalWrite(relay2, LOW); smartCar.sendCommand("p0.pic=1"); smartCarState = 1; break; case 1: // нажата кнопка пуск при включенном зажигании // если тормоз НЕ нажат выключаем зажигание if(!digitalRead(brake)) { digitalWrite(relay2, HIGH); smartCar.sendCommand("p0.pic=0"); smartCarState = 0; } else { // если тормоз нажат пытаемся завести корыто digitalWrite(relay3, LOW); smartCar.sendCommand("p0.pic=2"); smartCarState = 2; startTime = millis(); } break; case 3: // нажата кнопка пуск при заведенной машине, глушим digitalWrite(relay2, HIGH); smartCar.sendCommand("p0.pic=0"); smartCarState = 0; break; } } // если кнопка пуск отпущена или вышло время ожидания // и мы находимся в состоянии 2 if(smartCarState == 2) { if(message == "65 0 1 0 ffff ffff ffff" || millis()-startTime >= waitStartTime) { digitalWrite(relay3, HIGH); smartCar.sendCommand("p0.pic=1"); smartCarState = 3; } } }Penni, огромное тебе спасибо. буду разжовывать всю информацию. Я как то думал сделать через switch case, но пока моих знаний и практики в этом не хватило. И все же я так и не могу понять millis)
Если пытался чем то помочь, то неудачно... ПО-мойму я писал уже, что новичок и что изучаю все постепенно. Лучше бы нормально указал на ошибки или просто молчал, чем пустыми словами тему забивал.
Лучше кому?
Тому водителю, которому Вы из-за отказа техники создадите аварийную ситуацию?
Не нужно вмешиваться в работу систем, от исправности которых зависит жизнь людей.
[quote]
Лучше кому?
Тому водителю, которому Вы из-за отказа техники создадите аварийную ситуацию?
Не нужно вмешиваться в работу систем, от исправности которых зависит жизнь людей.
[\quote]
Не стоит уже так драматизировать, я не настолько глуп , что бы впаривать это в чей то автомобиль. Мне что бы понять ардуинку и основы программирования проще через подобный проект. От того что я пересмотрел видосы и прочел статьи по ардуино - тяжело еще разбираться. И даже если в дальнейшем я захочу установить для тестирования подобное в автомобиль, то это будет лично мой автомобиль и всего лишь как дополнительное оборудование, не нарушая основные узлы работы.
Penni, еще раз спасибо, я вроде разобрался в коде. Ты прав, нужно думать отключение стартера по сигналу из авто, но что то получается очень много релюх, в автомобиле то 12 вольт, а ардуинка принимает 5. Как еще можно подать на ардуинку 5в из 12в?
Оптроном сигнал, стабилизатором - питание
А вот в плане защиты? В случае выхода из строя того же стабилизатора, не пойдет 12в в ардуинку? И хватит ли корпуса для охлаждения стабилизатора или вешать придется алюминиевое охлаждение
Lm2596
Penny, такой вопрос. Получается интересная ситуация с тормозом. Педаль тормаза я имитирую подавая на пин 5 вольт из ардуинки, когда я отключаю 5в , то еще в течении 5-8 секунд все равно активен пин педали тормоза, так как ардуинка запускает реле стартера. Вроде лишенго ничего в коде, но вот как то старрно себя ведет
Надо подтянуть вход к минусу. У вас подтяжки вообще не было, та строчка что лоу запысывает в пин это не подтяжка а просто начальное состояние пина. Подтяните через резистор на землю и все должно быть нормально
спасибо большое. Резистор как я понял на 10кОм