modular-weather-station/WeatherStation.ino

154 lines
3.5 KiB
Arduino
Raw Normal View History

/*
* ModularWeatherStation
*
* Copyright (C) 2021 Gergely Polonkai
* Author: Gergely POLONKAI <gergely@polonkai.eu>
*
* ModularWeatherStation is free software: you can redistribute it
* and/or modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* ModularWeatherStation is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* As additional permission under GNU GPL version 3 section 7, you may
* distribute non-source form of the Program without the copy of the
* GNU GPL normally required by section 4, provided you inform the
* receipents of GNU GPL by a written offer.
*
*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>
#include "config.h"
#ifdef DHT_TYPE
# include <DHT.h>
#endif // DHT_TYPE
ESP8266WebServer server(80);
unsigned long last_update = 0;
#ifdef DHT_TYPE
DHT dht(DHT_PIN, DHT_TYPE);
float temperature = 0.0;
float humidity = 0.0;
#endif // DHT_TYPE
static const char TEXT_PLAIN[] PROGMEM = "text/plain";
void
reply_not_found()
{
server.send(404, FPSTR(TEXT_PLAIN), "Not Found");
}
void
send_metrics()
{
static const size_t dht_size = 228;
char message[dht_size + 1];
size_t message_size =
#ifdef DHT_TYPE
dht_size +
#endif // DHT_TYPE
1;
snprintf(message, message_size,
#ifdef DHT_TYPE
"# HELP temperature_celsius Temperature in degrees Celsius\n"
"# TYPE temperature_celsius gauge\n"
"temperature_celsius %.2f\n"
"# HELP relative_humidity Relative humidity, in percents\n"
"# TYPE relative_humidity gauge\n"
"relative_humidity %.2f\n",
temperature, humidity
#endif // DHT_TYPE
);
server.send(200, "text/plain; version=0.0.4; charset=utf-8", message);
}
void
setup()
{
IPAddress address;
Serial.begin(9600);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Waiting for WiFi to connect...");
}
address = WiFi.localIP();
Serial.print("WiFi Address: ");
address.printTo(Serial);
Serial.println("");
if (!MDNS.begin(MDNS_NAME)) {
Serial.println("Error setting up mDNS responder!");
while (1) {
delay(1000);
}
}
server.on("/metrics", HTTP_GET, send_metrics);
server.onNotFound(reply_not_found);
server.begin();
MDNS.addService("http", "tcp", 80);
// Initialize sensors
#ifdef DHT_TYPE
dht.begin();
#endif // DHT_TYPE
Serial.println("All set, starting the loop.");
}
void
read_sensors()
{
// Turn on the LED to indicate that were working
digitalWrite(LED_BUILTIN, LOW);
#ifdef DHT_TYPE
temperature = dht.readTemperature();
humidity = dht.readHumidity();
#endif
// Turn off the LED to indicate work is finished
digitalWrite(LED_BUILTIN, HIGH);
}
void
loop()
{
unsigned long now = millis();
MDNS.update();
server.handleClient();
if (now - last_update >= 5000) {
read_sensors();
last_update = now;
}
}