Помогите с написанием скетча

Leo_Galitsin
Offline
Зарегистрирован: 24.10.2018

Подскажите, пожалуйста, как написать код, чтоб светодиод загорался при нажатии кнопки и через 1 секунду гас и больше не загорался, пока опять не будет нажата кнопка?

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

А смысл?

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

Надо специальным образом подбирать слова на С и компоновать их в правильном порядке.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Так вот так прям и пишешь:

1. Если признак "светодиод сработал" не верен то делаем это:

1.1. Если некий признак "кнопка нажата" не верен, то проверяем нажати ли кнопка? Если кнопка нажата, ждем небольшую паузу и проверяем снова - нажати ли "все ещё" (человек не способен мгновенно отпустить кнопку). Если кнопка все ещё нажата, то ставим признак "кнопка нажата". Это не позволит срабатывать первой проверке повторно в этом пункте дальше.

1.2. Проверяем признак "кнопка нажата" и, если он верен, то включаем светодиод и запоминаем время включения. Ставим признак "светодиод включен".

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

Собственно всё.

Перевести на С/С++ самостоятельно можешь? Если нет, то прямиком в раздел "ищу исполнителя", там помогут за небольшую мзду (возможно теже самые люди, что выдали это задание .. тоже способ подработки)

Успехов.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Имя, которое может быть названо, не есть истинное имя. Безымянное есть начало неба и земли, обладающее именем мать всех вещей.

(c) Лао Цзы.

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

wdrakula пишет:

Имя, которое может быть названо, не есть истинное имя. Безымянное есть начало неба и земли, обладающее именем мать всех вещей.

Нет повода не выпить! Пойду, накачу!

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

Arhat109-2 пишет:

Так вот так прям и пишешь:


void setup() {

  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
}

void loop() {}

 

Arhat109-2 пишет:

Собственно всё.

"Не преумножайте сущностей, да воздастся Вам аз есмь. И извольте бриться" - Уильям Оккам.

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Leo_Galitsin пишет:

 как написать код, чтоб светодиод загорался при нажатии кнопки и через 1 секунду гас и больше не загорался, пока опять не будет нажата кнопка?

Поручик, ну это же элементарно!

1. Сесть за стол
2. Почесать репу
3. Написать

Какие проблемы-то? Стола нет? Или чесать нечего?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Чёт Вас на философию потянуло в мою днюху .. до кучи:

"Да не унизит Человек себя сам.
Да не возвысит он сам себя.
Ибо он сам себе друг
и нет ему большего врага, чем он сам себе."
   (с) Махабхарата.

P.S. sadman, а как ты узнал что я сегодня не побрился? :)

Leo_Galitsin
Offline
Зарегистрирован: 24.10.2018
int led_pin=3;          // пин подключения
int button_pin = 4;     // пин кнопки
void setup() { 
    pinMode(led_pin, OUTPUT); // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(button_pin, INPUT); // Инициализируем цифровой вход/выход в режиме входа.
}
void loop() {
   if (digitalRead(button_pin) == HIGH) { // Если кнопка нажата 
      digitalWrite(led_pin, HIGH);// зажигаем светодиод
     delay(1000);// горит 1 секунду
     digitalWrite(led_pin, LOW);// выключаем светодиод
     delay(1000);// негорит 1 секунду
 }
  else { //Иначе
      digitalWrite(led_pin, LOW);// выключаем светодиод
  }
}

Подскажите что нужно исправить чтобы светодиод загорался при нажатии кнопки и через 1 секунду гас и больше не загорался, пока опять не будет нажата кнопка.

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

самое простое - перенесите всё из loop() в setup() оставив loop() пустым. - так НЕВЕРНО (поторопился).

создайте признак (переменную) "светодиод сработал", присвойте ей начальное false и после отработки времени присваивайте ей true, как написал выше. И весь этот код из loop() заверните в проверку - сработал ли светодиод? Исполнять если ещё не срабатывал (п.1 выше).

2. Вместо второго delay(1000) поставьте такое: while(1);

 

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

