Помогите новичку разобраться в программе

sm1tcool
Offline
Зарегистрирован: 12.10.2015

Чего хочу добиться: Есть 6 светодиодов (2 красные. 2 синие. 2 желтые)

3 кнопки, каждая кнопка соответствует цвету (управляет 2 светодиодами).

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

 

 

boolean but1=2;  //кнопочки
boolean but2=7; 
boolean but3=12; 
int l1=3; //это светодиоды
int l2=5; 
int l3=6; 
int l4=9; 
int l5=10; 
int l6=11; 
int last1=0; //чтоб контролировать предыдущее состояние кнопок
int last2=0; 
int last3=0; 
int last4=0; 
int last5=0; 
int last6=0; 
 
 
void setup() { 
Serial.begin(9600); 
pinMode(but1, INPUT); 
pinMode(l1, OUTPUT); 
pinMode(l2, OUTPUT); 
pinMode(l3, OUTPUT); 
pinMode(l4, OUTPUT); 
pinMode(l5, OUTPUT); 
pinMode(l6, OUTPUT); 
pinMode(but2, INPUT); 
pinMode(but3, INPUT); 
 but1=LOW;// тут устанавливаю переменные кнопок в 0
 but2=LOW;
 but3=LOW;
 
 
void loop() { 
 
//этот блок условий для первой пары светодиодов
Serial.print("but1: "); Serial.println(but1);
if (digitalRead(but1)==HIGH) //начинается жесть, на кнопки не жму, светодиоды моргают сами по себе, хоть и переменная but1==LOW, и так со всеми цветами, самое ужастное что при нажатии на кнопку ничего с переменной but1, but2, but3 не происходит? это видно в мониторе последовательного порта
{
if (last1==0 and last2==0) //это условие выполняется не в зависимости от того истино ли "старшее" условие
analogWrite(l1,255); 
analogWrite(l2,0); 
last1=1; Serial.print("last1=1");Serial.println(); 
last2=0; Serial.print("last2=0");Serial.println();Serial.println(); 
if (last1==1 and last2==1) { 
analogWrite(l1,0); 
analogWrite(l2,0); 
last1=0; Serial.print("last1=0");Serial.println(); 
last2=0; Serial.print("last2=0");Serial.println();Serial.println(); 
if (last1==1 and last2==0) { 
analogWrite(l1,255); 
analogWrite(l2,255); 
last1=1; Serial.print("last1=1");Serial.println(); 
last2=1; Serial.print("last2=1");Serial.println();Serial.println(); 
 
 
 
 
 
//вторая пара светодиодов
if (digitalRead(but2)==HIGH) { 
if (last3==0 and last4==0) //это условие выполняется не в зависимости от того истино ли "старшее" условие
analogWrite(l3,255); 
analogWrite(l4,0); 
last3=1; Serial.print("last1=3");Serial.println(); 
last4=0; Serial.print("last2=4");Serial.println();Serial.println(); 
if (last3==1 and last4==1) { 
analogWrite(l3,0); 
analogWrite(l4,0); 
last3=0; Serial.print("last3=0");Serial.println(); 
last4=0; Serial.print("last4=0");Serial.println();Serial.println(); 
if (last3==1 and last4==0) { 
analogWrite(l3,255); 
analogWrite(l4,255); 
last3=1; Serial.print("last3=1");Serial.println(); 
last4=1; Serial.print("last4=1");Serial.println();Serial.println(); 
 
 
 
//третья пара светодиодов
if (digitalRead(but3)==HIGH) { 
if (last5==0 and last6==0)  //это условие выполняется не в зависимости от того истино ли "старшее" условие
analogWrite(l5,255); 
analogWrite(l6,0); 
last5=1; Serial.print("last5=1");Serial.println(); 
last6=0; Serial.print("last6=0");Serial.println();Serial.println(); 
if (last5==1 and last6==1) { 
analogWrite(l5,0); 
analogWrite(l6,0); 
last5=0; Serial.print("last5=0");Serial.println(); 
last6=0; Serial.print("last6=0");Serial.println();Serial.println(); 
if (last5==1 and last6==0) { 
analogWrite(l5,255); 
analogWrite(l6,255); 
last5=1; Serial.print("last5=1");Serial.println(); 
last6=1; Serial.print("last6=1");Serial.println();Serial.println(); 
 
delay(1000); 
}
__Alexander
Offline
Зарегистрирован: 24.10.2012

что за and?  замените на &&

keefa
Offline
Зарегистрирован: 19.06.2015

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

but1=LOW;// тут устанавливаю переменные кнопок в 0
 but2=LOW;
 but3=LOW;
а, во так:
digitalWrite(but1,HIGH);
и так далее.
Клапауций 070
Offline
Зарегистрирован: 26.09.2015

sm1tcool пишет:

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

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

"при первом нажатии" какой кнопки? 1-й, 2-й, 3-й??

далее - где у тебя в коде счётчик нажатий кнопки?

sm1tcool
Offline
Зарегистрирован: 12.10.2015

Я не получал нигде это занятие, вообще не думал что где то этому учат, я сам себе придумал это задание. Счетчик делать не захотел, считаю что мой вариант должен работать, причину почему не работает не могу найти, щас попробую присвоить LOW. Кстати кнопки я так и подключил через резистор, нифига значение переменных but1, but2, but3 не меняются от нажатия на кнопку, уже замыкаю напрямую без кнопок, 1 фиг не работает

sm1tcool
Offline
Зарегистрирован: 12.10.2015

при нажатии на любую кнопку. Это не техзадание)

sm1tcool
Offline
Зарегистрирован: 12.10.2015

что за and?  замените на &&

это важно?

__Alexander
Offline
Зарегистрирован: 24.10.2012

sm1tcool пишет:

что за and?  замените на &&

это важно?

а я хз, в си такого нет. возможно это арифметическая операция а не логическая. это только IDE известно. 

 

sm1tcool
Offline
Зарегистрирован: 12.10.2015

__Alexander пишет:

sm1tcool пишет:

что за and?  замените на &&

это важно?

а я хз, в си такого нет. возможно это арифметическая операция а не логическая. это только IDE известно. 

 

 

Только что изменил ничего не поменялось, осталось так же

keefa
Offline
Зарегистрирован: 19.06.2015

sm1tcool пишет:

что за and?  замените на &&

это важно?

найди здесь "and" http://arduino.ru/Reference

sm1tcool
Offline
Зарегистрирован: 12.10.2015

keefa пишет:

sm1tcool пишет:

что за and?  замените на &&

это важно?

найди здесь "and" http://arduino.ru/Reference

Не нашел, но работает и так и так одинаково)

keefa
Offline
Зарегистрирован: 19.06.2015

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

__Alexander
Offline
Зарегистрирован: 24.10.2012

sm1tcool пишет:

Не нашел, но работает и так и так одинаково)

 

не факт, т.к. у вас пока вобще ничего не работает. )))

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

sm1tcool пишет:
Счетчик делать не захотел, считаю что мой вариант должен работать

считаешь, что должен работать, но не работает - и, кто прав? ты или объективная реальность?

keefa
Offline
Зарегистрирован: 19.06.2015

попробуй начни вот с этого:

boolean but1=2;  //кнопочки
boolean but2=7; 
boolean but3=12;
 
 
void setup() { 
Serial.begin(9600); 
pinMode(but1, INPUT);
pinMode(but2, INPUT); 
pinMode(but3, INPUT); 
digitalWrite(but1,HIGH); 
digitalWrite(but2,HIGH); 
digitalWrite(but2,HIGH); 
} 
 
void loop() {
   
  boolean btn1 = digitalRead(but1); 
  boolean btn2 = digitalRead(but2);
  boolean btn3 = digitalRead(but3);
  
  Serial.print( btn1);
  Serial.print( btn2);
  Serial.println( btn3);
  }

 

sm1tcool
Offline
Зарегистрирован: 12.10.2015

keefa пишет:

попробуй начни вот с этого:

boolean but1=2;  //кнопочки
boolean but2=7; 
boolean but3=12;
 
 
void setup() { 
Serial.begin(9600); 
pinMode(but1, INPUT);
pinMode(but2, INPUT); 
pinMode(but3, INPUT); 
digitalWrite(but1,HIGH); 
digitalWrite(but2,HIGH); 
digitalWrite(but2,HIGH); 
} 
 
void loop() {
   
  boolean btn1 = digitalRead(but1); 
  boolean btn2 = digitalRead(but2);
  boolean btn3 = digitalRead(but3);
  
  Serial.print( btn1);
  Serial.print( btn2);
  Serial.println( btn3);
  }

 

 

спасибо щас попробую

sm1tcool
Offline
Зарегистрирован: 12.10.2015

keefa пишет:

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

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

keefa
Offline
Зарегистрирован: 19.06.2015

sm1tcool пишет:

keefa пишет:

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

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

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

keefa
Offline
Зарегистрирован: 19.06.2015

соединяй по этой схеме

sm1tcool
Offline
Зарегистрирован: 12.10.2015

keefa пишет:

соединяй по этой схеме

Все так и есть, только еще резистор

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

ТС признавайся, у кого украл дохлый код и сюда притащил?

*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255); 

sm1tcool
Offline
Зарегистрирован: 12.10.2015

keefa пишет:

sm1tcool пишет:

keefa пишет:

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

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

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

 

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

sm1tcool
Offline
Зарегистрирован: 12.10.2015

Клапауций 070 пишет:

ТС признавайся, у кого украл дохлый код и сюда притащил?

*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255); 

Вчера вечером получил посылку, открыл, достал макетную плату потыкал светодиоды резистор кнопки, потом подумал что я с этим сделаю, все придумал, написал это все сам, ничего не крал

*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255);  Что тут не так?)

