Vous êtes sur la page 1sur 9

Textul si imaginile din acest document sunt licentiate

Attribution-NonCommercial-NoDerivs
CC BY-NC-ND

Codul sursa din acest document este licentiat


Public-Domain

Esti liber sa distribui acest document prin orice mijloace consideri (email, publicare pe website /
blog, printare, sau orice alt mijloc), atat timp cat nu aduci nici un fel de modificari acestuia. Codul
sursa din acest document poate fi utilizat in orice fel de scop, de natura comerciala sau nu, fara nici
un fel de limitari.

WiFi Weather Station


n cadrul leciei de fa vom realiza o staie meteo fr fir (cu conexiune WiFi).

Proiectul se bazeaz pe senzorul Bosch BME280


senzor integrat de mediu capabil s msoare presiunea
atmosferic, temperatura n grade C i umiditatea aerului
i s ofere, prin intermediul funciilor bibliotecii
software, temperatura n grade F, altitudinea n metrii /
picioare. Cu alte cuvinte, acest senzor este o mic staie
meteo ntr-un singur circuit integrat fiind unul dintre cele
mai avansate circuite de acest tip.
https://www.bosch-sensortec.com/bst/products/all_products/bme280

Avnd n vedere formatul extrem de mic (2.5mm x 2.5mm) pentru a putea utiliza acest
circuit n cadrul montajului nostru vom folosi modulul Sparkfun Breakout BME280.
Senzorul poate fi conectat la o plac de dezvoltare utiliznd magistrala I2C sau SPI (la
alegere) i funcioneaz la tensiunea de alimentare de 3.3V nu suport niveluri logice
de 5V. Dac dorim s utilizm acest senzor cu o plac de dezvoltare ce funcioneaz la
5V (Arduino Uno, Arduino Mega, Arduino Leonardo) este necesar utilizarea unui
convertor de nivel (3.3V-5V):
https://www.robofun.ro/electronice/generale/logic-level-converter-bi-directional .

https://www.robofun.ro/senzori/vreme/sparkfun-atmospheric-sensor-breakout-bme280

https://www.robofun.ro/forum/

Senzorul poate fi utilizat fr probleme cu plci de dezvoltare ce funcioneaz la 3.3V,


cteva exemple:
Arduino Pro Mini 328 - 3.3V/8MHz
https://www.robofun.ro/arduino/arduino_pro_mini_328_8mhz
Pro Micro 3.3V/8MHz - ATMega 32U4
https://www.robofun.ro/arduino/pro-micro-3-3v-8mhz
Arduino Due
https://www.robofun.ro/arduino/arduino-due
Arduino Industrial - Olimexino 328
https://www.robofun.ro/platforme/arduino_dev/arduino-industrial

Pentru mai multe detalii legate de funcionarea modulului SparkFun BME280


Breakout se poate parcurge urmtorul Hookup Guide:
https://learn.sparkfun.com/tutorials/sparkfun-bme280-breakout-hookup-guide

Utilizarea n program a senzorului este facilitat de biblioteca software Sparkfun


BME280 Arduino Library ce trebuie instalat sub mediul Arduino IDE nainte de
scrierea / ncrcarea programului:
https://github.com/sparkfun/SparkFun_BME280_Arduino_Library

Pentru implementarea proiectului vom utiliza o plac de dezvoltare bazat pe


controlerul WiFi ESP8266 i anume placa NodeMCU. Chiar dac nu este o plac din
familia Arduino aceast plac poate fi programat cu ajutorul mediului de dezvoltare
Arduino IDE i majoritatea
bibliotecilor software funcioneaz
fr probleme inclusiv Sparkfun
BME280 Arduino Library. Placa
funcioneaz la 3.3V i se poate
alimenta
prin
intermediul
conexiunii USB. Avantajul major al
acestei plci de dezvoltare este,
bineneles, conectivitatea de reea
WiFi scutind necesitatea utilizrii
unui shield specializat.
https://www.robofun.ro/wireless/wireless-wifi/NodeMCUv2-ESP8266

https://www.robofun.ro/forum/

Pentru configurarea mediului Arduino IDE se pot urma paii descrii n


materialul Quick Start to Nodemcu (ESP8266) on Arduino IDE:
http://www.instructables.com/id/Quick-Start-to-Nodemcu-ESP8266-on-Arduino-IDE/

Conectarea ntre senzorul BME280 i placa de dezvoltare se va realiza prin intermediul


magistralei I2C (conform schemei de interconectare de mai jos):
Pinul SCL al senzorului se va conecta la pinul D1 al plcii de dezvoltare;
Pinul SDA al senzorului se va conecta la pinul D2 al plcii de dezvoltare;
Pinul de GND la GND i pinul de 3.3V la 3V3.

https://www.robofun.ro/forum/

Scopul sistemului este acela de a face disponibile informaiile provenite de la senzorul


BME280 prin intermediul unei interfee web (accesibil de pe orice sistem, PC sau
telefon mobil inteligent. din aceiai reea local ca i sistemul meteo). Interfaa web va
afia timpul de funcionare a sistemului (Uptime), temperatura n grade C
(Temperature), un grafic al evoluiei temperaturii, umiditatea (Humidity), presiunea
atmosferic (Pressure) i altitudinea (Altitude).

Accesarea interfeei web se poate face cu ajutorul unui client web (browser) accesnd
adresa IP a sistemului meteo adresa se preia dinamic (prin DHCP) de ctre sistem i
este afiat n Serial Monitor la pornirea sistemului.

https://www.robofun.ro/forum/

Programul sistemului se bazeaz pe exemplul AdvancedWebServer din seciunea


Examples/ESP8266WebServer. n exemplu se insereaz partea de achiziie parametrii
de la senzorul BME280:
#include <stdint.h>
#include "SparkFunBME280.h"
#include "Wire.h"
BME280 mySensor;
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

