3.
C H A P T E R 1
1
Saving the World…
…One Arduino at a Time!
Every scientist or engineer begins life as a hacker. In order to discover something new, one must often
BUILD something new. Fortunately for the ”non-scientists” among us, that paradigm puts us on even
ground!
For instance, temperature was once only a relative term: “Eh… it’s hotter than yesterday, isn’t it?”
Finally someone with a workshop, some raw material, a bit of time on his hands, and a great bit of
creativity invented the thermometer. Suddenly humanity had the ability to quantify “hot” and “cold” in
a universal manner that could be understood across continents. Even more fantastic was the ability to
record and compare these facts, year after year. Eventually, with a large enough data set, humanity was
able to make reasonably approximate predictions.
All this from one man’s ingenuity: simple spheres of glass filled with various mixtures of oil and
other liquids, suspended in a tall glass of water.
Fast-forward several hundred years. We now have the ability to measure so many phenomena that
we can not only predict outcomes but also examine complex ecosystems, understand the cause and
effects of changes within them, and have learned to reduce the negative effects―and sometimes
eliminate them completely. More than any other technology, sensors (which provide the ability to
quantify something) help scientists and everyday people save lives, save resources, and save the world.
It is with this premise that the book you now hold came about. By volunteering a small amount of
their time and effort, normal people should be able to participate actively in scientific data gathering
that benefits the greater good. If we can benefit ourselves along the way, even better!
The Arduino fits into the picture by positioning itself as the “bridge” between humans and sensors.
Never has it been easier to learn about microcontrollers, understand sensor technology, and write code.
The Arduino makes it all easy by providing a simple hardware and software platform that runs on any
desktop or laptop computer. Furthermore, the programming language in which you write the code that
is to run on the Arduino is an easy C-like language called Processing, which automates all of the difficult
hardware tasks for you. Finally, a standard electronic interface based upon the “shield” concept makes
working with complex hardware a simple matter of plugging in the optional boards. With some basic
electronics knowledge, you can even build your own shields to serve customized purposes.
This book covers several sensor types. In addition, we will interface these sensors to the Arduino
through a series of progressively complex methods. Initially, simple sensors will be connected directly to
the Arduino inputs or via a breadboard. Once a circuit is verified, we will then build the interface circuits
on prototyping shields or perf board.

4.
CHAPTER 1 ■ SAVING THE WORLD...
2
With the primary circuitry complete, we will develop the project into its final form, adding support
systems such as power supplies, switches, and jacks, as well as the all-important housing to protect the
sensor system from environmental conditions.
It’s All About Sensors
The main theme of this book is constructing Arduino projects that focus on sciences. In particular, this
book has a very strong “green focus.” What will make these projects possible are sensors, which are
devices that respond electrically to a physical change. Often this response is a change in resistance. For
example, a flex sensor will vary its resistance based on how much bend is applied to it. Essentially, the
sensor converts one analog (physical) condition to another analog (electrical) condition, such as
temperature to resistance or impact pressure to voltage.
By itself, a microprocessor (which lives in a digital world) cannot understand analog values.
Resistance or voltage means nothing to a microprocessor. We need some way to convert these values
into the ones and zeros of computer language.
At this point, I think we need to define how a microcontroller such as the one built into the Arduino
board differs from a microprocessor. In fact, a microcontroller is a microprocessor. However, it has
several key differences from the one lurking inside your laptop or desktop. A microcontroller has had
several useful peripheral devices built inside the chip casing, along with the CPU.
A microcontroller has RAM, ROM, serial ports, and digital inputs and outputs. All these might be
familiar to you already. After all, your personal computer has all the same devices. However, it is
important to note that these peripherals are built into the chip instead of sitting on the side. Therefore,
they are much more limited than their desktop PC counterparts. Where a traditional PC might have
gigabytes of RAM, a microcontroller might have only a few kilobytes.
There is one peripheral device built into the microcontroller that we will focus on again and again
throughout this book: the analog to digital converter, or ADC for short. As its name implies, the ADC
connects the analog world to the digital world, converting the signals into something the CPU can
understand and work with. Before moving on, let’s take a moment to look at the ADC more closely.
Arduino’s Analog to Digital Converter (ADC)
We will be using the analog to digital converter (ADC) extensively throughout the book. The Arduino has
an ADC tied to six inputs (labeled Analog0–Analog5). A few of the projects might utilize all six inputs. We
might even wish for more! It is the job of the ADC to sample a voltage at the specified input pin,
transcribe that voltage to a byte value, and finally deposit that value into a variable you specify in ram.
Essentially, the ADC does nothing more than makes a comparison. It compares the voltage
presented at the analog input to another voltage presented at a reference input.
■ Note The analog reference is considered the highest expected voltage that a signal will present to the analog
input. The input will not be damaged by any voltage that is 5 volts or less, but anything above the reference
voltage will be reported as the maximum value.

5.
CHAPTER 1 ■ SAVING THE WORLD...
3
You have a few options regarding the analog reference voltage. For instance, you could choose to
utilize the Arduino’s primary voltage supply as the reference. This is an easy solution, and is the default.
It will be either 5 volts or 3.3 volts, depending on your board. It does have a drawback, though. It is not so
stable. When running on batteries, for example, the supply voltage (and thus the analog reference
voltage) will drop over time. Also you might experience dips and sags if your project switches high-
current devices such as relays or servos.
Another option is to utilize an internal reference voltage. You have a few options as to what that
voltage might be, depending on the Arduino CPU you own. This reference voltage is dependent on
internal conditions of the Atmel CPU and is thus very stable. It will be either 1.1 volts or 2.56 volts.
Finally, you might provide your own voltage directly. This voltage can be anywhere from 0 to 5 volts.
It should never exceed 5 volts, and it is recommended that you take extra precautions when using the
Aref pin directly.
Conversion Process
Imagine for a moment that the voltage presented at the input is placed on a bar graph. This bar graph
has 1024 increments, and the 1024th
increment represents the maximum input voltage. Because
computers count starting with zero, the 1024
th
value is actually read as 1023.
Assuming that the operating voltage of the Arduino board is 5 volts, and that we are using the
default analog reference, the byte value 1023 (starting from zero) must represent 5 volts (actually 4.995
volts). It is fairly easy to see that 2.5 volts would be represented by the byte code 512, but what about the
others?
■ Tip If we were to take the maximum input voltage of 5 volts and divide it by 1024, we would find that each
increment of the byte code represents about 4.8828 millivolts. So, if we want our software to determine the
voltage of the analog input, all we need to do is multiply the byte code by 4.8828 millivolts.
Notice that because the ADC can count only in 4.8828-millivolt increments, it must round up or
down to the nearest increment. For example, 2.750 volts is between byte values 563 and 564. Byte value
563 represents a voltage of 2.747, while 564 represents 2.752 volts.
Changing the Voltage Reference
We can increase the resolution by utilizing either an internal reference voltage or by providing our own
lower voltage reference on the Aref pin.
In Table 1-1, each Arduino model has slightly different options for analog reference voltages. All
Arduinos have, by default, the system voltage as the reference, which is 5 volts in most models. Some
models have lower operating voltages, such as the Lilipad. Be sure to check the operational voltage of the
board before calculating the ADC increment size.
As for internal reference voltages, 1.1 volts is somewhat hard to use with most of the sensors
described in this book. Many won't operate at all in that voltage region. This reference voltage is useful
in special circumstances, but beyond the scope of this book.
The 2.56 volt reference is quite practical, but it is only available on the Arduino Mega, and possibly
the rare ATMEGA8-based devices.

6.
CHAPTER 1 ■ SAVING THE WORLD...
4
For these reasons, we use the default reference as much as possible throughout the book. However,
it can be useful to provide your own lower reference voltage. If you were to lower the reference voltage to
the ADC, you would have to modify the sensor circuit and software so the data scales properly. To
determine the voltage increment of your own analog reference voltage, simply divide it by 1024. Also, be
sure to provide an absolutely stable reference voltage. The best way to do this is to build a dedicated
voltage regulator for the analog section. This is relatively straightforward with standard LM78xx linear
regulators.
More information about the analog reference can be found here: http://www.arduino.cc/en/
Reference/AnalogReference
Table 1-1. Comparison of Various Analog Reference Options for Arduino Boards
Mode Board Voltage Increment Voltage
DEFAULT ALL Depending on board
5 Volts or 3.3 Volts
5 Volts = 4.88 mV
3.3 Volts = 3.22 mV
INTERNAL ATmega8, 168, 328–based
boards
ATmega168, 328 = 1.1V
ATmega8 = 2.56V
1.1 Volts = 1.07 mV
2.56 Volts = 2.50 mV
INTERNAL1V1 Arduino Mega only 1.1 Volts 1.07 mV
INTERNAL2V56 Arduino Mega only 2.56 Volts 2.50 mV
EXTERNAL ALL 0 to 5 Volts Aref / 1024
Voltage Dividers
The ADC can only measure a voltage; it cannot measure resistance or current (at least, not directly).
Many sensors will output a voltage directly, but not all. Some sensors are purely resistive. For example, a
light dependent resistor (LDR) changes its resistance due to light striking its surface. In such a case, we
will need to convert this resistance to a voltage before we can send it to the ADC. It's really quite easy,
using a simple circuit called a voltage divider (see Figure 1-1).
Figure 1-1. The voltage divider circuit

