Безключевой доступ в авто на ардуино + блютус и брелок сигнализации

Доброго времени суток!
Прошу помощи с кодом для самоделки.
Хочу реализовать простой безключевой доступ в авто по принципу когда подходишь к машине телефон по блютусу подключается к блютус адапетру ch-05, и на кнопки брелка подается минусовой сигнал, машина открывается, отходишь от авто теряется связь с телефоном на вторую кнопку брелка подается минус и машина закрывается.

Собрал схему, начал писать код, есть затруднение как сделать так, чтобы условие после if выполнялось только один раз пока не будет выполнено следующее условие после if else, а то получается что на кнопку подается сигнал бесконечное количество раз

#define PIN_STATE 4
#define PIN_LOCK 6 
#define PIN_AUTOSTATE 7 
#define PIN_TEST 13
int a;  // переменная для хранения значения STATE
int b;  // переменная для хранения значения AUTOSTATE


void setup()
{
  pinMode(PIN_UNLOCK, INPUT); // Объявляем пин включения кнопки открытия машины как вход, чтобы не было напряжения на пине.  
  pinMode(PIN_LOCK, INPUT); // Объявляем пин включения кнопки закрытия машины как вход, чтобы не было напряжения на пине.  
  pinMode(PIN_STATE, INPUT); // Объявляем пин для считывания сигнала с CH-05 как вход
  pinMode(PIN_AUTOSTATE, INPUT); // Объявляем для считывания c рэле автомомбиля при включенном зажигании как вход
  pinMode(PIN_TEST, OUTPUT); // Объявляем пин 13 светодиода на плате для индикации работы.   
  
}
void loop()
{
  a = digitalRead(4);  // считаем значение с пина 4 от блютусмодуля CH-05  
  b = digitalRead(7);  // cчитаем значение с пина 7 от рэле автобиля которое в номральном режиме разомкнуто и пин будет потянут к +5 вольт ардуино через резистор 10кОм
  if ( a > 0 &&  b > 0  ) {   // если есть сигнал от блютуса и реле разомкнуто 
    delay(10);  
 digitalWrite(13, HIGH); // зажечь сигнальный диод 
 pinMode(PIN_UNLOCK, OUTPUT); // назначит пин на выход 
 digitalWrite(5, LOW); // пин 5 притянуть к земле 
 delay (700);  // задержка для срабатывания брелка
pinMode(PIN_UNLOCK, INPUT);  // пин 5 назначит входом для рассоединения с землей 
digitalWrite(13, LOW);   // зажечь сигнальный диод 
    delay (15000); }  // задержка в 15с для включения зажигания в машине 
    
    else if (a < 1 &&  b > 0 )  // если нет сигнала от блютуса и реле разомкнуто  
{
digitalWrite(13, LOW);  // зажечь сигнальный диод 
pinMode(PIN_LOCK, OUTPUT); // назначит пин на выход 
digitalWrite(6, LOW); // пин 6 притянуть к земле 
 delay (700);  // задержка для срабатывания брелка
pinMode(PIN_LOCK, INPUT);  // пин 6 назначит входом для рассоединения с землей    
    delay (15000);  // как реализовать чтобы эта часть кода после else if выполнилась только один раз и ждать пока выполнения первой части условия??? 
}

     
   
}

Еще сразу нужно делать безключевой угонный комплекс на ардуино. Чего людей мучать изучением кода.

Флажок завести и проверять его, в дополнение к условию.

то есть вы собираетесь оставить брелок сигналки в машине? А зачем вообще такая сигнализация?

брелок спрячу, подключение только по mac адресу , да и машину мою вряд-ли угонят)

Добавьте переменную “дверь_уже_открыта” и выставляйте ее в единицу, когда срабатывает условие в строке 22. И пока эта переменная не станет нулем - больше не проверяйте это условие.
Переменную сбрасывайте на ноль при срабатывании условия в строке 32

Одно замечание не по делу - а по оформлению. Не надо называть переменные одной буквой, давайте им более осмысленные имена. И не пишите глупые комментарии, типа

для кого это? - для тетушки из Минусинска, которая не умеет читать код? - так она и в скетч ваш никогда не полезет
Вместо этого надо было написать что-то типа “Если на БТ-модуле сигнал и реле 3 включено - открываем дверь”
Комментарии должны не обьяснять, что операторы делают - а зачем эти действия нужны.

1 лайк
#define PIN_STATE 4
#define PIN_LOCK 6 
#define PIN_AUTOSTATE 7 
#define PIN_TEST 13
int a;  // переменная для хранения значения STATE
int b;  // переменная для хранения значения AUTOSTATE
int с;  // переменная для хранения открытия двери 