n program trebuie personalizate datele de conectare la reeaua WiFi:


const char *ssid = "....";
const char *password = "....";
ESP8266WebServer server ( 80 );

Led-ul de pe placa de dezvoltare NodeMCU nu este conectat la pinul 13 ci la pinul 0.


Mai mult de ct att, comanda de aprinderea a acestuia se face pe 0 nu pe 1. n
cadrul sistemului meteo led-ul de pe placa de dezvoltare se va aprinde la conectarea
unui client web.
const int led = D0;

Vectorul temperature_history va stoca valorile de temperatura ce vor folosi la


generarea graficului de evoluie.
float temperature_history [39];
int temperature_index = 0;
char temp[600];

Procedura handleRoot() va construi pagina web la conectarea unui client.


void handleRoot() {
digitalWrite ( led, 0 );
int sec = millis() / 1000;
int min = sec / 60;
int hr = min / 60;
temperature_history[temperature_index] = mySensor.readTempC();
String t = String(temperature_history[temperature_index],2);
Serial.println(t);
temperature_index ++;
if (temperature_index > 38) temperature_index = 0;
String p = String(mySensor.readFloatPressure(),2);
Serial.println(p);
String a = String(mySensor.readFloatAltitudeMeters(),2);

https://www.robofun.ro/forum/

Serial.println(a);
String h = String(mySensor.readFloatHumidity(),2);
Serial.println(h);
snprintf ( temp, 600,"%02d:%02d:%02d", hr, (min % 60), (sec % 60));
String page = "<html>\
<head>\
<meta http-equiv='refresh' content='10'/>\
<title>WiFi Weather Station</title>\
<style>\
body { background-color: #cccccc; font-family: Arial, Helvetica,
Sans-Serif; Color: #000088; }\
</style>\
</head>\
<body>\
<h1>WiFi Weather Station</h1>\
<p><b>Uptime:</b> " + String(temp) + " </p>\
<p><b>Temperature:</b> " + t + " C </p>\
<p><img src=\"/test.svg\" /></p>\
<p><b>Humidity:</b> " + h + " %</p>\
<p><b>Pressure:</b> " + p + " Pa</p>\
<p><b>Altitude:</b> " + a + " m</p>\
</body>\
</html>";
page.toCharArray(temp,page.length()+1);
server.send ( 200, "text/html", temp );
digitalWrite ( led, 1 );
}

n seciunea setup() se va realiza conexiunea la reeaua WiFi specificat, se va porni i


configura conexiunea web pentru deservirea solicitrilor client i se va realiza partea
de iniializare a senzorului BME280.
void setup()
{
Serial.begin(57600);
pinMode ( led, OUTPUT );
digitalWrite ( led, 1 );
WiFi.begin ( ssid, password );
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
Serial.println
Serial.print (
Serial.println
Serial.print (
Serial.println

( "" );
"Connected to " );
( ssid );
"IP address: " );
( WiFi.localIP() );

server.on ( "/", handleRoot );


server.on ( "/test.svg", drawGraph );
server.on ( "/inline", []() {

https://www.robofun.ro/forum/

server.send ( 200, "text/plain", "this works as well" );


} );
server.begin();
Serial.println ( "HTTP server started" );
mySensor.settings.commInterface = I2C_MODE;
mySensor.settings.I2CAddress = 0x77;
mySensor.settings.runMode = 3; //Normal mode
mySensor.settings.tStandby = 0;
mySensor.settings.filter = 0;
mySensor.settings.tempOverSample = 1;
mySensor.settings.pressOverSample = 1;
mySensor.settings.humidOverSample = 1;
Serial.print("Starting BME280... result of .begin(): 0x");
delay(10);
Serial.println(mySensor.begin(), HEX);
}

n cadrul seciunii loop() se vor trata solicitrile de conectare client:


void loop() { server.handleClient(); }

Procedura drawGraph() realizeaz graficul evoluiei temperaturii:


void drawGraph() {
String out = "";
char temp[100];
out += "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\"
width=\"400\" height=\"150\">\n";
out += "<rect width=\"400\" height=\"150\" fill=\"rgb(250, 230, 210)\"
stroke-width=\"1\" stroke=\"rgb(0, 0, 0)\" />\n";
out += "<g stroke=\"black\">\n";
int y = (32 - temperature_history[0])*15;
for (int x = 10; x < 390; x+= 10) {
int y2 = (32 - temperature_history[x/10])*15;
sprintf(temp, "<line x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\" strokewidth=\"1\" />\n", x, 70 + y, x + 10, 70 + y2);
out += temp;
y = y2;
}
out += "</g>\n</svg>\n";
server.send ( 200, "image/svg+xml", out);
}

Programul a fost realizat i testat cu Arduino IDE 1.6.9, extensia ESP8266 Community
2.3.0 i biblioteca Sparkfun BME280 1.0.0.
Proiectul a fost realizat cu ajutorul unui fundal sonor asigurat de albumul Ozzy
Osbourne No More Tears.

https://www.robofun.ro/forum/

Programul poate fi completat foarte uor cu calculul i afiarea mai multor parametrii
(punct de rou, temperatur resimit) i chiar cu realizarea unei predicii de evoluie a
vremii (pe baza evoluiei n timp a presiunii atmosferice).
Punct de rou
https://ro.wikipedia.org/wiki/Punct_de_rou%C4%83
What is the AccuWeather RealFeel Temperature?
http://www.accuweather.com/en/weather-news/what-is-accuweather-realfeel/7198202
Weather forecasting
https://en.wikipedia.org/wiki/Weather_forecasting

https://www.robofun.ro/forum/

Vous aimerez peut-être aussi