diff --git a/M5Atom_airqa.ino b/M5Atom_airqa.ino index 8d1a2ea..74f05d2 100644 --- a/M5Atom_airqa.ino +++ b/M5Atom_airqa.ino @@ -16,7 +16,9 @@ #include "M5Atom.h" #include - +#include +#include +#include #include #include "ClosedCube_HDC1080.h" #include "Adafruit_CCS811.h" //The device's I2C address is 0x5A @@ -27,6 +29,8 @@ //Наша кнопочка при нажатии на которую произойдет вызов wifi менеджера и перезагрузка в станцию #define TRIGGER_PIN 39 +unsigned int VersionSW=14; //65536 + WiFiManager wm; // обьект менеджера WiFiManagerParameter custom_field; Preferences OTApreferences; @@ -41,9 +45,12 @@ WiFiClient espClient; PubSubClient MqttClient(espClient); IPAddress IpMqtt; +WiFiUDP ntpUDP; +NTPClient timeClient(ntpUDP, "0.ua.pool.ntp.org", 7200, 60000); + const PROGMEM char *mqttHostName = "cctv.automation.art"; unsigned int mqttPort = 8889; -const PROGMEM char *topicName = "/aastudio"; // +mac адресс девайса +const PROGMEM char *topicName = "/aastudio"; // +mac адресс девайса const PROGMEM char *mqttLogin = "login", *mqttPass = "password"; const char *mqttIPHost; @@ -58,14 +65,14 @@ int PROGMEM nextMqttSend = 60000; //tcoeff[0,1,2] //hcoeff[0,1,2] -float PROGMEM tcoeff[3] = {-11.22, -9.62, -11.03}; -float PROGMEM hcoeff[3] = {12.30, 13.34, 15.18}; +float PROGMEM tcoeff[3] = {-11.18, -9.62, -10.6}; +float PROGMEM hcoeff[3] = {13.77, 14.07, 15.56}; float callibrationT = 0, callibrationH = 0; String macc = ""; float TempAv, HumAv, Eco2Av, TvocAv; -#define NUM_AVER 6 +#define NUM_AVER 5 float averageT; // перем. среднего float valArrayT[NUM_AVER]; // массив byte idxT = 0; @@ -166,6 +173,7 @@ void setup() SetCallibrationCoeff(); //Запрос IP сервера MQTT и установка сервера setMqttServer(); + reqNtpTime(); } void setMqttServer() @@ -181,7 +189,6 @@ void setMqttServer() MqttClient.setServer(IpMqtt, mqttPort); MqttClient.setCallback(callback); - } else { @@ -202,18 +209,28 @@ void callback(char *topic, byte *payload, unsigned int length) Serial.println(); } +void reqNtpTime() +{ + timeClient.update(); + setTime(timeClient.getEpochTime()); + // Serial.println(timeClient.getEpochTime()); + // Serial.println("<=ntp====now=>"); + time_t t = now(); + // Serial.println(t); +} + void checkButton() { Serial.println("Button Pressed"); - delay(3000); - if (digitalRead(TRIGGER_PIN) == LOW) - { + // delay(3000); + // if (digitalRead(TRIGGER_PIN) == LOW) { + Serial.println("Button Held"); Serial.println("Erasing Config, restarting"); wm.resetSettings(); ESP.restart(); - } - + // } + // start portal w delay Serial.println("Starting config portal"); wm.setConfigPortalTimeout(120); @@ -248,7 +265,6 @@ void saveParamCallback() void OTAUpdate() { - Serial.println("OTAUpdate()"); //http://meteosence.s-host.net/meteosence.php?meteopas=PdF4apD4i95xR5&meteodata=gethash @@ -259,9 +275,10 @@ void OTAUpdate() OTApreferences.begin("ota-config"); if (WiFi.status() == WL_CONNECTED) - { + { HTTPClient http; - String serverPath = "http://meteosence.s-host.net/airqa/airquality.php?meteopas=e93gme9hAt9nSWaV&meteodata=gethash"; + String getMacNow=getMacAddress(); + String serverPath = "http://meteosence.s-host.net/airqa/airquality.php?meteopas=e93gme9hAt9nSWaV&meteodata=gethash&mac="+getMacNow+""; http.begin(serverPath.c_str()); int httpResponseCode = http.GET(); @@ -276,7 +293,7 @@ void OTAUpdate() if (keyOTA.length() <= 0) { - OTApreferences.putString("md5HashOTA", "asshole"); + OTApreferences.putString("md5HashOTA", "undifined"); } keyOTA = OTApreferences.getString("md5HashOTA"); @@ -424,8 +441,17 @@ void SetCallibrationCoeff() } float middleArifmT(float newVal) -{ // принимает новое значение +{ + // Serial.print(newVal); + // Serial.print(" "); + // принимает новое значение valArrayT[idxT] = newVal; // пишем каждый раз в новую ячейку + // for (int t = 0; t <= 6; t++) + // { + // Serial.print(valArrayT[t]); + // Serial.print(" "); + // } + if (++idxT >= NUM_AVER) idxT = 0; // перезаписывая самое старое значение averageT = 0; // обнуляем среднее @@ -434,7 +460,9 @@ float middleArifmT(float newVal) averageT += valArrayT[i]; // суммируем } averageT /= NUM_AVER; // делим - return averageT; // возвращаем + + // Serial.println(averageT); + return averageT; // возвращаем } float middleArifmH(float newVal) @@ -500,6 +528,15 @@ void reqSensorData() hdc1080Temp = hdc1080.readTemperature() + callibrationT; hdc1080Hum = hdc1080.readHumidity() + callibrationH; + // Serial.println("Original: "); + // Serial.println(hdc1080.readTemperature()); + // Serial.println(hdc1080.readHumidity()); + + Serial.println("+calibration: "); + Serial.print(hdc1080Temp); + Serial.println(" "); + Serial.println(hdc1080Hum); + TempAv = middleArifmT(hdc1080Temp); HumAv = middleArifmH(hdc1080Hum); Eco2Av = middleArifmECO(eco2); @@ -508,20 +545,34 @@ void reqSensorData() void SendMqttReq() { - char HumInt[8], TempInt[8]; - dtostrf(HumAv * 100, 4, 0, HumInt); - dtostrf(TempAv * 100, 4, 0, TempInt); + Serial.println("Data in SendMqttReq()"); + Serial.print(TempAv); + Serial.print(" "); + Serial.print(HumAv); + Serial.print(" "); + Serial.print(Eco2Av); + Serial.print(" "); + Serial.println(TvocAv); - doc["mac"] = String(getMacAddress()); - doc["t"] = String(TempInt); - doc["h"] = String(HumInt); - doc["eco"] = (int)Eco2Av; - doc["tvoc"] = (int)TvocAv; - doc["time"]=millis(); + char HumidityInt[8], TemperatureInt[8]; + + dtostrf(TempAv * 100, 4, 0, TemperatureInt); + dtostrf(HumAv * 100, 4, 0, HumidityInt); + + doc["mac"] = String(getMacAddress()); + doc["swver"] = VersionSW; + doc["t"] = atoi(TemperatureInt); + doc["h"] = atoi(HumidityInt); + doc["eco"] = (int)Eco2Av; + doc["tvoc"] = (int)TvocAv; + doc["time"] = now(); + char resultString[200]; String JsonData = ""; + + serializeJson(doc, JsonData); Serial.println(JsonData); //Вывод JSON строки в консоль JsonData.toCharArray(resultString, JsonData.length() + 1); @@ -529,39 +580,51 @@ void SendMqttReq() String finishTopic = ""; finishTopic = String(topicName) + "/" + macc; - Serial.println(finishTopic); + //Serial.println(finishTopic); if (mqttSendFlag == true) { MqttClient.publish(finishTopic.c_str(), resultString); - Serial.println("SentToTopic - ok"); + //Serial.println("SentToTopic - ok"); } } void reconnectMqtt() { - Serial.print("Attempting MQTT connection..."); - //clientId += String(random(0xffff), HEX); - //clientId.c_str() - //MqttClient.connect(macc.c_str(), mqttLogin, mqttPass - - const char *clientId = macc.c_str(); - //macc += String(random(0xffff), HEX); - if (MqttClient.connect("AtomClient")) + //clientId += String(random(0xffff), HEX); + //clientId.c_str() + //MqttClient.connect(macc.c_str(), mqttLogin, mqttPass + byte circle = 0; + while (!MqttClient.connected()) { - String finishTopic = ""; - finishTopic = String(topicName) + "/" + macc; - // MqttClient.publish(finishTopic.c_str(), "Reconnect NOW"); - Serial.print("Connect MQTT OK"); - // client.subscribe("inTopic"); - mqttSendFlag = true; - } - else - { - Serial.print("failed, rc="); - Serial.print(MqttClient.state()); - mqttSendFlag = false; + Serial.print("MQTT reconnect..."); + + circle++; + if (circle == 10) + { + break; + } + + const char *clientId = macc.c_str(); + //macc += String(random(0xffff), HEX); + + if (MqttClient.connect(clientId)) + { + String finishTopic = ""; + finishTopic = String(topicName) + "/" + macc; + MqttClient.publish(finishTopic.c_str(), "Reconnect NOW"); + Serial.print("Connect MQTT OK"); + // client.subscribe("inTopic"); + mqttSendFlag = true; + } + else + { + Serial.print("failed, rc="); + Serial.print(MqttClient.state()); + mqttSendFlag = false; + delay(1000); + } } } @@ -569,13 +632,8 @@ void loop() { //Проверка старта сервера M5.update(); - MqttClient.loop(); - //Если не определен IP то и не будет отправки. - if (!MqttClient.connected()) - { //Если клиент отключился, переподключение - reconnectMqtt(); - } + //Если не определен IP то и не будет отправки. // 40 секунд и происходит сброс настроек WIFI if (M5.Btn.wasReleasefor(40000)) @@ -587,11 +645,10 @@ void loop() if (millis() - timingUpdate > nextM5Update) { + reqNtpTime(); OTAUpdate(); - // Serial.print("OTAUpdate() - "); // Serial.println(millis()); - timingUpdate = millis(); } @@ -610,4 +667,10 @@ void loop() SendMqttReq(); timingSendMqtt = millis(); } + + if (!MqttClient.connected()) + { + reconnectMqtt(); + } + MqttClient.loop(); } diff --git a/M5Atom_airqa.ino.m5stick_c.bin b/M5Atom_airqa.ino.m5stick_c.bin new file mode 100644 index 0000000..1f4e591 Binary files /dev/null and b/M5Atom_airqa.ino.m5stick_c.bin differ diff --git a/pdf/hdc1080.pdf b/pdf/hdc1080.pdf new file mode 100644 index 0000000..e9519c8 Binary files /dev/null and b/pdf/hdc1080.pdf differ diff --git a/pdf/Документ Microsoft Word.docx b/pdf/Документ Microsoft Word.docx new file mode 100644 index 0000000..e69de29 diff --git a/pdf/Новый текстовый документ.txt b/pdf/Новый текстовый документ.txt new file mode 100644 index 0000000..e69de29