modular-weather-station/WeatherStation.ino

154 lines
3.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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;
}
}