7.
CHAPTER 1 ■ SAVING THE WORLD...
5
Look at Figure 1-1 and imagine that a 5-volt source (the same as the Arduino ADC reference voltage,
or CPU power supply) enters from the top. As the voltage passes through the first resistor, some of it is
“used up.” As the voltage continues into the next resistor, by the time it reaches the end of the line
(returns to the power source), it will equal zero. Thus, the second resistor must use up whatever voltage
remains after the current passes through the first resistor.
Perhaps now it is becoming clear that the voltage at the middle, where both resistors meet, is the
result of the ratio between the two resistors. If the two resistors are precisely equal, it hopefully is
intuitive to imagine that the voltage output will be precisely half of the input. Likewise, if the top resistor
is very small compared with the bottom resistor, very little will be consumed by it. So we could expect
that the voltage at the center will still be quite large. If, however, the top resistance is quite large, while
the bottom resistance is small, we can expect that the voltage at the middle will be closer to zero.
Let’s try it out with a quick example. Assume that R1 = 10 ohms, and R2 = 90 ohms. Also assume that
VCC = 5 volts. Plugging those values into the equation should yield 4.5 volts at VOUT.
Unfortunately, we are not done. We now need to consider the current passed and power dissipated
by those two resistors. The two resistors are in a series, so the total resistance is 100 ohms. Using Ohm’s
Law (V=IR, or in this case, current = voltage/resistance), we see that they pass 50 milliamps (mA).
Although this might not seem like much, power dissipated = current X voltage. Multiplying 50 mA with 5
volts means we must dissipate 250milliwatts. Most through hole resistors will run quite hot. They are
rated at either 250mW (which would blow instantly) or 500mW (which would run quite hot at half its
maximum power rating).
Let's try again. This time, choose significantly higher values. For example, let’s try 10k and 90k.
Running the numbers again, we get 100k total resistance, 50 microamps, and 250 microwatts. Much
better.
The ideal variable voltage divider is the variable resistor (also known as a potentiometer, or just pot,
but you might best recognize it as a volume knob on your stereo). The pot can sweep from maximum
resistance all the way down to zero resistance. This means that we can drive the voltage all the way down
to zero and all the way up to 5 volts.
Unfortunately, most sensors are not simple. Typically, the sensor would occupy the place of one
resistor in the voltage divider, and we must select the appropriate resistor for the other position.
Deciding in which position to place the sensor as well as selecting the companion resistor can be a
bit of a mental challenge. It is partially dependent on the minimum and maximum range of the sensor as
well as personal preference.
Imagine that the photo sensor is in the top position. It could drop its resistance to zero, and thus the
center point might go as high as 5 volts. However, even at maximum resistance, the bottom resistor
would still prevent the center point from driving all the way down to zero volts. If the resistor positions
were reversed, the inverse would apply.
Imagine a sensor with a minimum resistance of zero, and a maximum resistance of 500 ohms. Place
the sensor in the top position, with the fixed resistor in the bottom position. Now, when the sensor is at
its minimum of zero, the voltage to the ADC would be 5 volts. As the sensor resistance rises, the voltage
to the ADC will decrease. However, because the sensor maximum resistance matches the fixed resistor,
the voltage to the ADC will never go below 2.5 volts
We need to keep this small issue in mind when we set up our sensors. We must ask ourselves how
we wish the sensors to react (should the sensor be on top, or bottom?), and what is the practical output
voltage range from our circuit (should the fixed resistor be larger, smaller, or equal to the maximum
resistance of the sensor?). We need to have at least a basic understanding of what to expect before we
attempt to interpret the data given to us by the ADC.

8.
CHAPTER 1 ■ SAVING THE WORLD...
6
A Strategy for Prototyping Sensor Systems
When we build up a sensor system (or any Arduino project, for that matter), it is important to have a
clear plan of action. A consistent framework for initially exploring and ultimately verifying our sensor
code before integrating it into a larger project is essential.
I have broken the process down into five key stages:
1. You must research and understand the sensor’s operation.
2. You will need to determine the appropriate equations to convert the sensor’s
output to valid data.
3. You should write a simple Arduino program, called a sketch, to operate the
sensor and verify that your equation works properly.
4. After that, you will want to verify that the data is correct and possibly calibrate
your sensors to known calibration sources.
5. Finally you can integrate the sensor code into your primary project.
When building remote battery-operated sensors, you will also want to consider what methods you
can employ to reduce power consumption.
Understand the Sensor
Our first task is to get a good idea about how the sensor works (or at least, how we are to interface with
it). The best resource is to study the data sheet provided by the manufacturer carefully. Certainly, there
is a lot of confusing material in any data sheet, but thankfully most of it is not necessary to get the basic
system up and running. We want to pay particular attention to any reference schematics, written
descriptions of theory of operation, and equations that describe the relationship between sensor
resistance or voltage and the phenomenon we are attempting to measure.
Theory of operation is particularly important. While many sensors are quite simple (needing only to
read the voltage output), some sensors require a series of steps to be taken before we can read the
sensor. Gas sensors for instance require that a heater be turned on for a specified period of time, and
then turned off. Then, after an interval, we must turn on the sensing element and wait another period of
time. Finally, we can read the sensor value.
Figure Out the Equations
After understanding the basic operation of the sensor, we must check the data sheet for any equations
we need to perform in order to get the data we need. If we are lucky, the data sheet will spell it out in
black and white, with a statement like the following:
Vout = some equation
We will need to rearrange the equation so that the result can be deposited into a variable in the unit
of measure we want:
Unit of measure = rearranged equation including Vout
Unfortunately, many data sheets lack the required equation (perhaps the manufacturers assume it
must be obvious, when in fact is far from it). In such a case, we have no choice but to study the sheet

9.
CHAPTER 1 ■ SAVING THE WORLD...
7
carefully and attempt to decipher what we should do. I often find it helps to do a web search for more
information or sample projects in such a case. Another option is to contact the manufacturer directly for
assistance via e-mail.
Also, referring to the section concerning the ADC, we need to actually replace any instance in the
equation of Vout with an equation that relates the ADC count to a voltage. Certainly, such an equation
could get quite confusing rather quickly. Thankfully, many sensors are designed to operate on a simple
linear scale, which simplifies the initial equation for us. Generally, we will end up with something
like this:
Unit of Measure = ((ADCcount X 4.8828 milli-volts)–Yoffset)/coefficient
Write a Sample Serial Sketch
Once I have a good idea about how the sensor works and I sit down and wrestle with the math (I hate
math!), I find that the best first step in building the application is to write a very simple sketch to output
information to the serial monitor.
From the Arduino integrated development environment (IDE), go to File  Examples  Basic and
load the AnalogReadSerial sketch. Now save it with a new name. I usually use the name of the sensor
device, such as LM35-test.
We can now modify the sketch to read the sensor on Analog pin 0 and output data to the serial
monitor. Right away you might want to adjust the default sketch just a bit. In fact, I have modified my
own sketch and saved it back to the original example, so my modified version loads every time.
I adjusted the serial port speed down to 9600. Your version can be set at the maximum transmission
speed (115200). This is what I would call massive overkill. Really, you have no need to be transmitting
most data at such a speed. I have found that the higher data rates are not always reliable, especially
when you move your hardware around to various computers. When troubleshooting the reason why you
are getting garbled messages on the screen, it is always better to start slowly and ramp it up until you hit
the limitations of your equipment.
The other item I changed was to add a delay to the end of the loop. Normally, I don't suggest using
the delay() function, but in this case all we ever want to do is read one sensor and report it. Because it is
only a test, and we have no critical tasks to take care of, using a delay is certainly acceptable here. The
reason I highly recommend a delay is because without one, the Arduino will read and spit out data from
the ADC as fast as possible. The text will literally be flying by, and the serial monitor buffer will quickly
fill up, causing slower computers to lock up. Set the delay to at minimum 500 milliseconds. My personal
choice is 1-second intervals.
Now it's time to start testing out your sensor. You might want to take it slow at first (let's avoid the
black smoke). If the sensor does not require any particular sequence of events to take place in order to
complete a successful read, I will simply leave the sketch as is. After hooking up the sensor, I like to just
check that I am getting raw ADC values, and that they fluctuate in an expected manner, based on the
sensor type. So, assuming that I am using a new temperature sensor for the first time, I will look at the
raw ADC values and make sure that as I warm the sensor, the numbers go up, and as I chill the sensor,
the numbers go down. This will satisfy the need to verify the sensor is in working order and that I know
roughly how to use it. From here, you can rapidly build up a complete sensor application. Just take
the ADC data and pass it through a function to perform the required calculation and print it to the
serial port.