Leo_Galitsin пишет:


Подскажите что нужно исправить чтобы светодиод загорался при нажатии кнопки и через 1 секунду гас и больше не загорался, пока опять не будет нажата кнопка.

Ну для начала почитайте тему про кнопки. Там уже давно есть то,что вам нужно.

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

Arhat109-2 пишет:

создайте признак (переменную) "светодиод сработал", присвойте ей начальное false и после отработки времени присваивайте ей true, как написал выше. И весь этот код из loop() заверните в проверку - сработал ли светодиод? Исполнять если ещё не срабатывал (п.1 выше).

2. Вместо второго delay(1000) поставьте такое: while(1);

 

Arhat109-2, так тоже неверно. Не читаете условие задачи.

В вашем варианте при повторном нажатии кнопки светодиод не включится - а ТС хочет, чтоб включался.

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

Вечер философского скетча позвольте считать открытым.

void setup() {
...
}

void loop() {
  digitalWrite(13, LOW);
  while (LOW == digitalRead(button_pin));
  digitalWrite(13, HIGH);
  delay(1000);
}

UPD: Кстати, Архат, может изобразите нам па-де-де на ISR-ках ?

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

Убрать строки №№ 12, 14, 15 и 16

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Leo_Galitsin пишет:

Подскажите, пожалуйста, как написать код, чтоб светодиод загорался при нажатии кнопки и через 1 секунду гас и больше не загорался, пока опять не будет нажата кнопка?

Что есть "нажатие кнопки" - вот в чём вопрос. Обычно под нажатием понимают именно нажатие, а не клик - т.е. когда кнопка нажата и отпущена. Если нужно именно нажатие, то простейший код тот, который привёл sadman41 в посте №13.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

Убрать строки №№ 12, 14, 15 и 16


Вот чем отличается настоящий профессионал от дилетанта, я остановился на 10, когда условие задания было выполнено )))
 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DIYMan пишет:

Leo_Galitsin пишет:

Подскажите, пожалуйста, как написать код, чтоб светодиод загорался при нажатии кнопки и через 1 секунду гас и больше не загорался, пока опять не будет нажата кнопка?

Что есть "нажатие кнопки" - вот в чём вопрос. Обычно под нажатием понимают именно нажатие, а не клик - т.е. когда кнопка нажата и отпущена. Если нужно именно нажатие, то простейший код тот, который привёл sadman41 в посте №13.


Тока что в кораблике такое решал, ввел флаг

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

Leo_Galitsin пишет:

int led_pin=3;          // пин подключения
int button_pin = 4;     // пин кнопки
void setup() { 
    pinMode(led_pin, OUTPUT); // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(button_pin, INPUT); // Инициализируем цифровой вход/выход в режиме входа.
}
void loop() {
   if (digitalRead(button_pin) == HIGH) { // Если кнопка нажата 
      digitalWrite(led_pin, HIGH);// зажигаем светодиод
     delay(1000);// горит 1 секунду
     digitalWrite(led_pin, LOW);// выключаем светодиод
     delay(1000);// негорит 1 секунду
 }
  else { //Иначе
      digitalWrite(led_pin, LOW);// выключаем светодиод
  }
}

Подскажите что нужно исправить чтобы светодиод загорался при нажатии кнопки и через 1 секунду гас и больше не загорался, пока опять не будет нажата кнопка.

 

А мне не понятно почему этот код не работает, быстренько нажал и отпустил - должен же работать...Или имеется ввиду - нажал и держу, светодиод погас и всё?, до следующего отпускания-нажатия?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Вечер философского скетча позвольте считать открытым.

void setup() {
...
}

void loop() {
  digitalWrite(13, LOW);
  while (LOW == digitalRead(button_pin));
  digitalWrite(13, HIGH);
  delay(1000);
}

UPD: Кстати, Архат, может изобразите нам па-де-де на ISR-ках ?

Товарищ хочет так

