Не так давно заинтересовался Ардуино, как подспорье новичку познакомиться с МК, тем более на высокоуровневом языке. Всем привет, кстати! Делал различные программы, даже игры, в основном в среде разработки GML. Могу малость программить. Понял, как зажечь светодиод, помигать, запрограммил ШИМ. Да вот не всё так просто оказалось с СИ, как говорилось. Задумка такая. Для начала при нажатии на кнопку менять значение переменной. А от переменной зависит, будет ли выполняться условие. Ко(Т)д: Если просто проверять уровень кнопки, всё работает. Но если выполнять условие при значении переменной, программа исполняется без нажатия кнопки, как будто переменная program всегда равна 1. Логики совсем нет Уже часов 5 перебираю и ищу варианты, но ничего. Пожалуйста, помогите понять данный момент.
if (program=1) //посмотри на эту строчку внимательней
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Да, сбрасываться будет (уже сбрасывается) как положено! Получилась китайская гирлянда с 8 режимами. Выполнено было в таком варианте, дабы не отвлекаться пока на остальное.
Если оформишь как положено (в текстовом виде, отступы, табуляция, пробелы), тогда можно и говорить дальше.
Осталась привычка от предыдущей среды программирования. Всегда оформлял так и лепил друг на друга, чтобы не растягивать визуально объём. Замечание понял.
if (program=1) //посмотри на эту строчку внимательней
Да, в этом и была проблема. В проверке, как понял случайно, нужно указывать двойное равенство. "If что-то true = тому-то..." До Ардуино в программах работало всё с одним равенством. А false или != оформлялся в штатном режиме. Какой занудный Си, а ещё высокоуровневым представился
Задумка такая. Для начала при нажатии на кнопку менять значение переменной. А от переменной зависит, будет ли выполняться условие.
из вашего описания практически ничего не понял возможно вам поможет этот скетч описание работы в комментарии к нему
Код:
[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]
_________________ все гениальное просто. чем проще - тем надежнее
"If что-то true = тому-то..." До Ардуино в программах работало всё с одним равенством. А false или != оформлялся в штатном режиме.
Нифига не понял...
Одно "=" - это присвоение, в С можно в условие присвоение или какую нибудь другую операцию вписать, например if(x--){...}; //будет проверять что х!=0, затем декрементировать его, а затем (не)выполнять тело ветвления.
Есть рекомендация писать условие не (x==0) а (0==x), т.е константой вперёд, тогда, если равно забудешь - будет явная ошибка... но я ни разу не видел, чтоб этой рекомендации ктото следовал...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Совершенно верно. Ни в одной из версий ( Arduino тут не при чём) Си в (if = ...) не выполняет сравнение - только присваивание. (Может, речь о других ЯП? Delphi, например?) Возможно, тут компилятор вообще выбрасывает сравнение - только присваивание и безусловный переход (интересно бы посмотреть листинг с кодом ). Ну вообще-то вменяемый компилятор в таком случае, как минимум, даёт warning: "Фигня тут у тебя, хлопче". А что иногда работало - так это случайное сочетание условий, потому что неправильно в принципе.
Это ежли в IDE включена опция сообщения об ошибках. По умолчанию она отключена - лапками надо самому уровень подсказок об ошибках выставить. (файл -> настройки -> окошко "сообщения компилятора" выставить "ВСЕ") Да и в последних версиях (2.х.х) почему то встроенный оффлайн справочник по "референсу" удалили... Весьма неплохой справочник для начинающего был. Теперь его только при прямом доступе на сайте адуринки читать можно. (Или копию от старых версий IDE использовать).
Сейчас этот форум просматривают: Google [Bot], Starichok51 и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения