Arduino: WiFi Temperature Data Logger

Introduction

Lets build a WiFi temperature data logger!!  The reason this project came to mind was because I needed to monitor the temperature of an outside enclosure box that will eventually house a couple of lithium ion batteries.  Can’t have the box get too hot or else we will end up having a nice backyard campfire.

This temperature data logger consist of three sections:

  1. The WiFi web server
  2. The temperature sensor
  3. The sleep controller

Lets get into the project now 🙂

Schematics, PCB, Arduino Libraries can be downloaded Here

Bill of Materials

  • x1 ESP8266 – Link
  • x1 Barometric (BMP180) – Link
  • x1 Atmega328P-PU – Link
  • x1 FTDI to Serial Converter – Link
  • x1 2N7002 – Link
  • x1 DMG2305UX-7 – Link
  • x7 10k Resistor 1206 – Link
  • x3 0.1uF Capacitor 1206 – Link
  • Female Headers – Link
  • x1 28 pin DIP Socket – Link
  • x1 PCB Terminal block – Link
  • x1 3.3V Boost Converter – Link

Hardware/Schematic/Assembly

I’ve designed this project to consist of two microcontrollers.  Its not the most efficient way of doing it but it is effective.  The heart of this project is the ESP8266-ESP01 IC.  It will take in the data from the BMP180 sensor over I2C and send the data over to a web hosting site Thingspeak.com

Schematic:

Webserver - Schematic

The schematic is not that all complicated but it is very effective at trying to save as much battery as possible and deliver my data for viewing purposes.

In order to have this be powered by 2x AA batteries and last longer then a couple of days or weeks, I needed a couple of things to make this possible which is where the second microcontroller comes into play.

First, we need to make sure we have a stable power supply that can provide up to at least 0.3A and have a minimum quiescent current in the low uA range.

Thingspeak.com

Before we get started into writing the code on the ESP8266 we need to set up an account at thingspeak.

Blog - Thingspeak

Click on the signup and fill out the information:

Blog - Thingspeak_2

Click on new channel:

Blog - Thingspeak_3

The most important information to fill out is the fields, in our case we will fill out field 1 and type in temperature.  The name could be any name you want, for this purpose we will write Temperature Data Logger. Once finish, scroll down and click save.

Blog - Thingspeak_4Blog - Thingspeak_5

The final piece of information we need is the API key, for this just click on the API Keys button and copy the Write API Key.

Blog - Thingspeak_6

Now we can move on to the code.

Click here for step by step on installing the ESP8266 arduino addon.[3]

ESP8266 Code

//////////////////////////////////////////////////////////////////////////////////
// Name: Steven Guzman                                                          //
// Date: 4/4/2017                                                               //
// Description: Temperature webserver that will update every 30 minutes to      //
//              thinkspeak with data that shows the temperature of the inside   //
//              of the enclosure.                                               //
//////////////////////////////////////////////////////////////////////////////////

#include <ESP8266WiFi.h&>
#include <Wire.h>
#include <SFE_BMP180.h>

SFE_BMP180 pressure;

char status;
double t, tf;

// Replace with your channel's thingspeak API key
String apiKey = "";

// Enter your wifi information below
const char* ssid = "";
const char* password  = "";

const char* server = "api.thingspeak.com";

