Нужен совет в програмировании кнопки и диода!

Witcher
Offline
Зарегистрирован: 22.10.2020

Задание
Нужно сделать так чтобы
1.Ардуино ждала на нажатие кнопки.
2.После того как кнопка нажимется диод навсегда начнет  светить с частотой 5 Hz( нужно сделать через команду "delay".
3.Нельзя использовать функцыю "if".
4. 

Начальный код у меня был вот такой

void setup()
{
 
  pinMode(4, OUTPUT);
  pinMode(10, INPUT);
  
}

void loop()
{
  while (digitalRead(10)==LOW);  {digitalWrite(4, HIGH); delay(200); digitalWrite(4, LOW); delay(200);} 

}

Буду очень признателен если поможете новичку.

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

Вам нужно три совета? Или зачем три темы?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Так а проблема то в чем? Не мигает? Кнопку не ждёт? )

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

BOOM пишет:

Так а проблема то в чем? Не мигает? Кнопку не ждёт? )

Сначала мигает, а как дождётся кнопки - зависает. Так всегда бывает, когда вмесо кода какой-нибудь delirium используют.

Witcher,

напрасно Вы подумали, что форум - это то место, где ленивым задницам делают домашние задания. Это не так. Топайте в платный раздел и заказывайте свою хотелку за денюшку.

Witcher
Offline
Зарегистрирован: 22.10.2020

Да как бы я ничего и не думал. Я с радостю и сам бы решил, но незнаю как.Думал хотябы совет дадут

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

Witcher пишет:

но незнаю как. Думал хотябы совет дадут

А чего тут знать? Совет простой: взять учебник языка, внимательно прочитать, выполняя все упражнения и разбирая примеры, а после этого просто написать то, что Вам нужно. Судя по тому, что Вы называете "кодом" никакие другие советы, кроме как учить язык, Вам не помогут. Если Вы не видите, что это бред, то ... учите язык.

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

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

Witcher пишет:

3.Нельзя использовать функцыю "if".
 

Что  за х-ня! Хто посмел запретить ИФ! Был тут один любитель запрещать, но его запретили уже.

fogary
Offline
Зарегистрирован: 05.03.2016

Witcher пишет:

while (digitalRead(10)==LOW);

Точку с запятой уберите и будет Вам счастье.

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

fogary пишет:
Точку с запятой уберите и будет Вам счастье.
Не будет. Придётся кнопку, единожды нажав, держать всё время.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Logik пишет:

Witcher пишет:

3.Нельзя использовать функцыю "if".
 

Что  за х-ня! Хто посмел запретить ИФ! Был тут один любитель запрещать, но его запретили уже.

Ну отчего же? Вполне жизненная ситуация.

Помнится в первых моделях видеокарт с шейдерами как раз не было условных операторов.

При этом конструкцию типа

if(a > b) 
  x = c(e);
else
  x = d(f);

компилятор преобразовывал так:

int tmp = a > b;
x = c(e)*tmp + d(f)*(!tmp);

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

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

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

А Вы как хотели? Занятия с девочками прогуливали...

сейчас набегут, в гомофобии обвинят..

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

Даю на водку - части содержимого loop() допустимо переносить в setup().

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

andriano пишет:

При этом конструкцию типа

if(a > b) 
  x = c(e);
else
  x = d(f);

компилятор преобразовывал 

дак таки ее никто не запрещал использовать, раз компилятор принимал!

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

sadman41 пишет:

Даю на водку - части содержимого loop() допустимо переносить в setup().

ты сегодня добрый ...
Всем на водку раздаёшь?
А то поиздержался )))

 

fogary
Offline
Зарегистрирован: 05.03.2016

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

Не будет. Придётся кнопку, единожды нажав, держать всё время.

Про отпустить кнопку, в условиях не говорится.

Тогда, точку с запятой оставить, а после нее дописать while(37) и далее как в оригинале.

Или так: в коде оставить только мигание, а кнопку с фиксацией в разрыв провода питания.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

fogary пишет:

Или так: в коде оставить только мигание, а кнопку с фиксацией в разрыв провода питания.

Думаю, преподу нужен код, а не устройство )))

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

