Помогите разобраться с кодом
- Войдите на сайт для отправки комментариев
Втр, 31/10/2017 - 12:42
Здравствуйте! Прошу сильно не пинать, только недавно начал разбираться с Ардуино ну и с программированием вообще. Написал программку, которая должна работать по алгоритму:
Есть 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);
}
1. Прочтите "Вставка програмного кода... "(прилепленное вверху)
2. Задайтесь вопросом: что будет со светодиодом при выполнении Вашего кода, если нажата только button_1?
Пардон за неправильно вставленный код. Обратил внимание только после отправки. А возможности отредактировать не нашел.
По нажатию кнопки Button_1 на пине 8 выставится высокий уровень и светодиод будет гореть. Это будет происходить каждый цикл, пока кнопка нажата
...и будет он гореть до след. вызова check_button(button_2, led_green)- т.е. погасите Вы его сразу.
Аналогично для butto_2, button_3.
А вот для нажатой button_4 светодиод горит пока выполняется всё остальное в loop.
А возможности отредактировать не нашел.
А возможности просто вставить, вместо того, чтобы писать эту фразу тоже не нашли?
Вставьте нормально.
А возможности просто вставить, вместо того, чтобы писать эту фразу тоже не нашли?
Вставьте нормально.
Я не знаю, как здесь отредактировать первый свой пост
Я не знаю, как здесь отредактировать первый свой пост
напрягите мозги и вставьте код не в первый пост, а туда, где отвечаете...
Ну и? Начнем опять?
Нажата только button_1: в вызове 68 строке - зажгли светодиод green_led, вызовом в 69 строке - погасили.
Поменяйте уже что-нибудь....
Ну и про дребезг кнопок Вам сейчас накидают...
3.Что записывается в transmit_data когда кнопка нажата?
4. а когда не нажата(отпустили)?
Когда происходит смена значения в transmit_data (после первой записи туда but_id)?
В 68 строке я вызвал функцию проверки пина №6. И я так понимаю, гасится он не в 69 строке, а в функции check_button. В основном цикле каждый раз вызывается эта функция и проверяется нажатие кнопок и соответственно выставляется единица на выходе. Мне и нужно, чтобы светодиод горел только при нажатой кнопке. Я не пойму, почему при нажатии на 4-ю кнопку он горит ярче?
Сейчас убрал все, что касается присваивания ID кнопкам, и светодиод горит одинаково при нажатии на любую кнопку.
Я не пойму, почему при нажатии на 4-ю кнопку он горит ярче?
сообщение #3 - написано же.. задержка на выполнения остального кода в loop после зажигания светодиода для кнопки4.
а код из сообщения #10 равномерно опрашивает кнопки и соответственно для каждой кнопки зажгли/погасили - одинаковый тайм-слот. ну почти...
сообщение #3 - написано же.. задержка на выполнения остального кода в loop после зажигания светодиода для кнопки4.
а код из сообщения #10 равномерно опрашивает кнопки и соответственно для каждой кнопки зажгли/погасили - одинаковый тайм-слот. ну почти...
А как тогда правильно сделать?
сообщение #3 - написано же.. задержка на выполнения остального кода в loop после зажигания светодиода для кнопки4.
а код из сообщения #10 равномерно опрашивает кнопки и соответственно для каждой кнопки зажгли/погасили - одинаковый тайм-слот. ну почти...
А как тогда правильно сделать?
Гасить светик только если ничего не нажато. :)