10.
CHAPTER 1 ■ SAVING THE WORLD...
8
Put the Sensor Through its Paces
Now that the code is done, you really need to verify that it is in fact working properly and reporting
accurately. It might be a bit difficult to compare your sensor directly with a commercial product. After
all, that is the reason we built our own in the first place: commercial products can be either too
expensive or not suitable to our requirements. But it is important to at least know you are close.
The solution is easy if you are lucky enough to have an instrumentation retail shop that is able to
rent out calibrated sensors. Simply compare the two sensors and make adjustments to your software
until they both agree. It's not enough to compare them at only one data point. You should attempt to
simulate a typical environment for the sensor, as well as both extremes. In the temperature sensor
example, you should compare ambient room temperature in your refrigerator (which is usually very
stable), and near some heat source. Only after you become quite familiar with the sensor’s variations
over the entire range can you be confident in your ability to interpret the data it reports.
If you have no calibration source for your sensor, you might want to contact the vendor for some
ideas or scour the Internet. Sometimes solutions come in unusual forms or from your own ingenuity. For
example, while attempting to calibrate a gas sensor, you might have to build your own vacuum jar so you
can directly control the calibration environment.
Integrate the Code into the Project by Building Sensor Functions
Once you are satisfied that your code is working well and reporting reasonably accurate data, you should
modify your code to make it more modular. The goal is to make it as reusable as possible. If the sensor
requires a series of steps to be performed, contain the sensor read process in one function that returns
raw ADC data.
The calculations required to convert the ADC data into units of measure should be contained in a
second function. If there are several devices in the family that require different values for parts of the
equation, these should be included as variables passed into the function. This makes the function
universal to the whole family of devices and allows you to easily change devices simply by passing a new
constant into the function.
You could take it a step further by learning a bit about writing libraries. Building a series of devices
into a library will make it very simple to use any number of them in any project, simply by importing the
library and calling the functions.
Consider Power Saving Whenever Possible
If the sensor has the ability to be turned off or disconnected in any way, you should consider using the
feature whenever possible. For devices powered by a wall outlet or the USB port, it really does not
matter. However, when building field devices, which need to operate on batteries or solar panels for long
periods of time, any bit of power you can save will help.
Many devices without a power saving feature can still be shut down to conserve power. Simply
assign one digital output of the Arduino to act as a power switch to all your external hardware. Route the
power for these devices through a transistor, with the gate tied to the digital output pin. When you are
ready to take a measurement, all you need to do is set the output to high to turn on all your sensors. Such
a design will incur some warmup delay, which varies from sensor to sensor, so you need to take that into
account when writing your code.

11.
CHAPTER 1 ■ SAVING THE WORLD...
9
Supplies and Tools Needed
Before we really get going, I think we should talk a bit about the prototyping tools you will need to get
started. Obviously, you will need at least one Arduino. You have a lot of options, but some are better for
sensor networks than others.
When choosing an Arduino (or team of Arduini?) you should ask the following questions:
• Will my project be operating on batteries?
• Will my project need to communicate over a distance?
• How many analog inputs will I need?
• What are the environmental conditions my project will operate in?
• Will my project be connected to a PC or network?
• Will I need to store large amounts of data?
Some projects will require special attention to some or all of these questions. In such cases, I will do
my best to provide advice in choosing the best Arduino for the project. In other cases, the choice of
Arduino will not matter much, and you can use any device you like.
In addition to parts required for individual projects, your shopping list should include these:
• Several Arduino prototyping shields
• Jumper wire kit
• Wires with pins on one end and sockets on the other
• Small breadboard (several might be nice)
• 6-pin header sockets, with long pins
• 8-pin header sockets, with long pins
Finally, you will need the following additional tools and supplies:
• Soldering iron, solder, and stand
• Diagonal cutters (nippers)
• Needle nose pliers
• Electric drill and drill bits
• Screwdriver set
• Adjustable wrench
• Set of jewelers’ files
• Electrical tape
• Heat shrink tubing of various sizes

12.
CHAPTER 1 ■ SAVING THE WORLD...
10
• Silicone glue or hot melt glue gun
• Razor knife
Building the BreadboardShield
One tool I have found to be invaluable in preparing the projects in this book is what I call the
BreadboardShield. You can make one yourself using a standard Arduino prototyping shield kit, a set of
replacement shield sockets with long pins, and a mini breadboard, as shown in Figure 1-2.
Figure 1-2. A typical prototyping shield with original pin headers. Replace them with sockets.
Arduino prototyping shields usually come with header pins that don't include the female sockets on
top. This means you can't stack another shield on top of the prototyping shield. I usually replace the
header pins with my own set of sockets with long pins so I can stack additional shields on top.
You should buy at least one set (2 each) of 6- and 8-pin sockets. Having several sets will come in
handy. It is always better to have them in stock rather than putting your project on hold while you go
shopping.
Start by laying the shield over an Arduino and inserting the socket pins through the shield and into
the Arduino sockets. This will confirm orientation of all the pins, and that you have the board right side
up instead of upside down. Trust me; nothing is more frustrating than trying to pull the sockets off after
you soldered them into the board bottom up!

13.
CHAPTER 1 ■ SAVING THE WORLD...
11
Next, pull the shield off the Arduino and carefully turn it over onto the table, keeping the sockets in
place, as shown in Figure 1-3. You should now be able to solder the pins easily. I suggest that you only
solder one pin for each socket at first. You can then test fit and adjust sockets in your Arduino. If
everything fits fine, solder the rest of the pins in place. If not, heat the solder joint of any socket not in
alignment and make adjustments till it fits properly.
Figure 1-3. Preparing to solder the sockets
The next step is to locate your mini breadboard and remove one of the power strips, as shown in
Figure 1-4. Usually these boards are held together with a wide piece of double-sided tape on the bottom.
You will need to cut this tape with a razor knife.

14.
CHAPTER 1 ■ SAVING THE WORLD...
12
Figure 1-4. Cutting one power strip away from the mini breadboard
Once the mini breadboard has been separated, test fit the piece between the sockets of the
prototyping shield. Notice that the side of the breadboard might have some plastic nubs to align the
board into the board next to it. You might need to cut these nubs off with a pair of nippers.
If all fits well, peel the backing off the double-sided tape and stick the breadboard down onto the
shield. Be sure to check the alignment of the breadboard as you do so, such that the end over the power
connector and USB port of the Arduino does not hang out too much. It will make it more difficult to plug
and unplug the Arduino. You also want to be sure that the VCC and GND pins on the Arduino are next to
holes on the power strip of the breadboard, rather than at an angle to them. The completed
BreadboardShield is shown in Figure 1-5.

15.
CHAPTER 1 ■ SAVING THE WORLD...
13
Figure 1-5. Completed BreadboardShield with power jumpers installed
I use this shield pretty much constantly to prototype Arduino projects. Only after the hardware is
fully tested do I go ahead and solder the parts down to a prototyping shield. This way, I have a lot of
freedom to move things around, try different parts, or completely reconfigure the circuit.
Summary
The Breadboard Shield is your new best friend! Once you become comfortable using it, you will start
virtually every Arduino project (and not just the ones in this book) with this shield. If you find a box large
enough to hold an Arduino with the shield attached, and some extra headroom for wires and
components mounted in on the breadboard, you can assemble a very nice travel kit for experimenting
on the go.
After verifying your project on the breadboard, you can finalize the design and build it directly onto
another prototyping shield, or have a printed circuit board made.
Now that we have assembled our parts, supplies, and tools, we can start building our own
environmental lab equipment.
Let’s start saving the world!

16.
C H A P T E R 2
15
Spider Temps
A Temperature Measurement Tool with Six Legs
In environmental projects, we often want to measure the temperature of something. Actually, we often
want to measure the temperature of many somethings!
Let me give you an example. My apartment has a loft, and thus the living room space has a very high
ceiling. We all know that hot air rises. In the winter, the loft sleeping space is quite warm and
comfortable, but the living room and kitchen are ice cold. To make matters worse, I have a double wide
sliding glass door to the patio, with single-pane windows (I loathe Japan’s building codes).
I would really like to be able to compare several temperatures at once, so that I can get a really good
idea of the “heat bubble,” as well as heat losses throughout the apartment. Then, I can use this
information as a baseline, while I try out different ideas to more efficiently manage the airflow and
heating in my apartment, and thus more efficiently manage my costs. Hey, I love saving a few bucks by
reducing my utility bills. It is a tiny impact on the environment, but if we can all analyze our living spaces
and learn to decrease our utilities, it will add up.
This is just one simple example of how you can use simultaneous temperature data. Another
possibility might be measuring river temperature upstream and downstream of a sewage runoff. Fish
and other aquatic wildlife are very susceptible to temperature variations. Knowing the temperature at
several data points in and around the runoff could help officials better understand the effects.
The following project starts off relatively simply. It is always easier, when working with new
hardware, to build up in stages. After getting one temperature sensor up and running, it becomes quite
simple to get five more working. At this point, you will have a pretty useful tool that will help you to
measure six temperatures at one time. In fact, it does not necessarily need to be temperature. With some
simple modifications, you can measure six of any sensors you have in your arsenal. Temperature is
certainly the most obvious sensor choice, but not your only option.
We then add a display to make it more portable and easier to handle (it's hard holding a laptop in
one palm and controlling a large array of sensors with the other).
Finally, we will box up the device in a field-ready form.
The Hardware
There are many ways to measure temperature, but I like to keep things simple. For most environmental
measurements (ambient air temperature, weather data, and the like) I prefer silicon temperature sensor
ICs. They have a lot of advantages over thermistors and thermocouples. For one thing, silicon sensors
are incredibly easy to interface. In most cases, you simply need three wires. One wire provides power,