int led_pin=3;          // пин подключения
int button_pin = 4;     // пин кнопки
int flag = 0;
void setup() { 
    pinMode(led_pin, OUTPUT); // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(button_pin, INPUT); // Инициализируем цифровой вход/выход в режиме входа.
}
void loop() {
if (flag == 1 && digitalRead(button_pin) == LOW) flag = 0; // Если уже было и кнопку отпустили )))
                                                           // сообщить, что боец готов
   if (digitalRead(button_pin) == HIGH && flag ==0) {      // Если кнопка нажата 
      digitalWrite(led_pin, HIGH);                         // зажигаем светодиод
     delay(1000);// горит 1 секунду
     digitalWrite(led_pin, LOW);                           // выключаем светодиод
  }
  }

 

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

ua6em пишет:

sadman41 пишет:

Вечер философского скетча позвольте считать открытым.

void setup() {
...
}

void loop() {
  digitalWrite(13, LOW);
  while (LOW == digitalRead(button_pin));
  digitalWrite(13, HIGH);
  delay(1000);
}

UPD: Кстати, Архат, может изобразите нам па-де-де на ISR-ках ?

Товарищ хочет так

int led_pin=3;          // пин подключения
int button_pin = 4;     // пин кнопки
int flag = 0;
void setup() { 
    pinMode(led_pin, OUTPUT); // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(button_pin, INPUT); // Инициализируем цифровой вход/выход в режиме входа.
}
void loop() {
if (flag == 1 && digitalRead(button_pin) == LOW) flag = 0; // Если уже было и кнопку отпустили )))
                                                           // сообщить, что боец готов
   if (digitalRead(button_pin) == HIGH && flag ==0) {      // Если кнопка нажата 
      digitalWrite(led_pin, HIGH);                         // зажигаем светодиод
     delay(1000);// горит 1 секунду
     digitalWrite(led_pin, LOW);                           // выключаем светодиод
  }
  }

 

Опять не ясно, а со значением флага из 0 ничего делать не надо?

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

Или я чего не понимаю?

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

ua6em пишет:

Товарищ хочет так

В ТЗ (#1) не было такого. Нужно было там что-то жать и чем-то гореть секунду. Жмем - горит.

Ну, если надо чтобы прямо вот по вашему - еще один while (HIGH == digitalRead(button_pin)); в конец пихнуть.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

leks пишет:

Или я чего не понимаю?


Это я просто поторопился )))
 

int led_pin=3;          // пин подключения
int button_pin = 4;     // пин кнопки
int flag = 0;
void setup() { 
    pinMode(led_pin, OUTPUT);    // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(button_pin, INPUT);  // Инициализируем цифровой вход/выход в режиме входа.
}
void loop() {
if (flag == 1 && digitalRead(button_pin) == LOW) flag = 0; // Если уже было и кнопку отпустили )))
                                                           // сообщить, что боец готов
   if (digitalRead(button_pin) == HIGH && flag ==0) {      // Если кнопка нажата 
     digitalWrite(led_pin, HIGH);                          // зажигаем светодиод
     delay(1000);                                          // горит 1 секунду
     digitalWrite(led_pin, LOW);                           // выключаем светодиод
     flag = 1;                                             // выставить флаг, что было )))   
  }
  }

Скетч использует 12516 байт (9%) памяти устройства. Всего доступно 131072 байт.
Глобальные переменные используют 2568 байт динамической памяти.
Arduino Version: 1.8.5

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

Разбавлю тему qwone-кодом #18

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

qwone пишет:

Разбавлю тему qwone-кодом #18


Давайте лучше объясните молодому поколению, почему так делать нельзя

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

ua6em пишет:
Давайте лучше объясните молодому поколению, почему так делать нельзя
Потому что программирование это Задачи по цепочке . А вот если цепочка оборвется программист вынужден начинать ком новой задачи тащить с начала.

Leo_Galitsin
Offline
Зарегистрирован: 24.10.2018

Большое спасибо. Этот код подходит.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

wdrakula пишет:

Имя, которое может быть названо, не есть истинное имя. Безымянное есть начало неба и земли, обладающее именем мать всех вещей.

Нет повода не выпить! Пойду, накачу!

