Апгрейд скетча

GOODZM
Offline
Зарегистрирован: 10.05.2019

Многоуважаемые жители форума, помогите модернизировать готовую рабочую программу. Необходимо переключить две кнопки к одному аналогову входу...

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

 

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

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

gfx125
Offline
Зарегистрирован: 27.05.2017

если научиться, то почитайте здесь

GOODZM
Offline
Зарегистрирован: 10.05.2019

Хочу научиться самостоятельно, но и был бы не против, если бы доработали скетч под аналоговые кнопки :))

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

GOODZM пишет:

 был бы не против, если бы доработали скетч под аналоговые кнопки :))

в платном разделе

GOODZM
Offline
Зарегистрирован: 10.05.2019

Милости прошу туда :)

nik182
Offline
Зарегистрирован: 04.05.2015

Несколько дней назад была аналогичная тема. Даже дежавю какое то словил. Там было достаточно советов, что бы всё сделать самому. 

GOODZM
Offline
Зарегистрирован: 10.05.2019

Вероятнее всего вы про эту тему 

http://arduino.ru/forum/programmirovanie/nuzhna-pomoshch-so-sketchem-dve-knopki

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

nik182 пишет:

Несколько дней назад была аналогичная тема. Даже дежавю какое то словил. Там было достаточно советов, что бы всё сделать самому. 

Так во #2, дали верное направление, а лень, она дорого стоит.

GOODZM
Offline
Зарегистрирован: 10.05.2019

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

nik182
Offline
Зарегистрирован: 04.05.2015

А как назвать то, что не прочитали заголовки форума хотя бы за пару дней или не воспользововались поиском? По мне это как раз лень. В найденных темах можно найти множество мнений. Объясните, пожалуйста, почему я должен в очередной, энный, раз писать одно и то же? 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Вот подпрограмма и дефайны под 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());
}

 

GOODZM
Offline
Зарегистрирован: 10.05.2019

Огромное вам спасибо!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Вот пакароче 

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

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

DetSimen пишет:

Вот пакароче 

Спасибо! И повеселее - сейчас у себя в программе поменяю.

Кстати эта подпрограмма для шилда LCD1602 с кнопками.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

mykaida пишет:

Кстати эта подпрограмма для шилда 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;
}

 

GOODZM
Offline
Зарегистрирован: 10.05.2019

Если не сложно, можете немного пояснить эту часть 

uint16_t buttonValue = 0;

	for (uint8_t i = 0; i < 16; i++) buttonValue += analogRead(A0);  // читаем 16 рас
	
	buttonValue >>= 4;			// потом усредняем

 

GOODZM
Offline
Зарегистрирован: 10.05.2019

цикл for , если быть конкретнее 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

тоись, ты даже этого не понимаешь?  тогда точно наданапица.  мне. 

GOODZM
Offline
Зарегистрирован: 10.05.2019

Не понимаю значение i < 16 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

16 раз читаем analogRead(A0)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

спомни математику, класс, примерна, пятый.  Как найти среднее значение?

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

DetSimen пишет:

спомни математику, класс, примерна, пятый.  Как найти среднее значение?

Точно, как сейчас помню: >>=4; )))))

Green
Онлайн
Зарегистрирован: 01.10.2015

DetSimen пишет:

тоись, ты даже этого не понимаешь?  тогда точно наданапица.  мне. 

Ну и как с такими бросишь пить!)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

у меня, канеш, процедура чтения кнопок шилда 1602 несколько посложнее, но давай пока с этой разберемся,  пока я синячить не ушол

GOODZM
Offline
Зарегистрирован: 10.05.2019

Ааа, всё, тупанул. Спасибо!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

и так непонятно? 

for (uint8_t i = 0; i < 16; i++) buttonValue += analogRead(A0);  // читаем 16 рас

аналог:

сумма = 0
сумма = сумма+analogRead(A0);
.
.   // и так 16 раз
.
сумма = сумма+analogRead(A0);

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

