Применение millis для нескольких процессов

Posol88
Offline
Зарегистрирован: 14.11.2019

а, он нарочно кривой что бы я подумал и исправил?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Posol88 пишет:

а, он нарочно кривой что бы я подумал и исправил?

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

Pyotr
Offline
Зарегистрирован: 12.03.2014

Posol88 пишет:

а, он нарочно кривой что бы я подумал и исправил?

Мой совет: распишите на листке каждую строку из луп() что делает. Тогда поймете.

У Вас два действия.
1. ВКЛ-ть. нагрев. Какие события должны произойти для этого? Сначало словами, а потом пихаем в один if(событ_1 и событ_2 или событ_3).
2. ОТК-ть нагрев. Какие события должны произойти для этого? Сначало словами, а потом пихаем в один if(событ_1 и событ_2 или событ_3).

Posol88
Offline
Зарегистрирован: 14.11.2019

единственное что нашел это в 20й строчке 

if(digitalRead(OF)==LOW){digitalWrite(HOT, LOW); }

заменить LOW на HIGH нужно

if(digitalRead(OF)==HIGH ) {digitalWrite(HOT, LOW); }

 

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

проверил, всё там работает, видимо неправильно что-то делаете, не к тем пинам кнопки подключаете к примеру

Posol88
Offline
Зарегистрирован: 14.11.2019

не знаю.... несколько раз пересобирал и перепрошивал... 25го еще попробую...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Posol88 пишет:

странно, по тому, что когда я снизу беру GND (а все кнопки и выводы сверху) программа не работает, в плоть до того, что сама включает и выключает сигнал на выходе... а когда сверху подключил все заработало как надо.

Притяните кнопку к земле (кажется так у Вас в скетче), эта проблема решится 

astwo
Offline
Зарегистрирован: 10.07.2019

Как бы не оказалось, что клей просрочен, или нитки старые.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это ладно. Хуже всего, когда время палёное подсунут :(

Posol88
Offline
Зарегистрирован: 14.11.2019

Ну и шуточки у Вас))) XD

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Это ладно. Хуже всего, когда время палёное подсунут :(

так я ему подсказал про время, одноразовость выполнения процедуры включения логикой обеспечивается!!! )))
Но про логические операторы ТС читать не стал

astwo
Offline
Зарегистрирован: 10.07.2019

Вы бы ещё про электротехнику ТС начали читать. Науку где если нужен контакт, то железный. А где контакт должен отсутсвавать, то он обязательно должен отсутствовать, без всяких соплей. Но похоже там из соплей вся схема собрана.

Posol88
Offline
Зарегистрирован: 14.11.2019

Стал. Я за эти 2 дня уже прочитал больше чем за все время изучения программирования. Может просто упустил что то... Или не понял сразу...

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Posol88 пишет:
Стал. Я за эти 2 дня уже прочитал больше чем за все время изучения программирования. Может просто упустил что то... Или не понял сразу...

прочитать мало,а понять, зачем  буквально в первом ифе использовано понял?

if (digitalRead(ON)==LOW && digitalRead(HOT)==LOW) 

Да, я как бы автомобилист, а в нём кнопки замыкают на землю )))

Posol88
Offline
Зарегистрирован: 14.11.2019

Енто "вроде понятно" . Но опять же у меня не кнопки будут, у меня будит приходить сигнал с другой платы, которая будет его подавать по команде с ПДУ. А там как ни крути логическая единица...

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Posol88 пишет:
Енто "вроде понятно" . Но опять же у меня не кнопки будут, у меня будит приходить сигнал с другой платы, которая будет его подавать по команде с ПДУ. А там как ни крути логическая единица...

это всё детали, расскажи ка, что понял

Posol88
Offline
Зарегистрирован: 14.11.2019

Ну что нужно сигнал через кнопку не +5 подавать, а GND. а в коде его "! "

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

я спрашиваю, зачем применено - && digitalRead(HOT)==LOW

