//Мини метеостанция с веб сервером
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "DHT.h"
#include <EEPROM.h>
#define DHTPIN 5 //GPIO5
#define DHTTYPE DHT21 // DHT21(AM2301)
int imp_sum = 0; // Сумма накопленых импульсов
unsigned long currentTime=0;
unsigned long startTime=millis();
int imp_val = 0; // Счетчик импульсов
unsigned long timer = 0;
unsigned long timer1=millis();
DHT dht(DHTPIN, DHTTYPE, 15);
const char* ssid = "my_ssid"; // Имя сети для подключения в режиме клиента
const char* ssid2 = "Wi-Fi-METEOSTATION(12121212)"; // Имя сети в режиме точки доступа
const char* password = "my_password"; // Пароль сети в режиме клиента
const char* password2 = "12121212"; // Пароль сети в режиме точки доступа
const char* host = "narodmon.ru"; //Адрес сервера, куда передаются данные
const char* key = "yourkey"; //Ключ доступа к серверу
extern "C" {
#include "user_interface.h"
uint16 readvdd33(void);
}
ESP8266WebServer server(80);
//#define REPORT_INTERVAL 60
const int led = 13;
Adafruit_BMP085 bmp;
void setup(void)
{
attachInterrupt(4, IMP_IN, FALLING); // Активируем внешнее прерывание
Serial.begin(115200);
Wire.pins(14, 12);// устанавливаем пины SDA,SCL для i2c
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
}
//Serial.begin(115200);
pinMode(led, OUTPUT);
digitalWrite(led, 0);
// Connect to WiFi network
// Выбираем режим Wi-Fi
// Выбор режимов выполняется изменением состояния 13 пина.
// если 1, то точка доступа
// если 0, то режим клиента
if (digitalRead(13)==1)
{
WiFi.mode(WIFI_AP); //Режим Wi-Fi Точка доступа
WiFi.softAP(ssid2, password2);//Поднятие точки доступа
Serial.println("");
Serial.println("AP mode"); //Говорим что мы в режиме точки доступа
}
else
{
Serial.print("Wait for connection\n\r");
WiFi.mode(WIFI_STA); //Режим Wi-Fi клиент
WiFi.begin(ssid, password); //Подключение в режиме клиента
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Client mode");// Говорим что мы в режиме клиент
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
server.on("/", handle_root);
server.on("/inline", [](){
server.send(200, "text/plain", "this works as well");
delay(100);
});
server.begin();
Serial.println("HTTP server started");
delay(100);
//dht21 sensor
Serial.println("DHTxx test!");
dht.begin();
delay(100);
}
//-------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------
void data() {
//dht21
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();
// Read temperature as Fahrenheit
float f = dht.readTemperature(true);
//float hi = dht.computeHeatIndex(f, h, true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.println();
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
//bmp180
Serial.print("Temperature = ");
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print("Pressure = ");
Serial.print(bmp.readPressure()/133.322);
Serial.println(" mm");
float pressure = (bmp.readPressure()/133.322);
float temp180 = (bmp.readTemperature());
//----------------------------------------------------------------------------------------
//Формируем GET запрос к серверу
Serial.print("connecting to ");
Serial.println(host);
// Используем WiFiClient класс для выполнения TCP подключения
WiFiClient client;
const int httpPort = 8283;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
Serial.println("connect - OK ");
}
digitalWrite(led, 1);
// Здесь мы отправляем запрос к удаленному серверу
client.print(String ("#18-FE-34-A3-92-95\n") + "#T1#" + t + "\n" +
"#H1#" + h + "\n" +
"#T2#" + temp180 + "\n" +
"#P1#" + pressure + "\n"
"##");
delay(200);
// Выводим то, что отправили к серверу
while(client.available()){
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
Serial.println("closing connection");
digitalWrite(led, 0);
}
//----------------------------------------------------------------------
void handle_root() {
digitalWrite(led, 1);
//Веб сервер
server.send(200, "text/html", "<!DOCTYPE html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><meta name=\"viewport\" content=\"width=400px\"><title>Wi-Fi ESP8266 Метеостанция</title>"
"<style type=\"text/css\">body\{background-color: #7D8EE2;color:#FFF;}"
"a {color:#73B9FF;}"
".blockk {border:solid 1px #2d2d2d;text-align:center;background:#0059B3;padding:10px 10px 10px 10px;-moz-border-radius: 5px;-webkit-border-radius: 5px;border-radius: 5px;}"
".blockk {border:double 2px #000000;-moz-border-radius: 5px;-webkit-border-radius: 5px;border-radius: 5px;}"
"</style><style type=\"text/css\" media=\'(min-width: 810px)\'>body\{font-size:18px;}.blockk \{width: 400px;}</style>"
"<style type=\"text/css\" media=\'(max-width: 800px) and (orientation:landscape)\'>body\{font-size:8px;}</style><meta http-equiv=\"REFRESH\" content=\"300\"></head><body><center><div class=\"blockk\">Мини Метеостанция на ESP8266<br><hr><b>AM2301:</b><br>Температура: "+String(dht.readTemperature())+" °C.<br> Влажность (отн.): "+String(dht.readHumidity())+" %.<br>Ощущаемая температура: "+String((5*(dht.computeHeatIndex(dht.readTemperature(true), dht.readHumidity(), true)-32))/9)+" °C.<br><hr><b>BMP180:</b><br>Температура: "+String(bmp.readTemperature())+" °C.<br> Давление(атм.): "+String(bmp.readPressure()/133.322)+" мм.рт.ст.<br><hr><b>СБМ-19:</b><br>Радиация: " +String((imp_sum/5)*0.21)+ " мкР/ч <br><hr><b>Питание:</b><br>Напряжение: " +String(readvdd33())+ " мВ <br><hr><b>Память:</b><br>Свободно: " +String(ESP.getFreeHeap())+ " байт <hr></div></center></body></html>");
digitalWrite(led, 0);
}
// Функция обработки сигнала со счетчика Гейгера
void IMP_IN() {
if (currentTime<=300000){ // Время измерения 5 минут (300000)
imp_val++;
currentTime=millis()-startTime;
Serial.println(currentTime);
delay (10);
}
else{
Serial.println("end 5 min");
imp_sum=imp_val;
currentTime=0;
startTime=millis();
imp_val=0;
Serial.println(currentTime);
Serial.println(imp_sum);
}
}
void loop(void){
if (timer<=600000){
timer=millis()-timer1;
delay (50);
server.handleClient();
delay (50);
}
else{
timer=0;
timer1=millis();
data();
}
}