Помощь чайнику(Программная часть Arduino)

ayde707
Offline
Зарегистрирован: 02.02.2020

Хочу сделать так что-бы по удержанию кнопки(А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);
    
  }
  
 
}

 

ayde707
Offline
Зарегистрирован: 02.02.2020

Условие выполнить мне не удалось,может есть у кого какие идеи?

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

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

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

И поясните, что это у вас такое в строчке 12 написано

ayde707
Offline
Зарегистрирован: 02.02.2020

Да,но я не знаю как.Есть варианты? 

ayde707
Offline
Зарегистрирован: 02.02.2020

Из-за того что это абстрактная задача,и кнопок в дальнейшем будет +- 7,я буду масштабировать значение "а"    от 0 до 7,и самих кейсов будет 7. Если я правильно понимаю что делает map.Я не уверен что я правильно использую map.Может здесь он не нужен.

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

Что такое масштабируемое значение а от 0 до 7 и чем оно отличается от обычного int?
Вы что такое сделать то пытались этой строчкой, поясните своими словами?

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

ayde707 пишет:

Да,но я не знаю как.Есть варианты? 


изучайте логические операторы и составляйте сложные условия, например
Если кнопка1 нажата И кнопка2 НЕ нажата

ayde707
Offline
Зарегистрирован: 02.02.2020
Тот же самый код. но с такими if'ами не помогает выполнить условие.


if(digitalRead(A0)==!HIGH&&digitalRead(A1)==HIGH){a=1;}
  if(digitalRead(A1)==!HIGH&&digitalRead(A0)==HIGH){a=2;}

 

ayde707
Offline
Зарегистрирован: 02.02.2020

b707 пишет:
Что такое масштабируемое значение а от 0 до 7 и чем оно отличается от обычного int? Вы что такое сделать то пытались этой строчкой, поясните своими словами?

Ну как я понял оператор switch(значение),будет выполнять кейс с тем же значением что и значение switch.

switch(7){

case1...

case7(то есть пропустит все кейсы,и включит 7)

}

По поводу int a;Я задал переменную "а" ,но она имеет либо 0 либо 1.Но мне нужно что бы значение "а" было от 0 7,что бы я мог задействовать кейс.Вот так я это понимаю.Или еще можно сказать что я промежуток 0-1 разбил на 8 частей от 0 до 7

ayde707
Offline
Зарегистрирован: 02.02.2020

b707,спасибо Вам,я не осознанно делал фигню,заменил map на if(digitalRead(A1)==HIGH||digitalRead(A0)==HIGH){a=0;}

Но все же, есть маленькая проблема.Если я удерживаю 2 кнопки все хорошо,горит один из светодиодов(тот который я первый включил),но когда я отпускаю какую-либо кнопку(1 из 2),то другая включает мне 2 светодиода О_0

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

Учитесь рассуждать логически
Если первая кнопка НАЖАТА и вторая НЕ НАЖАТА - включаем первый светик
Аналогично, если первая НЕ нажата, вторая нажата - включаем второй светик
Во всех остальных случаях все гасим.

Осталось перевести это в код

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

ayde707 пишет:
По принципу "Кто первый встал,того и тапки".
Завидите переменную тапки. Встал взял тапки, лег тапки отдал. Если встал то пока тапок нет можешь ничего не делать.. потому что тапок нету ;))

ayde707
Offline
Зарегистрирован: 02.02.2020


b707 пишет:
Учитесь рассуждать логически Если первая кнопка НАЖАТА и вторая НЕ НАЖАТА - включаем первый светик Аналогично, если первая НЕ нажата, вторая нажата - включаем второй светик Во всех остальных случаях все гасим. Осталось перевести это в код

void setup() {
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
 
}
 
void loop() {
if(digitalRead(A0)==!HIGH&&digitalRead(A1)==HIGH){digitalWrite(7,HIGH);digitalWrite(8,LOW);}
if(digitalRead(A1)==!HIGH&&digitalRead(A0)==HIGH){digitalWrite(8,HIGH);digitalWrite(7,LOW);}
if(digitalRead(A0)==HIGH&&digitalRead(A1)==HIGH){digitalWrite(7,LOW);digitalWrite(8,LOW);}
 
}
Вот я написал код,в нем я рассмотрел 3 случая.НАЖАТА, НЕ НАЖАТА//НЕ НАЖЕТА, НАЖЕТА//НЕ НАЖАТА НЕ НАЖАТА.Вроде логично.Но все равно косяк есть.
 
ayde707
Offline
Зарегистрирован: 02.02.2020

Проблема в том что,когда удерживается одна кнопка горит красный светик,одновременно нажимаю другую кнопку все равно горит красный(как и должно),но когда я отпускаю одну из кнопок причем ЛЮБУЮ, горит зеленый и красный светик,вот это меня удивляет!

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

Ищите ошибку

ayde707
Offline
Зарегистрирован: 02.02.2020


void setup() {
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
 
}
 
void loop() {
if(digitalRead(A0)==!HIGH&&digitalRead(A1)==HIGH){digitalWrite(7,HIGH);}
if(digitalRead(A1)==!HIGH&&digitalRead(A0)==HIGH){digitalWrite(8,HIGH);}
if(digitalRead(A0)==HIGH&&digitalRead(A1)==HIGH){digitalWrite(7,LOW);digitalWrite(8,LOW);}
 
}
Я конечно посижу,поищу здесь ошибку.Но если рассмотреть вариант что ее нет в коде,как Вы думаете возможно что из-за того что я использую RGB диод,появляется такое странное поведение?
b707
Offline
Зарегистрирован: 26.05.2017