17.
CHAPTER 2 ■ SPIDER TEMPS
16
one for ground, and one provides the signal input to the Arduino analog pin. Also, these sensors are
usually manufactured to be as linear as possible around the specified temperature range. This means
that calibration is incredibly simple, and the mathematics required to determine the temperature is
basic algebra. Easy for us! Easy for the Arduino!
In addition, silicon sensors are quite cheap. Of the two options presented here, one is about a dollar
each, while the other is as low as 3 sensors for a dollar!
We will be using either the LM35 sensor, made by National Instruments, or the MCP9700 sensor,
made by Microchip. See Table 2-1 to help you decide the sensor (or combination of sensors) you think
will best suit your needs. The "Determining Temperature Equations" section explains the coefficient and
offset in more detail later.
Table 2-1. Comparison of Two Temperature Measurment ICs
Manufacturer Part Number Range
(Degrees C)
Accuracy Coefficient
(mV/C)
Offset
(mV @ 0C)
National
Semiconductor
LM35D +2 to +150 +/- 0.2 @ 25C 10 0
Microchip MCP9700 -40 to +125 +/- 2 @ 70C 10 500
It should be noted that the LM35 series has several ICs in the family, designated with a letter. Each
part has different operating ranges and zero degree offsets. If you are using something other than an
LM35D, you should study the data sheet carefully.
The most obvious points to consider when choosing the best temperature sensor for your
application are temperature range and accuracy. Notice that although the MCP9700 has a much lower
operating temperature (which might be important for winter weather monitoring), it is less accurate
than the LM35D. With an accuracy of plus or minus 2 degrees, there is a potential error in reading by as
much as 4 degrees Celsius. Microchip provides an appnote to help you increase the accuracy to as little
as plus or minus .02 degrees, but it is an advanced project and beyond the scope of this book.
The zero degree offset is not a set-in-stone figure. We know that the slope (coefficient) is 10
millivolts per degree Celsius. Thus, it is reasonable to assume that in the case of the MCP9700, which has
a minimum temperature of -40 degrees, it would measure zero degrees at or around 400 millivolts. In
other words, it must move from -40 to 0, in 10-millivolt increments per degree (40 x 10 = 400). However,
the table shows that the offset is 500 millivolts. There is a 10 degree difference. When the analog to digital
converter (ADC) is reading very close to zero degrees, it might have trouble reading accurately. The
sensor has been “pushed” up the scale by 10 degrees such that at its extremes, it is still within the
accurate “window” of most analog converters.
Parts List
Here is the parts list for this project:
• Any Arduino
• Breadboard or prototyping shield
• 6 x LM35D or MCP9700 Temperature sensors (or a combination of both)
• At least 6 meters of 3-conductor cable (cut into 6 equal lengths)

19.
CHAPTER 2 ■ SPIDER TEMPS
18
If this is your first time looking at a schematic, trust me, it is less complex than it at first appears.
What looks like wires going all over the place in the schematic actually translates to a simple set of
connections in real life. The breadboard helps us tremendously by providing a set of busses that allow
several wires to be plugged into a row, and thus all be connected together.
Notice in the schematic that pin 1 of every sensor is connected to the 5-volt pin. Also, pin 3 of every
sensor is connected to Ground. Finally, pin 2 of each sensor goes to a different analog input.
The sensor looks like any standard small transistor. By referring to the data sheets, you will find that
the pin functions are the same with both sensors. Hold the sensor with the pins down and the flat face
toward you, and consult Figure 2-2. The left pin needs 5 volts input. The right pin should be connected
to Ground. The center pin is the output and connects directly to an Arduino analog input.
Figure 2-2. Temperature IC pin names
The build for this project is quite simple in principle. We want to solder several meters of 3-
conductor cable to each of 6 temperature sensors. When cutting the cables, be sure to match the lengths
of all six as closely as possible. We want to maintain consistency from sensor to sensor. Going the extra
mile now will save us a lot of trouble later in the field.
Also, be sure to take note of which conductors are soldered to which pins on the temperature sensor
IC. It might help to tape small “flags” onto each wire, opposite the sensor, on which you have marked the
pin name.
There are two things to consider about your cabling (and thus how you attach the sensors to any
objects). First, try to keep all the sensor leads about the same length. It is not so critical for short lengths,
but as the cables become quite long, cable resistance might become a factor. Two sensors measuring at
the same location, but with drastically different cable lengths, can actually report different values.
The other issue to consider is shielding. It would be ideal to use shielded cable, but 3-conductor
shielded cable is not exactly easy to find. It is not critical, but I have found that with cables over a few
meters, noise on the sensor line caused by nearby electrical devices and power lines can interfere with
the measurement. When unshielded lines are coiled up, the measurement is very stable, but when
stretched out, it could end up reading plus or minus one or two degrees Celsius.

20.
CHAPTER 2 ■ SPIDER TEMPS
19
You have several options when planning how to build the sensor cables. If you have raw wire or you
have salvaged wire from category 5 network cable (as I have done), you could do the following:
• Solder directly to the sensor and apply heat shrink tubing (see Figure 2-3).
Figure 2-3. A temperature IC soldered to a 3-conductor cable with heat shrink applied
• Take a more practical route of soldering a 3-pin female header on the sensor end,
so that you can easily swap sensors attached to the cable, as shown in Figure 2-4.
Be sure to use heat shrink tubing to insulate and protect the solder joints (not
shown in Figure 2-4).
Figure 2-4. A 3-conductor cable soldered to a three pin female header. Thus, we can easily try
out an assortment of sensors on this one cable.
If you intend to submerge your sensors, you should invest in cable with a round outer jacket. Also,
ask around for water–resistant shrink tubing. It has a special material on the inside, which melts and
flows around the connection as the tube shrinks, creating a watertight barrier. Finally, add a larger
diameter shrink tube of the same water-resistant type over the entire cable to sensor connection,
covering half of the sensor body.

21.
CHAPTER 2 ■ SPIDER TEMPS
20
Never submerge the sensor in corrosives such as acids, rubbing alcohols, oils or (God forbid)
radioactives. The casing is plastic and will not withstand that sort of treatment.
You will also need to consider how you want to attach the cable to the Arduino. I offer two
suggestions. The first is demonstrated in Figure 2-5. Cut two sections of standard header pins (0.1
spacing). One section is two pins wide, while the other is a single pin. The single pin should be soldered
to the signal wire of the sensor, while the two-pin section is soldered to the positive and ground wires of
the sensor.
Figure 2-5. The Arduino end of the cable is soldered to male header pins. They can be inserted easily into
the breadboard shield.
Next, we will connect power and ground for each sensor by plugging those header pins into the
breadboard power strips, as shown in Figure 2-6. We will also attach a wire from the 5-volt pin on the
Arduino to the positive power strip. Then connect another wire from any of the three ground pins on the
Arduino to the negative strip of the breadboard. Finally, the output wire from each sensor will be
plugged into one of the Arduino analog input pins.

22.
CHAPTER 2 ■ SPIDER TEMPS
21
Figure 2-6. The cable is inserted in the breadboard shield, which has been stacked onto a FreakDuino
board. Note the power connections from the shield socket to the breadboard.
This is where building the breadboard shield really pays off. By attaching a 2-pin header to the
power wires, and a single-pin header to the sensor output wire, it becomes a snap to connect to the
breadboard. Simply plug the power header into the power rows and the single pin header into the
analog input.
Another method is demonstrated later in the chapter. It is more appropriate for a semipermanent
instrument design, built into a case. Look ahead to Figures 2-11 to 2-13 if you are curious.
Mechanical Build
There are a number of ways in which you could use the basic setup. You could configure the sensors to
collect data as individual point sources, a linear group, or a two-dimensional group.
For example, let's assume you want to measure the gradient in temperature from floor to ceiling of a
vaulted room. In this case, you might attach each sensor at three-foot intervals along a long pole, and
stand the pole upright in the center of the room. You now have a vertical temperature gradient meter, as
shown in Figure 2-6.

23.
CHAPTER 2 ■ SPIDER TEMPS
22
Figure 2-7. An example of an expandable boom made from PVC pipe fittings and loaded with
temperature sensors in equal intervals
Another build option might be to use PVC pipe fittings to build a large grid so that you can measure
a large flat surface (such as a wall or large window) or to study how warm air from a single point source
mixes with a larger volume of cold air in a confined space.
You might even choose to not build the sensors onto a frame at all, so that you can place the
temperature sensors in various locations, such as one outside the window, another directly on the inside
surface of the window, a third sensor on the opposite side of the room, with a fourth sensor directly in
front of your heater or air conditioner.
Determining Temperature Equations
Remember algebra class? If so, you might hit upon the linear equation in Figure 2-8, where m is the slope
of a line, and b is the point at which the line crosses the Y-axis.
Figure 2-8. Trying to remember high-school algebra

24.
CHAPTER 2 ■ SPIDER TEMPS
23
In temperature sensor terms, the slope is referred to as the temperature coefficient, and the Y
intercept (+- b) is the zero degree offset. The zero degree offset simply states that “at zero degrees, the
sensor will output Y millivolts.” Thus, voltage output by the sensor would be related on the vertical axis
(Y), while temperature is related on the horizontal (X) axis. In the case of the MCP9700 sensor, with an
offset of 500 millivolts, our equation would be:
Y = 10X + 500
Now let's solve the equation for X, so that we can find the temperature, when we know the
voltage (Y):
X = (Y – b) / m
Or
X = (Y – 500) / 10
After looking at several types of semiconductor temperature sensor, I arrived at the following
general equation to be used in code:
Temp = ((val * ADCmV) - TempOffset) / TempCoef
At first glance, this does not look anything like the linear equation above. Trust me, it is. Remember
that in order to know Y, we must multiply the value given by the ADC (val) by a constant (ADCmV), which
represents the voltage portion that each increment of the ADC value represents.
The Arduino analog input will divide a voltage presented at the analog input into 1024 pieces. If our
input voltage range is 0 to 5 volts, each piece represents 5 volts/1024 pieces, or about 4.8828 millivolts
per piece. Keep this number in mind because you will use it nearly every time you utilize the analog
input.
By multiplying the ADC byte code (val) by the ADCmV value (4.8828), we arrive at the measured
voltage at the analog input. We next need to subtract from this voltage the zero degree offset. Finally, we
divide by the slope to arrive at the temperature in degrees Celsius. This equation will work with nearly all
linear temperature sensors (and perhaps many other types of linear sensors as well).
Test Code
When you work with a new sensor, your first sketch should be to run some basic validation on your
equations. With that in mind, open the Examples/Basics/AnalogReadSerial.pde sketch and save it back
as a new project; it will look like Listing 2-1. Name it MCP9700-test, LM35-test, or something similar.
Listing 2-1. AnalogReadSerial.pde Sketch
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue, DEC);
}