Ох! Пятница, завтра Шаббат, нужно  добрые дела делать!

const byte Led = 4;
const byte Btn = 8;

void setup() {
  pinMode(Led, OUTPUT);
  pinMode(Btn, INPUT);
}

void loop() {
static bool s = false;

digitalWrite (
  Led, 
  (s = s || digitalRead(Btn)) 
  && !digitalRead(Led));
delay(100);
}

KindMan
Offline
Зарегистрирован: 19.12.2018

wdrakula пишет:

Ох! Пятница, завтра Шаббат, нужно  добрые дела делать!


Так ему, наверное, придётся объяснить этот код. :)

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

KindMan пишет:
wdrakula пишет:

Ох! Пятница, завтра Шаббат, нужно  добрые дела делать!

Так ему, наверное, придётся объяснить этот код. :)

Настолько я еще не нагрешил за неделю! ;))))

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

wdrakula пишет:

KindMan пишет:
wdrakula пишет:

Ох! Пятница, завтра Шаббат, нужно  добрые дела делать!

Так ему, наверное, придётся объяснить этот код. :)

Настолько я еще не нагрешил за неделю! ;))))

Да и объяснить задания не было )))

Kakmyc
Offline
Зарегистрирован: 15.01.2018
const int btn = 5;
const int led = 13;
void setup(){
				pinMode(led,OUTPUT);
				pinMode(btn,INPUT);
}

void blink(){
								digitalWrite(led,1);
												delay(200);
												digitalWrite(led,0);
												delay(200);
				}

void loop(){
				
				//вариант 1
				while(digitalRead(btn)){
																while(1){
												blink();
								}
				}
				
}

 

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

Не хватает только Квона.

Kakmyc
Offline
Зарегистрирован: 15.01.2018
//вариант 2
const int btn = 5;
const int led = 13;

void blink(){
								digitalWrite(led,1);
												delay(200);
												digitalWrite(led,0);
												delay(200);
				}

void setup(){
				pinMode(led,OUTPUT);
				pinMode(btn,INPUT);
				while(!digitalRead(btn)){
								
				}
}



void loop(){
				
												blink();
				
}

 

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

Кактус, а почему 200, в задании жеж было 5 герц?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ua6em пишет:

Кактус, а почему 200, в задании жеж было 5 герц?


Да вообще пофигу, на это не смотрел даже

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

wdrakula пишет:

нужно  добрые дела делать!

Не приболел ли часом? Ты, береги себя, нам не всё равно!

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

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

wdrakula пишет:

нужно  добрые дела делать!

Не приболел ли часом? Ты, береги себя, нам не всё равно!

судя по строке - нет,... просто, ...со вкусом, ...не бредит )))

digitalWrite (Led, (s = s || digitalRead(Btn)) && !digitalRead(Led));

 

Witcher
Offline
Зарегистрирован: 22.10.2020

Спасибо огромное)Не ожидал что найдутся добрые люди.
Задание решил по другому.

 

void setup()
{
   pinMode(4, OUTPUT);
   pinMode(10, INPUT);
  while (digitalRead(10)==HIGH);  digitalWrite(4, HIGH);
                                 
}

void loop()
{
  while (digitalRead(10)==LOW);  {digitalWrite(4, HIGH); delay(100); digitalWrite(4, LOW); delay(100);}
}

 Но и с вашего кода, узнал много нового для себя. Еще раз спасибо. 

Witcher
Offline
Зарегистрирован: 22.10.2020

Огромное спасибо что отписались на мою просьбу. Код написал немного по другому
 

void setup()
{
   pinMode(4, OUTPUT);
   pinMode(10, INPUT);
  while (digitalRead(10)==HIGH);  digitalWrite(4, HIGH);
                                 
}

void loop()
{
  while (digitalRead(10)==LOW);  {digitalWrite(4, HIGH); delay(100); digitalWrite(4, LOW); delay(100);}
}

Еще раз спасибо.

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

Witcher пишет:

Огромное спасибо что отписались на мою просьбу. Код написал немного по другому
 

void setup()
{
   pinMode(4, OUTPUT);
   pinMode(10, INPUT);
  while (digitalRead(10)==HIGH);  digitalWrite(4, HIGH);
                                 
}

