Arduino функция digitalread

Arduino — функции — цифровой вход/выход

Arduino IDE имеет набор стандартных функций для управления входом/выходом. Вы можете легко обрабатывать как цифровые сигналы, так и аналоговые. Ниже приведен список функций с кратким описанием и примерами использования.

Цифровой вход/выход

Цифровые выводы Arduino могут быть использованы как входы или как выходы. Поэтому необходимы функции, которые позволят установить (настроить) выводы на запись или чтение данных.

Функция pinMode()

Функция pinMode() позволяет определить работу отдельных контактов. Ее синтаксис выглядит следующим образом:
[slh lang=»php»] pinMode(pin, mode);
[/slh]

pin — код — это указать номера контакта системы Arduino

mode — это одна из предопределенных констант: INPUT, OUTPUT или INPUT_PULLUP

Предназначение данных констант описано в другой статье. Примеры режим работы выводов:
[slh lang=»php»] pinMode(13,OUTPUT);
pinMode(8,INPUT);
#define ledPin 10
pinMode(ledPin,OUTPUT);
const byte button=4;
pinMode(button,INPUT_PULLUP);
int button2=5;
pinMode(button2,INPUT_PULLUP);
[/slh]

Как вы можете видеть, конфигурирование контактов не такой уж сложный процесс. Стоит обратить внимание на тот факт, что тот же эффект можно получить несколькими способами.

Первые два примера основаны на непосредственном вводе номера контакта и определении режима его работы. Это правильная декларация, однако, она не рекомендуется для использования. Стоит использовать один из последующих способов.

Прямое обращение к номерам выводов может привести к путанице и ошибкам, поскольку во время написания и тестирования программы постоянно необходимо держать в голове какой номер за что отвечает. Лучшее решение — использовать определение, константу или переменную.

Определение — название для конкретного контакта (имя), которое определяет его использование. Безусловно, легче запомнить, что ledPin это вывод, к которому подключен светодиод, чем просто светодиод подключен к контакту 10.

Стоит помнить, что при объявлении соответствующего имени, мы так же будем ссылаться на него и в программе, а не только при определении режима работы вывода. Определение имен с помощью директивы define или const совпадает с практической точки зрения. Компилятор заменит данное имя на присвоенное ему значение.

Разработчики Arduino IDE рекомендуют использовать const. Мы в отношении контактов рекомендуем использовать define как четкое отличительное назначение контактов для имени.

Дополнительным преимуществом использования define является то, что он обычно размещается в начале кода, что облегчает модификацию электронной схемы в будущем. При изменении выводов в электронной схеме, в скетче нам необходимо будет только изменить номера контактов в определении выводов.

В последнем примере показано использование переменной в качестве имени контакт. Такое определение приведено на официальном сайте документации Arduino. На наш взгляд, это не лучший вариант, так как переменная займет ценное место в памяти. Единственно оправданным случаем использования переменной может быть ситуация, когда мы хотим в цикле выполнять операции над несколькими выводами. Это, однако, особый случай.

Иногда в каком-либо проекте нет необходимости в аналоговых входах, тогда эти выводы можно использовать в качестве цифрового входа или выхода. В этом случае с помощью функции pinMode() можно установить необходимый режим для контактов A0 — A5.
[slh lang=»php»] #define power A0
void setup()
<
pinMode(power,OUTPUT);
>
[/slh]

Использование одного или нескольких контактов из A0… A5 как цифровых не приведет к невозможности использования оставшихся в качестве аналоговых входов. Можно использовать, например, 2 аналоговых входа и 4 цифровых выходов из A0… A5.

Функция digitalWrite()

Функция digitalWrite() позволяет установить состояние вывода как цифровой выход. Ее синтаксис (как и в pinMode()) требует двух параметров: первый — это номер контакта, второй — логическое значение LOW или HIGH.

