Files
AHome/ESP12SmallRoom/src/main.cpp
2020-12-12 17:40:21 +03:00

224 lines
7.2 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.
#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();
}
}