Кнопки. Внешнее питание.

zzzzza
Offline
Зарегистрирован: 18.11.2016

Всем привет!

Имеется "Arduino nano", 6 тактовых кнопок и еще 5 модулей (они просто припаяны, но в коде они не используются пока что).

Проблемы возникли именно с кнопками. Подключены они так: одна ножка кнопки к пину, другая - к +5v (без резисторов).

Сначала предоставлю код:

/*Все, что относится к кнопкам*/
#define PINBUTTONLEFT A0 //Кнопка влево.
#define PINBUTTONUP A1 //Кнопка вверх.
#define PINBUTTONRIGHT A2 //Кнопка вправо.
#define PINBUTTONDOWN A3 //Кнопка вниз.
#define PINBUTTONPRESS A6 //Кнопка нажать.
#define PINBUTTONMENU A7 //Кнопка меню.

#define BUTTONDELAY 50 //Задержка от дребезжания.


//Кнопка влево.
boolean buttLeftFlag = 0; //Нажата или нет.
unsigned long buttonLeftLastPress = 0; //Время, чтобы избежать дребезжания.
//Кнопка вверх.
boolean buttUpFlag = 0; //Нажата или нет.
unsigned long buttonUpLastPress = 0; //Время, чтобы избежать дребезжания.
//Кнопка вправо.
boolean buttRightFlag = 0; //Нажата или нет.
unsigned long buttonRightLastPress = 0; //Время, чтобы избежать дребезжания.
//Кнопка вниз.
boolean buttDownFlag = 0; //Нажата или нет.
unsigned long buttonDownLastPress = 0; //Время, чтобы избежать дребезжания.
//Кнопка нажать.
boolean buttPressFlag = 0; //Нажата или нет.
unsigned long buttonPressLastPress = 0; //Время, чтобы избежать дребезжания.
//Кнопка меню.
boolean buttMenuFlag = 0; //Нажата или нет.
unsigned long buttonMenuLastPress = 0; //Время, чтобы избежать дребезжания.
/*Конец того, что относится к кнопкам*/





/******************************************ФУНКЦИИ КНОПОК*************************************************************/
void BUTTONCHECK() //Проверка нажатия любой кнопки.
 {
  boolean buttLeft = !digitalRead(PINBUTTONLEFT); //Кнопка влево.
  boolean buttUp = !digitalRead(PINBUTTONUP); //Кнопка вверх.
  boolean buttRight = !digitalRead(PINBUTTONRIGHT); //Кнопка вправо.
  boolean buttDown = !digitalRead(PINBUTTONDOWN); //Кнопка вниз. 
  boolean buttPress = !digitalRead(PINBUTTONPRESS); //Кнопка нажать.
  boolean buttMenu = !digitalRead(PINBUTTONMENU); //Кнопка меню.

  //Кнопка влево.
  if ((buttLeft == 1) && (buttLeftFlag == 0) && (millis() - buttonLeftLastPress > BUTTONDELAY)) //Нажали.
   {
    buttLeftFlag = 1; 
    ButtonLeftFunc();
    buttonLeftLastPress = millis();
   }
  if (buttLeft == 0 && buttLeftFlag == 1) //Отпустили.
   {
    buttLeftFlag = 0; 
   } 

  //Кнопка вверх.
  if ((buttUp == 1) && (buttUpFlag == 0) && (millis() - buttonUpLastPress > BUTTONDELAY)) //Нажали.
   {
    buttUpFlag = 1; 
    ButtonUpFunc();
    buttonUpLastPress = millis();
   }
  if (buttUp == 0 && buttUpFlag == 1) //Отпустили.
   {
    buttUpFlag = 0; 
   } 

  //Кнопка вправо.
  if ((buttRight == 1) && (buttRightFlag == 0) && (millis() - buttonRightLastPress > BUTTONDELAY)) //Нажали.
   {
    buttRightFlag = 1; 
    ButtonRightFunc();
    buttonRightLastPress = millis();
   }
  if (buttRight == 0 && buttRightFlag == 1) //Отпустили.
   {
    buttRightFlag = 0; 
   }

  //Кнопка вниз.
  if ((buttDown == 1) && (buttDownFlag == 0) && (millis() - buttonDownLastPress > BUTTONDELAY)) //Нажали.
   {
    buttDownFlag = 1; 
    ButtonDownFunc();
    buttonDownLastPress = millis();
   }
  if (buttDown == 0 && buttDownFlag == 1) //Отпустили.
   {
    buttDownFlag = 0; 
   }

  //Кнопка нажать.
  if ((buttPress == 1) && (buttPressFlag == 0) && (millis() - buttonPressLastPress > BUTTONDELAY)) //Нажали.
   {
    buttPressFlag = 1; 
    ButtonPressFunc();
    buttonPressLastPress = millis();
   }
  if (buttPress == 0 && buttPressFlag == 1) //Отпустили.
   {
    buttPressFlag = 0; 
   }

  //Кнопка меню.
  if ((buttMenu == 1) && (buttMenuFlag == 0) && (millis() - buttonMenuLastPress > BUTTONDELAY)) //Нажали.
   {
    buttMenuFlag = 1; 
    ButtonMenuFunc();
    buttonMenuLastPress = millis();
   }
  if (buttMenu == 0 && buttMenuFlag == 1) //Отпустили.
   {
    buttMenuFlag = 0; 
   }
 }




