It’s Alive, It’s Alive. Ok, sounds better if done with a Dr. Frankenstein accent, but the Arduino WiFi wireless weather Server is alive. Starting with a Arduino UNO, we then stacked a Arduino WiFi shield, a adafruit Lithium Polymer battery shield, and a Sparkfun Protoshield with a Embedded Adventures BME280 breakout and a 3.3v – 5v level shifter. A 5v solar panel is on it’s way to keep this charged,
Arduino UNO
Arduino WiFi
Adafruit LIPO
Sparkfun Protoshield
Embedded Adventures BME280 (schematics)
Embedded Adventures Level Shifter
Code (Video below)
Become the Maker you were born to be. Try Arduino Academy for FREE!
#include <SPI.h> #include <WiFi.h>
#include <BME280_MOD-1022.h>
#include <Wire.h>
IPAddress dns(192, 168, 254, 254);
IPAddress ip(192, 168, 254, 16);
IPAddress gateway(192, 168, 254, 254);
IPAddress subnet(255, 255, 255, 0);
float temp, humidity, pressure, pressureMoreAccurate, tempF, inHg, rH;
double tempMostAccurate, humidityMostAccurate, pressureMostAccurate;
char ssid[] = “your ssid”; // your network SSID (name)
char pass[] = “your password”; // your network password
int keyIndex = 0; // your network key Index number (needed only for WEP)
int status = WL_IDLE_STATUS;
WiFiServer server(80);
// print out the measurements
void printCompensatedMeasurements(void) {
char buffer[80];
temp = BME280.getTemperature();
humidity = BME280.getHumidity();
pressure = BME280.getPressure();
pressureMoreAccurate = BME280.getPressureMoreAccurate(); // t_fine already calculated from getTemperaure() above
tempMostAccurate = BME280.getTemperatureMostAccurate();
humidityMostAccurate = BME280.getHumidityMostAccurate();
pressureMostAccurate = BME280.getPressureMostAccurate();
Serial.print(“Temperature “);
tempF = tempMostAccurate * 1.8 + 32.0;
Serial.print(tempF);
Serial.print(” “);
Serial.print(char(176));
Serial.println(“F”);
Serial.print(“Humidity “);
rH = humidityMostAccurate;
Serial.print(rH);
Serial.println(” %”);
Serial.print(“Pressure “);
inHg = pressureMostAccurate * 0.0295299830714;
Serial.print(inHg, 2);
Serial.println(” in. Hg”);
}
void setup() {
Wire.begin();
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println(“WiFi shield not present”);
// don’t continue:
while (true);
}
String fv = WiFi.firmwareVersion();
if ( fv != “1.1.0” )
Serial.println(“Please upgrade the firmware”);
// attempt to connect to Wifi network:
WiFi.config(ip, dns, gateway, subnet);
while ( status != WL_CONNECTED) {
Serial.print(“Attempting to connect to SSID: “);
Serial.println(ssid);
// Connect to WPA/WPA2 network. Change this line if using open or WEP network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
server.begin();
// you’re connected now, so print out the status:
printWifiStatus();
}
void loop() {
uint8_t chipID;
chipID = BME280.readChipId();
// find the chip ID out just for fun
//Serial.print(“ChipID = 0x”);
//Serial.print(chipID, HEX);
// need to read the NVM compensation parameters
BME280.readCompensationParams();
// Need to turn on 1x oversampling, default is os_skipped, which means it doesn’t measure anything
BME280.writeOversamplingPressure(os1x); // 1x over sampling (ie, just one sample)
BME280.writeOversamplingTemperature(os1x);
BME280.writeOversamplingHumidity(os1x);
// example of a forced sample. After taking the measurement the chip goes back to sleep
BME280.writeMode(smForced);
while (BME280.isMeasuring()) {
Serial.println(“Measuring…”);
delay(50);
}
Serial.println(“Done!”);
// read out the data – must do this before calling the getxxxxx routines
BME280.readMeasurements();
// Example for “indoor navigation”
// We’ll switch into normal mode for regular automatic samples
BME280.writeStandbyTime(tsb_0p5ms); // tsb = 0.5ms
BME280.writeFilterCoefficient(fc_16); // IIR Filter coefficient 16
BME280.writeOversamplingPressure(os16x); // pressure x16
BME280.writeOversamplingTemperature(os2x); // temperature x2
BME280.writeOversamplingHumidity(os1x); // humidity x1
BME280.writeMode(smNormal);
while (1) {
while (BME280.isMeasuring()) {
}
// read out the data – must do this before calling the getxxxxx routines
BME280.readMeasurements();
printCompensatedMeasurements();
delay(2000); // do this every 5 seconds
Serial.println();
// listen for incoming clients
WiFiClient client = server.available();
if (client) {
Serial.println(“new client”);
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you’ve gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == ‘n’ && currentLineIsBlank) {
// send a standard http response header
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println(“Connection: close”); // the connection will be closed after completion of the response
client.println(“Refresh: 5”); // refresh the page automatically every 5 sec
client.println();
client.println(“<!DOCTYPE HTML>”);
client.println(“<html>”);
// output the value of each sensor
client.print(“Temperature “);
client.println(tempF);
client.print(“°”);
client.print(“F”);
client.println(“<br />”);
client.print(“Humidity “);
client.println(rH);
client.print(” %”);
client.println(“<br />”);
client.print(“Pressure “);
client.println(inHg);
client.print(” in. Hg”);
client.println(“<br />”);
client.println(“</html>”);
break;
}
if (c == ‘n’) {
// you’re starting a new line
currentLineIsBlank = true;
}
else if (c != ‘r’) {
// you’ve gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println(“client disonnected”);
}
}
}
void printWifiStatus() {
// print the SSID of the network you’re attached to:
Serial.print(“SSID: “);
Serial.println(WiFi.SSID());
// print your WiFi shield’s IP address:
IPAddress ip = WiFi.localIP();
Serial.print(“IP Address: “);
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print(“signal strength (RSSI):”);
Serial.print(rssi);
Serial.println(” dBm”);
}
Become the Maker you were born to be. Try Arduino Academy for FREE!
http://www.embeddedadventures.com/ is a FAKE web site.
they get your money but items are not being shipped.
embedded adventures is CHEATER
Any updates to this project since the Arduino WiFi shield is no longer available?
Here is a ESP8266 version – http://arduinotronics.blogspot.com/2017/06/esp8266-bme280-weather-station.html