Включение и запуск

Bukmop
Offline
Зарегистрирован: 22.10.2017

Здравствуйте уважвемые форумчане. Большая к вам просьба, напривить в нужное русло ибо я совсем новичок, но усердно стараюсь изучать програмирование ардуинки. Нужна реализация включение зажигания и запуск двигателя нажатием на одну кнопку на дисплее nextion. попробую пошагово обьяснить. На дисплее только одна кнопка, которая переает в ардуинку код нажатия и отжатия кнопки (в дисплей не лезем)

1. Включение и отключение зажигания зажигания - нажанл на кнопку включилось зажигание, повторгое нажатие отключает его.

2. пуск двигателя - Включем зажигание нажатием кнопки на дисплее, жмем педаль тормоза и держим, нажимая эту кнопку еще раз и запускаем двигатель. 

3. остановка двигателя

По первому варианту я смог сделать используя if else. но реализуя пуск двигателя тем же методом - начинается дурдом. Пуск стартера должен быть либо по времени либо пока не отпуститшь зажатую кнопку на дисплее. В общем в любом случае я запутался. Использую блок реле для ардуинки что бы включать нужное в автомобиле.

Как и каким методом это можно более правильнее реализовать используя ардуинку? просто направьте - буду изучать. От примеров конечно тоже не откажусь) . заранее спасибо

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Когда включаете зажигание в первом пункте меняете состояние "системы" с 0 на 1 (например).

Крутитесь в лупе (ну или где-то там еще) и ждете нажатия на "кнопку". Как только нажали проверяете состояние системы, если 1 то надо завести, а для этого надо проверить чтобы тормоз был зажат и вот если это все выполнено то запоминаете начальное millis, включаете реле на запуск и изменяете состояние системы с 1 на 2. Далее опять же в лупе смотрите если состояние системы 2 и millis-начальное millis меньше, например, 3000 то ждем дальше, если больше то выключаем стартер и переводим систему в состояние 3 (завелась).

Это в самом простом случае, а так надо следить чтобы она реально завелась, например, по оборотам двигателя. Ну и предусмотреть возвраты в другие состояния. Ну и если надо крутить стартер пока кнопка зажата добавить, я не знаю как там у некстион реализован тач.

Bukmop
Offline
Зарегистрирован: 22.10.2017

Сигнал из дисплея о нажатии кнопки такой - 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");
    }
}
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Я искренне надеюсь, что все это не будет ездить по дорогам общего пользования.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

andriano пишет:

Я искренне надеюсь, что все это не будет ездить по дорогам общего пользования.

это будет бомбить Туву грузовыми космолётами.

Bukmop
Offline
Зарегистрирован: 22.10.2017

andriano пишет:

Я искренне надеюсь, что все это не будет ездить по дорогам общего пользования.

 

Если пытался чем то помочь, то неудачно... ПО-мойму я писал уже, что новичок и что изучаю все постепенно.  Лучше бы нормально указал на ошибки или просто молчал, чем пустыми словами тему забивал.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ну ваш скетч лучше написать так 

/**/
//-----------------------------
#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");
  }
}

 

Bukmop
Offline
Зарегистрирован: 22.10.2017

qwone пишет:

ну ваш скетч лучше написать так 

Спасибо.

При проверке скетча, программа ссылалась на 42 строку brake1, я исправил еденичку и ошибка пропала. Залил, работало только включение и отключение реле зажигания. Судя потому что в 21 строке brake1=0, то в 42 строке исправил на !brake1 (я же жму на педаль тормоза). Залил, при нажатии на кнопку сразу на секунду срабатывает реле стартера и одновременно включается реле зажигания.  с 47-50 строки убрал else, залил, при нажатии срабатывает сразу два реле. Ребят, может для реле стартера сделать отключение по таймеру через millis? Я просто как не пытался, не могу понять как правильно работать с millis(

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Из меня плохой советчик. 1) у меня нет nextion 2) мой стиль не понятен для новичка, а значит бесполезен вам http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

В самом простом варианте должно быть что-то типа такого. Но тут еще работать и работать. Надо проверять что двигатель реально завелся (по датчику масла или оборотам или как угодно).

#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;
    }
  }
}

 

Bukmop
Offline
Зарегистрирован: 22.10.2017

Penni, огромное тебе спасибо. буду разжовывать всю информацию. Я как то думал сделать через switch case, но пока моих знаний и практики в этом не хватило. И все же я так и не могу понять millis)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Bukmop пишет:

Если пытался чем то помочь, то неудачно... ПО-мойму я писал уже, что новичок и что изучаю все постепенно.  Лучше бы нормально указал на ошибки или просто молчал, чем пустыми словами тему забивал.

Лучше кому?

Тому водителю, которому Вы из-за отказа техники создадите аварийную ситуацию?

 

Не нужно вмешиваться в работу систем, от исправности которых зависит жизнь людей.

Bukmop
Offline
Зарегистрирован: 22.10.2017

[quote]

Лучше кому?

Тому водителю, которому Вы из-за отказа техники создадите аварийную ситуацию?

 

Не нужно вмешиваться в работу систем, от исправности которых зависит жизнь людей.

[\quote]

Не стоит уже так драматизировать, я не настолько глуп , что бы впаривать это в чей то автомобиль. Мне что бы понять ардуинку и основы программирования проще через подобный проект. От того что я пересмотрел видосы и прочел статьи по ардуино - тяжело еще разбираться. И даже если в дальнейшем я захочу установить для тестирования подобное в автомобиль, то это будет лично мой автомобиль и всего лишь как дополнительное оборудование, не нарушая основные узлы работы.

Penni, еще раз спасибо, я вроде разобрался в коде. Ты прав, нужно думать отключение стартера по сигналу из авто, но что то получается очень много релюх, в автомобиле то 12 вольт, а ардуинка принимает 5. Как еще можно подать на ардуинку 5в из 12в?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Оптроном сигнал, стабилизатором - питание

Bukmop
Offline
Зарегистрирован: 22.10.2017

А вот в плане защиты? В случае выхода из строя того же стабилизатора, не пойдет 12в в ардуинку? И хватит ли корпуса для охлаждения стабилизатора или вешать придется алюминиевое охлаждение

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Lm2596

Bukmop
Offline
Зарегистрирован: 22.10.2017

Penny, такой вопрос. Получается интересная ситуация с тормозом. Педаль тормаза я имитирую подавая на пин 5 вольт из ардуинки, когда я отключаю 5в , то еще в течении 5-8 секунд все равно активен пин педали тормоза, так как ардуинка запускает реле стартера. Вроде лишенго ничего в коде, но вот как то старрно себя ведет

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Надо подтянуть вход к минусу. У вас подтяжки вообще не было, та строчка что лоу запысывает в пин это не подтяжка а просто начальное состояние пина. Подтяните через резистор на землю и все должно быть нормально

Bukmop
Offline
Зарегистрирован: 22.10.2017

спасибо большое. Резистор как я понял на 10кОм