void loop()
{
  while (digitalRead(10)==LOW);  {digitalWrite(4, HIGH); delay(100); digitalWrite(4, LOW); delay(100);}
}

Еще раз спасибо.

а может так надо было?

void setup()
{
   pinMode(13, OUTPUT);
   pinMode(10, INPUT_PULLUP);
   while (digitalRead(10) == HIGH);
   digitalWrite(13,LOW);
                                 
}

void loop()
{
  while (1/*digitalRead(10)==LOW); */) 
  {digitalWrite(13, HIGH); delay(100); digitalWrite(13, LOW); delay(100);}
}

ЗЫ препод спросит, а второй цикл здесь не лишний?  )))

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

Зачем в лупе вайл?

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

Witcher пишет:

Спасибо огромное)Не ожидал что найдутся добрые люди.
Задание решил по другому.

 

void setup()
{
   pinMode(4, OUTPUT);
   pinMode(10, INPUT);
  while (digitalRead(10)==HIGH);  digitalWrite(4, HIGH);
                                 
}

void loop()
{
  while (digitalRead(10)==LOW);  {digitalWrite(4, HIGH); delay(100); digitalWrite(4, LOW); delay(100);}
}

 Но и с вашего кода, узнал много нового для себя. Еще раз спасибо. 

это не называется "решил", это такой же неграмотный код, как в первом посте

Вы пишете вот это в одну строчку и потому оно кажется вам правильным.

while (digitalRead(10)==LOW);  {digitalWrite(4, HIGH); delay(100); digitalWrite(4, LOW); delay(100);}

 

на самом деле полная чушь, и вот почему:

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

Если выкинуть все ошибочные операторы, ваш код соответвует вот такому:

void setup()
{
   pinMode(4, OUTPUT);
   pinMode(10, INPUT);
  while (digitalRead(10)==HIGH); 
                                 
}

void loop()
{
 digitalWrite(4, HIGH); delay(100); 
 digitalWrite(4, LOW); delay(100);
}

while в луп тут не нужен, смысла в нем никакого

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

Ну а вот этим вы сразите препода наповал.)

void loop()
{
  digitalWrite(4, !digitalRead(4));
  delay(100); 
}

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробую и я только с кнопкой как при условии За основу взят код ТС

bool run=0;

void setup()
{
  pinMode(4, OUTPUT);
  pinMode(10, INPUT);
}

void loop()
{
  while ((digitalRead(10)==LOW)|| run == 1)  {
  run = 1;
  digitalWrite(4, HIGH); delay(200); digitalWrite(4, LOW); delay(200);} 
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А без while вообще обойтись при решении такой задачи возможно? (Именно в ардуино-скетче). 

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

Без while() можно, а без цикла в любом его проявлении - нет.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я поэтому и уточнил про ардуино, где loop и есть цикл. Хотя... go to тут какие-нить тоже должны работать?

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

При декомпозиции задачи видно, что требуется последовательное выполнение двух цикличных процессов: ожидания нажатия кнопки и мырганья. Таким образом - нужны два программных цикла. Хоть for, хоть while, хоть until либо же их разнообразные сочетания.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

sadman41 пишет:
При декомпозиции задачи видно, что требуется последовательное выполнение двух цикличных процессов: ожидания нажатия кнопки и мырганья. Таким образом - нужны два программных цикла. Хоть for, хоть while, хоть until либо же их разнообразные сочетания.

Опередили. )

void setup()
{
  pinMode(4, OUTPUT);
  pinMode(10, INPUT); 
  for (;digitalRead(10)==LOW;){}
}

void loop()
{
  digitalWrite(4, HIGH); delay(200); digitalWrite(4, LOW); delay(200); 
}

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

while при желании можно заменить на for(;;) или lable goto

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018
boolean go=0;
void button() {go=1;}
void setup()
{
  pinMode(13, OUTPUT);
  pinMode(2, INPUT_PULLUP); 
  attachInterrupt(0, button, FALLING);
}
void loop()
{
  switch (go) {
    case 1:
    digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(200); 
  }
}

 

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

