Arduino ide boolean

Сравнения, условия и выбор

В языке C++ есть такое понятие, как логическая величина, которая принимает два значения: правда и ложь, true и false , 1 и 0. Для хранения логических величин у нас есть тип данных boolean ( bool ), который может принимать значения 0 ( false ) или 1 ( true ). Логические переменные часто называют флагами: если переменная равна true – флаг поднят, если false – опущен.

Сравнение

Два числа можно сравнить при помощи операторов сравнения:

  • == равенство ( a == b )
  • != неравенство ( a != b )
  • >= больше или равно ( a >= b )
  • меньше или равно ( a )
  • > больше ( a > b )
  • меньше ( a )

В рассмотренных выше абстрактных примерах с a и b мы получаем логическое значение, которое является результатом сравнения чисел. Пусть a = 10 и b = 20 , тогда скобка (a > b) вернёт значение false , потому что a меньше b . А вот (a != b) вернёт true , т.к. а действительно не равно b .

Для связи нескольких логических величин используются логические операторы:

  • ! логическое НЕ, отрицание. Есть аналог – оператор not
  • && логическое И. Есть аналог – оператор and
  • || логическое ИЛИ. Есть аналог – оператор or

Сравнение float

Со сравнением float чисел всё не так просто из за особенности самой модели “чисел с плавающей точкой” – вычисления иногда производятся с небольшой погрешностью, из за этого сравнение может работать неверно! Пример из урока про вычисления:

Будьте внимательны при сравнении float чисел, особенно со строгими операциями : результат может быть некорректным и нелогичным!

Условный оператор if

Условный оператор if (англ. “если”) позволяет разветвлять выполнение программы в зависимости от логических величин, т.е. результатов работы операторов сравнения и логических переменных.

Оператор else (англ. “иначе”) работает в паре с оператором if и позволяет предусмотреть действие на случай невыполнения if :

Также есть третья конструкция, позволяющая ещё больше разветвить код, называется она else if :

Посмотрим на все эти операторы в действии в большом примере:

Оператор if позволяет управлять программой и создавать разветвлённые действия в зависимости от разных условий. Обратите внимание на последний блок в примере выше, там где используется else if для выбора действия в зависимости от значения одной и той же переменной. Существует оператор выбора switch , позволяющий сделать код более красивым. О нём поговорим чуть ниже.

Особенность bool

В уроке о типах данных я упоминал о том, что bool принимает значение true , если присвоить ему отличное от нуля число, то есть оператору if можно скормить любое число, и он вернёт true в любом случае, кроме нуля. Это бывает удобно в некоторых случаях, но также может и приводить к ошибкам, которые трудно отловить. if (50) <> – код в фигурных скобках будет выполнен.

Порядок условий

Порядок условий играет очень большую роль: логические выражения и переменные проверяются слева направо, и если результат всего выражения в скобках будет однозначно определён после проверки первого выражения – остальные выражения проверяться не будут. Например если в выражении if (a && b && c) хотя бы а имеет значение false , проверка остальных выражений ( b и c ) уже не выполняется, потому что всё выражение заведомо будет false .

Или наоборот: если в выражении if (a || b || c) хотя бы а будет true – всё выражение также будет true и b с c не будут проверяться.

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

Тернарный оператор ?

Оператор знак вопроса ? , или тернарный оператор, является более коротким аналогом для записи конструкции if else . Действие с оператором ? имеет следующий вид:

условие ? выражение1 : выражение2

Это работает так: вычисляется условие, если оно истинно, то всё действие возвращает значение выражения 1, а если оно ложно, то всё действие возвращает значение выражения 2. Пример:

Аналогичная конструкция на if-else

Ещё вариант с вычислением:

Аналогичным образом можно использовать оператор ? для вывода данных и текста в последовательный порт (подробнее о нём в другом уроке):

Важный момент: если результат присваивается или передаётся в функцию, тип данных должен быть одинаковый! То есть код Serial.println((a > 9) ? 9 : «меньше 9»); приведёт к ошибке, так как мы пытаемся передать или int или char* , что не будет работать.

