Поменять положение реле после поступления команды на 5 секунд и выключить
- Войдите на сайт для отправки комментариев
Пнд, 14/03/2022 - 13:40
Всем привет!
Кто поможет разобраться, как сделать так, чтобы при получении команды "м" реле "включалось" на 5 секунд, потом само выключалось до следующего поступления команды "м"? После нескольких попыток, получил данный код, но он постоянно включает и выключает реле после поступления команды "м". В чем проблема и как исправить? Спасибо!
SoftwareSerial BTserial(12,13); char choice; const int loopDelay = 50; int IgnitionPin = 10; const long ignitionInterval = 5000; int ignitionState = HIGH; unsigned long previousMillis = 0; void setup() { BTserial.begin(115200); digitalWrite(IgnitionPin, HIGH); pinMode(IgnitionPin, OUTPUT); } void loop() { if (BTserial.available()) { choice = BTserial.read(); } if( choice == 'm' ) { ignitionState = HIGH; digitalWrite(IgnitionPin, ignitionState); ignitionCountTime = millis(); } if (ignitionCountTime - previousMillis >= ignitionInterval) { previousMillis = ignitionCountTime; if (ignitionState == HIGH) { ignitionState = LOW; } digitalWrite(IgnitionPin, ignitionState); } delay(loopDelay); }
Что должно происходить, если новая команда m поступит во время этих 5 секунд?
Ничего, игнорировать эту команду. Я пытаюсь имитировать зажигание, крутить стартер 5 секунд при поступлении команды "м".
Читайте внимательно.
После того, как команда m пришла в первый раз, и всё отработало, что будет происходить при следующем проходе loop?
Поскольку нового ничего не пришло, условие в строке №22 будет ложным и строка №24 не отработает.
А что будет с условием в строке №27? Чему сейчас равна choice? Оппа ... условие-то будет истинным и строки №№29-31 сработают! И будут срабатывать ВСЕГДА.
Вот оно у Вас и срабатывает.
Переделал код, но теперь код работает только один раз. При поступлении новой команды "м" второй раз реле молчит.
33 строка - трэшь какой-то
Переделал код, но теперь код работает только один раз. При поступлении новой команды "м" второй раз реле молчит.
Мля, давайте с начала. Уже по новому коду
После того, как команда m пришла в первый раз, и всё отработало, что будет происходить при следующем проходе loop?
Поскольку нового ничего не пришло, условие в строке №22 будет ложным и строка №24 не отработает.
А что будет с условием в строке №27? Чему сейчас равна choice? Оппа ... условие-то будет истинным и строки №№29-31 сработают! И будут срабатывать ВСЕГДА.
Т.е. ignitionCountTime всегда будет обновляться свежим millis
Вы не с того конца взялись. Вы пытаетесь выразить мысль, которую Вы не до конца сформулировали на языке, который Вы не до конца понимаете.
Начните с того, что сядьте и по-русски напишите, что должно происходить в loop. детально, "если ... иначе .. то" но по-русски, внятно. Убедитесь, что это правильно, и только потом пытайтесь писать код.
33 строка - трэшь какой-то
До 33 мы с ним ещё не добрались :-)
Правильно ли я понимаю, что в конце цикла мне нужно "обнулить" choice? В моем цикле после поступления команды "м" он постоянно "м", пока не прийдет новое значение?
Тогда вопрос, как обнулить?
У меня только один вопрос: А почему эта тема не в песочнице? ))
Правильно ли я понимаю, что в конце цикла мне нужно "обнулить" choice? В моем цикле после поступления команды "м" он постоянно "м", пока не прийдет новое значение?
Тогда вопрос, как обнулить?
Бинго. Так и есть. Обнулить - значит присвоить значение '\0'. Или вообще любое значение, кроме 'm'.
Тогда вопрос, как обнулить?
Например, присвоить 'Y' ))
Не знаю насколько это правильно, но получилось как-то так.
Правильно ли я понимаю, что в конце цикла мне нужно ...
Нет, Вы неправильно понимаете.
Что нужно делать правильно, я Вам написал
Начните с того, что сядьте и по-русски напишите, что должно происходить в loop. детально, "если ... иначе .. то" но по-русски, внятно. Убедитесь, что это правильно, и только потом пытайтесь писать код.
Вы решили проигнорировать? Ваше право, пожалуйста. Только по-другому это не работает. Либо кто-то просто напишет код за Вас из жалости, либо Вы начнёте делать это правильно, а именно - сначала добьётесь (от себя) внятной и строгой формулировки алгоритма.
В #12 ты такты считаешь, а не время. Воспользуйся подсказкой Евгения Петровича, иначе тут без вариантов.
Логическая цепочка такова:
В чем проблема Вашей логики - Евгений Петрович пояснит.
По поводу миллис - да, начинается отсчёт от включения, но не прекращается и даже переполняется (можно грубо сказать обнуляется) и все это пока мк работает. Но эти значения можно получить, можно, присвоить и даже сверить.) И не нужно писать новый код пока Евгений Петрович не скажет что делать дальше.
С millis() время не нужно обнулять, нужно запоминать текущее значение в момент включения реле, и от этого момента отсчитывать нужные вам 5 секунд
ТС ваши скетчи не компилируются, вот вам с делеем, без миллис и не мучайтесь логикой - она проста "если пришёл символ и этот символ м, то включаем реле, ждём 5 секунд, выключаем реле" :-)
lilik, ничего личного - но "прерывать обучение" как минимум не этично. Пусть учится, если хочет. Вроде желание есть.
Дилей будет весь процесс задерживать, мне надо чтобы не влияло на исполнение кода, т.к. это только маленькая его часть.
lilik, ничего личного - но "прерывать обучение" как минимум не этично. Пусть учится, если хочет. Вроде желание есть.
Это не обучение, а бесцельное времяпрепровождение :-)
Впрочем, раз это тренировочные куски кода, я не смею больше влезать, миллис вам в помощь.
Это не обучение, а бесцельное времяпрепровождение :-)
Это суждение преподавателя (в Вашем лице)?
Уважаемый, я Вам уже ДВАЖДЫ говорил
Говорю это в третий и в последний раз. Если Вы твёрдо решили игнорировать то, что я говорю, не вижу смысла бить пальцы об клавиши - они (пальцы) у меня не сменные.
В том, что Вы пытаетесь его писать не имея алгоритма, т.е. не понимая что именно Вы пишете.
Давайте посмотрим, что Вы называете "логикой"
Это не алгоритм, это хотелки или, если хотите, "чувственные идеи". Чтобы написать какой-то код по таким хотелкам, нужна очень высокая квалификация программиста. Как говорил граф Калиостро: «Материализация чувственных идей - есть труднейшая задача научной магии»
Попробуйте таки написать так, как я Вам говорил
Если не получится, я помогу поправить, но если увижу от Вас хоть строчку кода до того, как алгоритм будет готов, просто слиняю с темы - отвечать ничего не буду.
Как говорил граф Калиостро: «Материализация чувственных идей - есть труднейшая задача научной магии»
интересно, кто кроме меня из присутствующих понимает, что именно имел ввиду Калиостро )))
интересно, кто кроме меня из присутствующих понимает, что именно имел ввиду Калиостро )))
Боюсь, что никто. Тут один специалист по научной магии :-)
интересно, кто кроме меня из присутствующих понимает, что именно имел ввиду Калиостро )))
Боюсь, что никто. Тут один специалист по научной магии :-)
а если попытать с пристрастием, может есть скрытые? )))
Вот и не сомневайтесь. Он как никак преподаватель. И далеко не каждого он берется учить, как вас ;)