sadman41 пишет:
При декомпозиции задачи видно, что требуется последовательное выполнение двух цикличных процессов: ожидания нажатия кнопки и мырганья. Таким образом - нужны два программных цикла. Хоть for, хоть while, хоть until либо же их разнообразные сочетания.

;))))))))))))) Гы!

Я хочу посмотреть на циклы в моем примере выше, можно? Ежели скажешь, что луп - он в цикле, то я перепишу тоже самое на таймере, без лупа вообще, веришь?

Я эту же задачку на теории алгоритмов сам задавал много лет назад. И в качестве решения хотел решение без if, while, for и без тернарного оператора (посмотрел выше и добавил: и без case, конечно тоже). Смысл  - сделать решение на булевой алгебре. Так я видел эту задачу и она у меня была в разряде  "хитрых". Сейчас, если преподаватель примет решение с while  в setup, то деградация преподавания теории алгоритмов - налицо!

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

Можно вообще на мигающем светодиоде и фиксированной кнопке по питанию "переписать" - я не против ;)

Пока что озвучено одно условие - обойтись без if(). Таймер тоже цикличен и его применение никак не вступает в противоречие с тем, что должно быть два цикла. А будут ли они разделены или слиты с применением того или иного способа ветвления - who cares? 

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

sadman41 пишет:

Можно вообще на мигающем светодиоде и фиксированной кнопке по питанию "переписать" - я не против ;)

Пока что озвучено одно условие - обойтись без if(). Таймер тоже цикличен и никак не вступает в противоречие с тем, что должно быть два цикла. А будут ли они разделены или слиты с применением того или иного способа ветвления - who cares? 

Садман41! Я же написал, что я хотел видеть в ответах моих студентов (а учил я взрослых людей на переподготовке). Понимание, как работают простейшие операторы булевой алгебры. На них и задача, когда я её задавал. Посмотри, пожалуйста, как она решается у меня выше. Именно в том и задача, чтобы НЕ ИСПОЛЬЗОВАТЬ явные проверки, ни иф ни вайл ни всё, что делает явное ветвление. Нужно сделать решение без ветвлений. Конечно, предполагая, что есть внешний бесконечный цикл, но на него нет возможности влиять( по условию).

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

wdrakula! Дело в том, что ответ был дан ровно на тот вопрос, что был задан, а не с учетом сотен вариантов требований иных преподавателей. Я не сомневаюсь, что какой-нибудь извращенец будет иметь ввиду, что требуется вариант с прямой записью в регистр PC для того, чтобы увидеть понимание работы архитектуры целевого МК. Но тут-то собрались более простые люди, не побоюсь сказать - огородники и обменистраторы. Поэтому - как написано, так и прочтено.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018
#include <avr/wdt.h>

void button() {wdt_disable();}
void setup()
{
  pinMode(13, OUTPUT);
  pinMode(2, INPUT_PULLUP); 
  attachInterrupt(0, button, FALLING);
  wdt_enable (WDTO_1S);
  delay(1100);
}
void loop()
{
    digitalWrite(13, HIGH); delay(200); digitalWrite(13, LOW); delay(200); 
}

 

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

Во развели!
AndreyD, в чём фишка?

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Green пишет:

Во развели!
AndreyD, в чём фишка?

Проверил, рабочий вариант.

Контролер идет в перезагруз пока нет прерывания по нажатию кнопки. Тоже ж вариант без дополнительных циклов и if, case т.д.

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

AndreyD пишет:

Green пишет:

Во развели!
AndreyD, в чём фишка?

Проверил, рабочий вариант.

для абстрактной ардуины, а к примеру для nano с неперешитым лодырем, она жеж не поддерживает ватчдог

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Цитата:

для абстрактной ардуины, а к примеру для nano с неперешитым лодырем, она жеж не поддерживает ватчдог

Прошить. )

РазвИли же тему насчет вариантов решения - вот предлагаю свой. Проверял на Nano с прошивкой optiboot.

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

«Весьма порой мешает мне заснуть
Волнующая, как ни поверни,
Открывшаяся мне внезапно суть
Какой-нибудь немыслимой херни»

И. Губерман