WiFiClient client;
void setup()
{
Serial.begin(115200);
delay(10);
// Pin 0 = SDA
// Pin 2 = SCL
Wire.begin(0,2);

WiFi.begin(ssid,password);

Serial.println();
Serial.println();
Serial.print("Connecting to ");

while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("WiFi Connected");

// Initialize the sensor
if (pressure.begin())
{
Serial.println("BMP180 init success");
}
else
{
Serial.println("BMP180 init fail\n\n");
//while(1);
}

// Print the IP address
Serial.print("Use this URL to connect: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}

void loop()
{
// This starts the BMP180 sensor and takes a reading
status = pressure.startTemperature();
if (status !=0)
{
delay(status);
status = pressure.getTemperature(t);
}
// Converts Celsius into Farenheid
tf = (9.0/5.0)*t+32.0,2;
if(client.connect(server,80))
{
char t_buffer[10];

// This will convert the double variable into a string
String temp=dtostrf(tf,0,5,t_buffer);
String postStr = apiKey;
postStr +="&field1=";
postStr += String(temp);
postStr +="\r\n\r\n";

client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKapiKey: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);

Serial.print("Temperature: ");
Serial.println(t);
Serial.println((9.0/5.0)*t+32.0);
Serial.println(temp);
}

client.stop();

Serial.println("Waiting...");
delay(20000);
}

Arduino Code

///////////////////////////////////////////////////////////////////////////////////////////
/// Title:  Auto Garden Project                                                          //
/// Author: Steven Guzman                                                                //
/// Date:   4/6/17                                                                      //
/// Description: This project will automatically water a plant when the sensor reads low //
///              water levels in the soil.  If sensor reads low water, it will turn on   //
///              boost converter that controls the solenoid valve and then turn on the   //
///              solenoid valve control circuit to allow water to flow into the soil.    //
///////////////////////////////////////////////////////////////////////////////////////////

#include <LowPower.h>

int ESP1 = 2;          // Turns on sensor; set to low for battery consumption purposes (Active High)

void setup()
{

pinMode(ESP1,OUTPUT);     // Configure sensor control as output
digitalWrite(ESP1,LOW);   // Setup as low output
delay(100);
}

void loop()
{

digitalWrite(ESP1,HIGH);  // Turns on the ESP8266
delay(15000);             // 15 second delay
digitalWrite(ESP1,LOW);   // Turns off the ESP8266

// Loops the 8 second internal to extend the sleep state
// 15 = 2 minutes
// 37 = 5 minutes
// 75 = 10 minutes
// 112 = 15 minutes
// 255 = 30 minutes

for(int x = 0; x <= 255; x++)
{
LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
}

}

Programming

ESP8266-ESP01

First things first, we will upload the code to the ESP8266-ESP01.  This one is a little bit tricky but after awhile you’ll get the hang of it.

You need to make sure your settings are correct under the Arduino IDE.

See image below:

Arduino ESP8266 settings

Here’s the wiring diagram for connecting the FTDI programmer to the ESP8266:

Blog - ESP8266_WIRING

Now that your settings are correct, this is were it gets a little tricky to upload the code, you need to follow the steps below in order to upload correctly and successfully

Before hitting upload:

  1. Ground GPIO0 (hold down the push button JP2)
  2. Reset by pulling RST pin to ground (Press and release JP1 button)
  3. Once it restarts, hit the upload sketch icon
  4. When you see compiling sketch switch to uploading, then release the GPIO0 pin
  5. uploading should begin
ATMEGA328P-PU (ARDUINO LILYPAD)

Next, we will upload the second code into the ATmega328 which has the lilypad bootloader installed ( Click HERE [2] for tutorial on flashing ATMEGA328P-PU with bootloader).

See image below for settings:

Blog - ESP8266

Final Thoughts and Future updates

And now the final product:

Blog - Thingspeak_graph

Its not the most elegant but I actually used my CNC machine to make these boards, in the future I might get them professionally made but for now its perfect for me.

Future Updates:

  1. Replace the ATMEGA328P-PU IC with a smaller ATTINY85 which can also be flashed with the Arduino bootloader
  2. Connect the Arduino to the I2C communication lines to expand its data logging capability
  3. Since this is running on 2x AA NiMH batteries, it would be great to monitor battery capacity.  We can use one of the analog pins on the arduino to read the data and send it over I2C to the ESP8266

1. Arduinesp
2. ATMEGA328 Bootloader
3. ESP8266 installation

Boost Converter – 3.3V@ 0.4A

Its time to show you my 3.3V output boost Converter design. In one of my earlier post I showed you step by step on how to design your own boost converter and if you haven’t read that yet then click here.

You can purchase this board fully assembled by clicking here. 🙂

Lets get started:

Intro.

First of all, why do we even need this converter? Well every sensor, microcontroller, arduino, ESP8266, and various other digital components need a constant voltage.  A constant voltage is necessary to maintain proper operation of these components.

Here we will see the advantage of this boost converter.

Specifications.

Below are the operating specs for this converter

\Huge \bold V_\text{IN} = 1.8V - 2.4V

\Huge \bold V_\text{OUT} = 3.3V 

\Huge \bold I_\text{OUT} = 0.4A 

  • Note: Different Vin voltages gives you different max power output
    • \Huge \bold V_\text{IN} = 1.8V @ I_\text{OUT}: 0.2A
    • \Huge \bold V_\text{IN}: 2.0V @ Iout: 0.3A
    • \Huge \bold V_\text{IN}: 2.4V @ Iout: 0.4A

\Huge \bold V_\text{P-P} = 80mV 

Bill of Materials.

Here is a screenshot of the bill of materials.  I added the suppliers on the spreadsheet because I’ve found that some sites have better pricing than others.

Using octopart.com, you can actually find the best value for the component you’re looking for.  I highly suggest you go look at the site.

BOM - L6920

Schematic.

Attached here is the schematic for this project.  All the original files are available for download at the bottom of the page.

L6920.Rev.5

Layout.

I figure I’d help you guys out a bit if I added the layout for this board.  My approach for this layout was to minimize the overall size in order to get a better price for manufacturing the board.

L6920.PCB.Rev.5

Testing.

Here comes the fun part, actually testing what you designed.  Now one thing that took me awhile to learn was that design and theory never really match reality.  There are a lot of different parameters that are not accounted for when designing in theory.

A couple of the major issues that could make or break your design is parasitic elements.  One of the biggest parasitic elements is ESR for output capacitors.  This is the equivalent series resistance of the capacitor that is not taking into account when designing.  In my post that covers the design of a boost converter, I emphasizes this topic to make you aware of this parasitic element.

Now, my design parameters consisted of loading the converter at 3 different voltage inputs (1.8V, 2.0V, and 2.4V).  Each input voltage was loaded starting at 0.1A and ending at 0.4A.  This load all depended on which input voltage was tested because the lower input voltage cannot provide the max output power.

First test – Vin: 1.8V @ 0.2A

Will add soon.

Next test – Vin: 2.0V @ 0.3A

2.0V_0.3A_3.13.17

Last test – Vin: 2.4V @ 0.4A

2.4V_0.4A_3.13.17

After completely the voltage ripple test, I also conducted a load regulation test at max load for each input voltage.  I got a 1.5% voltage drop from calculated voltage meaning at full load, my output voltage was 3.25V at the lowest.

Downloads.

Order from OSH Park

All files available here – Click

How-to: Design a Boost Converter

image-boost-converter
Figure 1: Basic Boost Converter Circuit

Designing a boost converter sounds complicated and intimidating, well that was always my impression when it came to this topic in school.  In reality, the design and testing of a boost converter is a lot easier than meets the eye.

Here I will walk you step by step on designing your first boost converter and how the datasheet is your best friend when designing.  For this tutorial we will be using the L6920DC IC Boost converter from skyworks.[1]

Download the Boost Converter excel spredsheet from the Resources page.

This information was referenced from TI reference report.[2]

First and foremost, download the highlighted datasheet, datasheet-l6920dc. This has all the highlighted paremeters that you will need when designing a boost converter.

Step 1:

You need to decide what are your specifications.  These are the key parameters:

  • Vin(min)
  • Vin(max)
  • Vout
  • Iout
  • n = efficiency; Most boost converters average around 85 to 90% under medium load and up to 95% on heavy load.  We will use the lowest percentage to be safe.

Example:

  • Vin(min): 1.8V
  • Vin(max): 2.4V
  • Vout: 3.3V
  • Iout: 0.4A
  • n = 87% or 0.87

Step 2:

With your specifications, next step is to find your DUTY CYCLE:

\bf \Huge D= 1 - \cfrac{(V_{\text{IN}}*n)}{V_{\text{OUT}}}

We calculated the duty cycle for both lowest input voltage and highest input voltage.

  • Lowest input voltage gives you the highest switching current you will see
  • Highest input voltage gives you the highest output current your converter can produce

Example:

\bf \Huge V_{\text{IN-MIN}}

\Huge D = 1 - \cfrac{1.8V*0.85}{3.3V} = 0.52

\bf \Huge V_{\text{IN-MAX}}

\Huge D = 1 - \cfrac{2.4V*0.85}{3.3V} = 0.36

Step 3:

Next we will estimate the switching current or CURRENT RIPPLE of the Inductor:

ΔIL = \bf \Huge (0.3) * I_\text{OUTmax} * \cfrac{V_\text{OUT}}{V_\text{IN}}

Example:

\bf \Huge V_{\text{IN-MIN}}

ΔIL = \Huge  (0.3) * 0.4A * \cfrac{3.3V}{1.8V} = 0.22A

\bf \Huge V_{\text{IN-MAX}}

ΔIL = \Huge  (0.3) * 0.4A * \cfrac{3.3V}{2.4V} = 0.165A

Step 4:

Next we calculate the minimum INDUCTANCE we need:

\bf \Huge L_\text{MIN} = \cfrac{(V_\text{IN})*(V_\text{OUT} - V_\text{IN})}{\Delta I_\text{L}*f_\text{S}*V_\text{OUT}}

\bf \Huge f_\text{S} – This is the switching frequency that the converter will operate at.

Example:

\bf \Huge V_{\text{IN-MIN}}

\Huge L_\text{MIN} = \cfrac{(1.8V)*(3.3V - 1.8V)}{0.22A*1MHz*3.3V} = 3.72uH

\bf \Huge V_{\text{IN-MAX}}

\Huge L_\text{MIN} = \cfrac{(2.4V)*(3.3V - 2.4V)}{0.165A*1MHz*3.3V} = 3.97uH

We would select the highest inductance value to meet our input voltage rage of 1.8V-2.4V

When selecting the inductor, the key parameters you need to look for is low DCR, package size, and max current the inductor can handle.

DCR – Is the resistance in the coil because at the end of the day, an inductor is still a wire. When you keep this value at a minimum, it will increase your effieciency and the ability to provide a higher output power.

In step 7 , you will calculate the maximum current the inductor will see and there you will have all the necessary parameters needed to chose the inductor.

Step 5:

Now that we have our inductor value, we can calculate the actual CURRENT RIPPLE of the Inductor:

ΔIL = \bf \Huge \cfrac{V_{IN}*D}{f_\text{S}*L}

Example:

\bf \Huge V_{\text{IN-MIN}}

ΔIL = \Huge \cfrac{1.8V*0.525}{1MHz*3.72uH} = 0.19A

\bf \Huge V_{\text{IN-MAX}}

ΔIL = \Huge \cfrac{2.4V*0.36}{1MHz*3.97uH} = 0.18A

Step 6:

Next we need to calculate the MAX OUTPUT CURRENT the boost converter can output:

\bf \Huge I_\text{MAXOUT} = \bf  \Huge (I_\text{LIM} - \cfrac{\Delta I_\text{L}}{2}) * (1 - D)

I_\text{LIM} – This is the current switch limit of the boost converter.

Example:

\bf \Huge V_{\text{IN-MIN}}

\Huge I_\text{MAXOUT} = \bf  \Huge (0.8A - \cfrac{0.19A}{2}) * (1 - 0.52) = 0.33A

\bf \Huge V_{\text{IN-MAX}}

\Huge I_\text{MAXOUT} = \bf  \Huge (0.8A - \cfrac{0.18A}{2}) * (1 - 0.36) = 0.45A

Step 7:

Next we will calculate the MAX SWITCHING CURRENT, I_\text{SW} the Inductor will see.  This value cannot exceed the ILIM value of the boost converter:

\bf \Huge I_\text{SW-MAX} = \cfrac{\Delta I_\text{L}}{2} + \cfrac{I_\text{OUT}}{1 - D}

Example:

\bf \Huge V_{\text{IN-MIN}}

\Huge I_\text{SW-MAX} =  \cfrac{0.19A}{2} + \cfrac{0.4A}{1 - 0.525} = 0.94A

\bf \Huge V_{\text{IN-MAX}}

\Huge I_\text{SW-MIN} =  \cfrac{0.18A}{2} + \cfrac{0.4A}{1 - 0.36} = 0.72A

Note: \Huge I_\text{SW-MAX} value cannot exceed \Huge I_\text{LIM} which can be found in the datasheet.  In this example we see that with a low input voltage, the switching current exceeds the limit in the datasheet.  The boost converter might still be able to output the desired current at that low input voltage because \Huge I_\text{LIM} is the minimum switching current it can handle.  But better to be safe than sorry.

Here you can see the inductor will see a max of 0.94A at its lowest input voltage. Now we can chose the inductor for our design.

For this design I went with,MSS5131-472MLB, a 4.7uH inductor from coilcraft.[3]

Since I chose an inductor that has a higher value than previous calculated, the inductor current ripple and output power will be slightly lower but it will not effect your design negatively.

Step 8:

This step is only if your boost converter has an adjustable output voltage.

(This boost converter is a fixed output and does not require these resistors.  Step 8 values are dummy values but the process )

Here we will find R1 AND R2 values for the feedback network:

\bf \Huge I_\text{R0.5} >= 100 * I_\text{FB}

\bf \Huge I_\text{FB} – This is the current that the feedback resistor draws.

\bf \Huge R_2 = \cfrac{V_\text{FB}}{I_\text{R0.5}}

\bf \Huge V_\text{FB} – This is the feedback reference voltage

\bf \Huge R_1 =  R_2 * (\cfrac{V_\text{OUT}}{V_\text{FB}}-1)

Example:

\Huge I_\text{R0.5} >= 100 * 350nA = 35mA

\Huge R_2 = \cfrac{1.24V}{35mA} = 35.4kΩ

\Huge R_1 =  35.4k \Omega * (\cfrac{3.3V}{1.24V}-1) = 58.74kΩ

Step 9:

Next l, we will calculate the INPUT CAPACITOR and OUTPUT CAPACITOR needed to minimize the ripple going in and out of the system:

First, you find your input capacitor:

\bf \Huge C_\text{IN}: Typically this value is 4.7uF to 10uF

Next, we need to first to look at these two equations below[6]:

\bf \Huge \Delta V_\text{OUT}= \cfrac{I_\text{OUT} *T_\text{ONmax}}{ C_\text{OUT}}

\bf \Huge T_\text{ONmax} – This is the maximum on time of the boost converter.  It is also written as

\bf \Huge D * T_\text{S}

Were \bf \Huge T_\text{S} = \cfrac{1}{f_\text{S}}

\bf \Huge \Delta V_\text{OUTesr} = ESR* I_\text{SW-MAX}

ESR – All capacitors are not ideal capacitors and therefore have what is known as Equivalent Series Resistance. This is an important parameter that you need to consider when choosing the right output capacitor.

Example:

Cin = 10uF

First, we need to choose a voltage ripple that we can live with. Here I chose 50mV, and if we rearrange the first equation, we get:

 

 \Huge \Delta C_\text{OUTmin}= \cfrac{0.4 *6.25us}{50mV} = 50uF

Now we have a couple of options to choose from when it comes to materials for capacitors.

Most common are ceramic and electrolytic capacitors.  Each have there own pro and con.

Ceramic capacitors offer lower ESR for lower ripple but they typically do not have the bulk capacitance.

Electrolytic capacitors have bulk capacitance but generally have a high ESR that adds to ripple.

In this case I decided to go with both, getting the benefit of bulk capacitance and low ESR.

I went with a 1206 package, 10uF ceramic capacitor and a 47uF Electrolytic in parallel. For the electrolytic, they also have an aluminum polymer that has high capacitance with the added benefit of low ESR. I went with a 47uF that has an ESR of 40mΩ.

Now we plug in the values we got back into the equations and we get:Special Note: For ceramic capacitors, you need to be careful of which class and package size you choose because you only see a certain percentage of your nominal value (ex. 1206 10uF X7R will see 73% of 10uF)[4]. Click here for more info. I generally go with 1206 or 1210 with capacitors.

\Huge \Delta V_\text{OUT}= \cfrac{0.4A * 6.25us}{50uF} = 50mV

\Huge \Delta V_\text{OUTesr} = 40m\Omega*0.94A = 37mV

\Huge \Delta V_\text{OUT} = 87mV
Always refer to the datasheet and compare recommended value vs calculated[1]

You’ve now designed your own boost converter regulator.  See it wasnt too hard :).

I will post this project soon that has the schematic and bill of materials, it’ll be under the projects menu bar, stay tuned!!

 

Feel free to comment below and correct me if anything seems incorrect to you.

References:

1. L6920 Datasheet

2. TI Basic Calculations of a Boost Converter Power Stage

3. Coilcraft Inductor

4. Temperature and Voltage Variation of Ceramic Capacitors

5. Ceramic or electrolytic output capacitors
in DC/DC converters—Why not both?

6. Boost Converter Output Capacitor Selection