Помогите новичку разобраться в программе
- Войдите на сайт для отправки комментариев
Пнд, 12/10/2015 - 15:43
Чего хочу добиться: Есть 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);
}
что за and? замените на &&
для того что бы не использовать внешние подтягивающие резисторы, подключи кнопки к минусу и подтяжку сделай к плюсу в коде, так будет правельнее. и не так как вы написали:
при первом нажатии загорается один светодиод, при втором второй, при третьем выключается, и так остальные 2 кнопки. У меня условие работает неправильно, помогите понять почему при проверке на истину все равно выполняется действие (условие в условии). помогите разобраться чайнику
было уже это техзадание. признавайся, где это задают и куда нужно писать, что бы не присылали сюда никого?
"при первом нажатии" какой кнопки? 1-й, 2-й, 3-й??
далее - где у тебя в коде счётчик нажатий кнопки?
Я не получал нигде это занятие, вообще не думал что где то этому учат, я сам себе придумал это задание. Счетчик делать не захотел, считаю что мой вариант должен работать, причину почему не работает не могу найти, щас попробую присвоить LOW. Кстати кнопки я так и подключил через резистор, нифига значение переменных but1, but2, but3 не меняются от нажатия на кнопку, уже замыкаю напрямую без кнопок, 1 фиг не работает
при нажатии на любую кнопку. Это не техзадание)
что за and? замените на &&
это важно?
что за and? замените на &&
это важно?
а я хз, в си такого нет. возможно это арифметическая операция а не логическая. это только IDE известно.
что за and? замените на &&
это важно?
а я хз, в си такого нет. возможно это арифметическая операция а не логическая. это только IDE известно.
Только что изменил ничего не поменялось, осталось так же
что за and? замените на &&
это важно?
найди здесь "and" http://arduino.ru/Reference
что за and? замените на &&
это важно?
найди здесь "and" http://arduino.ru/Reference
Не нашел, но работает и так и так одинаково)
Я так понимаю у тебя не работают даже кнопки. для начала удали весь код и добейся того, что бы срабатывали кнопки, потом будешь понемног удобавлять.
Не нашел, но работает и так и так одинаково)
не факт, т.к. у вас пока вобще ничего не работает. )))
считаешь, что должен работать, но не работает - и, кто прав? ты или объективная реальность?
попробуй начни вот с этого:
попробуй начни вот с этого:
спасибо щас попробую
Я так понимаю у тебя не работают даже кнопки. для начала удали весь код и добейся того, что бы срабатывали кнопки, потом будешь понемног удобавлять.
Понимаю что это наверное самый правильный вариант, но заново делать не хочется, да и лучше найти ошибку ничего не удаляя. Думал может тут кто поймет
Я так понимаю у тебя не работают даже кнопки. для начала удали весь код и добейся того, что бы срабатывали кнопки, потом будешь понемног удобавлять.
Понимаю что это наверное самый правильный вариант, но заново делать не хочется, да и лучше найти ошибку ничего не удаляя. Думал может тут кто поймет
Если хочешь что бы сделали за тебя, то тебе не сюда. А если хочешь научиться, то делай так как говорят. не сильно то много тебе там удалять (менять). Просто закоментируй лишнее, и добавляй понемногу.
соединяй по этой схеме
соединяй по этой схеме
Все так и есть, только еще резистор
ТС признавайся, у кого украл дохлый код и сюда притащил?
*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255);
Я так понимаю у тебя не работают даже кнопки. для начала удали весь код и добейся того, что бы срабатывали кнопки, потом будешь понемног удобавлять.
Понимаю что это наверное самый правильный вариант, но заново делать не хочется, да и лучше найти ошибку ничего не удаляя. Думал может тут кто поймет
Если хочешь что бы сделали за тебя, то тебе не сюда. А если хочешь научиться, то делай так как говорят. не сильно то много тебе там удалять (менять). Просто закоментируй лишнее, и добавляй понемногу.
Вот именно что понять сам хочу, но ставить счетчик мне нет смысла, т.к. на диоды будут влиять не только кнопки, а работать все будет взависимости от состояния светодиодов.
ТС признавайся, у кого украл дохлый код и сюда притащил?
*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255);
Вчера вечером получил посылку, открыл, достал макетную плату потыкал светодиоды резистор кнопки, потом подумал что я с этим сделаю, все придумал, написал это все сам, ничего не крал
*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255); Что тут не так?)
ТС признавайся, у кого украл дохлый код и сюда притащил?
*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255);
Вчера вечером получил посылку, открыл, достал макетную плату потыкал светодиоды резистор кнопки, потом подумал что я с этим сделаю, все придумал, написал это все сам, ничего не крал
*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255); Что тут не так?)
ШИМом их нахрена включать в этом варианте? DigitalWrite(l6, HIGH) али LOW.
В общем такое дело
значит переменные but1 but2 but3 должы быть LOW. но принт говорит что все 3 равны 1. Провода от кнопок отключил ничего не меняется
ТС признавайся, у кого украл дохлый код и сюда притащил?
*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255);
Вчера вечером получил посылку, открыл, достал макетную плату потыкал светодиоды резистор кнопки, потом подумал что я с этим сделаю, все придумал, написал это все сам, ничего не крал
*шо это за дурь? analogWrite(l5,0); analogWrite(l6,255); Что тут не так?)
ШИМом их нахрена включать в этом варианте? DigitalWrite(l6, HIGH) али LOW.
В дальнейшем хотел добавить потенциометр
В общем такое дело
значит переменные but1 but2 but3 должы быть LOW. но принт говорит что все 3 равны 1. Провода от кнопок отключил ничего не меняется
but1, but2, but3 - это константы, точнее имена вводов.
переменные btn1, btn2, btn3
analogWrite(l5,0); analogWrite(l6,255); Что тут не так?)
если analogWrite(l6,255); last6==1 или last6==0 ?
analogWrite(l5,0); analogWrite(l6,255); Что тут не так?)
если analogWrite(l6,255); last6==1 или last6==0 ?
Ну если выполнить условие и л6 присвоится 255, следующим действием last6 получит значение 1
analogWrite(l5,0); analogWrite(l6,255); Что тут не так?)
если analogWrite(l6,255); last6==1 или last6==0 ?
ок. и, как узнать, сколько раз была нажата кнопка? 1, 2 или 3?
Код, конечно, сложно читать)
У тебя все три условия идет друг за другом, а должны идти через else. Первое условия (оба == 0) выполняется первым (т.к. переменные инициализированы 0-ми). В нем выставляется =0 и =1. После этого проверяется второе условия ( оба == 1), но не срабатывает. Потом проверяется 3-е - там как раз 0 и 1 (именно так и было выставлено выше в 1-ом условии). Оно срабатывает и выставляет 1 и 1. И т.д.
Т.е. должно быть так:
Только первый блок условий:
Остальные по аналогии. Я не тестировал, но проблем должно стать точно меньше.
Вообще могу дать пару мелких советов (если интересует):
1. для управления светодиодами лучше использовать все же digitalWrite. Особенно если используется digitalRead ;)
2. Для "флагов" используй не int а boolean.
3. В твоем случае задачу можно решить компактнее: добавить три переменных-счетчика типа int - на каждую кнопку по одному. При опросе кнопок при каждом нажатии увеличивать соответствующую переменную на 1.
После опроса вызывать ф-ию вкл/выкл светодиодов, которая работает по принципу: если счетчик кнопки = 0 ничего не зажигаем. Если = 1 то зажигаем 1-ый светодиод, если = 2 - зажигаем второй.
Спасибо за советы, но мне нужно будет подключить потенциометр поэтому digital.write не подходит, нужно регулировать яркость. А что касается счетчика, этот вариант мне тоже не подойдет, т.к. светодиоды будут включаться/выключаться не только в этом условии. А про ELSE щас попробую, наверное действительно проблем станет меньше, и как сам не додумался)
А что касается счетчика, этот вариант мне тоже не подойдет
всем плевать, что тебе подойдёт - как балалайка будет знать, сколько раз ты нажал на кнопку?
sm1tcool, так що, схемы, скетча и лога не будет? Ну, тогда сами разбирайтесь. Удачи!
Только что изменил ничего не поменялось, осталось так же
а как оно вообще скомпилировалось ?
Я не получал нигде это занятие, вообще не думал что где то этому учат, я сам себе придумал это задание. Счетчик делать не захотел, считаю что мой вариант должен работать, причину почему не работает не могу найти, щас попробую присвоить high
мне одному показалось, что бот сломался?
мне одному показалось, что бот сломался?
Та уж давно)))