25.
CHAPTER 2 ■ SPIDER TEMPS
24
Go ahead and upload it to the Arduino. Connect the first temperature sensor to analog 0 and run the
serial monitor. Verify that you are getting the ADC data in the window, and that the value remains
steady. Now warm the sensor by pinching it between your fingers. The ADC value should increase. If
possible, put the sensor into a freezer and verify that the ADC values drop. This test simply outputs the
raw ADC data to the serial monitor, but provides us with a very quick opportunity to verify that we have
connected the sensor properly, and that it functions as expected.
Now that the basic hardware validation is complete, let's move on to the exciting part: converting
the ADC value to real data (temperature) and printing it to the window. Add the following variables to
the top of the code (note that the temperature offset will need to change, according to Table 2-1; I have
highlighted it in bold):
int TSensor = 0; // temperature sensor ADC input pin
int val = 0; // variable to store ADC value read
int TempOffset = 500; // value in mV when ambient is 0 degrees C
int TempCoef = 10; // Temperature coefficient mV per Degree C
float ADCmV = 4.8828; // mV per ADC increment (5 volts / 1024 increments)
float Temp = 0; // calculated temperature in C (accuraccy to two decimal places)
Finally, modify the loop function:
void loop()
{
val = analogRead(TSensor); // read the input pin
Temp = ((val * ADCmV) - TempOffset) / TempCoef; // the ADC to C equation
Serial.println(Temp); // debug value
delay (500);
}
After uploading the new version, you should again verify the values printed to the screen. This time
you should be reading degrees Celsius. For the moment, we can ignore most of the decimal places. Later,
we will cut these off. The final code is shown in Listing 2-2.
At this point, it would be good to have a traditional thermometer around to compare your sensor
with. Again, place both the sensor and the traditional thermometer into a cold environment (such as a
freezer or refrigerator) and compare the results after a few minutes. A possible heat source for the
opposite end of the scale is a hair dryer.
Listing 2-2. Temperature in Degrees Celsius Sketch
int TSensor = 0; // temperature sensor ADC input pin
int val = 0; // variable to store ADC value read
int TempOffset = 500; // value in mV when ambient is 0 degrees C
int TempCoef = 10; // Temperature coefficient mV per Degree C
float ADCmV = 4.8828; // mV per ADC increment (5 volts / 1024 increments)
float Temp = 0; // calculated temperature in C (accuraccy to two decimal
places)
void setup()
{
Serial.begin(9600); // setup serial
}

26.
CHAPTER 2 ■ SPIDER TEMPS
25
void loop()
{
val = analogRead(TSensor); // read the input pin
Temp = ((val * ADCmV) - TempOffset) / TempCoef; // the ADC to C equation
Serial.println(Temp); // display in the SerialMonitor
delay (200);
}
Basic SpiderTemps Code
Now that we are totally confident in the sensor and our equation, as well as how the code should handle
the sensor, we can move on to scaling it up. Again, we will do this in stages, but we will take much bigger
steps.
The first stop is to read six sensors at once and print them to the screen in a reasonably nice fashion.
Connect six sensors to the Arduino, as illustrated in Figure 2-1. Also, let’s start with a blank sketch.
As always, the first thing we need to do is set up some variables. The first line of the code creates six
variables, one for each ADC input. The next two variables are the 0 degree Celsius offset values, as
defined by the temperature sensors you intend to use:
int ADC0, ADC1, ADC2, ADC3, ADC4, ADC5;
int MCPoffset = 500;
int LM35offset = 0;
Following that, we need to set up the serial port for debugging. We will output all six values in the
serial monitor:
void setup() {
Serial.begin(9600);
}
There are two functions in the program, in addition to the mainline. The first function (getADC)
simply performs the analogRead function on all analog inputs and assigns the byte code to each variable:
void getADC() {
ADC0 = analogRead(A0);
ADC1 = analogRead(A1);
ADC2 = analogRead(A2);
ADC3 = analogRead(A3);
ADC4 = analogRead(A4);
ADC5 = analogRead(A5);
}
The second function (calcTemp) takes the ADC value, as well as the desired offset as inputs, and
outputs a temperature in degrees Celsius, using our equation:
float calcTemp (int val, int offset) {
return ((val * 4.8828) - offset) / 10;
}
It is always a good idea to break up the process into two functions like this. More-elaborate sensors
can have tricky timing constraints or a complex interface. It is much easier to figure out what is going
wrong if you isolate the read function from the convert and output functions. You can divide and
conquer each aspect of the process in the case of failure, first validating a good read, secondly validating

27.
CHAPTER 2 ■ SPIDER TEMPS
26
the conversion, and finally validating the print function. You could simply output the value at each stage
to the window. Usually, the faulty function becomes obvious.
If all three of these stages were integrated, it would be terribly difficult to try and isolate a problem.
There would be no way to break into the loop. Much longer and more complex code will be hard to sift
through, and it would be really difficult to expand or scale back the project for other purposes the future.
So, starting in the loop function, the first thing we do is call getADC to fill the variables. Next, we want
to call the calcTemp function for each temperature. Notice that I dynamically created the variables temp0
through temp5. I could have just as easily defined them at the top of the code listing with the rest of the
variables.
When we call calcTemp, we pass into the function both the ADC variable, as well as the desired
offset. Both the LM35 and the MCP9700 use the same equation, but different 0 degree offsets. So, by
calling this function individually, we can actually mix and match sensors quite easily, by simply
changing which offset we pass to the function.
void loop() {
getADC();
float temp0 = calcTemp(ADC0, LM35offset);
float temp1 = calcTemp(ADC1, LM35offset);
float temp2 = calcTemp(ADC2, MCPoffset);
float temp3 = calcTemp(ADC3, MCPoffset);
float temp4 = calcTemp(ADC4, MCPoffset);
float temp5 = calcTemp(ADC5, MCPoffset);
Our last major task is to output the temperature data to the serial port and then wait a moment
before doing it all over again. To print the data to the serial port, we use the Serial.print function.
Notice that we also insert a double space between each value to make reading the data easier on the
eyes. For the final piece of data, we use Serial.println, so that after printing the data, we get a line feed,
putting us on a fresh line in the terminal for the next loop.
Serial.print(temp0, 0);
Serial.print(" ");
Serial.print(temp1, 0);
Serial.print(" ");
Serial.print(temp2, 0);
Serial.print(" ");
Serial.print(temp3, 0);
Serial.print(" ");
Serial.print(temp4, 0);
Serial.print(" ");
Serial.println(temp5, 0);
delay(500);
}
Notice that for each Serial.print command we send the variable, followed by a zero. This zero sets
how many decimal places we want to present. We need to use floating-point numbers through the
temperature equation (since we are doing some division). Thus the output variable must also be able to
contain a decimal place. However, we might not always want to see the decimal places. Do you care that
the temperature is 19.30376 degrees, or is 19 degrees just fine for you? You could easily change this value
to show two, three or even eight decimal places. However, let’s refer to the accuracy column in Table 2-
1. The LM35D is accurate down to 0.2 degrees, so you might think that showing one decimal place of
accuracy makes sense. Unfortunately, this is not entirely true. Consider that there is inherent error in the
conversion from analog to digital (remember the “step size” of each size is 4.8828 mV). Errors add up.

29.
CHAPTER 2 ■ SPIDER TEMPS
28
ADC5 = analogRead(A5);
}
float calcTemp (int val, int offset) {
return ((val * 4.8828) - offset) / 10;
}
Test It Out
Before trusting that the output values are correct, you should thoroughly test the sensors. Ideally, you
would attach them all to a singular object so that the thermal mass of the object ensures that each sensor
is measuring the same temperature. Next, measure the object with a known calibrated thermometer and
compare it with the measured output. Another (simpler) option is to insert all the sensors into your
refrigerator, along with an accurate thermometer. After a few minutes, compare the values from your
sensors to the thermometer.
At this point, you should write down the differences in temperature. You might even want to
increase the decimal places to 2 just to be sure you have good data.
With this information in hand, we will modify the preceding code to include a calibration point for
each sensor. Without a calibration for each, we would not be able to trust the hardware when it says that
one end of the probe is cold while the other end is hot. When dealing with air temperature gradiants,
plus or minus two degrees is a rather large difference. We really need to know that all our sensors are
reading on the same scale.
SpiderTemps, Take Two: Calibration
As it turns out, there are a couple of solutions to the calibration problem. We will take the easy way out
and simply do it in software. To calibrate the sensors in software, we simply need to add or subtract
some value from the final result produced by running the temperature equation.
■ Note This is not quite scientifically accurate, and both National Instruments and Microchip offer guides to
writing equations for a more scientific approach to calibration. You can certainly take up the reading and
implement their suggestions, but it is beyond the scope of this book.
We can easily add a simple calibration value to the equation. We then add this variable to the list of
variables to be passed into the calculation function. Finally, we define a set of calibrations somewhere at
the top of our code.
Add a block of variables to the top of the code, with one for each analog input, like this:
float calibration0 = 0;
We should also change the list of tempX variables from being created within the mainline to being
created at the top of the code so we can use them within function blocks. This will become important
later when we add a display to the system. By being defined directly in the loop function, they were only
available for that one function. You can make this change by removing the float data type names from
loop:. So the following line:

30.
CHAPTER 2 ■ SPIDER TEMPS
29
float temp0 = calcTemp(ADC0, LM35offset);
becomes this:
temp0 = calcTemp(ADC0, LM35offset);
Then add the following line to the top, along with the calibration integers:
float temp0, temp1, temp2, temp3, temp4, temp5;
Finally, we modify the calculation function, but to do so, we also need to modify the code that calls
the function for each analog input. We want to add the calibration value to the list of parameters passed
to the function, as well as to add it to the equation. First, modify the calling functions in the main loop,
just after the getADC function call. You should call the calcTemp function six times, like so:
temp0 = calcTemp(ADC0, LM35offset, calibration0);
Next, modify the calcTemp function to read in the calibration data sent by the calling code:
float calcTemp (int val, int offset, float cal) {
return (((val * 4.8828) - offset) / 10) + cal;
}
With the ability to add or subtract some small amount to each sensor on an individual basis, we can
adjust each sensor so that they all read the same value when in close proximity to each other.
Begin calibrating by placing all sensors in close proximity. They should now be evaluating the same
body of air and thus the same temperature. You will need to check the readings against a known
constant, such as a professional-grade thermometer.
Note the reported temperatures, and calculate the difference between the reported temperatures
and the known temperature. Input this difference in each calibration point in the code. Finally, upload
the new version to the Arduino and verify accuracy.
You might want to expand this code so that the user can input the calibration data directly in
the serial monitor window, rather than manually adjusting the code. The final version is shown in
Listing 2-4.
Listing 2-4. Software-calibrated Version of SpiderTemps.
/*
SpiderTemps 6 sensor plus software calibration
Arduino projects to save the world
This sketch reads all six analog inputs, calculates temperature(C) and outputs them to the
serial monitor.
*/
float temp0, temp1, temp2, temp3, temp4, temp5;
int ADC0, ADC1, ADC2, ADC3, ADC4, ADC5;
int MCPoffset = 500;
int LM35offset = 0;
float calibration0 = 0;
float calibration1 = 0;
float calibration2 = 0;
float calibration3 = 0;
float calibration4 = 0;

32.
CHAPTER 2 ■ SPIDER TEMPS
31
The first thing we should do is consider what size of display we will need. If each sensor needs 2 or 3
digits for whole degrees (remember that -10 degrees requires 3 characters), a decimal point, and two
decimal places, we need 5 to 6 characters per sensor, plus a pad between sensors of 1 character. I think
the only decent option here would be a 20-column by 2-line display, as shown in Figure 2-9. Sensors 1
through 3 can be displayed on the top line, and 4 through 6 can be displayed on the bottom line.
Figure 2-9. Adding an LCD display to the SpiderTemps project
Note that I have not included the power supplies for the temperature sensors in Figure 2-9. I want to
draw attention to the LCD side of the schematic. The left half remains the same as in the previous
schematic.
■ Tip When choosing an LCD screen, be sure to check the data sheet for the correct pin numbers. There are
various LCD communications options available (for example: Serial, SPI, I2C, and parallel). The LiquidCrystal
library expects that you will utilize a “character” LCD with a parallel connection, and that it be HD44780
controller–compatible. These LCDs can operate in 8-bit or 4-bit mode. The library operates in 4-bit mode by
default. The best mode is 4-bit mode because it requires only 4 data pins and 2 control pins (for a total of 6 pins)
from the Arduino.
To get started, we first need to initialize the library by including it like so:
#include <LiquidCrystal.h>

33.
CHAPTER 2 ■ SPIDER TEMPS
32
We then need to create an object of the LiquidCrystal type. We could call it anything we want (such
as Display or Face), but the typical convention is simply to call it lcd. While creating the object, we also
need to define the pin connections for the six pins that connect to the LCD.
As noted in the previous tip, we can operate in 4-bit mode to save pins. Thus we need four data pins
for the LCD from the Arduino. We also need a few additional control pins. The Enable (E) pin acts as a
switch to notify the LCD that data is available on the data pins. Register Select (RS) instructs the LCD to
consider the data either as a register address or instruction code. These two pins are critical for
maintaining proper communication with the LCD.
A third control pin on the LCD is the Read/Write (RW) pin. When this pin is low, we can write text to
the screen. When it is high, we can read back the data from the LCD into the Arduino. This feature is
rarely (if ever) used, and therefore is not included in the default setup of the library. However, you will
need to be aware of the pin, and tie it low by connecting it to the ground pin on the Arduino. Finally, we
need to apply power to the LCD. Connect the LCD ground (often labled VDD) to the Arduino ground and
the LCD positive supply (often labled VSS) to the Arduino’s 5-volt pin.
With the pins in place, we can now define them in the Arduino sketch. When we create the
LiquidCrystal object in code, we use this format:
LiquidCrystal name(RS, Enable, D4, D5, D6, D7)
Thus the following line would start a LiquidCrystal object named lcd, using Arduino pin 12 as the
RS, 11 as the Enable, 5 as D4, and so on:
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
■ Tip If your LCD screen does not display anything after resetting the Arduino, check the connections carefully.
In particular, be sure that RW is connected to ground. Without this connection, the LCD will never show any text.
With the object created and the pins in place, we need only start the object and start writing to the
screen. lcd.begin(20, 2) designates the size of the LCD screen. In this case, the screen is 20 columns
wide, with 2 rows.
We won’t see any more LCD code until we call the lcdPrint() function. Sending text to the screen is
no different from sending it to the serial port, except that we use the name of the LiquidCrystal object
rather than the serial object; for example: lcd.print() instead of serial.print(). One thing to watch out
for is lcd.println(). Although it is a valid function (as far as the compiler is concerned), it often ends up
causing garbage on the screen. A better choice is to stick with lcd.print() and manually move the
cursor and clear the screen. We can perform the clear screen function with lcd.clear(). Positioning the
cursor is accomplished with lcd.setCursor(Y, X), where Y is the horizontal position and X is the row.
■ Tip When using the LCD, it is always a good idea to clear the screen and write fresh text instead of simply
overwriting existing text. Doing so often causes unexpected results. For example, the LCD currently shows
something like “This is long text”, and you want to overwrite “Short text” on the screen. Without clearing the
screen, the result would be “Short textng text.”