Posol88
Offline
Зарегистрирован: 14.11.2019

Чтобы считать не только положение кнопки но и статус выхода HOT

b707
Offline
Зарегистрирован: 26.05.2017

Мож пора уже прикрыть эту тему. Право, все уже сказано...если это троллинг, то несмешной, а если нет -то вообще жесть

Posol88
Offline
Зарегистрирован: 14.11.2019

Не пойму что не так? && это логический элемент "и" . == применяется для сравнения. В функции if проверяется утверждение в скобках( ) если верно то выполняется команда в фигурным скобках{ }.
То есть тут он смотрит состояние выхода HOT равно == LOW ?
Что не так то?

sadman41
Offline
Зарегистрирован: 19.10.2016

ua6em пишет:

я спрашиваю, зачем применено - && digitalRead(HOT)==LOW

Я вот тоже не понимаю - зачем лишний раз читать.

Не знаю, зачем это сделал, но... 

#define PIN_BUTTON_ON 10
#define PIN_BUTTON_OFF 3
#define PIN_RELAY_HOT 13 //9  светодиод на 13 пине для проверки

#define RELAY_SIGNAL_ON   HIGH
#define RELAY_SIGNAL_OFF  !RELAY_SIGNAL_ON

#define BUTTON_STATE_ON   LOW
#define BUTTON_MODE       INPUT_PULLUP

#define WARMING_DURATION  3000UL

uint32_t warmingStartTime;
uint8_t hotState = RELAY_SIGNAL_OFF;
 
 void setup() {
  pinMode (PIN_RELAY_HOT, OUTPUT);
  //digitalWrite(HOT,LOW);    // Выключить обогрев при старте контроллера
  pinMode(PIN_BUTTON_ON,  BUTTON_MODE); // кнопка включения
  pinMode(PIN_BUTTON_OFF, BUTTON_MODE); // кнопка выключения
 }
 
 void loop(){

  digitalWrite(PIN_RELAY_HOT, hotState);

  if (hotState && BUTTON_STATE_ON == digitalRead(PIN_BUTTON_ON)) { hotState = RELAY_SIGNAL_ON; warmingStartTime = millis(); }

  if (WARMING_DURATION <= millis() - warmingStartTime) { hotState = RELAY_SIGNAL_OFF; }

  if (BUTTON_STATE_ON == digitalRead(PIN_BUTTON_OFF)) { hotState = RELAY_SIGNAL_OFF; }         
 
 // delay(20);
  }



 

Posol88
Offline
Зарегистрирован: 14.11.2019

прошу прощения. я не нашел нигде что означает команды: INPUT_PULLUP ; uint32_t ; uint8_t

Pyotr
Offline
Зарегистрирован: 12.03.2014

Posol88 пишет:

прошу прощения. я не нашел нигде что означает команды: INPUT_PULLUP ; uint32_t ; uint8_t

копируем непонятное слово и вставляем в строку поиска браузера

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

[quote=sadman41]

Я вот тоже не понимаю - зачем лишний раз читать.

Не знаю, зачем это сделал, но... 

/quote]

Как зачем, книгу пишешь - "Программирование шаг за шагом"...
Раз написал попробую ТС пояснить...Построчно...

#define PIN_BUTTON_ON 10
#define PIN_BUTTON_OFF 3
#define PIN_RELAY_HOT 13 //9  светодиод на 13 пине для проверки

#define RELAY_SIGNAL_ON   HIGH   // Определяем для компилятора значение сигнала на включение

#define RELAY_SIGNAL_OFF  !RELAY_SIGNAL_ON // Сигнал для выключения принимается инверсным сигналу
включения, то-есть если нам потребуюся инверсные сигналы для включения реле, для
изменения программы только в одном месте  (строчкой выше)заменим HIGH на LOW

#define BUTTON_STATE_ON   LOW  // Определяемся с состоянием пина на включение,
теперь если нам потребуется инвертировать входной сигнал с низкого уровня на высоки
достаточно сменить LOW на HIGH, переписывать тело программы, а она может иметь тысячи строк
не потребуется

