Доброго времени суток!
Прошу помощи с кодом для самоделки.
Хочу реализовать простой безключевой доступ в авто по принципу когда подходишь к машине телефон по блютусу подключается к блютус адапетру 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 выполнилась только один раз и ждать пока выполнения первой части условия???
}
}
Добавьте переменную “дверь_уже_открыта” и выставляйте ее в единицу, когда срабатывает условие в строке 22. И пока эта переменная не станет нулем - больше не проверяйте это условие.
Переменную сбрасывайте на ноль при срабатывании условия в строке 32
Одно замечание не по делу - а по оформлению. Не надо называть переменные одной буквой, давайте им более осмысленные имена. И не пишите глупые комментарии, типа
для кого это? - для тетушки из Минусинска, которая не умеет читать код? - так она и в скетч ваш никогда не полезет
Вместо этого надо было написать что-то типа “Если на БТ-модуле сигнал и реле 3 включено - открываем дверь”
Комментарии должны не обьяснять, что операторы делают - а зачем эти действия нужны.
#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().
ЗЫ: “Бесключевой доступ” пишется через СЫ, грамотей )))