Помогите разобраться с кодом

a_b_r_a
Offline
Зарегистрирован: 31.10.2017

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

Есть 4 кнопки и светодиод. При нажатии на любую кнопку должен загораться светодиод и в терминал должен отправлятся идентификатор этой кнопки.

Моя программа отправляет идентификатор кнопки в терминал всего 1 раз. То есть если нажать кнопку №1 два раза, то идентификатор этой кнопки в терминал выведется только один раз. И другие кнопки тоже самое. При этом светодиод при нажатии на кнопки №1,2,3 горит тускло, а при нажатии на кнопку №4 горит ярко. Посмотрите, пожалуйста, где я мог накосячить

 

 

 

byte button_1=6;              // ///////////////////////////////////////////////////////////////////////////////
byte button_2=5;             //  Определяем, к каким пинам подключены кнопки.                                //
byte button_3=4;            //                                                                              //
byte button_4=3;           //////////////////////////////////////////////////////////////////////////////////
byte green_led=8;         //  Определяем, к каким пинам подключены светодиоды.                            //
byte red_led=7;          //////////////////////////////////////////////////////////////////////////////////
byte but_ID_1=0x10;     ///////////////////////////////////////////////////////////////////////////
byte but_ID_2=0x11;    //    Выставляем ID наших кнопок.                                        // 
byte but_ID_3=0x12;   //                                                                       // 
byte but_ID_4=0x13;  ///////////////////////////////////////////////////////////////////////////
byte transmit_data[4]; // массив, хранящий передаваемые данные
byte latest_data[4]; // массив, хранящий последние переданные данные
 
 
void setup() {
pinMode(button_1,INPUT_PULLUP);       //////////////////////////////////////////////////////////////
pinMode(button_2,INPUT_PULLUP);      //                                                          //
pinMode(button_3,INPUT_PULLUP);     //  Инициализация микроконтроллера и  переферии.            //
pinMode(button_4,INPUT_PULLUP);    //   Выполняется однократно при запуске.                    //  
pinMode(green_led,OUTPUT);        //    Скорость обмена по COM 9600 бод                       //
pinMode(red_led,OUTPUT);         //                                                          //
Serial.begin(9600);             //////////////////////////////////////////////////////////////
}
 
// Функция проверки нажатия кнопок и вкл.-выкл. светодиодов
 
void check_button(byte nomber_pin,byte led_on){     
if(!digitalRead(nomber_pin)==1)
{
 digitalWrite(led_on,1); 
}
  else 
  {
  digitalWrite(led_on,0); 
  }
}    
// Функция присваивания кнопкам идентефикатора
void add_id(byte nomber_pin){
  if (!digitalRead(nomber_pin)==1&&nomber_pin==button_1){
   transmit_data[0]= but_ID_1;
  }
  else 
   if (!digitalRead(nomber_pin)==1&&nomber_pin==button_2){
   transmit_data[1]= but_ID_2;
   } 
  else 
   if (!digitalRead(nomber_pin)==1&&nomber_pin==button_3){
   transmit_data[2]= but_ID_3;
   } 
 else 
   if (!digitalRead(nomber_pin)==1&&nomber_pin==button_4){
   transmit_data[3]= but_ID_4;
   } 
}
 
                                           
//  Основная программа
 
void loop() {
  int i;
  for ( i = 0; i < 4; i++) // в цикле от 0 до числа кнопок
 if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
  Serial.println(transmit_data[i]);
  latest_data[i] = transmit_data[i];// запомнить последнее изменение
  
 }
 
 check_button(button_1,green_led); //Пока нажата любая кнопка, зажигаем зеленый светодиод,отпустили - гасим.
 check_button(button_2,green_led);
 check_button(button_3,green_led);
 check_button(button_4,green_led);
 add_id(button_1);
 add_id(button_2);
 add_id(button_3);
 add_id(button_4);
 
 }
T.Rook
Offline
Зарегистрирован: 05.03.2016

1. Прочтите "Вставка програмного кода... "(прилепленное вверху)

2. Задайтесь вопросом:  что будет со светодиодом при выполнении Вашего кода, если нажата только button_1?

a_b_r_a
Offline
Зарегистрирован: 31.10.2017

Пардон за неправильно вставленный код. Обратил внимание только после отправки. А возможности отредактировать не нашел.

По нажатию кнопки Button_1 на пине 8 выставится высокий уровень и светодиод будет гореть. Это будет происходить каждый цикл, пока кнопка нажата

