Обсуждаем контроллеры компании Atmel.
Ответить

Ардуино. Изменение значения переменной при нажатии кнопки.

Ср янв 22, 2025 19:10:36

Не так давно заинтересовался Ардуино, как подспорье новичку познакомиться с МК, тем более на высокоуровневом языке. Всем привет, кстати! Делал различные программы, даже игры, в основном в среде разработки GML. Могу малость программить. Понял, как зажечь светодиод, помигать, запрограммил ШИМ. Да вот не всё так просто оказалось с СИ, как говорилось.
Задумка такая. Для начала при нажатии на кнопку менять значение переменной. А от переменной зависит, будет ли выполняться условие.
Ко(Т)д:
Изображение
Если просто проверять уровень кнопки, всё работает. Но если выполнять условие при значении переменной, программа исполняется без нажатия кнопки, как будто переменная program всегда равна 1. Логики совсем нет :dont_know: Уже часов 5 перебираю и ищу варианты, но ничего. Пожалуйста, помогите понять данный момент.

Re: Ардуино. Изменение значения переменной при нажатии кнопк

Ср янв 22, 2025 19:14:48

А сбрасывать значение program кто будет?

Re: Ардуино. Изменение значения переменной при нажатии кнопк

Ср янв 22, 2025 19:31:13

Если оформишь как положено (в текстовом виде, отступы, табуляция, пробелы), тогда можно и говорить дальше.

Re: Ардуино. Изменение значения переменной при нажатии кнопк

Чт янв 23, 2025 08:01:20

if (program=1) //посмотри на эту строчку внимательней

Re: Ардуино. Изменение значения переменной при нажатии кнопк

Пт янв 31, 2025 11:54:53

А сбрасывать значение program кто будет?

Да, сбрасываться будет (уже сбрасывается) как положено! Получилась китайская гирлянда с 8 режимами. Выполнено было в таком варианте, дабы не отвлекаться пока на остальное.
Если оформишь как положено (в текстовом виде, отступы, табуляция, пробелы), тогда можно и говорить дальше.

Осталась привычка от предыдущей среды программирования. Всегда оформлял так и лепил друг на друга, чтобы не растягивать визуально объём. Замечание понял.
if (program=1) //посмотри на эту строчку внимательней

Да, в этом и была проблема. В проверке, как понял случайно, нужно указывать двойное равенство. "If что-то true = тому-то..." До Ардуино в программах работало всё с одним равенством. А false или != оформлялся в штатном режиме. Какой занудный Си, а ещё высокоуровневым представился :))

Re: Ардуино. Изменение значения переменной при нажатии кнопк

Пт янв 31, 2025 12:27:56

Задумка такая. Для начала при нажатии на кнопку менять значение переменной. А от переменной зависит, будет ли выполняться условие.

из вашего описания практически ничего не понял
возможно вам поможет этот скетч
описание работы в комментарии к нему
Код:
 [code]
//!!!!!!!!!!!!!!!!!ВНИМАНИЕ!!!!!!!!!!!!!!!

//Для проверки работы используется кнопка, подключенная к A0 и "-"питания платы
//и светодиод на плате, который служит индикатором работы и в зависимости от варианта
//реализации платы будет или зажигаться на 3 секунды или наоборот тухнуть,
//как при подаче низкого уровня("-") на контакт A0 платы ардуино(кнопка нажата),
//так и при снятии этого сигнала (кнопка отпускается).
//Кнопка(контакт) подключает 0 вольт,  на ненажатой кнопке присутствует
//высокий уровень от встроенного "подтягивающего" резистора.
//При использовании других пинов ввода/вывода подставлять
//нужные обозначения только в строках #define !!!!!!
//Если необходимо убрать дребезг контактов - раскоментировать строку "delay(50)".

#define OUT_PIN 13      // номер вывода для вкл.исполнительного устройства равен 13

#define BUTTON1_PIN A0  // номер вывода для кнопки(сигнала) равен A0


boolean buttonState1;      // состояние кнопки
boolean buttonPrevState1;  // предыдущее состояние кнопки
boolean outState;         // состояние выхода

void setup() {
  pinMode(OUT_PIN, OUTPUT);        //определяем вывод 13 (исполнит. устр-во) как выход
 
  pinMode(BUTTON1_PIN, INPUT_PULLUP);//определяем вывод A0(кнопка или сигнал) как вход
 
  digitalWrite(OUT_PIN, LOW);     //устанавливаем выход в выключенное состояние
 
  buttonPrevState1 = HIGH;        //исходное состояние кнопки выключена
 

}
void loop() {

  buttonState1 = digitalRead(BUTTON1_PIN); //запис.сост.кнопки в переменную buttonState


  // delay(50);   //задержка на дребезг контактов

  if (buttonPrevState1 != buttonState1) // если состояние кнопки изменилось
 
  {
    outState = ! outState;            // инверсия состояния выхода
    digitalWrite(OUT_PIN, outState);  // включение выхода
    delay(3000);                       // на 3 секунды
    outState = ! outState;            // инверсия состояния выхода
    digitalWrite(OUT_PIN, outState);  //выключение выхода
  }
  buttonPrevState1 = buttonState1;    // предыдущее состояние кнопки = текущему
}
[code]

Re: Ардуино. Изменение значения переменной при нажатии кнопк

Пт янв 31, 2025 12:38:51

"If что-то true = тому-то..." До Ардуино в программах работало всё с одним равенством. А false или != оформлялся в штатном режиме.
Нифига не понял... :dont_know:

Одно "=" - это присвоение, в С можно в условие присвоение или какую нибудь другую операцию вписать, например if(x--){...}; //будет проверять что х!=0, затем декрементировать его, а затем (не)выполнять тело ветвления.

Есть рекомендация писать условие не (x==0) а (0==x), т.е константой вперёд, тогда, если равно забудешь - будет явная ошибка... но я ни разу не видел, чтоб этой рекомендации ктото следовал...

Re: Ардуино. Изменение значения переменной при нажатии кнопк

Пт янв 31, 2025 15:39:07

Совершенно верно. Ни в одной из версий ( Arduino тут не при чём) Си в (if = ...) не выполняет сравнение - только присваивание. (Может, речь о других ЯП? Delphi, например?) Возможно, тут компилятор вообще выбрасывает сравнение - только присваивание и безусловный переход (интересно бы посмотреть листинг с кодом ). Ну вообще-то вменяемый компилятор в таком случае, как минимум, даёт warning: "Фигня тут у тебя, хлопче".
А что иногда работало - так это случайное сочетание условий, потому что неправильно в принципе.

Re: Ардуино. Изменение значения переменной при нажатии кнопк

Пт янв 31, 2025 16:26:38

Это ежли в IDE включена опция сообщения об ошибках.
По умолчанию она отключена - лапками надо самому уровень подсказок об ошибках выставить.
(файл -> настройки -> окошко "сообщения компилятора" выставить "ВСЕ")
8)
Да и в последних версиях (2.х.х) почему то встроенный оффлайн справочник по "референсу" удалили...
Весьма неплохой справочник для начинающего был.
Теперь его только при прямом доступе на сайте адуринки читать можно. (Или копию от старых версий IDE использовать).
:(
Ответить