Эх Евгений Петрович, Евгений Петрович, нет объяснить народным умельцам, почему:
Так писать можно,

int led_pin=3;          // пин подключения
int button_pin = 4;     // пин кнопки
int flag = 0;
void setup() { 
    pinMode(led_pin, OUTPUT);    // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(button_pin, INPUT);  // Инициализируем цифровой вход/выход в режиме входа.
}
void loop() {
if (flag == 1 && digitalRead(button_pin) == LOW) flag = 0; // Если уже было и кнопку отпустили )))
                                                           // сообщить, что боец готов
   if (digitalRead(button_pin) == HIGH && flag ==0) {      // Если кнопка нажата 
     digitalWrite(led_pin, HIGH);                          // зажигаем светодиод
     delay(1000);                                          // горит 1 секунду
     digitalWrite(led_pin, LOW);                           // выключаем светодиод
     flag = 1;                                             // выставить флаг, что было )))   
  }
  }

А так нельзя )))
 

int led_pin=3;          // пин подключения
int button_pin = 4;     // пин кнопки

void setup() {
    pinMode(led_pin, OUTPUT);    // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(button_pin, INPUT);  // Инициализируем цифровой вход/выход в режиме входа.
}
void loop() {
  digitalWrite(led_pin, LOW);
  while (LOW == digitalRead(button_pin));
  digitalWrite(led_pin, HIGH);
  delay(1000);
  while (HIGH == digitalRead(button_pin)); 
  }

 

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

Чой-то нельзя. Ну, блокирующий, да. Поставленную задачу выполняет. Других - не было.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Чой-то нельзя. Задачу код выполняет. Других - не стояло.


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

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

О, я смотрю, тут всё серьёзно было воспринято. Надеюсь, что этот фрагмент не успели включен в прошивку для... Что у нас там очередное ко взлету готовят?

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

sadman41 пишет:

не успели включен в прошивку для... Что у нас там очередное ко взлету готовят?

Дрель для МКС

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

Надеюсь, что принцип работы трехстрочника из #6 поняли... А то вдруг придется прояснять смысл на пяти страницах. Я опасаюсь уже за судьбу Родины.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

О, я смотрю, тут всё серьёзно было воспринято. Надеюсь, что этот фрагмент не успели включен в прошивку для... Что у нас там очередное ко взлету готовят?


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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Надеюсь, что принцип работы трехстрочника из #6 поняли... А то вдруг придется прояснять смысл на пяти страницах. Я опасаюсь уже за судьбу Родины.


Можно не опасаться, я пенсионер )))

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

Водой залиты... Вам же говорили, что автомат надо держать на вытянутых руках, чтобы расплавленный металл не капал на казенные сапоги!

Вот у меня был DECT телефон фирмы Siemens (!) . База и трубка беспроводная на аккамуляторах, которые нужно было вытаскивать и периодически вставлять в зарядное устройство. В руководстве немцы написали: "Вытащить через два часа". Всё. Никакой защиты от перезаряда/перегрева и пр. 2 часа и выключил. Потому что Ordnung ist ordnung и никаких там гее ди Штрассе унд вюрст эссен.

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

ua6em пишет:

Эх Евгений Петрович, Евгений Петрович, нет объяснить народным умельцам, почему:
Так писать можно,
...
А так нельзя )))

Писать по-всякому можно. Бумага и та, как известно, всё стерпит, а уж электронные носители - те и подавно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Водой залиты... Вам же говорили, что автомат надо держать на вытянутых руках, чтобы расплавленный металл не капал на казенные сапоги!

Вот у меня был DECT телефон фирмы Siemens (!) . База и трубка беспроводная на аккамуляторах, которые нужно было вытаскивать и периодически вставлять в зарядное устройство. В руководстве немцы написали: "Вытащить через два часа". Всё. Никакой защиты от перезаряда/перегрева и пр. 2 часа и выключил. Потому что Ordnung ist ordnung и никаких там гее ди Штрассе унд вюрст эссен.

)))

их вайс нихт, вас зол эс бэдоит