#define BUTTON_MODE       INPUT_PULLUP // входные пины конфигурируются на ввод и к ним 
подключаются внутренние подтягивающие резисторы. То-есть на этих пинах присутствует HIGH сигнал.
Если нам потребуется сменить разрешающий сигнал с низкого на высокий, то в этом месте
определение примет вид просто INPUT и нам необходимо пины подтянуть к шине GND hрезистором
10 килоом


#define WARMING_DURATION  3000UL // Здесь компилятору сообщается необходимое время таймера на прогрев двигателя

uint32_t warmingStartTime;   // Это описание типа переменной которое мы выделяем для хранения
значения счетчика millis в момент прихода сигнала на включение обогрева, это значение
счетчика будет использовано в вычислениях времени окончания обогрева

uint8_t hotState = RELAY_SIGNAL_OFF; 
 
 void setup() {
  pinMode (PIN_RELAY_HOT, OUTPUT);  //Настраиваем пин на выход
  pinMode(PIN_BUTTON_ON,  BUTTON_MODE); // кнопка включения
  pinMode(PIN_BUTTON_OFF, BUTTON_MODE); // кнопка выключения
 }
 
 void loop(){

  digitalWrite(PIN_RELAY_HOT, hotState);  // Пин реле в цикле поддерживает текущее состояние переменной режима,
процедура перенесена профессиональным программистом из блока SETUP в основное тело программы.
Решение спорное, так как теоретически в выходном сигнале могут присутствовать "иголки" - короткие
всплески напряжения от постоянного по времени прохождения цикла долбления в порт.
Как по мне менять состояние порта надо тогда и только тогда когда пришла команда смены режима.

  if (hotState && BUTTON_STATE_ON == digitalRead(PIN_BUTTON_ON)) { hotState = RELAY_SIGNAL_ON; warmingStartTime = millis(); }
// А здесь начинается самая магия - пишем простым русским языком: если пришел сигнал на включение и пин реле в исходном (отключенном )
состоянии изменить переменную состояния пина и запомнить состояние счетчика миллисекунд.
То-есть эта процедура выполнится один раз. Если этого не далать, то любое последующе нажатие кнопки включения
заставит выполнить процедуру изменив счетчик миллисекунд...
Полной однократности выполнения процедуры включения обогрева стеклоочистителей можно добиться если
ввести еще одну переменную - счетчик числа циклов нагрева )))

Как-то так (как мне видится), Садман поправит, если я в чём-то накосячил с пояснениями

  if (WARMING_DURATION <= millis() - warmingStartTime) { hotState = RELAY_SIGNAL_OFF; }

  if (BUTTON_STATE_ON == digitalRead(PIN_BUTTON_OFF)) { hotState = RELAY_SIGNAL_OFF; }         
 
 // delay(20);
  }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

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

В 45-й же строке я, конечно, напарил - там включать нужно только если hotState = off. Я сначала вообще по другому писал, это артефакт остался ))
55 и 57 объединить можно вовсе, если стремиться к минимизации писанины.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

sadman41 пишет:
Насколько я помню топик с обсуждением этих самых постоянных писаний в порт - итогом был вывод, что никаких "автовыключений" перед включением "ноги" не происходит.

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

Logik
Offline
Зарегистрирован: 05.08.2014

ua6em пишет:

sadman41 пишет:
Насколько я помню топик с обсуждением этих самых постоянных писаний в порт - итогом был вывод, что никаких "автовыключений" перед включением "ноги" не происходит.

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

поддерживаю. Лишняя команда остается лишней даже если не вредит.

astwo
Offline
Зарегистрирован: 10.07.2019

Лишние бывают разные. Вот вроде появились лишние деньги. А потом глядишь пригодились, и ни в чем не повредили. Так что устранять лишки и излишки надо с оглядкой.

Logik
Offline
Зарегистрирован: 05.08.2014

