aboutsummaryrefslogtreecommitdiffstats
path: root/source/arduino/constants.rst
blob: b082774e7b68326d6e5b31abb95eeb7da903d6df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
.. _arduino-constants:

constants
=========

Constants are predefined variables in the Arduino language. They
are used to make the programs easier to read. We classify constants
in groups.

.. contents:: Contents
   :local:

.. _arduino-constants-bool:

Boolean Constants
-----------------

There are two constants used to represent truth and falsity in the
Arduino language: **true**, and **false**.

.. _arduino-constants-false:

false
^^^^^

false is the easier of the two to define. false is defined as 0
(zero).

.. _arduino-constants-true:

true
^^^^

true is often said to be defined as 1, which is correct, but true
has a wider definition. Any integer which is *non-zero* is TRUE, in
a Boolean sense. So -1, 2 and -200 are all defined as true, too, in
a Boolean sense.


Note that the *true* and *false* constants are typed in lowercase
unlike HIGH, LOW, INPUT, & OUTPUT.


Defining Pin Levels, HIGH and LOW
---------------------------------

When reading or writing to a digital pin there are only two
possible values a pin can take/be-set-to: **HIGH** and **LOW**.

.. _arduino-constants-high:

**HIGH**



The meaning of HIGH (in reference to a pin) is somewhat different
depending on whether a pin is set to an INPUT or OUTPUT. When a pin
is configured as an INPUT with pinMode, and read with digitalRead,
the microcontroller will report HIGH if a voltage of 3 volts or
more is present at the pin.



A pin may also be configured as an INPUT with pinMode, and
subsequently made HIGH with digitalWrite, this will set the
internal 20K pullup resistors, which will *steer* the input pin to
a HIGH reading unless it is pulled LOW by external circuitry.



When a pin is configured to OUTPUT with pinMode, and set to HIGH
with digitalWrite, the pin is at 5 volts. In this state it can
*source* current, e.g. light an LED that is connected through a
series resistor to ground, or to another pin configured as an
output, and set to LOW.

.. _arduino-constants-low:

**LOW**



The meaning of LOW also has a different meaning depending on
whether a pin is set to INPUT or OUTPUT. When a pin is configured
as an INPUT with pinMode, and read with digitalRead, the
microcontroller will report LOW if a voltage of 2 volts or less is
present at the pin.



When a pin is configured to OUTPUT with pinMode, and set to LOW
with digitalWrite, the pin is at 0 volts. In this state it can
*sink* current, e.g. light an LED that is connected through a
series resistor to, +5 volts, or to another pin configured as an
output, and set to HIGH.



Defining Digital Pins, INPUT and OUTPUT
---------------------------------------

Digital pins can be used either as **INPUT** or **OUTPUT**.
Changing a pin from INPUT TO OUTPUT with pinMode() drastically
changes the electrical behavior of the pin.



Pins Configured as Inputs
^^^^^^^^^^^^^^^^^^^^^^^^^

Arduino (Atmega) pins configured as **INPUT** with pinMode() are
said to be in a high-impedance state. One way of explaining this is
that pins configured as INPUT make extremely small demands on the
circuit that they are sampling, say equivalent to a series resistor
of 100 Megohms in front of the pin. This makes them useful for
reading a sensor, but not powering an LED.



Pins Configured as Outputs
^^^^^^^^^^^^^^^^^^^^^^^^^^

Pins configured as **OUTPUT** with pinMode() are said to be in a
low-impedance state. This means that they can provide a substantial
amount of current to other circuits. Atmega pins can source
(provide positive current) or sink (provide negative current) up to
40 mA (milliamps) of current to other devices/circuits. This makes
them useful for powering LED's but useless for reading sensors.
Pins configured as outputs can also be damaged or destroyed if
short circuited to either ground or 5 volt power rails. The amount
of current provided by an Atmega pin is also not enough to power
most relays or motors, and some interface circuitry will be
required.

.. _arduino-fpconstants:

Floating-Point Constants
------------------------

Similar to integer constants, floating point constants are used to
make code more readable. Floating point constants are swapped at
compile time for the value to which the expression evaluates.