Установка значения LOW приведет к тому, что напряжение на выходе будет 0В (короткое замыкание на массу), значение HIGH около 3,3В или 5В в зависимости от напряжения питания Arduino. Ниже приведен пример использования функции digitalWrite():
[slh lang=»php»] #define ledPin 13
void setup()
<
pinMode(ledPin,OUTPUT);
>
void loop()
<
digitalWrite(ledPin,HIGH); //включить LED
delay(500); //подождать 500ms (0,5 сек)
digitalWrite(ledPin,LOW); //выключить LED
delay(500); //подождать 500ms (0,5 сек)
>
[/slh]

В примере видно как можно установить соответствующее состояние вывода. Использованная в примере функция delay() позволяет выполнять задержку исполнения кода. Подробнее об этом будет обсуждаться далее.

При использование функции digitalWrite() в случае, когда вывод настроен как вход, необходимо включить или выключить режим PULLUP, то есть подключить подтягивающий резистор. В более поздних версиях Arduino IDE, безусловно, лучше использовать pinMode() с параметром INPUT_PULLUP.

Функция digitalRead()

Функция digitalRead() позволяет считывать состояние с вывода, определенного как цифровой вход. Эта функция возвращает значение LOW или HIGH. Необходимо указать номер контакта, с которого мы хотим прочитать состояние.
[slh lang=»php»] digitalRead(pin);
[/slh]

Если вывод, с которого мы считываем состояние в данный момент не подключен к схеме («висит в воздухе»), то функция может возвратить случайное значение — LOW или HIGH. Следует помнить об этом во время проектирования электронного оборудования. Для предотвращения такой ситуации необходимо использовать подтягивающий резистор. Ниже приведены примеры чтения состояния цифрового входа:
[slh lang=»php»] #define ledPin 13 // светодиод подключен к контакту 13
#define inPin 7 // кнопка подключена к контакту 7
int val = 0; // переменная, хранящая состояние входа
void setup()
<
pinMode(ledPin, OUTPUT); // pin 13 как выход
pinMode(inPin, INPUT_PULLUP); // pin 7 как вход
>
void loop()
<
val = digitalRead(inPin); // считываем состояние с контакт 7
digitalWrite(ledPin, val);// состояние светодиода зависит от состояния входа
>
[/slh]

Приведенный выше пример показывает, как считывать состояние входа, и использовать эту информацию для управления выходом.

Переменная val может содержать значение LOW или HIGH, в зависимости от состояния входа. Функция digitalWrite() задает состояние выхода в зависимости от переменной val.

Довольно часто бывает необходимо выполнять некоторые операции, которые напрямую зависят от состояния на входе. В такой ситуации мы можем написать так:
[slh lang=»php»] #define ledPin 13 // светодиод подключен к контакту 13
#define inPin 7 // кнопка подключена к контакту 7
void setup()
<
pinMode(ledPin, OUTPUT); // pin 13 как выход
pinMode(inPin, INPUT_PULLUP); // pin 7 как вход
>
void loop()
<
if(digitalRead(inPin)) //более явный способ: if(digitalRead(inPin)==HIGH)
digitalWrite(ledPin, HIGH);
else
digitalWrite(ledPin, LOW);
>
[/slh]

Приведенный выше пример программы также зажигает и гасит светодиод в зависимости от состояния подключенной кнопки. Действия те же самые, но синтаксис программы немного другой. Можно использовать оба вышеупомянутых решения, в некоторых случаях проще применить первый пример, в других — второй.

Источник

Цифровые пины

В уроке про возможности микроконтроллера мы обсуждали такое понятие, как GPIO – входы-выходы общего назначения, которые позволяют читать и выдавать цифровой сигнал. Давайте посмотрим на распиновке, какие пины умеют так делать.

Нумерация пинов