void ButtonLeftFunc() //Кнопка влево.
 {
  Serial.println("LEFT");
 }

void ButtonUpFunc() //Кнопка вверх.
 {
  Serial.println("UP");
 }

void ButtonRightFunc() //Кнопка вправо.
 {
  Serial.println("RIGHT");
 }

void ButtonDownFunc() //Кнопка вниз.
 {
  Serial.println("DOWN");
 }

void ButtonPressFunc() //Кнопка нажать.
 {
  Serial.println("PRESS");
 }

void ButtonMenuFunc() //Кнопка меню.
 {
  Serial.println("MENU");
 }
/*********************************************************************************************************************/





/******************************************SETUP***************************************************************/
void setup()
 {
  Serial.begin(9600);

  
  /*Все, что относится к кнопкам*/
  pinMode(PINBUTTONLEFT, OUTPUT); //Кнопка влево.
  pinMode(PINBUTTONUP, OUTPUT); //Кнопка вверх.
  pinMode(PINBUTTONRIGHT, OUTPUT); //Кнопка вправо.
  pinMode(PINBUTTONDOWN, OUTPUT); //Кнопка вниз.
  pinMode(PINBUTTONPRESS, OUTPUT); //Кнопка нажать.
  pinMode(PINBUTTONMENU, OUTPUT); //Кнопка меню.
  /*Конец того, что относится к кнопкам*/
 }
/**************************************************************************************************************/






/******************************************LOOP*****************************************************************/
void loop()
 {
  //ОБРАБОТКА НАЖАТИЯ НА КНОПКИ.
  BUTTONCHECK();
 }
/**************************************************************************************************************/ 

Теперь проблемы, которые возникли и я не смог понять в чем дело:

1) По какой-то причине, как только включается arduino, в Serial выводятся все нажатия кнопок, то есть как бы нажимаются все кнопки. После этого момента такое больше не происходит и кнопки работаю правильно. Почему это может быть происходить?

2) 4 кнопки подключены к пинам A0-A3 и 2 кнопки подключены к пинам A6-A7. Кнопки, подключенные к A0-A3 работают, а две кнопки, подключенные к A6-A7 не работают, то есть при нажатии на них ничего не происходит. Я сначала подумал, что купил сломанную кнопку, но прозвонил ее и оказалсоь все нормально. Что может быть не так с этими пинами?

Теперь вопросы, связанные с тем, что хочу добавить в будущем:

3) Почитал о питание arduino от внешнего источника. Решил питать от 3 батареек. И прочитал, что если подключить бокс из 3 батареек к пину "VIN", то не будет работать 3v3, а он мне нужен, чтобы питать дисплей. Вроде бы нашел информацию о том, что если питать напрямую к +5v, то 3v3 будет работать. Хочу уточнить этот вопрос у знающих людей.

4) Хочу сделать включение и выключение arduino по кнопки. Как это сделать с помощью двухфазовой кнопки кнопки я понимаю; вставить ее между блоком из 3 батареек и пином VIN/+5v. А можно ли сделать то же самое, только используя тактовую кнопку?

Заранее спасибо!

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

Посмотрите на строки 164-169. Вас там ничего не смущает?

Вы уверены, что Вы собираетесь выводить что-то на эти кнопки, а не, наоборот, читать их состояния?

И, да, OUTPUT завести на питание, да ещё и напрямую - без резистора. Вы экстремал!

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

zzzzza
Offline
Зарегистрирован: 18.11.2016

ЕвгенийП пишет:

Посмотрите на строки 164-169. Вас там ничего не смущает?

Вы уверены, что Вы собираетесь выводить что-то на эти кнопки, а не, наоборот, читать их состояния?

И, да, OUTPUT завести на питание, да ещё и напрямую - без резистора. Вы экстремал!

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

Написал "OUTPUT", так как только с ним работают кнопки. Если использовать подтягивающий резистор, то есть "INPUT_PULLUP", то кнопки вообще не реагируют.

Почему тогда при "OUTPUT" 4-е кнопки работают, а 2-е нет?

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

Кнопка должна быть между землёй и ножкой. Только тогда pullup будет работать. Если кнопки на + то обязательно нужен резистор на землю.  Почитайте http://arduino.ru/Reference/Constants  вразделе Задание режима порта вход/выхода, INPUT и OUTPUT. Вы бедный порт насилуете. Он выдает 0 , а вы ему +5 или единицу подаете. Сгорит микросхема - сам себе буратино. 

 

zzzzza
Offline
Зарегистрирован: 18.11.2016

nik182 пишет:

Кнопка должна быть между землёй и ножкой. Только тогда pullup будет работать. Если кнопки на + то обязательно нужен резистор на землю.  Почитайте http://arduino.ru/Reference/Constants  вразделе Задание режима порта вход/выхода, INPUT и OUTPUT. Вы бедный порт насилуете. Он выдает 0 , а вы ему +5 или единицу подаете. Сгорит микросхема - сам себе буратино. 

 

Ну перепаять с + на - у меня уже не получится, так как очень много проводов, спаяных воедино, идут к плюсу.

А резисторы имеются в наличии. Одну ножку резистора к GND, а вторую куда припаять?

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

На каждый вход. И режим INPUT_PULLUP. И логика поменяется. Отпустили LOW, нажали HIGH. Резистор должен быть больше 50к.  

zzzzza
Offline
Зарегистрирован: 18.11.2016

Спасибо большое, припаяю по возможности!

Скорее всего это решит сразу две первые проблемы с кнопками.

А что скажите по 3 и 4 вопросам?

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

А6 и А7 аналоговые входы которые не могут быть переключены в цифровые.

zzzzza
Offline
Зарегистрирован: 18.11.2016

trembo пишет:
А6 и А7 аналоговые входы которые не могут быть переключены в цифровые.

Спасибо! И правда как цифровые могут использоватсья только пины 14-19 (A0-A5).

Опять все перепаивать(

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

Если перепаивать, то всёж лучше кнопки лучше на землю подсоединить. И логика не поменяется и резисторы не паять. 

zzzzza
Offline
Зарегистрирован: 18.11.2016

nik182 пишет:

Если перепаивать, то всёж лучше кнопки лучше на землю подсоединить. И логика не поменяется и резисторы не паять. 

Я все-таки так и решил сделать. Просто отпаяю провод от ножки, идущий к "+" и прицеплю новый, который к земле будет идти. А то я так представил, столько возни с этими резисторами будет...

Спасибо за совет!

zzzzza
Offline
Зарегистрирован: 18.11.2016

Возник вопрос, чтобы не отпаивать 2-е кнопки от A6 и A7: можно ли тоже одну ножку кнопки к "-" припаять, вместо "+", и поставить режим "INPUT_PULLUP"?

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

Вам же объясняли, что они не умеют быть цифровыми. Хотя, Если будете читать analogRead, то можно, только тогда никаких INPUT_PULLUP не нужно.

zzzzza
Offline
Зарегистрирован: 18.11.2016

ЕвгенийП пишет:

Вам же объясняли, что они не умеют быть цифровыми. Хотя, Если будете читать analogRead, то можно, только тогда никаких INPUT_PULLUP не нужно.

Я так и хотел. Мне было интересно нужно "INPUT_PULLUP" использовать или нет. Спасибо за ответ!

zzzzza
Offline
Зарегистрирован: 18.11.2016

Аааа, и вот еще что интересовало: к минусу все-таки надо перепаивать, если как аналоговый порт использовать?

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

Да. И резистор на +5 надо. 10к хватит. Читать analogRead и делить на 512. Получите 0 - нажата, 1 - отпущена.