Super enkel Arduino väder webbservern (4 / 5 steg)
Steg 4: Barometertryck
Adafruit BMP-180 visas nedan, men har också testat med ICStation BMP-085. Inga ändringar i koden eller krets. Se http://arduinotronics.blogspot.com/2014/02/icstation-5v-bmp-085-pressure.html
Här är koden med alla tillägg:
#include < Wire.h >
#include < Adafruit_BMP085.h >
flyta Tc = 0;
flyta Tf = 0;
flyta Pa = 0;
flyta InHg = 0;
float är = 0;
flyta Af = 0;
#include "DHT.h"
#define DHTPIN 2 / / vilken pin vi är ansluten till
Avkommentera oavsett vilken typ du använder!
#define DHTTYPE DHT11 / / DHT 11
#define DHTTYPE DHT22 / / DHT 22 (AM2302)
#define DHTTYPE DHT21 / / DHT 21 (AM2301)
Ansluta stift 1 (till vänster) av sensorn till + 5V
Ansluta stift 2 av sensorn till vad din DHTPIN är
Ansluta stift 4 (till höger) av sensorn till marken
Ansluta en 10K motstånd från stift 2 (data) till stift 1 (power) av sensorn
DHT dht (DHTPIN, DHTTYPE);
float tF;
flyta dP;
float dPF;
#include < SPI.h >
#include < Ethernet.h >
Ange en MAC-adress och IP-adressen för din controller nedan.
IP-adressen kommer att bero på ditt lokala nätverk:
byte [mac] = {
0x90, 0xA2, 0xDA, 0x00, 0x23, 0x36};
IP-adress ip(192,168,254,177);
Starta servern Ethernet-biblioteket
med IP-adress och port vill du använda
(port 80 är standard för HTTP):
EthernetServer server(80);
Adafruit_BMP085 bmp;
void setup() {
Öppna seriell kommunikation och vänta på port att öppna:
Serial.BEGIN(9600);
om (! bmp.begin()) {
Serial.println kunde ("inte hitta en giltig BMP085 sensor, kolla ledningar!");
samtidigt (1) {}
}
tag (!. Serial) {
; vänta för seriell port att ansluta. Behövs för Leonardo endast
}
DHT.BEGIN();
Starta Ethernet-anslutningen och servern:
Ethernet.BEGIN (mac, ip);
Server.BEGIN();
Serial.Print ("servern är på");
Serial.println(Ethernet.localIP());
}
void loop() {
Serial.Print ("temperatur =");
Serial.Print(bmp.readTemperature());
TC=bmp.readTemperature();
TF = ((Tc*9)/5) + 32;
Serial.Print(tf);
Serial.println ("* F");
Serial.Print ("tryck =");
Serial.Print(bmp.readPressure());
PA=bmp.readPressure();
InHg = Pa * 0.000295333727;
Serial.Print(InHg);
Serial.println ("i Hg");
Beräkna höjden förutsatt att "standard" barometrisk
trycket av 1013,25 millibar = 101325 Pascal
Serial.Print ("höjd =");
Serial.Print(bmp.readAltitude());
Am=bmp.readAltitude(101550); justerat för lokala höjd
AF = Am * 3.28084;
Serial.Print(AF);
Serial.println ("fötter").
Du kan få en mer exakt mätning av höjd
Om du vet den nuvarande havsytan tryck som kommer att
variera med vädret och sådant. Om det är 1015 millibar
som är lika med 101500 Pascal.
Serial.Print ("verkliga höjd =");
Serial.Print(bmp.readAltitude(101500));
Serial.println ("mäter");
Serial.println();
Läst temperatur eller fuktighet tar cirka 250 millisekunder!
Sensormätningar kan också vara upp till 2 sekunder "gamla" (det är en mycket långsam sensor)
flyta h = dht.readHumidity();
flyta t = dht.readTemperature();
kolla om avkastningen är giltig, om de är NaN (inte ett tal) då något gick fel!
om (isnan(t) || isnan(h)) {
Serial.println ("kunde inte läsa från DHT");
} annat {
Serial.Print ("luftfuktighet:");
Serial.Print(h);
Serial.Print ("% \t");
Serial.Print ("temperatur:");
Serial.Print(t);
tF = ((t*9)/5) + 32;
Serial.println ("* C");
}
lyssna efter inkommande klienter
EthernetClient klient = server.available();
om (klient) {
Serial.println ("ny kund");
en http-förfrågan avslutas med en tom rad
booleska currentLineIsBlank = sant;
samtidigt (client.connected()) {
om (client.available()) {
char c = client.read();
Serial.write(c);
Om du har fått till slutet av raden (fick en newline
karaktär) och raden är tom, http-begäran har avslutats,
så du kan skicka ett svar
om (c == '\n' & & currentLineIsBlank) {
Skicka ett standard http-svarshuvud
client.println ("HTTP/1.1 200 OK");
client.println ("Content-Type: text/html");
client.println ("anslutning: Stäng"); anslutningen kommer att stängas efter slutförandet av svar
client.println ("uppdatera: 5"); uppdatera sidan automatiskt varje 5 sek
client.println();
client.println ("<! DOCTYPE HTML > ");
client.println ("< html >");
client.println ("< TABLE >");
client.println (< TR >");
client.println ("< TD >");
utgående värdet av DHT-11
client.Print ("luftfuktighet:");
client.println ("< /TD >");
client.println ("< TD >");
client.Print(h);
client.Print ("% \t");
client.println ("< /TD >");
client.println ("< /TR >");
client.println (< TR >");
client.println ("< TD >");
client.Print ("temperatur:");
client.println ("< /TD >");
client.println ("< TD >");
client.Print(t*1.8+32);
client.println ("°");
client.println("F");
client.println ("< /TD >");
client.println ("< /TR >");
client.println (< TR >");
client.println ("< TD >");
client.Print ("barometertryck:");
client.println ("< /TD >");
client.println ("< TD >");
client.Print(InHg);
client.println ("°");
client.println ("i.");
client.println ("< /TD >");
client.println ("< /TR >");
client.println (< TR >");
client.println ("< TD >");
client.println ("daggpunkt:");
client.println ("< /TD >");
client.println ("< TD >");
dP = (dewPointFast (t, h));
dPF = ((dP*9)/5) + 32;
client.println(dPF);
client.println ("°");
client.println("F");
client.println ("< /TD >");
client.println ("< /TR >");
client.println (< TR >");
client.println ("< TD >");
client.println ("Värmeindex:");
client.println ("< /TD >");
client.println ("< TD >");
client.println(heatIndex(tf,h));
client.println ("°");
client.println("F");
client.println ("< /TD >");
client.println ("< /TR >");
client.println ("</TABLE >");
client.println ("</html >");
bryta;
}
om (c == "\n") {
du börjar en ny rad
currentLineIsBlank = sant;
}
annars om (c! = '\r') {
du har fått ett tecken på den aktuella raden
currentLineIsBlank = false;
}
}
}
de web webbläsare möjlighet att ta emot data
Delay(1);
stänga anslutningen:
client.stop();
Serial.println ("klient disonnected");
}
}
delta max = 0.6544 wrt dewPoint()
6,9 x snabbare än dewPoint()
Referens: http://en.wikipedia.org/wiki/Dew_point
dubbel dewPointFast (dubbel celsius, dubbel luftfuktighet)
{
dubbel en = 17.271;
dubbel b = 237.7;
dubbel temp = (en * celsius) / (b + c) + log(humidity*0.01);
dubbel Td = (b * temp) / (a - temp);
returnera Td;
}
dubbel heatIndex (dubbel tempF, dubbel luftfuktighet)
{
dubbel c1 =-42.38, c2 = 2.049, c3 = 10.14, c4 =-0.2248, c5 = - 6.838e-3, c6 = - 5.482e - 2, c7 = 1.228e-3, c8 = 8.528e-4, c9 = - 1.99e - 6;
dubbel T = tempF;
dubbla R = fuktighet;
dubbel-A = ((c5 * T) + c2) * T + c1;
dubbel B = ((c7 * T) + c4) * T + c3;
dubbla C = ((c9 * T) + c8) * T + c6;
dubbel rv = (C * R + B) * R + A;
returnera rv;
}