GOODZM пишет:

Ааа, всё, тупанул. Спасибо!

Б-ть!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Если въехал чо к чему, теперь подумай, что будет, если кнопку отпустить в середине цикла?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

DetSimen пишет:

Если въехал чо к чему, теперь подумай, что будет, если кнопку отпустить в середине цикла?

Эт значит, что у тебя реакция как у Шумахера, а то и покруче :)

nik182
Offline
Зарегистрирован: 04.05.2015

Как там у Мерфи - если гадость может случится, то она случится. Так что только так и раз и на середине. 

GOODZM
Offline
Зарегистрирован: 10.05.2019

Кто-ниубдь, прошу! Объясните мне, почему светодиоды зараграются сами собой без нажатия на аналоговые кнопки.АААААААААААААААААА

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

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

GOODZM пишет:

Кто-ниубдь, прошу! Объясните мне, почему светодиоды зараграются сами собой без нажатия на аналоговые кнопки.АААААААААААААААААА

А строку 19 прочитать слабо? Чего Вы там просите сделать?

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

[quote=GOODZMКто-ниубдь, прошу! Объясните мне, почему светодиоды зараграются сами собой без нажатия на аналоговые кнопки

[/quote]

а вход А0 к питанию или к земле подтянул? - если нет, то и будут загораться

 

А вот эта строчка класссная...

while (analogRead(0)<1030);

 

GOODZM
Offline
Зарегистрирован: 10.05.2019

Без вопросов на вопрос...ПРОШУУ ВАС!!

GOODZM
Offline
Зарегистрирован: 10.05.2019

Схему собрал верно...Проблема в коде и моих руках

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

О! В сетапе определите начальное состояние выходов led.

GOODZM
Offline
Зарегистрирован: 10.05.2019

Заливая этот скетч светодиоды не загараются без нажатия на кнопку ...В схеме ничего не менял. 

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

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

А гасить светодиоды при BUTTON_NONE Пушкин будет?

И 23 строку удалите

GOODZM
Offline
Зарегистрирован: 10.05.2019

mykaida пишет:

А гасить светодиоды при BUTTON_NONE Пушкин будет?

И 23 строку удалите

23 строчку удалил, но куда вписать  BUTTON_NONE  ?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

GOODZM пишет:

Кто-ниубдь, прошу! Объясните мне, почему светодиоды зараграются сами собой без нажатия на аналоговые кнопки.АААААААААААААААААА

Потомк, чтот у вас такая фигня написана, что выдает полное непонимание основ программирования Могу только порекомендовать поискать в сети что нибудь вроде "Основы программирование на С" или "С для чайникав". 

GOODZM
Offline
Зарегистрирован: 10.05.2019

Не спорю! Но я пытаюсь разобраться в этом. А вы, если видите ошибку, помогите, пожалуйста :)

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Да там не ошибка, там все неправильно.

 

GOODZM
Offline
Зарегистрирован: 10.05.2019

Не может быть всё, ибо часть кода взята со скетча человека, который писал выше!

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Гля!!!

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

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Изучайте си!!!

GOODZM
Offline
Зарегистрирован: 10.05.2019

Только что попробовал ваш новый скетч. Светодиоды не зажигаются. Огромнейшая вам благодарность... Если не секрет, где ошибка в моём скетче ?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

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


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);
  }
//досюда
}

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

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

GOODZM пишет:

Если не секрет, где ошибка в моём скетче ?

строки 11, 19, 23. 36, 41

А вообще -вам верно сказаи. Вы программировать не умеете СОВСЕМ. И с таким знаниями вам на форуме делать нечего, пока не прочитаете какой-нибудь учебник СИ хотя бы до половины - не тратье время участников

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

mykaida пишет:

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


не только. "Там всю систему менять надо" (с)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

b707 пишет:

mykaida пишет:

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


не только. "Там всю систему менять надо" (с)

А чего тогда в песочницу не отправите?