36.
CHAPTER 2 ■ SPIDER TEMPS
35
Battery Powered?
The next logical step is to build a self-contained device. By operating the device over a battery pack we
can be truly mobile, but first we need to do a little experiment. We need to find out how our sensors will
respond on battery power. It is possible that as the battery voltage drops over time, the sensor readings
will be affected. This is an experiment you should try with any sensor systems you build.
Start by loading the temperature test sketch into the Arduino. It needs to report temperature on only
one analog input (refer to the “Test Code” section of this chapter. Now, we need to simulate a situation
in which the supply battery has dropped. We can do this by attaching a variable resistor to the supply
input of the sensor, as shown in Figure 2-10.
Figure 2-10. The temperature sensor low supply voltage experiment
Fire up the Arduino serial monitor and observe the temperature readings as you turn the knob on
the variable resistor. Notice that the readings remain constant for a large portion of the dial, but
suddenly they become unstable, decreasing quickly until finally reading zero, or even a negative
temperature.
As the voltage supply to the temperature IC decreases, it attempts to compensate until the voltage
drops below a certain threshold. The cutoff voltage is very important for us to know because it helps us
to choose the best battery supply for the project, and we can know when our readings are no longer
reliable.
Using a multimeter set to the voltage setting, measure the voltage coming out of the variable
resistor. Do so by touching the black probe of the meter to the ground connection of the variable
resistor, while touching the red lead to the center pin. Now sweep the knob again, looking for the point
in which the measurement is no longer stable. Note the voltage readings on the meter. It is above this
point that we need to maintain a voltage to the sensor.
We can now modify Table 2-1 with this new data to produce Table 2-2:
Table 2-2. Updating Table 2-1 with Minimum Voltage Data
Manufacturer Part
Number
Range
(Degrees C)
Accuracy Coefficient
(mV/C)
Offset
(mV @ 0C)
Minimum
Operating Voltage
National
Semiconductor
LM35 +2 to +150 +/- 0.2 @
25C
10 0 3 volts
Microchip MCP9700 -40 to +125 +/- 2 @
70C
10 500 1.7 volts

37.
CHAPTER 2 ■ SPIDER TEMPS
36
This data concludes that we should have no problems operating the temperature sensors on
batteries. Even a 2–cell AA pack (3 volts), while not okay for the LM35, will keep the Microchip part in
operation for quite a while before readings become unstable.
Unfortunately, this is only half the problem. What happens when the voltage supplying the Arduino
(and thus the ADC) dips below 5 volts? When the ADC reference dips below 5 volts, it will no longer be
comparing the analog input to a stable reference voltage. Therefore, it will be reporting inaccurate data.
You must provide some sort of stable voltage to the analog reference pin.
Your best solution would be to utilize an Arduino with a boost converter (such as the FreakDuino). A
boost converter accepts a lower voltage input, and boosts it to a higher voltage. A typical example in the
case of an Arduino is to take an input from two AA batteries, which total 2.4-3 volts, and boosts it to 5
volts. Boost converters have a wide operating range below the required voltage, so that even as the
battery supply drops, the Arduino and ADC reference remain at 5 volts for as long as possible. The
Freaklabs Freakduino is one such example of an Arduino with a boost converter on board. Another
option is to use a standalone boost converter to power the board, such as SparkFun’s lithium polymer
battery booster (http://www.sparkfun.com/products/10255). There is a trade-off, however. All boost
converters exchange current for voltage. This has the effect of dramatically reducing the overall time of
operation on batteries. In other words, to get 5 volts out of a 3–volt battery pack, either the pack must
drain faster or the circuit must be very considerate of current requirements.
Boxing It Up
When using the temperature array indoors, the bare board might be suitable for most applications; very
little can be damaged, other than knocking the cable leads loose from the Arduino board. To increase
reliability, you might consider building a prototyping shield with screw-down or spring-loaded terminal
blocks to attach the cables.
You might want to box up the device. I placed mine inside a cheap plastic case from the dollar store,
but you can use any project box that suits you as long as it is large enough to house the Arduino plus the
prototyping shield, as well as a battery pack. If you intend to use the LCD, you will also need to have
plenty of space to mount it as well. If you plan on using the project for extended monitoring outdoors, be
sure to choose a box with a watertight seal and rubber grommets for any outside connections.
After choosing a box, you need to decide just how you intend to connect sensors to the device. I
used 1/4-inch stereo phono plugs and jacks (look at your headphones for your portable media device). I
suggest that you buy panel mounted jacks, as shown in Figure 2-11. They are much easier to work with
than PCB mounted parts.

38.
CHAPTER 2 ■ SPIDER TEMPS
37
Figure 2-11. 1/4-inch phono plug, plug jacket, and panel mount jack
You should use a multimeter to confirm the corresponding pins on the jacks to the location on the
plug. I chose to place the negative connection on the large ring toward the base of the plug, the signal
output on the middle ring, and 5 volts on the tip of the plug. This way, 5 volts is the final connection to
be made when plugging in a sensor. This will protect it (as well as your Arduino) from short circuits as
you plug it in while power is applied.
1. Start by marking the location of the Arduino, battery case, and headphone
jacks. You might also want to include a power switch as well.
2. After testing that everything will fit without crashing into each other, drill holes
in the box for the mounting screws of the Arduino.
3. Using hexagon standoff posts, screws and nuts, mount the Arduino in place.
Now is a good time to double-check that there is room to spare above the
Arduino. We need some space for cabling, as shown in Figure 2-12. You can
see the copper wire power rails and their cables, which loop over into the right
connector. The analog inputs are connected on the left. This case has five
analog input sockets and a power switch on the far left.

39.
CHAPTER 2 ■ SPIDER TEMPS
38
Figure 2-12. Internal connections of the SpiderTemps box.
4. Next drill and mount the panel jacks. Align them such that the pins all face the
same way.
5. Strip a long strand of solid core wire and thread it through all the positive posts
of the panel jacks. Do the same for the negative posts.
6. Now solder each post to the stripped wire. Add a bit of jacketed wire to the end
of both the positive bus and negative bus, so that you can easily plug them into
the breadboard. I used wire with a machined pin soldered to the end that will
fit into the breadboard.
7. Finally, solder a similar wire with machined pins to each signal output pin on
the panel jack. You can now plug the power pins into power sockets, and
attach each sensor input to the analog inputs of the Arduino, as shown in
Figure 2-13.

40.
CHAPTER 2 ■ SPIDER TEMPS
39
Figure 2-13. The SpiderTemps case with a probe inserted
Making Mods
This chapter featured several variations on the same basic theme. It demonstrates the versatility of both
the Arduino platform and available temperature sensor ICs well. An excellent extension to the project
would be to write a Processing sketch that reads the data and saves it into a file that can be accessed by a
spreadsheet and graphing program, such as Microsoft Excel. Or invest some additional time in learning
the Processing IDE and system, and write a data visualization application to better suit your own needs.
For more about Processing, data logging and visualization, take a look at Chapter 6.
The unit could also benefit from data storage or a wireless communications upgrade and long–life
battery pack. In the river waste water example, mounting the Arduino temperature probe unit near the
wastewater outlet, and sending data wirelessly to a more physically secure location which contains the
computer system would be a logical solution.
Finally, take a look Chapter 5, where we cover the online service Pachube, for a way to share your
temperature data around the world.
Conclusion
Having the ability to measure several temperature readings in various locations simultaneously allows
you to characterize and model the environment much more effectively. You can examine the effects of
temperature flow in and around an environment, and start actively making deductions and decisions
based on this information.

41.
CHAPTER 2 ■ SPIDER TEMPS
40
We found that the solution to simultaneous measurement is actually quite simple. You could apply
the same code to virtually any array of like sensors, by simply changing the code and equations within
the calcTemp function.
This chapter set out to put the design process model outlined in Chapter 1 into action. We took baby
steps at first, in order to confirm functionality and our fundamental understanding of the sensor
technology. We then were able to aggressively build upon that foundation to create incredibly powerful
variations in a relatively short period of time.
Now that you have this powerful data acquisition hardware on your tool belt, you will start to see
many applications for its use. Be sure to mention it the next time your local environmental or ecology
organization has a tricky temperature measurement problem.

42.
C H A P T E R 3
41
Jungle Power
Keeping an Arduino Alive in the Field
One aspect of electronic sensors deployed in the field that is quite difficult to deal with is that of power
management. Sensors obviously need electrical power to operate, but it is usually impractical to run
long power cables out to the sensor’s location. Often, there isn’t even a power grid to connect up to. This
leaves relatively few practical options.
Most often, field sensors are powered by battery sources. This gives them a limited operational life
span. Your equipment can operate only as long as the battery pack has power. To be more accurate: only
as long as your battery pack has enough power to keep the sensor going. When the voltage in the pack
drops below a certain threshold, the sensor system shuts down, even though there is still some
remaining “juice” in the battery cells.
In the not-too-distant past, remote sensor equipment was often bulky, heavy, and required a lot of
power to keep operational. It also usually had limited recordkeeping time. This resulted in field scientists
contriving various incentives to get their lab assistants to trek out into the forest, up the mountain, or to
other uncomfortable locations to serve as pack mules. The battery packs required for long-term service
were difficult to transport, to say the least.
But technology marches forward. We live in a new era of lightweight, high-current battery packs.
Solar panels are getting more efficient. Adding to the power input advantage, voltage boost circuits let us
suck every last milliamp of power out of battery cells.
Microcontrollers are now packing a heavy punch in tiny packages. They require very little power
and less physical space. Most offer some sort of “sleep” mode to consume even less power.
The sensors are smaller, lighter, and more accurate. MEMS micro machines have replaced complex
mechanical sensors. The interface circuitry required has been minimized by placing as much of it as
possible on the sensor chip.
With all this miniaturization, the costs have been driven down as well. In the past, the idea of
installing a sensor system with no intention of ever retrieving it later would be unheard of. No one could
justify the thousands of dollars lost. Now, it is quite practical for a scientist to design and install a system
in a very remote location, with no intention of ever returning. The “throw away” cost is often less than
$100. For that money, they could have a reasonably sophisticated instrument.
By adding radio communications, there is no need to install communication lines or return to the
instrument to pick up the chart logs or swap out data storage media. They can have live, real-time data.
Now we can install hundreds of instruments like this in a location, for the cost of what just one
instrument would have been, 10 years ago.

43.
CHAPTER 3 ■ JUNGLE POWER
42
In this chapter, we will explore several key concepts required to keep an Arduino “alive” and
unattended for several days, weeks, and possibly months. In particular, we will need to determine the
energy requirements of the Arduino-based sensor and match a battery pack to the system. We will also
need to add a charging system, in the form of a solar panel (or two). You could also charge the battery
using energy harvesting from other environmental sources, such as wind, hydroelectric, or biological
power. Finally, we can take steps to assure that we extend the battery life as much as possible, by putting
the Arduino to sleep in between readings and using an alarm clock to wake it up at predetermined
intervals.
Diverse Power Sources
The key to self-contained, long-term instrumentation is a diverse power source structure. Batteries are
all well and good (and form the primary source for nearly every field instrument), but they have one
serious drawback: time. When building your system, you must always evaluate how long you expect a
fully charged pack to last. It is finite. We can prolong and possibly even eliminate this drawback
altogether by adding natural recharging solutions such as solar power. Granted, long exposure to heat
and cold, as well as a bit of humidity and condensation, will eventually render the battery pack
permanently dead. Thankfully, this will happen much further down the timeline if we include solar
recharging than if we simply threw in a few alkaline cells and called it “done.”
Whenever you think of renewable or free energy sources, perhaps only a few options come to mind.
You might think of windmills and solar panels. Or perhaps you think of a big hydroelectric dam, or even
a nuclear power plant. But there are also other less-known options such as energy harvesters.
Doing a few Google searches can lead you down some interesting roads. When doing searches for
generator– or turbine–based power systems, it is helpful remember this basic guide:
• A pico system is a small system, just about right for charging a small portable
battery pack, such as the ones we will be using in our Arduino project, over the
course of a day.
• A micro system is larger. It is suitable for a home, provided you are very energy-
conscious. It should charge an automotive-sized battery cell over the course of
a day.
• Doing a search without the terms pico or micro will bring up systems larger still.
You are now getting into the industrial-sized systems that are capable of powering
large homes.
These terms apply on a totally different scale when talking about energy harvesting. By definition,
energy harvesters work with incredibly small currents.
Solar Power
The most obvious free source of energy to recharge your sensor’s battery is a solar panel. It is a relatively
simple option, cheap, and requires no mechanical parts that could break.
Solar has a few minor drawbacks. Remember that it has a possibility of working for only half the day;
it generates electricity only when the sun is shining down on it. You will need a space clear of trees and
buildings that would cast a shadow on your panel. You will also need to aim the panel in the most
optimal position. In the northern hemisphere, this means aiming the panel generally toward the south.
Close to the equator, the panel can lay flat. As you approach the poles, you’ll need to dramatically
increase the angle.

44.
CHAPTER 3 ■ JUNGLE POWER
43
Finally, the sun is constantly moving. This means that unless we have a sun-tracking mechanism,
we will have to accept that the panel will perform optimally for only a short period of time. Between the
hours of 10 a.m. and 2 p.m. are usually the most optimal energy-generation times for a stationary solar
panel.
Wind Power
Another power option is a wind turbine. You might be thinking that a large windmill would be
impractical. A few years ago, you might have been right. But we are living in exciting times.
Manufacturers have found that small compact renewable or free energy systems are big business.
Doing a Google search for “pico wind turbine” will yield hundreds of products in the sub-$300
range, which output 8 to 12 volts at 100 mA. These small systems are perfect for adding a bit of recharge
to your remote sensor.
Wind is not a steady and reliable recharging source. Some days, it is gusting and blowing, while
other days it is still. As part of an overall energy plan, however, wind can be an excellent addition to a
sensor site.
Water Power
If your sensor site is near naturally running water, a pico hydro turbine is the best choice. It tops wind
and even solar due to its consistent nature. Even if the water flow is not year-round, it will remain
consistent for days on end. With the exception of unforeseen rains or drought, a river bed is quite
predictable, so power output will be mostly constant. It provides power at night when solar is no longer
affective. A pico hydro system will not suffer the surges and lows that a wind system must contend with.
Energy Harvesting
Energy harvesters convert energy from ambient sources. Vibrations in the ground, salinity of water, or
the difference of temperature between two masses are all ambient sources that can be tapped for energy.
An energy harvester often operates in ultra low currents, cumulatively storing the current until it has
reached a usable level for the device. It does not necessarily need to be a low-current system, though.
The key to a good harvester system is to look to the natural environment for a source of mechanical or
thermal energy.
To get started with energy harvesting, you might want to check out SparkFun’s LTC3588 breakout
board.
Three Sides to Every (Power) Story
Having a robust and diverse power input section is not enough. Regarding power management, there
are three sides to the story: input, regulation, and usage.
On the input side of the story, we have the bulk energy generation or storage medium. This could be
a “wall-wart” power supply, batteries, a super capacitor, a solar panel, or a combination of several
energy sources.
Current from the energy source is passed through a voltage regulation device. The purpose of the
regulator is to set the voltage from the energy source to a level compatible with the Atmel
microcontroller and other electronics in our project.

45.
CHAPTER 3 ■ JUNGLE POWER
44
Finally, we can utilize the energy provided by the power source through the regulation circuits. In
most projects you might not be too concerned about how much current it draws. However, in the case of
remote sensor sites, you must always be aware of your current usage and how to minimize it in order to
maximize the sensor’s “uptime.”
Input (Batteries, Charge Controllers, and Free Energy)
For the moment, let’s assume our sensor system will be battery-operated with some additional charging
source, such as a solar panel. We have a few considerations to take into account. Primarily, we have
three systems at play: battery, charge input source, and charge controller.
First we must decide our battery pack chemistry, voltage, and current. This decision will determine
what sort of charge controller we will need. Finally, we must match the charging input to the system. By
far, the simplest solution is to use a system based around modern lithium polymer packs. You can buy a
pack and charge controller as a set. The charge controller is often mounted as a breakout board, with a
connection for the battery pack, an input for the charge voltage (your solar panel), and an output to the
Arduino.
A far less efficient but still serviceable system is composed of standard sized NiCD or nickle metal
hydride (NiMH) cells and a simple charge circuit (see Figure 3-1). All that is required is a solar panel,
diode, the batteries, and a battery case. The batteries and panel are in parallel, while the diode is placed
between the panel and the pack, so current cannot flow from the pack into the panel. As long as the
voltage output of the panel exceeds the pack (by about 2 volts), and the current demands do not exceed
that of the panel output, it will feed current into the system. This current will be split up, going either
into the battery pack as a charge or to the Arduino. Thus, you will want to size the panel so the current
exceeds the Arduino requirements, while the remaining current has a maximum output of about 1/10th
of the current output of the battery pack.
The rule of thumb for charging these kinds of batteries is 1/10th (or C/10 in the battery world). To
charge the battery pack at 1/10th its rated current requires 16 hours of charge time. Obviously, this is
totally impractical with a solar panel. It receives optimal sunlight for only four hours per day, from 10
a.m. to 2 p.m. Thus, a totally ideal system would require four days to fully charge the battery pack.
For example, suppose that we have a 2xAA–sized 1000mAh battery pack that is rated at 1.2 volts per
cell. With cells in series, our pack outputs 2.4 volts. While the voltage required to charge the battery
changes over time, you will need to make available at least 2.4-3 volts. It will require C/10, or 100mA, for
16 hours. At 200mA, it would require only 8 hours, but we might be trading overall life of the battery for a
quicker charge time.
A 3 volt solar panel would be ideal for this battery pack. If our project needs 150mA of current during
operation, we need to provide a solar panel that outputs at least 250mA at 4 volts to charge the batteries
and power the project during sunlight hours.
This has not yet taken into account that the forward voltage drop of the diode could be as high as 0.7
volts. Thus, we really want a panel of 3.7-4 volts to be sure we can fully charge the batteries.

46.
CHAPTER 3 ■ JUNGLE POWER
45
Figure 3-1. A simple solar recharging Arduino project
Regulation Options
Having solved the input problem, the next problem we encounter is that of regulation. This is the area in
which the standard Arduino kind of fails the test. Don’t get me wrong; it is awesome for prototyping and
even some commercial applications. It makes a very flexible and robust lab tool (the subject of this
book). Unfortunately, it was never really designed with a lean power diet in mind. Building field-ready,
long-duration instruments for harsh environments was never at the top of the list.
So, the regulation circuitry on most Arduinos and Arduino clones was never optimized for such a
case. They are not particularly efficient when running off of batteries. Thankfully, the open source
community is pretty good at keeping in mind that we, as users, are never going to follow all the rules.
Thus, there are a variety of clones, each with its own intended use in mind. There are clones designed for
radio use, data logging, low power, or really tight spaces. Later in the chapter, we will explore a few of the
available options that are well suited for wireless sensors. However, don’t let that be the end of the
discussion, New clones are popping up all the time. It pays to do some research before selecting a clone
for your project.
Operate at 5 Volts from a Higher Voltage Source
This is certainly the easiest option. If you don’t mind the inefficiency of the onboard regulators, you can
use a battery pack made up of AA, C, or D cells, with a supply voltage over 5 volts. Simply wire it up to a
barrel plug as shown in Figure 3-2, and plug it in as you would an external wall wart power supply.
Because the onboard regulator requires more than 5 volts to operate, you will need to be sure you have a
battery pack that provides at least 5.5 volts to the barrel plug.

47.
CHAPTER 3 ■ JUNGLE POWER
46
Figure 3-2. A simple power solution for a mobile Arduino
The whole power system will need to be designed around the idea that you are operating the
Arduino in its most-convenient yet least-efficient modes. Consider that when using standard off-the-
shelf NiCD or nickle metal hydride (NiMH) batteries, they are no longer rated at 1.5 volts like their
alkaline counterparts. At 1.2 volts each, you need at least 5 cells to get over the 5 volt mark (plus
regulator overhead) needed to power the Arduino.
The other possibility is to provide your own 5 volt regulated source. It is often the case when using
specialized batteries like Lithium Polymer, that the pack will have its own control board. In such a case,
simply connect the 5 volt output of the controller to the 5 volt pin on the Arduino. This will bypass the
onboard regulators.
Another option might be a DC-to-DC converter. This is an example of a switching power supply and
is incredibly efficient at cutting higher voltages down to a precise 5 volt supply without wasting valuable
current as heat. However, they are considerably more expensive (10 to 20 times) and are bulky devices.
Operate at Lower Voltages
First, it is important to know that while the Arduino system specifies a 5 volt supply, it can actually
operate as low as 3.3 volts (and in some cases, 2.5 volts). This is very important for a number of reasons.
For example, you can power the Arduino off of lower voltages However, when doing so, you must
remember that analog input circuitry will be affected, and you will need to account for the voltage
differences, not just in your hardware design, but in your code as well.
Use a Boost Converter to Operate on 5 Volts with a Supply Less than 5 Volts
A boost converter is a specialized style of voltage regulator, that actually allows us to input less voltage
than we require to power our electronics. One rendition of this project will connect two AA batteries,
supplying 3 volts, to a boost converter. The boost converter will then supply 5 volts to the Arduino. You
will find that even as the voltage output of the battery pack dips well below 2 volts, it is still supplying 5
volts to the Arduino. It manages to do this, but at a loss of current. The available current will quickly drop
as the voltage remaining in the pack drops below 1 volt.
SparkFun sells an excellent boost converter/energy harvester module in the form of a general-
purpose power supply board named the “LiPower–boost converter.”
Also, many hackers are familiar with AdaFruit’s MintyBoost project, which takes the input of just
two AA batteries and charges a smartphone. This project could easily be repurposed for powering an