AVR (Arduino Nano)

  • Нет прямой нумерации GPIO, всё поделено на порты и пины (не указаны на распиновке), о них мы поговорим в отдельном уроке.
  • На плате выведенные GPIO подписаны как Dцифра и Aцифра и в программе мы можем обращаться к ним по этой нумерации:
    • К пинам GPIO, подписанным как D (D0-D13), можно обращаться по номеру: D2 – просто 2 .
    • К пинам GPIO, подписанным как A (A0-A5), можно обращаться по подписи на плате: A2 – A2 . Также нумерация A пинов продолжает нумерацию D пинов по порядку, то есть A0 это 14 , A1 это 15 .. A5 – 19 .

ESP8266 (Wemos Mini)

  • Имеется прямая нумерация GPIO (номера подписаны на распиновке зелёным), по этим номерам можно обращаться к пинам в программе как к цифрам: GPIO5 – просто 5 .
  • На плате пины подписаны как Dцифра. Эта нумерация не совпадает с номерами GPIO, но по ней также можно обращаться к пинам в программе: D1 это D1 , и этот же пин – просто 5 , как номер GPIO (см. распиновку выше).

Режимы работы пинов

Цифровой пин может находиться в двух состояниях, вход и выход. В режиме входа пин может считывать напряжение от 0 до напряжения питания МК, а в режиме выхода – выдавать такое же напряжение. Режим работы выбирается при помощи функции pinMode(pin, mode) , где pin это номер пина, а mode это режим:

  • INPUT – вход
  • OUTPUT – выход
  • INPUT_PULLUP – подтянутый к питанию вход

Если со входом/выходом всё понятно, то с подтяжкой давайте разберёмся. В режиме входа пин МК не подключен никуда и ловит из воздуха всякие наводки, получая практически случайное значение. Для задания пину “состояния по умолчанию” используют подтяжку резистором к земле или питанию. Режим INPUT_PULLUP включает встроенную в микроконтроллер подтяжку пина к питанию при помощи внутреннего резистора. Подробнее об этом, со схемами и примерами я рассказывал в начале вот этого видео урока.

Вывод цифрового сигнала

Цифровой пин в режиме выхода ( OUTPUT ) может генерировать цифровой сигнал, т.е. выдавать напряжение. Так как понятие “цифровой” обычно связано с двумя состояниями, 0 и 1, цифровой пин тоже может выдать 0 или 1, точнее сигнал низкого или высокого уровня:

  • Сигнал низкого уровня это 0V, пин подключается к GND микроконтроллера.
  • Сигнал высокого уровня подключает пин к VCC микроконтроллера, то есть к питанию.

Если вы вспомните урок по питанию платы, то поймёте, что сигнал высокого уровня на цифровом пине будет варьироваться в зависимости от того, от какого напряжения питается плата. При питании напрямую от источника 5V на пине будет 5V, при питании от USB с потерей на защитном диоде мы получим около 4.7V.

Самый главный момент касательно цифровых пинов: микроконтроллер – логическое устройство, которое создано для управления другими устройствами при помощи логических сигналов. Логическое – означает не силовое, то есть питать от пина МК нельзя ничего мощнее светодиода или слабой микросхемы:

  • Для AVR Arduino рекомендуемый ток с пина GPIO – не более 20 мА, максимальный ток – 40 мА.
  • Для esp8266 максимальный ток с пина GPIO – не более 12 мА.

Вернёмся к вопросу подачи цифрового сигнала: для этого у нас есть функция digitalWrite(pin, value) :

  • pin – пин GPIO (нумерацию смотри выше).
  • value – уровень сигнала: HIGH высокий, LOW низкий. Также можно использовать цифры 1 и 0 соответственно.

Пример, в котором пины инициализируются как выходы и на них подаётся сигнал (на примере Arduino Nano):

Чтение цифрового сигнала

Цифровой пин может измерять напряжение, но сообщить он может только о его отсутствии (сигнал низкого уровня, LOW ) или наличии (сигнал высокого уровня, HIGH ), причём отсутствием напряжения считается промежуток от 0 до

