Это легко понять если вы задумаетесь. Возьмите батарейку на 9 вольт и включите её в простую схему. Измеряя ток, вы увидите что чем с большим сопротивлением резистор вы добавите в схему, тем меньший ток будет проходить через него.Возвращаясь к аналогии с водой, при данном насосе, если я установлю клапан (который соотносится с сопротивлением в электронике), то чем больше я буду закручивать этот клапан - увеличивая сопротивление потоку воды - тем меньше воды протечёт по трубе. Ом подвёл итог своего закона в формулу:
R (сопротивление) = V (напряжение) / I (ток)
V = R * I
I = V / R
Это единственное правило, который вам надо запомнить и выучить, поскольку в большинстве ваших работ оно единственное вам и понадобится.
4.10 Использование кнопки для управления светодиодом
Мигать светодиодом несложно, но я не думаю что вам понравится если настольная лампа будет бесконечно мигать тогда как вы пытаетесь читать книгу. Поэтому вам надо понять как управлять ею. В нашем предыдущем примере светодиод был актюатором и Arduino управляла им. Чего не хватает для полноты картины, так это сенсора.
В данном случае мы будем использовать простейший из доступных сенсоров - кнопку.
Если вы разберёте кнопку на части, вы увидите что это очень простое устройство: два кусочка металла, разделённые пружинкой, и пластиковый наконечник, который при нажатии соединяет эти контакты. Когда металлические части разделены, ток через кнопку не протекает (она подобна закрытому крану для воды); когда мы нажимаем её, мы осуществляем соединение.
Чтобы узнать состояние выключателя, существует новая для нас команда Arduino, которую нам следует изучить: функция digitalRead().
digitalRead() проверяет, подключено-ли напряжение к контакту, который вы указали в скобках, и возвращает значение "HIGH" или "LOW". Другие инструкции, которые мы использовали до этого, не возвращали никакой информации - они просто выполняли то что мы просили. Но такой тип функций немного ограничен, так как они заставляют нас придерживаться предсказуемой, строго определённой последовательности команд, без ввода данных из окружения. С функцией digitalRead() мы можем "задать вопрос" Arduino и получить ответ, который можно сохранить где-нибудь в памяти и принять решение немедленно или позже.
Составьте схему по рис. 4-6. Для этого у вас должны быть некоторые детали (и они потребуются в следующих проектах):
Беспаечная макетная плата. Приложение A - инструкция по применению такой платы.
Набор нарезанных проводов
Резистор на 10 кОм
Кнопка
Рис. 4-6. Подключение кнопки
Примечание: чтобы не покупать набор проводов, вы можете купить небольшую катушку провода 22 AWG (диаметр 0.65 мм), нарезать куски требуемой длины и зачистить концы самостоятельно.
Давайте рассмотрим код, который используется для управления светодиода кнопкой:
Пример 4-2. Включение светодиода при нажатии кнопки
#define LED 13 // the pin for the LED
#define BUTTON 7 // the input pin where the
// pushbutton is connected
int val = 0; // val will be used to store the state
// of the input pin
void setup() {
pinMode(LED, OUTPUT); // tell Arduino LED is an output
pinMode(BUTTON, INPUT); // and BUTTON is an input
}
void loop(){
val = digitalRead(BUTTON); // read input value and store it
// check whether the input is HIGH (button pressed)
if (val == HIGH) {
digitalWrite(LED, HIGH); // turn LED ON
} else {
digitalWrite(LED, LOW);
}
}
В среде Arduino выберите "File" > "New" (если у вас уже был открыт какой-то скетч, сохраните его). Когда Arduino спросит у вас имя папки для нового скетча, введите PushButtonControl. Напечатайте код Примера 4-2 в Arduino (или скачайте его сwww.makezine.com/getstartedarduino). Если всё сделано правильно, светодиод будет загораться когда вы нажмёте кнопку.
4.11 Как это работает?
В этом примере программы я показал две новых концепции: функция, которая возвращает результат своей работы, и выражение "if".
Выражение "if" - возможно, самая важная инструкция в языке программирования, так как она позволяет компьютеру (а мы помним что Arduino - это маленький компьютер) делать выбор. После ключевого слова "if" вы должны написать "вопрос" в круглых скобках, и если "ответ", или результат, верен, будет выполнен первый блок кода; и напротив, если ответ неверен, будет выполнен блок кода после "else". Обратите внимание, что я использовал символ "==" вместо "=". Первый используется при сравнении двух значений и возвращает "TRUE" (ИСТИНА) или "FALSE" (ЛОЖЬ); второй присваивает значение переменной. Удостоверьтесь что вы пользуетесь ими правильно, так как очень легко совершить подобную ошибку и использовать простое равно. В этом случае программа никогда не будет работать. Я знаю это по опыту 25 лет программирования и всё ещё могу ошибиться.
Держать палец на кнопке пока вам надо свет - не очень практично. Хотя это заставило-бы вас задуматься о том, сколько энергии тратися впустую когда вы оставляете лампу включённой, нам надо подумать о том, как-бы сделать чтобы кнопка "залипала".
4.12 Одна схема, тысяча применений
Огромное преимущество цифровой программируемой электроники над классической стало теперь очевидным: я покажу вас как реализовать множество различных "поведений" с использованием той-же электрической схемы из предыдущего раздела, просто изменяя программу.
Как мы поняли раньше, непрактично держать палец на кнопке чтобы свет оставался включённым. Поэтому мы должны осуществить что-то похожее на "память" в виде механизма программы, который будет запоминать что мы нажали кнопку и продолжать светить даже елси мы отпустим её.
Чтобы сделать это, нам придётся использовать нечто, называемое переменной (мы уже использовали её, но я не пояснял ничего о ней). Переменная - это место в памяти Arduino, в котором мы можем хранить данные. Думайте о ней как о липкой бумаге для заметок, которую вы иногда используете для записи чего-нибудь: например, телефонного номера - вы берёте листик, пишете на ней "Аня, 02 555 1212" и приклеиваете на компьютер. В языке Arduino это так-же легко: вы просто определяете тип данных, которые будут храниться (например, число или какой-то текст), даёте ей имя, и теперь при надобности вы можете сохранить в переменной данные, или получить их. Например:
int val = 0;
"int" означает, что в переменной будет храниться целое число, "val" - это имя переменной, а "= 0" - назначение переменной нулевого начального значения.
Переменная, как следует из названия, может быть изменена в любом месте вашего кода, так-что позднее в своей программе вы можете написать:
val = 112;
что изменит значение переменной с нуля на 112.
Примечание: Вы заметили, что Arduino каждая инструкция, кроме #define, заканчивается точкой с запятой? Это делается для того чтобы компилятор (часть Arduino, которая превращает ваш скетч в программу, которую может выполнить микроконтроллер) знал где заканчивается одно ваше выражение и начинается другое. Не забудьте использовать точку с запятой (кроме тех строк, которые начинаются с #define).