bwn
Offline
Зарегистрирован: 25.08.2014

sm1tcool пишет:

Клапауций 070 пишет:

ТС признавайся, у кого украл дохлый код и сюда притащил?

*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255); 

Вчера вечером получил посылку, открыл, достал макетную плату потыкал светодиоды резистор кнопки, потом подумал что я с этим сделаю, все придумал, написал это все сам, ничего не крал

*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255);  Что тут не так?)

ШИМом их нахрена включать в этом варианте? DigitalWrite(l6, HIGH) али LOW.

sm1tcool
Offline
Зарегистрирован: 12.10.2015

В общем такое дело

void setup() { 
 digitalWrite(but1,LOW);
 digitalWrite(but2,LOW);
 digitalWrite(but3,LOW);
}

значит переменные but1 but2 but3 должы быть LOW. но принт говорит что все 3 равны 1. Провода от кнопок отключил ничего не меняется

sm1tcool
Offline
Зарегистрирован: 12.10.2015

bwn пишет:

sm1tcool пишет:

Клапауций 070 пишет:

ТС признавайся, у кого украл дохлый код и сюда притащил?

*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255); 

Вчера вечером получил посылку, открыл, достал макетную плату потыкал светодиоды резистор кнопки, потом подумал что я с этим сделаю, все придумал, написал это все сам, ничего не крал

*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255);  Что тут не так?)

ШИМом их нахрена включать в этом варианте? DigitalWrite(l6, HIGH) али LOW.

В дальнейшем хотел добавить потенциометр

keefa
Offline
Зарегистрирован: 19.06.2015

sm1tcool пишет:

В общем такое дело

void setup() { 
 digitalWrite(but1,LOW);
 digitalWrite(but2,LOW);
 digitalWrite(but3,LOW);
}

значит переменные but1 but2 but3 должы быть LOW. но принт говорит что все 3 равны 1. Провода от кнопок отключил ничего не меняется

but1, but2, but3 - это константы, точнее имена вводов.

переменные btn1, btn2, btn3

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

sm1tcool пишет:

analogWrite(l5,0); analogWrite(l6,255);  Что тут не так?)

если analogWrite(l6,255); last6==1 или last6==0 ?

sm1tcool
Offline
Зарегистрирован: 12.10.2015

Клапауций 070 пишет:

sm1tcool пишет:

analogWrite(l5,0); analogWrite(l6,255);  Что тут не так?)

если analogWrite(l6,255); last6==1 или last6==0 ?


Ну если выполнить условие и л6 присвоится 255, следующим действием last6 получит значение 1

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

sm1tcool пишет:
Клапауций 070 пишет:

sm1tcool пишет:

analogWrite(l5,0); analogWrite(l6,255);  Что тут не так?)

если analogWrite(l6,255); last6==1 или last6==0 ?

Ну если выполнить условие и л6 присвоится 255, следующим действием last6 получит значение 1

ок. и, как узнать, сколько раз была нажата кнопка? 1, 2 или 3?

_DarkVoid_
Offline
Зарегистрирован: 12.10.2015

Код, конечно, сложно читать)

У тебя все три условия идет друг за другом, а должны идти через else. Первое условия (оба == 0) выполняется первым (т.к. переменные инициализированы 0-ми). В нем выставляется =0 и =1. После этого проверяется второе условия ( оба == 1), но не срабатывает. Потом проверяется 3-е - там как раз 0 и 1 (именно так и было выставлено выше в 1-ом условии). Оно срабатывает и выставляет 1 и 1. И т.д.

Т.е. должно быть так:

Только первый блок условий:

if (digitalRead(but1)==HIGH) //начинается жесть, на кнопки не жму, светодиоды моргают сами по себе, хоть и переменная but1==LOW, и так со всеми цветами, самое ужастное что при нажатии на кнопку ничего с переменной but1, but2, but3 не происходит? это видно в мониторе последовательного порта
{
	if (last1==0 and last2==0) //это условие выполняется не в зависимости от того истино ли "старшее" условие
	{ 
		analogWrite(l1,255); 
		analogWrite(l2,0); 
		last1=1; Serial.print("last1=1");Serial.println(); 
		last2=0; Serial.print("last2=0");Serial.println();Serial.println(); 
	} else if (last1==1 and last2==1) { 
		analogWrite(l1,0); 
		analogWrite(l2,0); 
		last1=0; Serial.print("last1=0");Serial.println(); 
		last2=0; Serial.print("last2=0");Serial.println();Serial.println(); 
	} else if (last1==1 and last2==0) { 
		analogWrite(l1,255); 
		analogWrite(l2,255); 
		last1=1; Serial.print("last1=1");Serial.println(); 
		last2=1; Serial.print("last2=1");Serial.println();Serial.println(); 
	} 
}

Остальные по аналогии. Я не тестировал, но проблем должно стать точно меньше.

Вообще могу дать пару мелких советов (если интересует):

1. для управления светодиодами лучше использовать все же digitalWrite. Особенно если используется digitalRead ;)

2. Для "флагов" используй не int а boolean.

3. В твоем случае задачу можно решить компактнее: добавить три переменных-счетчика типа int - на каждую кнопку по одному. При опросе кнопок при каждом нажатии увеличивать соответствующую переменную на 1.

После опроса вызывать ф-ию вкл/выкл светодиодов, которая работает по принципу: если счетчик кнопки = 0 ничего не зажигаем. Если = 1 то зажигаем 1-ый светодиод, если = 2 - зажигаем второй.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
sm1tcool пишет:
начинается жесть, на кнопки не жму, светодиоды моргают сами по себе
 
Схему подключения кнопок и светодиодов в студию. Точную схему (рисунком), а не "ля-ля-ля".
 
sm1tcool пишет:
это условие выполняется не в зависимости от того истино ли "старшее" условие
 
Сиё есть бред. Так не бывает и так, на самом деле не происходит. А кажется так потому, что ... в общем так, если хотите нормальных советов,то:
 
1. Схему подключения в студию
2. Нормально, по правилам выложенный скетч в студию
3. Копипаст лога, котрый идёт в Serial, также в студию.
 
Будет всё это - будет о чём говорить
sm1tcool
Offline
Зарегистрирован: 12.10.2015

Спасибо за советы, но мне нужно будет подключить потенциометр  поэтому digital.write не подходит, нужно регулировать яркость. А что касается счетчика, этот вариант мне тоже не подойдет, т.к. светодиоды будут включаться/выключаться не только в этом условии. А про ELSE щас попробую, наверное действительно проблем станет меньше, и как сам не додумался)

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

sm1tcool пишет:

А что касается счетчика, этот вариант мне тоже не подойдет

всем плевать, что тебе подойдёт - как балалайка будет знать, сколько раз ты нажал на кнопку?

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

sm1tcool, так що, схемы, скетча и лога не будет? Ну, тогда сами разбирайтесь. Удачи!

Maverik
Offline
Зарегистрирован: 12.09.2012

Только что изменил ничего не поменялось, осталось так же

а как оно вообще скомпилировалось ? 

sm1tcool
Offline
Зарегистрирован: 12.10.2015

Я не получал нигде это занятие, вообще не думал что где то этому учат, я сам себе придумал это задание. Счетчик делать не захотел, считаю что мой вариант должен работать, причину почему не работает не могу найти, щас попробую присвоить high

Клапауций 070
Offline
Зарегистрирован: 26.09.2015

sm1tcool пишет:
Я не получал нигде это занятие, вообще не думал что где то этому учат, я сам себе придумал это задание. Счетчик делать не захотел, считаю что мой вариант должен работать, причину почему не работает не могу найти, щас попробую присвоить high

мне одному показалось, что бот сломался?

bwn
Offline
Зарегистрирован: 25.08.2014

Клапауций 070 пишет:

sm1tcool пишет:
Я не получал нигде это занятие, вообще не думал что где то этому учат, я сам себе придумал это задание. Счетчик делать не захотел, считаю что мой вариант должен работать, причину почему не работает не могу найти, щас попробую присвоить high

мне одному показалось, что бот сломался?

Та уж давно)))