Examples:



``n = .005;``



Floating point constants can also be expressed in a variety of
scientific notation. 'E' and 'e' are both accepted as valid
exponent indicators.



::

    
    floating-point   evaluates to:      also evaluates to:
      constant 
    
       10.0              10
      2.34E5          2.34 * 10^5             234000
      67e-12        67.0 * 10^-12         .000000000067

.. _arduino-constants-integers:

Integer Constants
-----------------

Integer constants are numbers used directly in a sketch, like
``123``. By default, these numbers are treated as
`int <http://arduino.cc/en/Reference/Int>`_'s but you can change
this with the U and L modifiers (see below).



Normally, integer constants are treated as base 10 (decimal)
integers, but special notation (formatters) may be used to enter
numbers in other bases.



::

    Base               Example    Formatter        Comment

    10 (decimal)           123    none

    2 (binary)        B1111011    leading 'B'      only works with 8 bit values (0 to 255)
                                                   characters 0-1 valid

    8 (octal)             0173    leading "0"      characters 0-7 valid

    16 (hexadecimal)      0x7B    leading "0x"     characters 0-9, A-F, a-f valid

.. _arduino-constants-integers-dec:

**Decimal** is base 10. This is the common-sense math with which
you are acquainted. Constants without other prefixes are assumed to
be in decimal format.



Example:
::

    101     // same as 101 decimal   ((1 * 10^2) + (0 * 10^1) + 1)

.. _arduino-constants-integers-bin:

**Binary** is base two. Only characters 0 and 1 are valid.



Example:
::

    B101    // same as 5 decimal   ((1 * 2^2) + (0 * 2^1) + 1)

The binary formatter only works on bytes (8 bits) between 0 (B0)
and 255 (B11111111). If it is convenient to input an int (16 bits)
in binary form you can do it a two-step procedure such as:



::

    myInt = (B11001100 * 256) + B10101010;    // B11001100 is the high byte

.. _arduino-constants-integers-oct:

**Octal** is base eight. Only characters 0 through 7 are valid.  Octal
values are indicated by the prefix "0".

Example:

::

    0101    // same as 65 decimal   ((1 * 8^2) + (0 * 8^1) + 1)

Warning
It is possible to generate a hard-to-find bug by (unintentionally)
including a leading zero before a constant and having the compiler
unintentionally interpret your constant as octal.

.. _arduino-constants-integers-hex:

**Hexadecimal (or hex)** is base sixteen. Valid characters are 0
through 9 and letters A through F; A has the value 10, B is 11, up
to F, which is 15. Hex values are indicated by the prefix "0x".
Note that A-F may be syted in upper or lower case (a-f).



Example:

::

    0x101   // same as 257 decimal   ((1 * 16^2) + (0 * 16^1) + 1)

.. _arduino-constants-integers-u-l:

U & L formatters
^^^^^^^^^^^^^^^^

By default, an integer constant is treated as an
`int <http://arduino.cc/en/Reference/Int>`_ with the attendant
limitations in values. To specify an integer constant with another
data type, follow it with:




-  a 'u' or 'U' to force the constant into an unsigned data format.
   Example: ``33u``
-  a 'l' or 'L' to force the constant into a long data format.
   Example: ``100000L``
-  a 'ul' or 'UL' to force the constant into an unsigned long
   constant. Example: ``32767ul``




See also
--------


-  `pinMode() <http://arduino.cc/en/Reference/PinMode>`_
-  `Integer Constants <http://arduino.cc/en/Reference/IntegerConstants>`_
-  `boolean variables <http://arduino.cc/en/Reference/BooleanVariables>`_
-  `#define <http://arduino.cc/en/Reference/Define>`_
-  `byte <http://arduino.cc/en/Reference/Byte>`_
-  `int <http://arduino.cc/en/Reference/Int>`_
-  `unsigned int <http://arduino.cc/en/Reference/UnsignedInt>`_
-  `long <http://arduino.cc/en/Reference/Long>`_
-  `unsigned long <http://arduino.cc/en/Reference/UnsignedLong>`_