Код (C++): if (digitalRead(pin) == 1) //если на пин подали "1", представим, что это тумблер digitalWrite(led1, 1); //диод 1 включили digitalWrite(led2, 1); //диод 2 мигнули delay(500); digitalWrite(led2, 0); else { // иначе диод 1 не горит. digitalWrite(led1, 0); } Помогите разобраться, как сделать, что бы диод 2 не мигал постоянно если тумблер выключен, а мигнул один раз при включении тумблера, а второй раз уже при повторном включении ну или после перезагрузки ардуины. Немогу нагуглить, довольно простое, как мне кажется решение.
Код (C++): if(digitalRead(pin)==1)//если на пин подали "1", представим, что это тумблер digitalWrite(led1, 1);//диод 1 включили digitalWrite(led2, 1);//диод 2 мигнули delay(500); digitalWrite(led2, 0); else{ // иначе диод 1 не горит. digitalWrite(led1, 0);} if(digitalRead(pin)==2)//если на пин подали "2", digitalWrite(led3, 1);//диод 3 включили digitalWrite(led2, 1);//диод 2 мигнули delay(500); digitalWrite(led2, 0); else{ // иначе диод 3 не горит. digitalWrite(led3, 0);} Так тоже будет работать?
Zems , Вы видели дорогу , где много едет машин. Так вот среди водителей машин находятся неадекваты , которые считают что дорога только для них, вот и чудят в меру свой фантазии. Понятно , что новички учатся на пустой площадке. Но ситуация меняется если они выезжают на дорогу где есть и другие машины. Так и здесь. Как правило, все скетчи они демо. То есть хороши когда они работают одни. А вот когда их собирают в кучу, получается х р е н ь. Так и у вас. Пока учились на отдельной площадке то все ОК. А вот когда выехали на большую дорогу и полезла туфтень. 1 - delay(500); . Вы бы еще припарковались на середине автобана.
Спойлер: код Код (C++): /* #1 кнопка -> 2 (btm_pin) 0 нажата / 1 нет -> GND светодиод -> 3 (Led1_pin ) 0 горит /1 нет через R=1кОМ-> +5В */ //#1 const int btm1_pin = 2; uint8_t btm1 = 0xFF; const int Led1_pin = 3; uint8_t Led1;// const int interval = 500 ; // интервал после нажатия клавиши 0,5 сек void setup() { //#1 светодиод и кнопка pinMode(btm1_pin, INPUT_PULLUP); btm1 = btm1 << 1 | digitalRead(btm1_pin); pinMode(Led1_pin, OUTPUT); digitalWrite(Led1_pin, Led1 = 1); // погасить светодиод } void loop() { static uint32_t MILLIS ; MILLIS = millis() ; //#1 static uint32_t fut1 = 0 ; static uint32_t future1 = 0 ; if (!Led1 && MILLIS >= fut1) { digitalWrite(Led1_pin, Led1 = 1); } if (MILLIS >= future1) { future1 = MILLIS + 200; btm1 = btm1 << 1 | digitalRead(btm1_pin); if ( (btm1 & 3) == 2) { digitalWrite(Led1_pin, Led1 = 0); fut1 = MILLIS + interval; } } }
2rkit Я и не вводил переменную, просто не могу понять как это сделать грамотно. А второй вариант скетча, я написал для наглядности, что led2 у меня используется не только с led1 но и с led3,4,5 и т.д. Мне не хочется, что бы за меня написали весь мой скетч, а хочется разобраться с одним моментом, потому и привожу короткие кусочки кода. 2qwone "delay" в моем коде не мешает, мне достаточно даже 0,1 секунды, что в целом на процесс не повлияет. Ваш вариант с "millis" мне знаком, но он мне кажется довольно громоздким, хотя я могу ошибаться и решений с меньшей "кровью" не существует. В любом случае всем спасибо за Ваши коментарии.
2 Zems . Это только кажется , что мой код горомоздкий. На деле я могу с минимальными усилиями совмещать работу десятка любых программ, написаных мной. И при этом они все будут работать и требовать "минимальной работы напильником".
Ну могу сказать, что на цифровой пин нельзя подать 2. Можно подать высокий уровень, известный как 1 или HIGH. И можно подать низкий, известный как 0 или LOW. Третьего не дано. А вообще по вопросу вот тут разжевано достаточно хорошо. http://wiki.amperka.ru/конспект-arduino:кнопочный-переключатель
странно что код вообще скомпилировался строка Код (C++): digitalWrite(led1, 1); //диод 1 включили будет выполняться только при соблюдении указанного в скобках if условия. А вот строка Код (C++): digitalWrite(led2, 1); //диод 2 мигнули будет выполнена всегда, независимо от того, что указано в if
включится, ибо уловие всегда истинно. И синтаксис не нарушен А то, что не работает как задумано - как описано ТЗ, такой и результат.
Это сокращеная запись этого. Led1 =0; digitalWrite(Led1_pin, Led1); В некотором смысле штамп для моего стиля написания программы.
Что мешает написать: Код (C++): digitalWrite(Led1_pin, 0); И вообще какой смысл в переменной в таком случае?
нет, это не сокращенная запись. Это всегда единица, т.е. присвоение переменной Led1 значение 0 завершилось успешно (возвращает true). Код (C++): digitalWrite(Led1_pin, Led1 = 0); и Код (C++): digitalWrite(Led1_pin, 0); это не одно и то же, а полностью противоположные значения. А вот строки Код (C++): digitalWrite(Led1_pin, Led1 = 0); digitalWrite(Led1_pin, Led1 = 1); полностью идентичны и обе включают светодиод Led1. ТС, даю подсказку: код в сообщении #1 полностью правильный с точки логики. А вот по синтактису - забыли две фигурных скобки, поэтому работает не так как задумано.
Таки нет, вероятно компилятор понимает это не как условие, а как действие присвоения. Пин выключится (установится в 0).
Мой скечь работает. digitalWrite(Led1_pin, Led1 =0);// это включает digitalWrite(Led1_pin, Led1 =1);// это выключает замечу я указал выше светодиод висит на питании. Вы еще не заметили кусок if(!Led1 && MILLIS >= fut1){ digitalWrite(Led1_pin, Led1 =1); } // то есть если светодиод светит Led1 =0 , то есть !Led1 и время выключать подошло то выключить digitalWrite(Led1_pin, Led1 =1); // Led1 =1 и не будет выполнятся это условие !Led1==1
Не путайте = это операция присвоения и ничего иное, а == это сравнение. А еще есть операция запятая. Это почти как точка с запятой. Синтаксис Си.
Здесь нет сравнения (==), это присваивание (=) ВЫ запись digitalWrite(kol_l, LOW) называете "дибилизм", а сами пишете "странноватенько" digitalWrite(Led1_pin, Led1 =0)