Апгрейд скетча
- Войдите на сайт для отправки комментариев
Ср, 15/05/2019 - 13:18
Многоуважаемые жители форума, помогите модернизировать готовую рабочую программу. Необходимо переключить две кнопки к одному аналогову входу...
const int green=8;
const int green1=7;
const int green2=6;
const int green3=5;
const int red=13;
const int red1=12;
const int red2=11;
const int red3=10;
const int BUTTON=2;
const int BUTTON1=3;
boolean lastButton = LOW;
boolean currentButton = LOW;
int ledMode = 0;
void setup()
{
pinMode (green, OUTPUT);
pinMode (green1, OUTPUT);
pinMode (green2, OUTPUT);
pinMode (green3, OUTPUT);
pinMode (red, OUTPUT);
pinMode (red1, OUTPUT);
pinMode (red2, OUTPUT);
pinMode (red3, OUTPUT);
pinMode (BUTTON, INPUT);
pinMode (BUTTON1, INPUT);
}
void loop()
{
int c;
for(;;)
{
if(digitalRead (BUTTON) == HIGH)
{
c=gg(BUTTON);
setMode(c,green,green1,red,red1);
}
if(digitalRead (BUTTON1) == HIGH)
{
c=gg(BUTTON1);
setMode(c,green2,green3,red2,red3);
}
}
}
int gg(int BUTTONX)
{
currentButton = debounce(lastButton,BUTTONX);
if (lastButton == LOW && currentButton == HIGH)
{
ledMode++;
}
lastButton = currentButton;
if (ledMode == 3) ledMode = 1;
return(ledMode);
}
boolean debounce(boolean last,int BUTTONX)
{
boolean current = digitalRead(BUTTONX);
if (last != current)
{
delay(5);
current = digitalRead(BUTTONX);
}
return current;
}
void setMode(int mode,int svet,int svet1,int svet2,int svet3)
{
if (mode == 1)
{
digitalWrite(svet,LOW);
digitalWrite(svet1,LOW);
digitalWrite(svet2, HIGH);
delay(1000);
digitalWrite(svet3, HIGH);
}
else if (mode == 2)
{
digitalWrite(svet2,LOW);
digitalWrite(svet3,LOW);
digitalWrite(svet, HIGH);
delay(1000);
digitalWrite(svet1,HIGH);
}
}
вы хотите научится это делать самостоятельно или вам нужен просто готовый результат?
если научиться, то почитайте здесь
Хочу научиться самостоятельно, но и был бы не против, если бы доработали скетч под аналоговые кнопки :))
был бы не против, если бы доработали скетч под аналоговые кнопки :))
в платном разделе
Милости прошу туда :)
Несколько дней назад была аналогичная тема. Даже дежавю какое то словил. Там было достаточно советов, что бы всё сделать самому.
Вероятнее всего вы про эту тему
http://arduino.ru/forum/programmirovanie/nuzhna-pomoshch-so-sketchem-dve-knopki
Несколько дней назад была аналогичная тема. Даже дежавю какое то словил. Там было достаточно советов, что бы всё сделать самому.
Так во #2, дали верное направление, а лень, она дорого стоит.
Кто сказал что я ленюсь. Программу переделал и сейчас уже собираю схему для проверки. Я предпочитаю иметь несколько вариантов решения моей проблемы. На случай, если всё же мне не удастся это реализовать самому :)
А как назвать то, что не прочитали заголовки форума хотя бы за пару дней или не воспользововались поиском? По мне это как раз лень. В найденных темах можно найти множество мнений. Объясните, пожалуйста, почему я должен в очередной, энный, раз писать одно и то же?
Вот подпрограмма и дефайны под 5 аналоговых кнопок с примером использования. Пользуйтесь
#define BUTTON_NONE 0 #define BUTTON_RIGHT 1 #define BUTTON_UP 2 #define BUTTON_DOWN 3 #define BUTTON_LEFT 4 #define BUTTON_SELECT 5 int getPressedButton() { int button; int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0) if (buttonValue > 1000) { return BUTTON_NONE; } else if (buttonValue < 100) { button = BUTTON_RIGHT; } else if (buttonValue < 200) { button = BUTTON_UP; } else if (buttonValue < 400){ button = BUTTON_DOWN; } else if (buttonValue < 600){ button = BUTTON_LEFT; } else if (buttonValue < 800){ button = BUTTON_SELECT; }else { return BUTTON_NONE; } while (analogRead(0)<1000); return button; } void setup(){ Serial.begin(9600); } void loop(){ Serial.println(getPressedButton()); }Огромное вам спасибо!
Вот пакароче
int getPressedButton() { uint16_t buttonValue = 0; for (uint8_t i = 0; i < 16; i++) buttonValue += analogRead(A0); // читаем 16 рас buttonValue >>= 4; // потом усредняем if (buttonValue > 1000) return BUTTON_NONE; if (buttonValue < 100) return BUTTON_RIGHT; if (buttonValue < 200) return BUTTON_UP; if (buttonValue < 400) return BUTTON_DOWN; if (buttonValue < 600) return BUTTON_LEFT; if (buttonValue < 800) return BUTTON_SELECT; return BUTTON_NONE; }Вот пакароче
Спасибо! И повеселее - сейчас у себя в программе поменяю.
Кстати эта подпрограмма для шилда LCD1602 с кнопками.
Кстати эта подпрограмма для шилда LCD1602 с кнопками.
Я знаю. Вот еще можно сократить
int getPressedButton() { uint16_t buttonValue = 0; for (uint8_t i = 0; i < 16; i++) buttonValue += analogRead(A0); // читаем 16 рас buttonValue >>= 4; // потом усредняем if (buttonValue > 800) return BUTTON_NONE; if (buttonValue < 100) return BUTTON_RIGHT; if (buttonValue < 200) return BUTTON_UP; if (buttonValue < 400) return BUTTON_DOWN; if (buttonValue < 600) return BUTTON_LEFT; return BUTTON_SELECT; }Если не сложно, можете немного пояснить эту часть
цикл for , если быть конкретнее
тоись, ты даже этого не понимаешь? тогда точно наданапица. мне.
Не понимаю значение i < 16
16 раз читаем analogRead(A0)
спомни математику, класс, примерна, пятый. Как найти среднее значение?
спомни математику, класс, примерна, пятый. Как найти среднее значение?
Точно, как сейчас помню: >>=4; )))))
тоись, ты даже этого не понимаешь? тогда точно наданапица. мне.
Ну и как с такими бросишь пить!)
у меня, канеш, процедура чтения кнопок шилда 1602 несколько посложнее, но давай пока с этой разберемся, пока я синячить не ушол
Ааа, всё, тупанул. Спасибо!
и так непонятно?
for(uint8_t i = 0; i < 16; i++) buttonValue += analogRead(A0);// читаем 16 расаналог:Ааа, всё, тупанул. Спасибо!
Б-ть!
Если въехал чо к чему, теперь подумай, что будет, если кнопку отпустить в середине цикла?
Если въехал чо к чему, теперь подумай, что будет, если кнопку отпустить в середине цикла?
Эт значит, что у тебя реакция как у Шумахера, а то и покруче :)
Как там у Мерфи - если гадость может случится, то она случится. Так что только так и раз и на середине.
Кто-ниубдь, прошу! Объясните мне, почему светодиоды зараграются сами собой без нажатия на аналоговые кнопки.АААААААААААААААААА
#define BUTTON_NONE 0 #define BUTTON_RIGHT 1 #define BUTTON_UP 2 const int LED =2; const int LED1=3; int getPressedButton() { int button; int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0) if (buttonValue > 1000) { return BUTTON_NONE; } else if (buttonValue >=100 && buttonValue < 550) { button = BUTTON_RIGHT; } else if (buttonValue >= 550 && buttonValue <1023) { button = BUTTON_UP; } while (analogRead(0)<1030); return button; } void setup () { pinMode ( LED, OUTPUT); pinMode ( LED1, OUTPUT); } void loop () { if (analogRead(BUTTON_RIGHT)) { digitalWrite(LED, HIGH); digitalWrite(LED1, LOW); } if (analogRead(BUTTON_UP)) { digitalWrite(LED, LOW); digitalWrite(LED1,HIGH); } }Кто-ниубдь, прошу! Объясните мне, почему светодиоды зараграются сами собой без нажатия на аналоговые кнопки.АААААААААААААААААА
А строку 19 прочитать слабо? Чего Вы там просите сделать?
[quote=GOODZMКто-ниубдь, прошу! Объясните мне, почему светодиоды зараграются сами собой без нажатия на аналоговые кнопки
[/quote]
а вход А0 к питанию или к земле подтянул? - если нет, то и будут загораться
А вот эта строчка класссная...
Без вопросов на вопрос...ПРОШУУ ВАС!!
Схему собрал верно...Проблема в коде и моих руках
О! В сетапе определите начальное состояние выходов led.
Заливая этот скетч светодиоды не загараются без нажатия на кнопку ...В схеме ничего не менял.
void setup() { Serial.begin(9600); pinMode(2, OUTPUT); pinMode(3, OUTPUT); } void loop() { int sensorValue = analogRead(A0); if (sensorValue >= 100 && sensorValue < 550) { digitalWrite(2, HIGH); digitalWrite(3, LOW); } else if (sensorValue >= 550 && sensorValue < 1024) { digitalWrite(2, LOW); digitalWrite(3, HIGH); } else { digitalWrite(2, LOW); digitalWrite(3, LOW); } }А гасить светодиоды при BUTTON_NONE Пушкин будет?
И 23 строку удалите
А гасить светодиоды при BUTTON_NONE Пушкин будет?
И 23 строку удалите
23 строчку удалил, но куда вписать BUTTON_NONE ?
Кто-ниубдь, прошу! Объясните мне, почему светодиоды зараграются сами собой без нажатия на аналоговые кнопки.АААААААААААААААААА
Потомк, чтот у вас такая фигня написана, что выдает полное непонимание основ программирования Могу только порекомендовать поискать в сети что нибудь вроде "Основы программирование на С" или "С для чайникав".
Не спорю! Но я пытаюсь разобраться в этом. А вы, если видите ошибку, помогите, пожалуйста :)
Да там не ошибка, там все неправильно.
Не может быть всё, ибо часть кода взята со скетча человека, который писал выше!
Гля!!!
void loop (){ switch(getPressedButton()){ case BUTTON_RIGHT: digitalWrite(LED, HIGH); digitalWrite(LED1, LOW); break; case BUTTON_LEFT: digitalWrite(LED, LOW); digitalWrite(LED1, HIGH); break; case BUTTON_NONE: digitalWrite(LED, LOW); digitalWrite(LED1, LOW); break; } }Изучайте си!!!
Только что попробовал ваш новый скетч. Светодиоды не зажигаются. Огромнейшая вам благодарность... Если не секрет, где ошибка в моём скетче ?
В том, что Вы не использовали подпрограмму, а опять читали аналоговый вход
void loop () { if (analogRead(BUTTON_RIGHT)) // Надо было if (getPressedButton()==BUTTON_RIGHT) { digitalWrite(LED, HIGH); digitalWrite(LED1, LOW); } if (analogRead(BUTTON_UP)) // Надо было if (getPressedButton()==BUTTON_UP) { digitalWrite(LED, LOW); digitalWrite(LED1,HIGH); } //А этого вообще не было if (getPressedButton()==BUTTON_NONE) { digitalWrite(LED, LOW); digitalWrite(LED1,LOW); } //досюда }Но в моем варианте покороче, а если подтянутся гуру, так и мою программу сократят
Если не секрет, где ошибка в моём скетче ?
строки 11, 19, 23. 36, 41
А вообще -вам верно сказаи. Вы программировать не умеете СОВСЕМ. И с таким знаниями вам на форуме делать нечего, пока не прочитаете какой-нибудь учебник СИ хотя бы до половины - не тратье время участников
В том, что Вы не использовали подпрограмму, а опять читали аналоговый вход
не только. "Там всю систему менять надо" (с)
В том, что Вы не использовали подпрограмму, а опять читали аналоговый вход
не только. "Там всю систему менять надо" (с)
А чего тогда в песочницу не отправите?