Ethernet Shield Barometric Pressure Web Server
Outputs the values from a barometric pressure sensor as a web page.
This example shows how to use SPI communications to read data from a SCP1000 Barometric Pressure sensor, and how to then post that data to the web by using your Arduino / Ethernet Shield combo as a simple web server. Using the Ethernet library, your device will be able to answer HTTP requests by responding with just enough HTML for a browser to display the temperature and barometric pressure values outputted by your sensor. After completing your circuit and uploading the example code below, simply navigate to your Ethernet shield's IP address, in a browser, to see this information.
See the Barometric Pressure Sensor example for more on how the sensor works.
Hardware Required
Arduino Board
SCP1000 Pressure Sensor Breakout Board
Arduino Ethernet Shield
Circuit
Your Barometric Pressure sensor will be attached to pins 6,7, and the SPI pins of your Arduino / Ethernet shield combo, and powered via your device's 3.3 volt output. Connect the DRDY (Data Ready) pin on your sensor to digital pin 6 on your combo, and the CSB pin (Chip Select) to digital pin 7. Your sensor's COPI (Controller Out Periheral In), MISO (Controller In Periheral Out), and SCK (SPI clock input) pins should then be connected to the SPI pins on your Arduino board/shield. The SPI pin numbers differ depending on which Arduino board you're using and are listed in the SPI reference page. Make sure that the two share a common ground.
After wiring your sensor, your shield should be connected to a network with an Ethernet cable. You will need to change the network settings in the program to correspond to your network.
Image developed using Fritzing. For more circuit examples, see the Fritzing project page
In the above image, the Arduino board would be stacked below the Ethernet shield.
Schematic
Code
1/*2
3 SCP1000 Barometric Pressure Sensor Display4
5 Serves the output of a Barometric Pressure Sensor as a web page.6
7 Uses the SPI library. For details on the sensor, see:8
9 http://www.sparkfun.com/commerce/product_info.php?products_id=816110
11 This sketch adapted from Nathan Seidle's SCP1000 example for PIC:12
13 http://www.sparkfun.com/datasheets/Sensors/SCP1000-Testing.zip14
15 TODO: this hardware is long obsolete. This example program should16
17 be rewritten to use https://www.sparkfun.com/products/972118
19 Circuit:20
21 SCP1000 sensor attached to pins 6,7, and 11 - 13:22
23 DRDY: pin 624
25 CSB: pin 726
27 MOSI: pin 1128
29 MISO: pin 1230
31 SCK: pin 1332
33 created 31 July 201034
35 by Tom Igoe36
37 */38
39#include <Ethernet.h>40// the sensor communicates using SPI, so include the library:41#include <SPI.h>42
43// assign a MAC address for the Ethernet controller.44// fill in your address here:45byte mac[] = {46
47 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED48};49// assign an IP address for the controller:50
51IPAddress ip(192, 168, 1, 20);52
53// Initialize the Ethernet server library54// with the IP address and port you want to use55// (port 80 is default for HTTP):56
57EthernetServer server(80);58
59//Sensor's memory register addresses:60
61const int PRESSURE = 0x1F; //3 most significant bits of pressure62
63const int PRESSURE_LSB = 0x20; //16 least significant bits of pressure64
65const int TEMPERATURE = 0x21; //16 bit temperature reading66
67// pins used for the connection with the sensor68// the others you need are controlled by the SPI library):69
70const int dataReadyPin = 6;71
72const int chipSelectPin = 7;73
74float temperature = 0.0;75long pressure = 0;76long lastReadingTime = 0;77
78void setup() {79
80 // You can use Ethernet.init(pin) to configure the CS pin81
82 //Ethernet.init(10); // Most Arduino shields83
84 //Ethernet.init(5); // MKR ETH shield85
86 //Ethernet.init(0); // Teensy 2.087
88 //Ethernet.init(20); // Teensy++ 2.089
90 //Ethernet.init(15); // ESP8266 with Adafruit Featherwing Ethernet91
92 //Ethernet.init(33); // ESP32 with Adafruit Featherwing Ethernet93
94 // start the SPI library:95
96 SPI.begin();97
98 // start the Ethernet connection99
100 Ethernet.begin(mac, ip);101
102 // Open serial communications and wait for port to open:103
104 Serial.begin(9600);105
106 while (!Serial) {107
108 ; // wait for serial port to connect. Needed for native USB port only109
110 }111
112 // Check for Ethernet hardware present113
114 if (Ethernet.hardwareStatus() == EthernetNoHardware) {115
116 Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :(");117
118 while (true) {119
120 delay(1); // do nothing, no point running without Ethernet hardware121
122 }123
124 }125
126 if (Ethernet.linkStatus() == LinkOFF) {127
128 Serial.println("Ethernet cable is not connected.");129
130 }131
132 // start listening for clients133
134 server.begin();135
136 // initialize the data ready and chip select pins:137
138 pinMode(dataReadyPin, INPUT);139
140 pinMode(chipSelectPin, OUTPUT);141
142 //Configure SCP1000 for low noise configuration:143
144 writeRegister(0x02, 0x2D);145
146 writeRegister(0x01, 0x03);147
148 writeRegister(0x03, 0x02);149
150 // give the sensor and Ethernet shield time to set up:151
152 delay(1000);153
154 //Set the sensor to high resolution mode tp start readings:155
156 writeRegister(0x03, 0x0A);157
158}159
160void loop() {161
162 // check for a reading no more than once a second.163
164 if (millis() - lastReadingTime > 1000) {165
166 // if there's a reading ready, read it:167
168 // don't do anything until the data ready pin is high:169
170 if (digitalRead(dataReadyPin) == HIGH) {171
172 getData();173
174 // timestamp the last time you got a reading:175
176 lastReadingTime = millis();177
178 }179
180 }181
182 // listen for incoming Ethernet connections:183
184 listenForEthernetClients();185}186
187void getData() {188
189 Serial.println("Getting reading");190
191 //Read the temperature data192
193 int tempData = readRegister(0x21, 2);194
195 // convert the temperature to celsius and display it:196
197 temperature = (float)tempData / 20.0;198
199 //Read the pressure data highest 3 bits:200
201 byte pressureDataHigh = readRegister(0x1F, 1);202
203 pressureDataHigh &= 0b00000111; //you only needs bits 2 to 0204
205 //Read the pressure data lower 16 bits:206
207 unsigned int pressureDataLow = readRegister(0x20, 2);208
209 //combine the two parts into one 19-bit number:210
211 pressure = ((pressureDataHigh << 16) | pressureDataLow) / 4;212
213 Serial.print("Temperature: ");214
215 Serial.print(temperature);216
217 Serial.println(" degrees C");218
219 Serial.print("Pressure: " + String(pressure));220
221 Serial.println(" Pa");222}223
224void listenForEthernetClients() {225
226 // listen for incoming clients227
228 EthernetClient client = server.available();229
230 if (client) {231
232 Serial.println("Got a client");233
234 // an http request ends with a blank line235
236 bool currentLineIsBlank = true;237
238 while (client.connected()) {239
240 if (client.available()) {241
242 char c = client.read();243
244 // if you've gotten to the end of the line (received a newline245
246 // character) and the line is blank, the http request has ended,247
248 // so you can send a reply249
250 if (c == '\n' && currentLineIsBlank) {251
252 // send a standard http response header253
254 client.println("HTTP/1.1 200 OK");255
256 client.println("Content-Type: text/html");257
258 client.println();259
260 // print the current readings, in HTML format:261
262 client.print("Temperature: ");263
264 client.print(temperature);265
266 client.print(" degrees C");267
268 client.println("<br />");269
270 client.print("Pressure: " + String(pressure));271
272 client.print(" Pa");273
274 client.println("<br />");275
276 break;277
278 }279
280 if (c == '\n') {281
282 // you're starting a new line283
284 currentLineIsBlank = true;285
286 } else if (c != '\r') {287
288 // you've gotten a character on the current line289
290 currentLineIsBlank = false;291
292 }293
294 }295
296 }297
298 // give the web browser time to receive the data299
300 delay(1);301
302 // close the connection:303
304 client.stop();305
306 }307}308
309//Send a write command to SCP1000310void writeRegister(byte registerName, byte registerValue) {311
312 // SCP1000 expects the register name in the upper 6 bits313
314 // of the byte:315
316 registerName <<= 2;317
318 // command (read or write) goes in the lower two bits:319
320 registerName |= 0b00000010; //Write command321
322 // take the chip select low to select the device:323
324 digitalWrite(chipSelectPin, LOW);325
326 SPI.transfer(registerName); //Send register location327
328 SPI.transfer(registerValue); //Send value to record into register329
330 // take the chip select high to de-select:331
332 digitalWrite(chipSelectPin, HIGH);333}334
335//Read register from the SCP1000:336unsigned int readRegister(byte registerName, int numBytes) {337
338 byte inByte = 0; // incoming from the SPI read339
340 unsigned int result = 0; // result to return341
342 // SCP1000 expects the register name in the upper 6 bits343
344 // of the byte:345
346 registerName <<= 2;347
348 // command (read or write) goes in the lower two bits:349
350 registerName &= 0b11111100; //Read command351
352 // take the chip select low to select the device:353
354 digitalWrite(chipSelectPin, LOW);355
356 // send the device the register you want to read:357
358 SPI.transfer(registerName);359
360 // send a value of 0 to read the first byte returned:361
362 inByte = SPI.transfer(0x00);363
364 result = inByte;365
366 // if there's more than one byte returned,367
368 // shift the first byte then get the second byte:369
370 if (numBytes > 1) {371
372 result = inByte << 8;373
374 inByte = SPI.transfer(0x00);375
376 result = result | inByte;377
378 }379
380 // take the chip select high to de-select:381
382 digitalWrite(chipSelectPin, HIGH);383
384 // return the result:385
386 return (result);387}
Last revision 2018/09/07 by SM
Suggest changes
The content on docs.arduino.cc is facilitated through a public GitHub repository. If you see anything wrong, you can edit this page here.
License
The Arduino documentation is licensed under the Creative Commons Attribution-Share Alike 4.0 license.