T.Rook
Offline
Зарегистрирован: 05.03.2016

...и будет он гореть до след. вызова check_button(button_2, led_green)- т.е. погасите Вы его сразу.

Аналогично для butto_2, button_3.

А вот для нажатой button_4 светодиод горит пока выполняется всё остальное в loop.

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

a_b_r_a пишет:

А возможности отредактировать не нашел.

А возможности просто вставить, вместо того, чтобы писать эту фразу тоже не нашли?

Вставьте нормально.

a_b_r_a
Offline
Зарегистрирован: 31.10.2017

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

А возможности просто вставить, вместо того, чтобы писать эту фразу тоже не нашли?

Вставьте нормально.

Я не знаю, как здесь отредактировать первый свой пост

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

a_b_r_a пишет:

Я не знаю, как здесь отредактировать первый свой пост

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

a_b_r_a
Offline
Зарегистрирован: 31.10.2017
byte button_1=6;              // ///////////////////////////////////////////////////////////////////////////////
byte button_2=5;             //  Определяем, к каким пинам подключены кнопки.                                //
byte button_3=4;            //                                                                              //
byte button_4=3;           //////////////////////////////////////////////////////////////////////////////////
byte green_led=8;         //  Определяем, к каким пинам подключены светодиоды.                            //
byte red_led=7;          //////////////////////////////////////////////////////////////////////////////////
byte but_ID_1=0x10;     ///////////////////////////////////////////////////////////////////////////
byte but_ID_2=0x11;    //    Выставляем ID наших кнопок.                                        // 
byte but_ID_3=0x12;   //                                                                       // 
byte but_ID_4=0x13;  ///////////////////////////////////////////////////////////////////////////
byte transmit_data[4]; // массив, хранящий передаваемые данные
byte latest_data[4]; // массив, хранящий последние переданные данные
 
 
void setup() {
pinMode(button_1,INPUT_PULLUP);       //////////////////////////////////////////////////////////////
pinMode(button_2,INPUT_PULLUP);      //                                                          //
pinMode(button_3,INPUT_PULLUP);     //  Инициализация микроконтроллера и  переферии.            //
pinMode(button_4,INPUT_PULLUP);    //   Выполняется однократно при запуске.                    //  
pinMode(green_led,OUTPUT);        //    Скорость обмена по COM 9600 бод                       //
pinMode(red_led,OUTPUT);         //                                                          //
Serial.begin(9600);             //////////////////////////////////////////////////////////////
}
 
// Функция проверки нажатия кнопок и вкл.-выкл. светодиодов
 
void check_button(byte nomber_pin,byte led_on){     
if(!digitalRead(nomber_pin)==1)
{
 digitalWrite(led_on,1); 
}
  else 
  {
  digitalWrite(led_on,0); 
  }
}    
// Функция присваивания кнопкам идентефикатора
void add_id(byte nomber_pin){
  if (!digitalRead(nomber_pin)==1&&nomber_pin==button_1){
   transmit_data[0]= but_ID_1;
  }
  else 
   if (!digitalRead(nomber_pin)==1&&nomber_pin==button_2){
   transmit_data[1]= but_ID_2;
   } 
  else 
   if (!digitalRead(nomber_pin)==1&&nomber_pin==button_3){
   transmit_data[2]= but_ID_3;
   } 
 else 
   if (!digitalRead(nomber_pin)==1&&nomber_pin==button_4){
   transmit_data[3]= but_ID_4;
   } 
}
 
                                           
//  Основная программа
 
void loop() {
  int i;
  for ( i = 0; i < 4; i++) // в цикле от 0 до числа кнопок
 if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
  Serial.println(transmit_data[i]);
  latest_data[i] = transmit_data[i];// запомнить последнее изменение
  
 }
 
 check_button(button_1,green_led); //Пока нажата любая кнопка, зажигаем зеленый светодиод,отпустили - гасим.
 check_button(button_2,green_led);
 check_button(button_3,green_led);
 check_button(button_4,green_led);
 add_id(button_1);
 add_id(button_2);
 add_id(button_3);
 add_id(button_4);
 
 }

 

T.Rook
Offline
Зарегистрирован: 05.03.2016

Ну и? Начнем опять?

Нажата только button_1: в вызове 68 строке - зажгли светодиод green_led, вызовом в 69  строке - погасили.