Также можно получать значения из функций, если они имеют одинаковый возвращаемый тип данных:

А можно ли сделать на операторе ? более сложную конструкцию, типа else if ? Можно!

Оператор выбора

Оператор выбора switch позволяет создать разветвление кода в зависимости от значения одной переменной. Синтаксис такой:

Наличие оператора default необязательно. Наличие оператора break обязательно, иначе сравнение пойдёт дальше, как показано для case 2, 3 и 4.

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

Также конструкция на switch работает быстрее, чем аналогичная на else if : происходит выбор варианта и моментальный переход на нужный блок кода, а в else if в каждой строке производится проверка логического выражения.

ВАЖНОЕ ЗАМЕЧАНИЕ

Нужно быть крайне внимательным при работе с оператором switch , потому что код, находящийся внутри фигурных скобок switch() < >, является одним блоком кода для всех кейсов. Соответственно кейсы case – всего лишь ярлыки перехода между участками этого блока. Почему это так важно: все кейсы находятся в одной области видимости, то есть внутри switch не могут быть объявлены локальные переменные с одинаковыми именами:

Более того, крайне не рекомендуется создавать локальные переменные внутри кейсов, так как это может сломать код!

Что делать, если очень хочется? Обернуть содержимое кейса в блок при помощи фигурных скобок:

Видео

Источник

Arduino and Booleans: The truth is greater than zero!

Boolean with Abstract Technology Binary code Background.Digital binary data and Secure Data Concept. Software / Web Developer Programming Code and Boolean. Boolean Java Script Abstract Computer Script

Table of contents
1 Boolean logic with Arduino
1.1 Transistor logic & binary
2 Examples
2.1 Logical operators
2.2 Dual relay state machine

1 Boolean logic with Arduino

Binary and boolean sometimes seem like buzzwords, particularly “binary,” but that’s just because people become so fond of this mode of thinking once they get into it. Hint: They’re the cool geeks with Ferraris.

At the heart of things, binary is a machine thing, and if you want to control machines, especially microcontrollers, then you have to dig into binary once in a while. Especially the Arduino Uno (atmega328p), which has only 2KB SRAM. It’s a lean system that requires you to be clever if you want it to run large programs. Storing large arrays in PROGMEM and EEPROM (flash) will only get you so far.

1.1 Transistor logic and binary

The question, “why not just use the decimal system?” is very relevant, and must first be answered. You’ll learn to love boolean logic more once you understand why the binary system was designed in the first place.

Consider a transistor, which may be either “ON” or “OFF” at any given time. That transistor can describe two values (2**1). However, what if you want to count a bit higher? Add another transistor, and you can count to 4 (2**2), three (2**3) let you count to 8, and so forth. For your learning pleasure, pop open a python shell, and copy-paste the following to see the possible states up to 8 bits / 1 byte:

And up to 16 bits / 2 bytes:

It’s impossible to count 65,535 Pokemons (including the starting score of 0) using only 16 fingers and toes, using only the decimal system. But, with binary, we can!

If it seems obscure, don’t be annoyed. Think of each binary digit as a transistor: 1 is “ON” and if 0 is “OFF.” To describe the number 255 using the decimal system would require 256 transistors (including 0), whereas with the binary system, we can describe 256 states with just eight transistors. It’s “0b11111111,” eight bits to one byte. It saved a lot of space in the early computer labs, where transistors weren’t tiny or effective (have you ever seen a vacuum tube?).

This is how our tablets and smartphones counted the number of Pokemons we caught when playing Pokémon Go. There’s no upper limit except memory.

When using Arduino, we have the “byte” data type (really uint_8t) to tell the compiler that we want a value in the range 0-255. However, boolean variables are much easier! Boolean variables can be represented with just one transistor, where true equals “ON,” and false equals “OFF.” You might have a tiny little state machine to determine if your motor is running, and declare it globally, before the setup() function:

When the motor is turned on, you’ll want to update that, with

You can use this to control the behavior of your system, if, for instance, your Arduino shouldn’t do anything else while the motor is running.

