224 lines
7.2 KiB
C++
224 lines
7.2 KiB
C++
#include <Arduino.h>
|
||
#include <ESP8266WiFi.h>
|
||
#include <ESP8266mDNS.h>
|
||
#include <WiFiUdp.h>
|
||
#include <ArduinoOTA.h>
|
||
#include <Wire.h>
|
||
#include <Adafruit_HTU21DF.h>
|
||
#include <PubSubClient.h>
|
||
#include <leds.h>
|
||
#include <ESP_EEPROM.h>
|
||
|
||
#define LED_BLUE D5 //GPIO14
|
||
#define LED_GREEN D6 //GPIO12
|
||
#define LED_RED D7 //GPIO13
|
||
#define PWR_SENS D8 //GPIO15
|
||
#define MOVE_SENS D0 //GPIO16
|
||
|
||
Adafruit_HTU21DF htu = Adafruit_HTU21DF();
|
||
WiFiClient espClient;
|
||
PubSubClient client(espClient);
|
||
leds lGreen(LED_GREEN, 200);
|
||
leds lRed(LED_RED, 200);
|
||
leds lBlue(LED_BLUE, 200);
|
||
|
||
const char* ssid = "wf-home";
|
||
const char* password = "0ndthnrf";
|
||
const char* mqtt_server = "192.168.1.250";
|
||
|
||
float temp, rel_hum;
|
||
bool izm = false;
|
||
unsigned long cRun;
|
||
int minCnt = 0;
|
||
int measCnt = 1;
|
||
uint8_t mv, oldmv;
|
||
uint16_t adc, oldadc, delta;
|
||
|
||
void reconnect();
|
||
void publishMin();
|
||
void publishSec();
|
||
void callback(char* topic, byte* payload, unsigned int length);
|
||
|
||
void setup() {
|
||
Serial.begin(9600);
|
||
pinMode(LED_BUILTIN, OUTPUT);
|
||
WiFi.mode(WIFI_STA);
|
||
WiFi.setOutputPower(20.5f);
|
||
WiFi.hostname("ESP-SmallRoom");
|
||
WiFi.begin(ssid, password);
|
||
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
|
||
//Serial.println("Connection Failed! Rebooting...");
|
||
// "Соединиться не удалось! Перезагрузка..."
|
||
delay(5000);
|
||
ESP.restart();
|
||
}
|
||
digitalWrite(LED_BUILTIN, !WiFi.isConnected());
|
||
ArduinoOTA.onStart([]() { /*Serial.println("Start");*/}); // "Начало OTA-апдейта"
|
||
ArduinoOTA.onEnd([]() { /*Serial.println("\nEnd");*/}); // "Завершение OTA-апдейта"
|
||
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { /*Serial.printf("Progress: %u%%\r", (progress / (total / 100)));*/ });
|
||
ArduinoOTA.onError([](ota_error_t error) {
|
||
/*Serial.printf("Error[%u]: ", error);
|
||
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); // "Ошибка при аутентификации"
|
||
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); // "Ошибка при начале OTA-апдейта"
|
||
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); // "Ошибка при подключении"
|
||
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); // "Ошибка при получении данных"
|
||
else if (error == OTA_END_ERROR) Serial.println("End Failed"); // "Ошибка при завершении OTA-апдейта"*/
|
||
});
|
||
ArduinoOTA.begin();
|
||
pinMode(LED_GREEN, OUTPUT);
|
||
pinMode(LED_BLUE, OUTPUT);
|
||
pinMode(LED_RED, OUTPUT);
|
||
pinMode(PWR_SENS, OUTPUT);
|
||
pinMode(MOVE_SENS, INPUT);
|
||
digitalWrite(LED_GREEN, LOW);
|
||
digitalWrite(LED_BLUE, LOW);
|
||
digitalWrite(LED_RED, LOW);
|
||
// Serial.begin(115200);
|
||
Serial.println("HTU21D-F");
|
||
digitalWrite(PWR_SENS, HIGH);
|
||
delay(200);
|
||
if (!htu.begin()) {
|
||
Serial.println("Couldn't find sensor!");
|
||
while (1);
|
||
}
|
||
temp = htu.readTemperature();
|
||
rel_hum = htu.readHumidity();
|
||
//digitalWrite(PWR_SENS, LOW);
|
||
client.setServer(mqtt_server, 1883);
|
||
client.setCallback(callback);
|
||
EEPROM.begin(8);
|
||
EEPROM.get(0, delta);
|
||
adc = analogRead(A0);
|
||
cRun = millis();
|
||
}
|
||
|
||
void loop() {
|
||
static bool lsSent = false, lbSent = false;
|
||
ArduinoOTA.handle();
|
||
lGreen.tick();
|
||
lRed.tick();
|
||
lBlue.tick();
|
||
|
||
if (!client.connected()) {
|
||
reconnect();
|
||
}
|
||
client.loop();
|
||
|
||
if(cRun + 99 < millis()){
|
||
cRun = millis();
|
||
adc += int((analogRead(A0) - adc) / 10.0f);
|
||
mv = digitalRead(MOVE_SENS);
|
||
if(mv != oldmv){
|
||
oldmv = mv;
|
||
client.publish("/home/smallroom/move", mv == 0 ? "0" : "1");
|
||
};
|
||
//if(abs(adc - oldadc) > delta){
|
||
if(((adc < delta) && !lsSent) || ((adc >= (delta + 5)) && !lbSent)){
|
||
char strFVal[6];
|
||
itoa(adc, strFVal, 10);
|
||
client.publish("/home/smallroom/light", strFVal);
|
||
oldadc = adc;
|
||
if(adc < delta) {lsSent = true; lbSent = false;}
|
||
else {lbSent = true; lsSent = false;}
|
||
}
|
||
if(measCnt == 0){
|
||
temp += (htu.readTemperature() - temp) / 6.0f;
|
||
rel_hum += (htu.readHumidity() - rel_hum) / 6.0f;
|
||
digitalWrite(PWR_SENS, LOW);
|
||
}
|
||
if(++measCnt == 299){
|
||
digitalWrite(PWR_SENS, HIGH);
|
||
measCnt = 0;
|
||
}
|
||
//Serial.print("T: ");Serial.print(temp);Serial.print("\tH: ");Serial.println(rel_hum);
|
||
if(++minCnt == 599){
|
||
publishMin();
|
||
minCnt = 0;
|
||
}
|
||
if(minCnt % 100 == 0) publishSec();
|
||
}
|
||
}
|
||
|
||
void reconnect() {
|
||
lRed.start();
|
||
//digitalWrite(LED_RED, HIGH);
|
||
//Serial.print("Attempting MQTT connection...");
|
||
// "Попытка подключиться к MQTT-брокеру... "
|
||
// Пытаемся подключиться:
|
||
if (client.connect("ESPSmallRoom")) {
|
||
//Serial.println("connected"); // "подключен"
|
||
// подписываемся или переподписываемся на топик;
|
||
// можно подписаться не только на один, а на несколько топиков
|
||
char v[6];
|
||
itoa(delta, v, 10);
|
||
client.publish("/home/smallroom/ldelta", v);
|
||
client.subscribe("/home/smallroom/ldelta");
|
||
} else {
|
||
//Serial.print("failed, rc="); // "подключение не удалось"
|
||
//Serial.print(client.state());
|
||
//Serial.println(" try again in 5 seconds");
|
||
}
|
||
//delay(100);
|
||
//digitalWrite(LED_RED, LOW);
|
||
}
|
||
|
||
void publishMin()
|
||
{
|
||
char strFVal[11];
|
||
if (client.connected()) {
|
||
lGreen.start();
|
||
//digitalWrite(LED_BLUE, HIGH);
|
||
if(!isnan(temp)){
|
||
dtostrf(temp, 6, 1, strFVal);
|
||
client.publish("/home/smallroom/temp", strFVal);
|
||
}
|
||
if(!isnan(rel_hum)){
|
||
dtostrf(rel_hum, 6, 1, strFVal);
|
||
client.publish("/home/smallroom/rel_hum", strFVal);
|
||
}
|
||
ultoa(adc, strFVal, 10);
|
||
client.publish("/home/smallroom/light", strFVal);
|
||
ultoa(cRun, strFVal, 10);
|
||
client.publish("/home/smallroom/millis", strFVal);
|
||
itoa(delta, strFVal, 10);
|
||
client.publish("/home/smallroom/ldelta", strFVal);
|
||
//digitalWrite(LED_BLUE, LOW);
|
||
}
|
||
}
|
||
|
||
void publishSec()
|
||
{
|
||
char strFVal[11];
|
||
if (client.connected()) {
|
||
lBlue.start();
|
||
//digitalWrite(LED_GREEN, HIGH);
|
||
if(!isnan(temp)){
|
||
dtostrf(temp, 7, 3, strFVal);
|
||
client.publish("/hometest/smallroom/temp", strFVal);
|
||
}
|
||
if(!isnan(rel_hum)){
|
||
dtostrf(rel_hum, 7, 3, strFVal);
|
||
client.publish("/hometest/smallroom/rel_hum", strFVal);
|
||
}
|
||
itoa(WiFi.RSSI(), strFVal, 10);
|
||
client.publish("/hometest/smallroom/RSSI", strFVal);
|
||
ultoa(cRun, strFVal, 10);
|
||
client.publish("/hometest/smallroom/millis", strFVal);
|
||
ltoa(adc, strFVal, 10);
|
||
client.publish("/hometest/smallroom/light", strFVal);
|
||
itoa(delta, strFVal, 10);
|
||
client.publish("/hometest/smallroom/ldelta", strFVal);
|
||
//digitalWrite(LED_GREEN, LOW);
|
||
}
|
||
}
|
||
|
||
void callback(char* topic, byte* payload, unsigned int length) {
|
||
if(strcmp(topic,"/home/smallroom/ldelta") == 0){
|
||
payload[length] = '\0';
|
||
String pl = String((char*)payload);
|
||
delta = pl.toInt();// atoi((char*)payload);
|
||
EEPROM.put(0, delta);
|
||
EEPROM.commit();
|
||
}
|
||
}
|