void setup()
{
  pinMode(PIN_UNLOCK, INPUT); // Объявляем пин включения кнопки открытия машины как вход, чтобы не было напряжения на пине.  
  pinMode(PIN_LOCK, INPUT); // Объявляем пин включения кнопки закрытия машины как вход, чтобы не было напряжения на пине.  
  pinMode(PIN_STATE, INPUT); // Объявляем пин для считывания сигнала с CH-05 как вход
  pinMode(PIN_AUTOSTATE, INPUT); // Объявляем для считывания c рэле автомомбиля при включенном зажигании как вход
  pinMode(PIN_TEST, OUTPUT); // Объявляем пин 13 светодиода на плате для индикации работы.   
  
}
void loop()
{
  a = digitalRead(4);  // считаем значение с пина 4 от блютусмодуля CH-05  
  b = digitalRead(7);  // cчитаем значение с пина 7 от рэле автобиля которое в номральном режиме разомкнуто и пин будет потянут к +5 вольт ардуино через резистор 10кОм
  с = 0; // дверь открыта 
  if ( a > 0 &&  b > 0 && c == 0 ) {   // если сигнал от блютуса есть и реле разомкнуто и дверь закрыта
    delay(10);  
 digitalWrite(13, HIGH); // зажечь сигнальный диод 
 pinMode(PIN_UNLOCK, OUTPUT); // назначит пин на выход 
 digitalWrite(5, LOW); // пин 5 притянуть к земле 
 delay (700);  // задержка для срабатывания брелка
pinMode(PIN_UNLOCK, INPUT);  // пин 5 назначит входом для рассоединения с землей 
digitalWrite(13, LOW);   // зажечь сигнальный диод 
с = 1; // дверь открыта 
    delay (15000); }  // задержка в 15с для включения зажигания в машине 
    
    else if (a < 1 &&  b > 0 && c == 1) // если сигнала от блютуса нет  и рэле разомкуто и дверь открыта
{
digitalWrite(13, LOW);  // зажечь сигнальный диод 
pinMode(PIN_LOCK, OUTPUT); // назначит пин на выход 
digitalWrite(6, LOW); // пин 6 притянуть к земле 
 delay (700);  // задержка для срабатывания брелка
pinMode(PIN_LOCK, INPUT);  // пин 6 назначит входом для рассоединения с землей   
с = 0; // дверь закрыта   
    delay (15000);  // как реализовать чтобы эта часть кода после else if выполнилась только один раз и ждать пока выполнения первой части условия??? 
}

     
   
}

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

А представь, что ты уже едешь, а брелок связь потерял с телефоном, что будет?

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

Это говнокод, нельзя так делать. Тем более использовать делеи по 15 секунд !!!

Причесанный говнокод с твоей хотелкой
/* НАФИГА ВСЕ ЭТИ ДЕФАЙНЫ, ЕСЛИ ТЫ ИМИ НЕ ПОЛЬЗУЕШЬСЯ ??? */
#define PIN_STATE     4
#define PIN_LOCK      6
#define PIN_UNLOCK    5                           // ЭТОТ ВООБЩЕ Я ДОБАВИЛ !!!
#define PIN_AUTOSTATE 7
#define PIN_TEST      13

uint8_t state;                                    // переменная для хранения значения STATE
uint8_t auto_state;                               // переменная для хранения значения AUTOSTATE
uint8_t ifelse = 0;                               // новая переменная для того "чудо-условия"
                                                  // я не очень понял что значит "чтобы эта часть кода после else if выполнилась только один раз и ждать пока выполнения первой части условия???"
                                                  // можно и наоборот )))
void setup() {
  pinMode(PIN_UNLOCK, INPUT);                     // Объявляем пин включения кнопки открытия машины как вход, чтобы не было напряжения на пине.
  pinMode(PIN_LOCK, INPUT);                       // Объявляем пин включения кнопки закрытия машины как вход, чтобы не было напряжения на пине.
  pinMode(PIN_STATE, INPUT);                      // Объявляем пин для считывания сигнала с CH-05 как вход
  pinMode(PIN_AUTOSTATE, INPUT);                  // Объявляем для считывания c рэле автомомбиля при включенном зажигании как вход
  pinMode(PIN_TEST, OUTPUT);                      // Объявляем пин PIN_TEST светодиода на плате для индикации работы.
}

void loop() {
  state = digitalRead(PIN_STATE);                 // считаем значение с пина PIN_STATE от блютусмодуля CH-05
  auto_state = digitalRead(PIN_AUTOSTATE);        // cчитаем значение с пина PIN_AUTOSTATE от рэле автобиля которое в номральном режиме разомкнуто и пин будет потянут к +5 вольт ардуино через резистор 10кОм
  if ( state > 0 &&  auto_state > 0  ) {          // если есть сигнал от блютуса и реле разомкнуто
    delay(10);
    digitalWrite(PIN_TEST, HIGH);                 // зажечь сигнальный диод
    pinMode(PIN_UNLOCK, OUTPUT);                  // назначит пин на выход
    digitalWrite(PIN_UNLOCK, LOW);                // пин PIN_UNLOCK притянуть к земле
    delay (700);                                  // задержка для срабатывания брелка
    pinMode(PIN_UNLOCK, INPUT);                   // пин PIN_UNLOCK назначит входом для рассоединения с землей
    digitalWrite(PIN_TEST, LOW);                  // зажечь сигнальный диод
    delay (15000);
    ifelse = 0;
  }                                               // задержка в 15с для включения зажигания в машине
  else 
  if (state < 1 &&  auto_state > 0 && !ifelse ) { // если нет сигнала от блютуса и реле разомкнуто
    digitalWrite(PIN_TEST, LOW);                  // зажечь сигнальный диод
    pinMode(PIN_LOCK, OUTPUT);                    // назначит пин на выход
    digitalWrite(PIN_LOCK, LOW);                  // пин PIN_LOCK притянуть к земле
    delay (700);                                  // задержка для срабатывания брелка
    pinMode(PIN_LOCK, INPUT);                     // пин PIN_LOCK назначит входом для рассоединения с землей
    delay (15000);                                // как реализовать чтобы эта часть кода после else if выполнилась только один раз и ждать пока выполнения первой части условия???
    ifelse = 1;
  }
}

Но лично я считаю - что это просто п#здец какой-то…
Рано тебе на сигнализации заглядываться, сначала научись мигать диодиком без использования delay().

ЗЫ: “Бесключевой доступ” пишется через СЫ, грамотей )))

1 лайк