You’ve probably noticed the “!,” which is the logical negation operator. It means “NOT” in human-speak. The relational operators available in Arduino C++ are “==,” “!=,” “>=,” “ ,” but today is all about the boolean logic. Concerning ourselves with the relationship between variables isn’t relevant (such as determining if one value is greater than another), since the logical operators “!,” logical negation, “&&,” logical AND, and “||,” logical OR are more than enough to create AWESOME complex expressions. Though sometimes called binary operators, let’s not stray from the path.

If you’re feeling up to it, have a look at more advanced logic.

2 Examples

2.1 Logical operators

Following the binary bits above, let’s use the logical operators in a practical manner. We do use the Arduino IDE, see this for a quick introduction.

Now, let’s count to “1” in binary!

It’s unimpressive but very powerful. Let’s make a longer compound expression!

Hit CTRL+SHIFT+M to pop open the serial monitor, and input a 4-bit value, delimited by space. Something like “1 0 1 0” will do nicely. Then, press “Send.” You’ll see output like the following:

If you’re the lucky one, favored by the rising sun:

This Arduino sketch demonstrates many uses of boolean logic. Wherever the truth must be found, or its opposite, we’re using boolean logic.

2.2 Dual relay state machine

The example in 2.1 is a toy, created only to demonstrate logical operators. This, however, is a useful state-tracking relay module, for you to modify and tinker with. Copy the code into a new sketch in your Arduino IDE, and upload it with CTRL+U. Then, view the serial monitor with CTRL+SHIFT+M (or “python3 -m serial.tools.miniterm” on Linux/MacOS, TeraTerm/Putty on Windows). If you input “0” and send it, you can view current relay states, either “ON” or “OFF.”

If you input “1,” you’ll switch relay 1, “ON” if it was “OFF” and “OFF” if it was “ON.” Sending “2” will accomplish the same thing for relay 2. For both relays, state is kept with “bool” variables (“relay1State” and “relay2State”), and for each relay, an LED will light up if it’s indeed “ON.”

It’s not necessary to have anything except an Arduino to use the program. Play before you make!

The code below is written specifically to make you comfortable with using booleans in Arduino IDE.

On the hardware side of things, I’ve never trusted those blue 5V relays for heavy loads, but they’re confirmed good up to

200W. Enjoy your making!

2x 2N7000 N-channel MOSFET https://www.newark.com/on-semiconductor/2n7000/n-channel-mosfet-60v-200ma-to/dp/58K9650
2x ROHM SLR343BC4TT32 3mm blue LEDs https://www.avnet.com/shop/us/products/rohm/slr343bc4tt32-3074457345627700657?CMP=EMA_ECIA_inventoryfeed_VSE?aka_re=1
2x BAT86 schottky diode https://www.newark.com/search?st=bat86%20schottky%20diode
Arduino Uno or Arduino Nano https://store.arduino.cc/arduino-uno-rev3

https://store.arduino.cc/arduino-nano

2x 4.7 kiloohms + 2x 470 ohms resistors https://www.newark.com/multicomp/cfr0w4je006kil/resistor-kit-carbon-film-axial/dp/24M1011
Breadboard https://www.newark.com/twin-industries/tw-e41-1020/breadboard-solderless-830-tie/dp/56T0251
Dupont wires https://www.newark.com/adafruit/759/kit-contents/dp/88W2571
2x 5V relays https://www.newark.com/omron-electronic-components/g5le-1a4-dc5/relay-spst-no-250vac-30vdc-10a/dp/83F5375

2.2.1 MAKE it!

Connect everything as shown in the diagram below; first on breadboard, then on protoboard. That’s how we do it.

The only gotcha is getting the BAT86 schottky diodes right. You must have the cathodes (black ring on BAT86, usually a white ring) facing the positive terminals on the relays (the right side in the image above), or there will be problems (short circuit). The ring marks the cathode (k); make sure it’s lined up to the positive terminals! See this picture, zoom in on the blue relays:

Here’s a picture of the assembled build. The extra things on the protoboard with the Arduino Nano aren’t in the scope of this article, and are also wildly uninteresting.

Источник

Adblock
detector