VCC/2 Вольт, а от VCC/2 до VCC микроконтроллер считает за наличие сигнала высокого уровня.

Для чтения уровня сигнала на пине используется функция digitalRead(pin) , где пин – номер GPIO (нумерацию смотри выше).

Следующий код будет выводить в порт сигнал на пине D5. Если подключить его проводом к VCC – получим 1 , если к GND – получим 0 .

Видео


Источник

Tutorial 07: digitalRead() and Serial Port Communication

digitalRead() and Serial Port Communication

As simple as it may seem, knowing when something is either on or off can be a great tool for designing something useful.

This lesson will answer the following questions:

  • Is a button being pressed?
  • Has a switch been turned on?
  • What is the on/off sensor status?

When you can answer questions like these, you can implement actions based on the current status – if the button is pressed do this – otherwise, do that. If the sensor is HIGH take this action, otherwise do nothing. You get the gist. But before we can implement the actions, we have to be able to track the status and the changes of the digital pins.

You Will Need

  1. A momentary push button – this is a button that is spring-loaded, i.e. it never stays in a down position unless it’s held down.
  2. Jumper wires (3)
  3. A 10,000 Ohm resistor more commonly referred to as a 10K resistor
  4. A very ripe banana, (1) – not completely useful, but nutritious

Step-by-Step Instructions

  1. Connect the pushbutton to the breadboard.
  2. Connect one side of the pushbutton to the 5-volt pin on the Arduino board using a jumper wire.
  3. Connect one side of the 10K resistor to the other side of the pushbutton.
  4. Connect the other side of the resistor to the ground pin on the Arduino. You may have to use a jumper wire to make it reach.
  5. On the same side, the resistor is connected to the pushbutton, connect a jumper wire and run it to pin 2 on the Arduino board.
  6. Connect the Arduino to your computer with the USB cable.
  7. Open the sketch for this section.
  8. Click the Verify button in the top left corner of the IDE. The Verify button will turn orange and then back to blue when it has completed compiling.
  9. Click the Upload Button (located to the immediate right of the Verify button). This button will also turn orange and then back to blue once the sketch is uploaded to the Arduino board.
  10. Now go to the menu bar at the top and select Tools > Serial Monitor. Or you could use the shortcut key, Shift + Control + M.
  11. The serial monitor window will open and will be spouting off numbers. It should be a bunch of zeros.
  12. Press and hold the pushbutton – watch the serial monitor window, the numbers should now be ones.
  13. If the numbers are not scrolling, make sure you click Autoscroll at the bottom left of the serial monitor window.

This image built with Fritzing.

The Arduino Code

Discuss the Sketch

This sketch opens with a multi-line comment containing a short description of the program and circuit. The first block of code following the comment is where we declare and initialize variables. From the last lesson, we are familiar with the integer data type.

Notice how the variable pushButton is declared and initialized all on the same line. Also, notice the descriptive name of the variable – pushButton – the variable name implies its use within the program – this is a good example to follow.

Let’s consider what we have done so far – we have made a variable that will store the pin number that our pushbutton is connected to.

The next block of code we come to is the setup(). Inside these wily curly brackets there are two functions – a familiar one, pinMode() and another which we will learn to love – Serial.begin().

Serial.begin() is part of a family of functions referred to as a library. The name of the library is the Serial library. A library is just a group of functions that work toward a similar purpose. If you had a Circus library, it might contain the functions juggle(), balance() and flamingCircleOfDeath(). To access the functions in a library, you write the name of the library followed by the name of the function in the library, with a period in between.

Arduino has many preinstalled libraries. There are also many community-contributed libraries that you can add. You can view all of the preinstalled libraries and some of the contributed libraries at http://arduino.cc/en/Reference/Libraries.

So what does the Serial library do?

The Serial library helps establish communication between your computer and the Arduino board. If you ever go to marriage counseling, you will learn that communication involves sending and receiving. Data can flow both ways. If we want to establish this communication, we use the begin() function from the Serial library.

