/* Погодный модуль в 8:00, 14:00 и 20:00 измеряет влажность,
температуру и давление DHT22 и BMP180. Время определяется по часам реального
времени DS3231.
*/
#include <Wire.h>
//+++++++++++++++++++++++++++++++++++++++++++++++++++
//Объявим библиотеки и переменные
// Начнем с влажности и температуры
#include "DHT.h"
#define DHTTYPE DHT22 // тип датчика - DHT22
#define DHTPIN 13 // на ногу D7 повесим датчик.
// объявим глобальные переменные влажности и температуры
float humidity_room = 0.0; // глобальная переменная влажность в офисе
// запрос humidity_room = dht.readHumidity();
float temp_room = 0.0; // глобальная переменная температура в офисе
// запрос temp_room = dht.readTemperature();
// Объявляем датчик DHT22. С него будем снимать влажность
// и температуру
DHT dht(DHTPIN, DHTTYPE);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Теперь добавим датчик давления.
// Пин SDA подключаем к D2, пин SDL - к D1
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
float pressure = 0.0; // глобальная переменная давления
// Пин SDA подключаем к D2, пин SDL - к D1
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Добавляем часы реального времени
// Пин SDA подключаем к D2, пин SDL - к D1
#include "RTClib.h"
RTC_DS3231 rtc;
// Массив для вывода дня недели
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Библиотека для работы с SPIFFS
#include "FS.h"
// Все необходимое для WiFi
#include <ESP8266WiFi.h>
const char* ssid = "Rostelekom_23"; // имя WiFi сети
const char* password = "850013342806"; // пароль от WiFi
IPAddress ip(192, 168, 0, 8);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
const int port = 80; // port to serve pages through
WiFiServer server(port);
uint16_t timeout=0;
// Include API-Headers
extern "C" {
#include "user_interface.h"
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++
void setup() {
Serial.begin(9600); // Откроем сом порт
//Это код для освобождения пина SDL,
//который занимает модуль DS3231 после ресета
pinMode(5, OUTPUT);
for (int i = 0; i < 10; i++) {
digitalWrite(5, HIGH);
delayMicroseconds(3);
digitalWrite(5, LOW);
delayMicroseconds(3);
}
pinMode(5, INPUT);
// Запускаем датчик давления
// if (!bmp.begin()) {
// Serial.println("Couldn't find BMP180");
// while (1) {}
// }
delay(500);
// Запускаем часы
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
delay(500);
// Запускаем датчик температуры
dht.begin();
// Запускаем файловую систему
SPIFFS.begin();
// Следующие три строчки предназначены для форматирования SPIFFS. После заливки скетча, закомментировать эти строки и залить еще раз.
// Serial.println("Please wait 30 secs for SPIFFS to be formatted");
// SPIFFS.format();
// Serial.println("Spiffs formatted");
WiFi.setAutoConnect(true);
WiFi.setAutoReconnect(true);
wifi_station_set_reconnect_policy(true);
wifi_station_set_auto_connect(1);
// Запускаем сервер и подключаемся к беспроводной сети
Serial.println("WiFi delete all config...");
// delete all existing WiFi stuff in EEPROM
WiFi.disconnect();
WiFi.softAPdisconnect();
WiFi.mode(WIFI_OFF);
delay(500);
Serial.println("WiFi set new config...");
// connect static
WiFi.mode(WIFI_STA);
wifi_set_sleep_type(NONE_SLEEP_T);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password); // connect to WiFi network
WiFi.config(ip, gateway, subnet);
while (WiFi.status() != WL_CONNECTED) { // wait until connected
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
server.begin(); // Start the server
Serial.println("Server started");
Serial.println(WiFi.localIP()); // Print the servers IP address
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
void loop() {
if (WiFi.status() != WL_CONNECTED) { // wait until connected
WiFi.begin(ssid, password); // connect to WiFi network
WiFi.config(ip, gateway, subnet);
delay(500);
Serial.print("WiFi lost connection");
return;
}
// Проверяем есть ли подключение к ЕСП
WiFiClient client = server.available(); // Check if a client has connected
if (client) {//типа если клиент, то выводим в браузер. Если не клиент, то смотрим время и т.д.
Serial.println("New client"); // Wait until the client sends some data
while (!client.available()) {
delay(1);
timeout++;
if (timeout > 500)
{
client.flush();
client.stop();
break;
}
}
String req = client.readStringUntil('\r'); // Read the first line of the request
Serial.println(req);
client.flush();
if (req.indexOf("/reset") != -1) // if req = reset
SPIFFS.remove("/data.txt"); // remove file data.txt
else if (req.indexOf("/data.txt") != -1) { // если в адресе есть data.txt
String line_out = "HTTP/1.1 200 OK\r\n"; //Эти две строки создают полноценный HTTP заголовок,
line_out += "Content-Type: text/plain; charset=UTF-8\r\n\r\n"; //чтобы выводимый файл был доступен средствами PHP
File f = SPIFFS.open("/data.txt", "r");
while (f.available()) {
//Собрать строку и вывести в браузер содержимое data.txt
String line = f.readStringUntil(';');
line_out += line;
}
// Serial.print(line_out);
client.print(line_out);
client.stop();
return;
}
else {
Serial.println("Data page"); // Во всех остальных случаях
String r = HTMLHeader(); // показать домашнюю страницу
r += "<p>";
r += Temp_icon();
r += temp_room;
r += "° C</p>\r\n";
r += "<p>";
r += Humidity_icon();
r += humidity_room;
r += "%</p>\r\n";
r += "<p>";
r += Bar_icon();
r += pressure;
r += " мм рт.ст.</p>\r\n";
r += HTMLFooter();
client.print(r); // send page to clients browser
client.stop(); // disconnect client
return;
}
client.stop();
return;
}
//++++++++++++++++++++++++++++++++++++++++++++++++
// События по времени. Получаем текущее время в массив now
DateTime now = rtc.now();
// В 8, 14 и 20 часов (если now.hour()=8 или 14 или 20 и
// now.minute=0 и now.second=0) снимаем показания
// if (((now.hour() == 8) || (now.hour() == 14) || (now.hour() == 20)) && (now.second() == 0) && (now.minute() == 0)) {
if (now.second() == 0) {
// //********************
int count = 0;
do { // Измеряем влажность
humidity_room = dht.readHumidity();
delay(500);
// Измеряем температуру
temp_room = dht.readTemperature();
delay(500);
count++;
if (count = 10)
break;
} while (isnan(humidity_room) || isnan(temp_room));
// Измеряем атмосферное давление
// pressure = bmp.readPressure();
// pressure = int((pressure / 101325) * 760); // переводим паскали в мм.рт.ст
// delay(1000);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
// записываем в файл weather.txt в SPIFFS
// открывем файл для чтения
// буква "a" означает, что запись будет продолжаться с конца файла
String data_string = "";
data_string += now.unixtime();
data_string += "000";
data_string += ",";
data_string += temp_room;
data_string += ",";
data_string += humidity_room;
data_string += ",";
data_string += pressure;
data_string += ";";
// File f = SPIFFS.open("/data.txt", "a");
// if (!f) {
// Serial.println("file open failed");
// }
// f.println(data_string);
// f.close();
//+++++++++++++++++++++++++++++++++++++++++++++++++++++
// Вывод информации в сериал для отладки
Serial.print("WiFi status = ");
Serial.println(WiFi.status());
Serial.print("UnixTime: ");
Serial.println(now.unixtime());
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print (RUS("Влажность: "));
Serial.println (humidity_room);
Serial.print (RUS("Температура: "));
Serial.println (temp_room);
Serial.print (RUS("Давление: "));
Serial.println (pressure);
//********************
}
}