Skicka sensordata (DHT11 & BMP180) till ThingSpeak med en Arduino, via kabel eller WiFi (ESP8266) (4 / 5 steg)
Steg 4: En Bonus
I fall du inte vill använda Thingspeak men vill bara din egen webbserver: Använd detta program:
/*
* DHT11 Sensor kopplad till stift 2
< en href = "http://arduino-info.wikispaces.com/ethernet-temp-humidity" rel = "nofollow" > http://arduino-info.wikispaces.com/ethernet-temp-...>
Baserat på koden av David A. Mellis & Tom Igoe
Av diy_bloke
* bmp180sensor på a4/a5
*/
/ *---(Import behövs bibliotek)---* /
#include < SPI.h >
#include < Ethernet.h >
#include < dht11.h >
#include < Wire.h >
#include < Adafruit_Sensor.h >
#include < Adafruit_BMP085_U.h >
#include < Adafruit_BMP085.h >
/ *---(Deklarera konstanter och Pin nummer)---* /
#define DHT11PIN 2 / / The temperatur/hygrometergivare
Ange en MAC-adress och IP-adressen för din controller nedan.
IP-adressen kommer att bero på ditt lokala nätverk:
byte [mac] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
/ *---(Deklarera objekt)---* /
IP-adress ip (192,168,1, 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_Unified bmp = Adafruit_BMP085_Unified(10085);
Adafruit_BMP085 bmp;
dht11 DHT11; Objektet Sensor
/ *---(Deklarera variabler)---* /
void setup() / *** SETUP: kör en gång *** /
{
Öppna seriell kommunikation och vänta på port att öppna:
Serial.BEGIN(9600);
tag (!. Serial) {
; vänta för seriell port att ansluta. Behövs för Leonardo endast
}
Starta Ethernet-anslutningen och servern:
Ethernet.BEGIN (mac, ip);
Server.BEGIN();
Serial.Print (F ("servern är på"));
Serial.println(Ethernet.localIP());
} //--(end setup)---
void loop() / *---(LOOP: kör OVER AND OVER AGAIN)---* /
{
lyssna efter inkommande klienter
EthernetClient klient = server.available();
om (klient) {
Serial.println F ("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 ("Connnection: Stäng");
client.println();
client.println ("<! DOCTYPE HTML > ");
client.println ("< html >");
lägga till en meta refresh-taggen, så webbläsaren drar igen var femte sekund:
client.println ("< meta http-equiv = \"refresh\"innehåll = \"5\">");
client.println ("< head >");
client.println ("< title >");
client.println F ("My hem miljö").
client.println ("</title >");
client.println ("</head >");
client.println ("< body >");
client.Print (F ("< h3 > My hem miljö </h3 >"));
client.println ("< br/>");
/ *---(Får sensor läsa, beräkna och skriva ut resultaten)---* /
int chk = DHT11.read(DHT11PIN);
Serial.Print (F ("Läs sensor:"));
Switch (chk)
{
fall 0:
Serial.println(F("OK"));
bryta;
fall -1:
Serial.println F ("Checksum error").
bryta;
fall -2:
Serial.println F ("Time out fel").
bryta;
standard:
Serial.println F ("okänt fel").
bryta;
}
/ * Få en ny sensor (BMP085) händelse * /
sensors_event_t händelse;
bmp.getEvent(&event);
//--------------
client.Print (F ("< tabell style =" border: 1px solid svart; bakgrundsfärg: vit; " > "));
client.Print F (< tr >< td >").
client.Print ("< font color ="röd"> temperatur </font > (° C):");
client.Print (F ("< /td >< td align ="rätt">"));
client.println ((float) DHT11.temperature, 1);
client.println (F ("< br/>"));
client.Print F ("< /td >< /tr >").
client.Print F (< tr >< td >").
client.Print ("< b > temperatur < /b > (° F):");
client.Print (F ("< /td >< td align ="rätt">"));
client.println(Fahrenheit(DHT11.temperature), 1);
client.println ("< br/>");
client.Print F ("< /td >< /tr >").
client.Print F (< tr >< td >").
client.Print ("< teckenfärg = 'blå' > luftfuktighet </font > (%):");
client.Print (F ("< /td >< td align ="rätt">"));
client.println ((float) DHT11.humidity, 0);
client.println ("< br/>");
client.Print F ("< /td >< /tr >").
client.Print F (< tr >< td >").
/*
client.Print ("< b > temperatur < /b > (° K):");
client.println(Kelvin(DHT11.temperature), 1);
client.println ("< br/>");
*/
client.Print ("< i > daggpunkt < /i > (° C):");
client.Print (F ("< /td >< td align ="rätt">"));
client.println (daggpunkten (DHT11.temperature, DHT11.humidity));
client.println ("< br/>");
client.Print F ("< /td >< /tr >").
client.Print F (< tr >< td >").
client.Print ("< i > dagg PointFast < /i > (° C):");
client.Print (F ("< /td >< td align ="rätt">"));
client.println (dewPointFast (DHT11.temperature, DHT11.humidity));
client.println ("< br/>");
client.Print F ("< /td >< /tr >").
client.Print F (< tr >< td >").
om (! bmp.begin()) {
client.Print ("geen sensor");
}
annat
{
client.Print ("tryck (hPa):");
client.Print (F ("< /td >< td align ="rätt">"));
client.println(bmp.readPressure()/100.0);
client.Print F ("< /td >< /tr >").
client.Print F (< tr >< td >").
client.Print ("tryck (mmHg):");
client.Print (F ("< /td >< td align ="rätt">"));
client.println(bmp.readPressure()/133.3);
client.Print F ("< /td >< /tr >").
client.Print F (< tr >< td >").
client.println ("temperatur (° C):");
client.Print (F ("< /td >< td align ="rätt">"));
client.Print(bmp.readTemperature());
client.println ("< br/>");
}
client.Print F ("< /td >< /tr >").
client.Print (F ("</table >"));
/ * Visa resultatet (barometertrycket är åtgärd i hPa) * /
/ * Visa lufttrycket i hPa * /
/ * client.print ("tryck:");
client.println(Event.Pressure);
client.println ("hPa");
client.println ("< br/>");
*/
/ *---(Avsluta Sensor Läs)---* /
client.println ("</kropp >");
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 F ("klient disonnected").
}
} / / END Loop
/ *---(Förklara användaren skrivna funktioner)---* /
//
Celsius till Fahrenheit konvertering
dubbel Fahrenheit (dubbel celsius)
{
returnera 1,8 * celsius + 32.
}
Celsius till Kelvin konvertering
Dubbelrum Kelvin(double celsius)
{
returnera celsius + 273.15;
}
Daggpunkten funktion NOAA
Referens: < en href = "http://wahiduddin.net/calc/density_algorithms.htm" rel = "nofollow" > http://arduino-info.wikispaces.com/ethernet-temp-...>
dubbel daggpunkten (dubbel celsius, dubbel luftfuktighet)
{
dubbel A0 = 373.15 / (273.15 + celsius);
dubbla summan =-7.90298 * (A0-1).
SUMMA += 5.02808 * log10(A0);
Summa +=-1.3816e-7 * (pow (10, (11.344*(1-1/A0)))-1);
SUMMA += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1);
SUMMA += log10(1013.246);
dubbla VP = pow (10, SUM-3) * luftfuktighet;
dubbel T = log(VP/0.61078); Temp var
Return (241.88 * T) / 17.558-T,
}
delta max = 0.6544 wrt dewPoint()
5 x snabbare än dewPoint()
Referens: < en href = "http://en.wikipedia.org/wiki/Dew_point" rel = "nofollow" > http://arduino-info.wikispaces.com/ethernet-temp-...>
dubbel dewPointFast (dubbel celsius, dubbel luftfuktighet)
{
dubbel en = 17.271;
dubbel b = 237.7;
dubbel temp = (en * celsius) / (b + c) + log(humidity/100);
dubbel Td = (b * temp) / (a - temp);
returnera Td;
}
/ * (SLUTET) * /