Зачем вы в последнем варианте убрали выключение диодов? И еще - вы все равно не все варианты учли

ayde707
Offline
Зарегистрирован: 02.02.2020

b707 пишет:
Зачем вы в последнем варианте убрали выключение диодов? И еще - вы все равно не все варианты учли

Тут мне придется извиниться потому что,с выключением диодов то есть вот так: if(digitalRead(A0)==!HIGH&&digitalRead(A1)==HIGH){digitalWrite(7,HIGH);digitalWrite(8,LOW);}

все работает,но можно ли,добиться такого же результата без выключения диодов?(Жирным шрифтом)

ayde707
Offline
Зарегистрирован: 02.02.2020

Попробую описать полную ситуацию.Представим что у ардуино 7 входов и 7 выходов.Нужно сделать так,когда на 1 вход ардуино приходили 5В то 1 выход выдавал 0В,а остальные 6 выходов 5В и так аналогично должен работать каждый вход и выход Это первое условие.

Второе условие было "Кто первый встал,того и тапки".То есть если на первый вход подается 5В то,плата работает в режиме первый выход 0В остальные 5В,и ей должно быть все равно даже если на 2-3-4-5 входе будет 5в,потому что на первый вход подали 5В первее,и пока они не пропадут,она работает в таком режиме.Как только с первого выхода пропадет 5в,она должна перейти в режим ожидания и ждать того первого.

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

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

Да йоп же ж. На, пробуй, у меня сегодня помутнение сознания, вследствие чего поступаю совершенно нетипичным для форума образом:

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;
	}
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
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; // тапки снова есть
  }
}

Объяснять не буду.

ayde707
Offline
Зарегистрирован: 02.02.2020

DIYMan пишет:

Да йоп же ж. На, пробуй, у меня сегодня помутнение сознания, вследствие чего поступаю совершенно нетипичным для форума образом:

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;
	}
}

 

Я слишком слабый,что бы это понять,но если я все правильно подключил.И без ошибок скопировал код,то он работает не так как нужно. )=

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

ayde707 пишет:

 он работает не так как нужно. )=

Ну тады ой.

Zummer
Offline
Зарегистрирован: 25.11.2019

Можно использовать оператор while,например

if(digitalRead(A0)==LOW){

digitalWrite(7,HIGH);

while(digitalRead(A0)==LOW)

{
 //пустой цикл
}

digitalWrite(7,LOW)

}

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

ayde707
Offline
Зарегистрирован: 02.02.2020

qwone пишет:

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) что бы смотря какая нога встала,такой кейс и использовался.Но вроде нет)=

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

тапки одни, а ног много.Если тапки одеты, то надо знать на чье тело. Потому что если именно это тело легло спать, то тапки надо снять.

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

qwone пишет:

тапки одни, а ног много.Если тапки одеты, то надо знать на чье тело. Потому что если именно это тело легло спать, то тапки надо снять.

Пух, кому ты пишешь? Он в моём коде в нужных местах не может нужные уровни поставить, а ты... 

ayde707
Offline
Зарегистрирован: 02.02.2020


bool tapky;
byte leg;
void setup() {
  pinMode(A0,INPUT);
  pinMode(A1,INPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  tapky = true;
  
}
 
void loop() {
  if(tapky&&!digitalRead(A0)){
    tapky = false;
    leg=1;
}
if(!tapky&&leg==1&&digitalRead(A0)){
  tapky = true;
}
if(tapky&&!digitalRead(A1)){
  tapky = false;
  leg=2;
}
if(!tapky&&leg==2&&digitalRead(A1)){
  tapky = true;
}
 
}
Переделал код под себя,мне так легче воспринимать.
if(tapky&&!digitalRead(A0)){
    tapky = false;
    leg=1;
}
Я понимаю выше написанное как:Если тапки есть И кнопка нажата,тогда тапки забрали.Но я тупой и не понимаю что значит leg=1.Я понимаю что тапки одни,а ног от 0 до 255 .
 
if(!tapky&&leg==1&&digitalRead(A0)){
  tapky = true;
}
это я понимаю как,если тапок нет И  они на первых ногах и кнопка не нажата, тогда тапки есть.
Я уже запутался,может быть leg-это лёг?)))Или leg-это всё таки нога?
 
 
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

В комнате живут 1 и 2 . в шкафу лежат тапки . = true;  Если 1 захотел одеть тапки !digitalRead(body1Pin) и тапки есть tapky .  Ну и так далее. Если вы не знаете языка Си , то можете забить на программирование  и ардуино.

ПС: если tapky == false; и leg==1 , то тапки у первого . а если tapky == false; и leg==2, то у второго. А если tapky == true и не важно leg==1 или  leg==2 , то в шкафу

Можете стелаль если leg==0 то тапки в шкафу и переменую tapky  выкинуть.

ayde707
Offline
Зарегистрирован: 02.02.2020

Ладно,спасибо.Тут достаточно материала что бы решить задачу,осталось его проработать.

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

ayde707 пишет:

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

Чтобы светик погас - кто-то должен его выключить. Если вы почему либо "не можете" делать это в программе - то ваша задача программного решения не имеет.

хотя почему вы не можете подать на пин LOW - я так и не понял.

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

DIYMan пишет:

у меня сегодня помутнение сознания

Ты, эта ... береги себя, не шути такими делами!