Пример не корректный, "лишние деньги" - это дополнительный ресурс, "Лишняя команда" - дополнительный расход. 

ПС. Просьба не нагружать в дальнейшем тупизной. ОК?

baby_in_Arduino
Offline
Зарегистрирован: 21.07.2019

как весело тут у вас привет привет

ТС так вы написали программу?

astwo
Offline
Зарегистрирован: 10.07.2019

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

Posol88
Offline
Зарегистрирован: 14.11.2019

Ага)) добрый вечер)

Posol88
Offline
Зарегистрирован: 14.11.2019

Уважаемые знатоки! Внимание вопрос - ТС спрашивает - что такое ТС?

Logik
Offline
Зарегистрирован: 05.08.2014

astwo пишет:
Это зависит от способа оплаты. Если программы продаются на вес, то лишний расход на команды приводит к дополнительном доход в деньгах. Если вас коробит словосочетание лишняя команда, то замените на бонусную команду.

Меня коробит тока твоя тупость, на вес )))) 

Logik
Offline
Зарегистрирован: 05.08.2014

Posol88 пишет:
Уважаемые знатоки! Внимание вопрос - ТС спрашивает - что такое ТС?

8|

 

Posol88
Offline
Зарегистрирован: 14.11.2019

Я предполагал, что у вас может идти подсчет этих вопросов, но - во первых я держался довольно долго. А во вторых - не ну интересно же))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Posol88 пишет:
Уважаемые знатоки! Внимание вопрос - ТС спрашивает - что такое ТС?
Уважаемый ТС, в связи с Вашим категорическим неприятием гугла, обусловленном, очевидно, Вашими религиозными убеждениями, я набрал Ваш вопрос там за Вас. Третий ответ - https://otvet.mail.ru/question/54446037

Posol88
Offline
Зарегистрирован: 14.11.2019

Таёжный суслик XD

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Posol88 пишет:
Таёжный суслик XD

Заработал код?

Logik
Offline
Зарегистрирован: 05.08.2014

Заработал на код?

Posol88
Offline
Зарегистрирован: 14.11.2019

Ага но это мелочи... Вот я тут собрался кормушку для кур сделать на сервоприводе и с дисплеем... Повеселимся... Если меня тут не забанят))

Logik
Offline
Зарегистрирован: 05.08.2014

Курицу зарегиш, дело может быстрей пойдет.

Green
Offline
Зарегистрирован: 01.10.2015

И что бы курица такая же разговорчивая была.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

ТС не безнадёжен, увлёкся (северным сиянием) )))

SLKH
Offline
Зарегистрирован: 17.08.2015

ua6em пишет:

sadman41 пишет:
Насколько я помню топик с обсуждением этих самых постоянных писаний в порт - итогом был вывод, что никаких "автовыключений" перед включением "ноги" не происходит.

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

А что с дверью сделается? Ускорится износ микроконтроллера?

bwn
Offline
Зарегистрирован: 25.08.2014

SLKH пишет:

А что с дверью сделается? Ускорится износ микроконтроллера?

Дырки электронами забьются.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

bwn пишет:

SLKH пишет:

А что с дверью сделается? Ускорится износ микроконтроллера?

Дырки электронами забьются.

у вас и в ветренную погоду окна на проветривании???

Logik
Offline
Зарегистрирован: 05.08.2014

SLKH пишет:

ua6em пишет:

sadman41 пишет:
Насколько я помню топик с обсуждением этих самых постоянных писаний в порт - итогом был вывод, что никаких "автовыключений" перед включением "ноги" не происходит.

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

А что с дверью сделается? Ускорится износ микроконтроллера?

Дверь то переживет до поры, а у долбящего привычка останется. И дальше будет долбить все не думая: удаленную БД или темы на форуме. Долбить не надо чтоб дятлом не стать.

sadman41
Offline
Зарегистрирован: 19.10.2016

Опять тупоконечники напали на остроконечников.