The begin() function takes one argument – the baud rate. What is the baud rate you ask? It is the rate at which data will flow between your computer and the Arduino. For most Arduino sketches a baud rate of 9600 is used as the argument.

That’s all you really need to know about the baud rate to get started with serial monitoring. But I have a feeling you want to know more, so if you check out the further reading section at the end of this tutorial, there will be some links to tempt your insatiable desire for acquiring an understanding of all things in the universe.

The next function after Serial.begin() is the pinMode() function. We want to set the mode of a pin and what is cool about pinMode() this time around is that we are changing the arguments we pass to the function. Instead of being an OUTPUT (as in the Blink sketch), we want our pin to be an INPUT because we want to read voltage at this pin, not provide it.

Here we use the variable pushButton to let the function know we are setting the mode at pin 2. Then we use the keyword INPUT, to say which mode we want.

Those are the only two functions in the setup() curly braces – and just as a reminder – setup() only runs once.

The next block of code is the function loop(). What do we see inside the curly braces of the loop()?

Whoa! What the heck is this? It looks like the programmer is declaring a variable! I thought variables were declared at the top of the sketch. While variables are often declared before the setup() function, you can actually declare and initialize a variable just about anywhere in a sketch. Soon you will see why this placement is the way to go.

Let’s break down this statement. First, look at the data type and the name. We declare an integer and name it buttonState. Notice the variable name buttonState is indicative of its purpose, as we will see this variable is assigned the position of the button.

To initialize the variable, we see something altogether new – the variable is set equal to the output of a function called digitalRead(). This is going to take a little recall power on your part. Do you remember the reason for the word void in front of the loop() function? We had to write void because the function loop() does not return a value. But that is not the case for the function digitalRead().

The digitalRead() function returns an integer – either 1 or 0. This value is then assigned to the variable buttonState.

If it is 1, the voltage at the pin is HIGH, if the value is 0, the voltage at the pin is LOW. What pin you ask? Well the pin you pass as an argument in the digitalRead() function. In this case, we send the variable pushButton, because we want to read the state of pin 2 (if you recall pushButton was initialized to equal 2).

All of this is in the following line of code:

This is why Arduino rocks – one line of code and you are on your way to dominating the world.

Now the state of our pushbutton will be either HIGH (pressed) or LOW (not-pressed). HIGH will be reported as a 1, and LOW will be reported as 0. When we press the pushbutton, pin 2 is exposed to the 5-volts from the Arduino board, this is considered HIGH, and the digitalRead() function will return 1. If the button is not pressed, then all that pin 2 is exposed to is the ground voltage which is 0 and digitalRead() will return 0.

In the next line of code we return to the Serial library for another function called println().

The Serial.println () function returns the value of whatever variable you stick in as an argument. It will report this value to the serial monitor window on your Arduino IDE. To open up the serial monitor window all you have to do is click Tools > Serial Monitor (or SHIFT + CONTROL + M). This is one way to retrieve the data on your Arduino board.

Keep in mind, that when you unplug your Arduino and use some batteries to charge it, the Serial.println () function won’t do you much good. But while you are creating the circuit and the sketch, there is no better way to troubleshoot than use the println () and print () functions from the Serial library.

So let’s cover what we have done so far in the loop. First we read the state of digital pin 2 and save the state in a variable. Then we display the state in the serial monitor window.

Finally, we use the delay () function and wait one millisecond – this allows the reading at the pin to stabilize.

Once this is done, the loop starts from the top. We read another value at pin 2 – we are checking every time whether the button is pressed or not pressed – this value gets assigned to our buttonState variable, then we display the newly recorded value to serial monitor window – again. And we do this over and over – hundreds of times per second.

So go ahead, press that button, watch the serial monitor window – I think you are already brewing applications for these functions…

Источник

Adblock
detector