Поменяйте уже что-нибудь....

Ну и про дребезг кнопок Вам сейчас накидают...

T.Rook
Offline
Зарегистрирован: 05.03.2016

3.Что записывается в  transmit_data когда кнопка нажата?

4. а когда не нажата(отпустили)?

Когда происходит смена значения в transmit_data (после первой записи туда but_id)?

a_b_r_a
Offline
Зарегистрирован: 31.10.2017

В  68 строке я вызвал функцию проверки пина №6. И я так понимаю, гасится он не в 69 строке, а в функции check_button. В основном цикле каждый раз вызывается эта функция и проверяется нажатие кнопок и соответственно выставляется единица на выходе. Мне и нужно, чтобы светодиод горел только при нажатой кнопке. Я не пойму, почему при нажатии на 4-ю кнопку он горит ярче? 

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

byte button_1=6;              // ///////////////////////////////////////////////////////////////////////////////
byte button_2=5;             //  Определяем, к каким пинам подключены кнопки.                                //
byte button_3=4;            //                                                                              //
byte button_4=3;           //////////////////////////////////////////////////////////////////////////////////
byte green_led=8;         //  Определяем, к каким пинам подключены светодиоды.                            //
byte red_led=7;          //////////////////////////////////////////////////////////////////////////////////
byte but_ID_1=0x10;     ///////////////////////////////////////////////////////////////////////////
byte but_ID_2=0x11;    //    Выставляем ID наших кнопок.                                        // 
byte but_ID_3=0x12;   //                                                                       // 
byte but_ID_4=0x13;  ///////////////////////////////////////////////////////////////////////////
byte transmit_data[4]; // массив, хранящий передаваемые данные
byte latest_data[4]; // массив, хранящий последние переданные данные


void setup() {
pinMode(button_1,INPUT_PULLUP);       //////////////////////////////////////////////////////////////
pinMode(button_2,INPUT_PULLUP);      //                                                          //
pinMode(button_3,INPUT_PULLUP);     //  Инициализация микроконтроллера и  переферии.            //
pinMode(button_4,INPUT_PULLUP);    //   Выполняется однократно при запуске.                    //  
pinMode(green_led,OUTPUT);        //    Скорость обмена по COM 9600 бод                       //
pinMode(red_led,OUTPUT);         //                                                          //
Serial.begin(9600);             //////////////////////////////////////////////////////////////
}

// Функция проверки нажатия кнопок и вкл.-выкл. светодиодов

void check_button(byte nomber_pin,byte led_on){     
if(!digitalRead(nomber_pin)==1)
{
 digitalWrite(led_on,1); 
}
  else 
  {
  digitalWrite(led_on,0); 
  }
}    

                                           
//  Основная программа

void loop() {
   
 
 check_button(button_1,green_led); //Пока нажата любая кнопка, зажигаем зеленый светодиод,отпустили - гасим.
 check_button(button_2,green_led);
 check_button(button_3,green_led);
 check_button(button_4,green_led);
 
 
 }

 

T.Rook
Offline
Зарегистрирован: 05.03.2016

a_b_r_a пишет:

 Я не пойму, почему при нажатии на 4-ю кнопку он горит ярче? 

сообщение #3 - написано же.. задержка на выполнения остального кода в loop после зажигания светодиода для кнопки4.

а код  из сообщения #10 равномерно опрашивает кнопки и соответственно для каждой кнопки зажгли/погасили  - одинаковый тайм-слот. ну почти...

 

a_b_r_a
Offline
Зарегистрирован: 31.10.2017

T.Rook пишет:

 

сообщение #3 - написано же.. задержка на выполнения остального кода в loop после зажигания светодиода для кнопки4.

а код  из сообщения #10 равномерно опрашивает кнопки и соответственно для каждой кнопки зажгли/погасили  - одинаковый тайм-слот. ну почти...

 

А как тогда правильно сделать?

T.Rook
Offline
Зарегистрирован: 05.03.2016

a_b_r_a пишет:

T.Rook пишет:

 

сообщение #3 - написано же.. задержка на выполнения остального кода в loop после зажигания светодиода для кнопки4.

а код  из сообщения #10 равномерно опрашивает кнопки и соответственно для каждой кнопки зажгли/погасили  - одинаковый тайм-слот. ну почти...

 

А как тогда правильно сделать?

 

Гасить светик  только если ничего не нажато. :)