Помощь чайнику(Программная часть Arduino)
- Войдите на сайт для отправки комментариев
Вс, 02/02/2020 - 16:37
Хочу сделать так что-бы по удержанию кнопки(А0) горел один светодиод,а по удержанию кнопки(А1) горел другой.И есть одно условие,если нажата кнопка(А0) и горит соответствующий светодиод ,то кнопка (А1) не должна включать свой светодиод,и наоборот.По принципу "Кто первый встал,того и тапки".
Вот код
int a;
void setup() {
Serial.begin(9600);
pinMode(A1,INPUT);
pinMode(A0,INPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}
void loop() {
int a=map(a,0,1,0,2);
if(digitalRead(A0)==!HIGH){a=1;}
if(digitalRead(A1)==!HIGH){a=2;}
Serial.println(a);
switch(a){
case 1:digitalWrite(6,HIGH);
break;
case 2:digitalWrite(7,HIGH);
break;
default:digitalWrite(6,LOW); digitalWrite(7,LOW);
delay(10);
}
}
Условие выполнить мне не удалось,может есть у кого какие идеи?
Наверное при анализе состояния одной кнопки необходимо учитывать ещё и состояние второй, нет?
И поясните, что это у вас такое в строчке 12 написано
Да,но я не знаю как.Есть варианты?
Из-за того что это абстрактная задача,и кнопок в дальнейшем будет +- 7,я буду масштабировать значение "а" от 0 до 7,и самих кейсов будет 7. Если я правильно понимаю что делает map.Я не уверен что я правильно использую map.Может здесь он не нужен.
Что такое масштабируемое значение а от 0 до 7 и чем оно отличается от обычного int?
Вы что такое сделать то пытались этой строчкой, поясните своими словами?
Да,но я не знаю как.Есть варианты?
изучайте логические операторы и составляйте сложные условия, например
Если кнопка1 нажата И кнопка2 НЕ нажата
Тот же самый код. но с такими if'ами не помогает выполнить условие. if(digitalRead(A0)==!HIGH&&digitalRead(A1)==HIGH){a=1;} if(digitalRead(A1)==!HIGH&&digitalRead(A0)==HIGH){a=2;}Ну как я понял оператор switch(значение),будет выполнять кейс с тем же значением что и значение switch.
switch(7){
case1...
case7(то есть пропустит все кейсы,и включит 7)
}
По поводу int a;Я задал переменную "а" ,но она имеет либо 0 либо 1.Но мне нужно что бы значение "а" было от 0 7,что бы я мог задействовать кейс.Вот так я это понимаю.Или еще можно сказать что я промежуток 0-1 разбил на 8 частей от 0 до 7
b707,спасибо Вам,я не осознанно делал фигню,заменил map на if(digitalRead(A1)==HIGH||digitalRead(A0)==HIGH){a=0;}
Но все же, есть маленькая проблема.Если я удерживаю 2 кнопки все хорошо,горит один из светодиодов(тот который я первый включил),но когда я отпускаю какую-либо кнопку(1 из 2),то другая включает мне 2 светодиода О_0
Учитесь рассуждать логически
Если первая кнопка НАЖАТА и вторая НЕ НАЖАТА - включаем первый светик
Аналогично, если первая НЕ нажата, вторая нажата - включаем второй светик
Во всех остальных случаях все гасим.
Осталось перевести это в код
Проблема в том что,когда удерживается одна кнопка горит красный светик,одновременно нажимаю другую кнопку все равно горит красный(как и должно),но когда я отпускаю одну из кнопок причем ЛЮБУЮ, горит зеленый и красный светик,вот это меня удивляет!
Ищите ошибку
Зачем вы в последнем варианте убрали выключение диодов? И еще - вы все равно не все варианты учли
Тут мне придется извиниться потому что,с выключением диодов то есть вот так: if(digitalRead(A0)==!HIGH&&digitalRead(A1)==HIGH){digitalWrite(7,HIGH);digitalWrite(8,LOW);}
все работает,но можно ли,добиться такого же результата без выключения диодов?(Жирным шрифтом)
Попробую описать полную ситуацию.Представим что у ардуино 7 входов и 7 выходов.Нужно сделать так,когда на 1 вход ардуино приходили 5В то 1 выход выдавал 0В,а остальные 6 выходов 5В и так аналогично должен работать каждый вход и выход Это первое условие.
Второе условие было "Кто первый встал,того и тапки".То есть если на первый вход подается 5В то,плата работает в режиме первый выход 0В остальные 5В,и ей должно быть все равно даже если на 2-3-4-5 входе будет 5в,потому что на первый вход подали 5В первее,и пока они не пропадут,она работает в таком режиме.Как только с первого выхода пропадет 5в,она должна перейти в режим ожидания и ждать того первого.
Я думал пример с светиками поможет мне разобрать и с этим.Но видимо здесь все сложнее,ибо в таком раскладе я не могу в if выключать пины
Да йоп же ж. На, пробуй, у меня сегодня помутнение сознания, вследствие чего поступаю совершенно нетипичным для форума образом:
uint8_t inputs[] = { 2, 3, 4, 5, 6, }; uint8_t outputs[] = { 7, 8, 9, 10, 11, }; typedef enum { msDetect, msWaitRelease } MachineState; int activeInputIndex = -1; MachineState state = msDetect; void setup() { for(size_t i=0;i<sizeof(inputs)/sizeof(inputs[0]);i++) { pinMode(inputs[i],INPUT); } for(size_t i=0;i<sizeof(outputs)/sizeof(outputs[0]);i++) { pinMode(outputs[i],OUTPUT); digitalWrite(outputs[i],LOW); } } void loop() { switch(state) { case msDetect: { for(size_t i=0;i<sizeof(inputs)/sizeof(inputs[0]);i++) { if(digitalRead(inputs[i])) { for(size_t k=0;k<sizeof(outputs)/sizeof(outputs[0]);k++) { digitalWrite(outputs[k],LOW); } activeInputIndex = i; digitalWrite(outputs[activeInputIndex],HIGH); state = msWaitRelease; break; } } } break; case msWaitRelease: { if(!digitalRead(inputs[activeInputIndex])) { digitalWrite(outputs[activeInputIndex],LOW); activeInputIndex = -1; state = msDetect; } } break; } }const byte body1Pin = 2; // тело1 const byte body2Pin = 3; // тело2 const byte leg1Pin = 12; // ноги1 const byte leg2Pin = 13; // ноги2 bool tapky; byte leg; void setup() { pinMode(body1Pin, INPUT_PULLUP); pinMode(body2Pin, INPUT_PULLUP); pinMode(leg1Pin, OUTPUT); pinMode(leg2Pin, OUTPUT); tapky = true; // тапки есть } void loop() { bool body1 = digitalRead(body1Pin); if (tapky && !body1) { tapky = false; // тапок нет leg = 1; // тапки у первого } if (!tapky && leg == 1 && body1) { tapky = true; // тапки снова есть } bool body2 = digitalRead(body2Pin); if (tapky && !body2) { tapky = false; // тапок нет leg = 2; // тапки у второго } if (!tapky && leg == 2 && body2) { tapky = true; // тапки снова есть } }Объяснять не буду.
Да йоп же ж. На, пробуй, у меня сегодня помутнение сознания, вследствие чего поступаю совершенно нетипичным для форума образом:
uint8_t inputs[] = { 2, 3, 4, 5, 6, }; uint8_t outputs[] = { 7, 8, 9, 10, 11, }; typedef enum { msDetect, msWaitRelease } MachineState; int activeInputIndex = -1; MachineState state = msDetect; void setup() { for(size_t i=0;i<sizeof(inputs)/sizeof(inputs[0]);i++) { pinMode(inputs[i],INPUT); } for(size_t i=0;i<sizeof(outputs)/sizeof(outputs[0]);i++) { pinMode(outputs[i],OUTPUT); digitalWrite(outputs[i],LOW); } } void loop() { switch(state) { case msDetect: { for(size_t i=0;i<sizeof(inputs)/sizeof(inputs[0]);i++) { if(digitalRead(inputs[i])) { for(size_t k=0;k<sizeof(outputs)/sizeof(outputs[0]);k++) { digitalWrite(outputs[k],LOW); } activeInputIndex = i; digitalWrite(outputs[activeInputIndex],HIGH); state = msWaitRelease; break; } } } break; case msWaitRelease: { if(!digitalRead(inputs[activeInputIndex])) { digitalWrite(outputs[activeInputIndex],LOW); activeInputIndex = -1; state = msDetect; } } break; } }Я слишком слабый,что бы это понять,но если я все правильно подключил.И без ошибок скопировал код,то он работает не так как нужно. )=
он работает не так как нужно. )=
Ну тады ой.
Можно использовать оператор while,например
if(digitalRead(A0)==LOW){
digitalWrite(7,HIGH);
while(digitalRead(A0)==LOW)
{//пустой цикл}digitalWrite(7,LOW)
}
Получится пока нажата кнопка включаем светодиод и крутимся в цикле,как только отпустили кнопку выходим из цикла и гасим светодиод
const byte body1Pin = 2; // тело1 const byte body2Pin = 3; // тело2 const byte leg1Pin = 12; // ноги1 const byte leg2Pin = 13; // ноги2 bool tapky; byte leg; void setup() { pinMode(body1Pin, INPUT_PULLUP); pinMode(body2Pin, INPUT_PULLUP); pinMode(leg1Pin, OUTPUT); pinMode(leg2Pin, OUTPUT); tapky = true; // тапки есть } void loop() { bool body1 = digitalRead(body1Pin); if (tapky && !body1) { tapky = false; // тапок нет leg = 1; // тапки у первого } if (!tapky && leg == 1 && body1) { tapky = true; // тапки снова есть } bool body2 = digitalRead(body2Pin); if (tapky && !body2) { tapky = false; // тапок нет leg = 2; // тапки у второго } if (!tapky && leg == 2 && body2) { tapky = true; // тапки снова есть } }Объяснять не буду.
если я опять же все правильно сделал,то код не работает.(думаю так и должно быть ибо я не вИжу не одной команды которая включала светики)
Я сидел разбирался,но я так и не понял какую функцию выполняют ноги(leg),хотелось бы все таки услышать объяснение.Была идея что это переменная для switch(leg) что бы смотря какая нога встала,такой кейс и использовался.Но вроде нет)=
тапки одни, а ног много.Если тапки одеты, то надо знать на чье тело. Потому что если именно это тело легло спать, то тапки надо снять.
тапки одни, а ног много.Если тапки одеты, то надо знать на чье тело. Потому что если именно это тело легло спать, то тапки надо снять.
Пух, кому ты пишешь? Он в моём коде в нужных местах не может нужные уровни поставить, а ты...
В комнате живут 1 и 2 . в шкафу лежат тапки . = true; Если 1 захотел одеть тапки !digitalRead(body1Pin) и тапки есть tapky . Ну и так далее. Если вы не знаете языка Си , то можете забить на программирование и ардуино.
ПС: если tapky == false; и leg==1 , то тапки у первого . а если tapky == false; и leg==2, то у второго. А если tapky == true и не важно leg==1 или leg==2 , то в шкафу
Можете стелаль если leg==0 то тапки в шкафу и переменую tapky выкинуть.
Ладно,спасибо.Тут достаточно материала что бы решить задачу,осталось его проработать.
Я думал пример с светиками поможет мне разобрать и с этим.Но видимо здесь все сложнее,ибо в таком раскладе я не могу в if выключать пины
Чтобы светик погас - кто-то должен его выключить. Если вы почему либо "не можете" делать это в программе - то ваша задача программного решения не имеет.
хотя почему вы не можете подать на пин LOW - я так и не понял.
у меня сегодня помутнение сознания
Ты, эта ... береги себя, не шути такими делами!