mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-26 14:12:16 +03:00
@@ -1,4 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
#include <vector>
|
||||||
#include "classes/IoTGpio.h"
|
#include "classes/IoTGpio.h"
|
||||||
//#include "classes/IoTBench.h"
|
//#include "classes/IoTBench.h"
|
||||||
|
|
||||||
|
|||||||
45
src/NTP.cpp
45
src/NTP.cpp
@@ -156,33 +156,30 @@ const String getTodayDateDotFormated() {
|
|||||||
|
|
||||||
// format 22.02.2022
|
// format 22.02.2022
|
||||||
unsigned long strDateToUnix(String date) {
|
unsigned long strDateToUnix(String date) {
|
||||||
int day = selectToMarker(date, ".").toInt();
|
int day, month, year;
|
||||||
date = deleteBeforeDelimiter(date, ".");
|
|
||||||
int month = selectToMarker(date, ".").toInt();
|
|
||||||
date = deleteBeforeDelimiter(date, ".");
|
|
||||||
int year = selectToMarker(date, ".").toInt();
|
|
||||||
int secsInOneDay = 86400;
|
|
||||||
int daysInOneYear = 365;
|
|
||||||
int daysInLeepYear = 366;
|
|
||||||
int numberOfLeepYears = 12;
|
|
||||||
int totalNormalYears = year - 1970 - numberOfLeepYears;
|
|
||||||
unsigned int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
unsigned int daysInMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||||
if (year % 4 == 0) {
|
|
||||||
if (year % 100 != 0 || year % 400 == 0) {
|
day = date.substring(0, date.indexOf(".")).toInt();
|
||||||
daysInMonth[1] = 29;
|
date = date.substring(date.indexOf(".") + 1);
|
||||||
} else {
|
month = date.substring(0, date.indexOf(".")).toInt();
|
||||||
daysInMonth[1] = 28;
|
date = date.substring(date.indexOf(".") + 1);
|
||||||
}
|
year = date.toInt();
|
||||||
} else {
|
|
||||||
daysInMonth[1] = 28;
|
unsigned long unixTime = (year - 1970) * 365 * 86400;
|
||||||
|
int numberOfLeepYears = (year - 1968) / 4 - (year - 1900) / 100 + (year - 1600) / 400;
|
||||||
|
unixTime += numberOfLeepYears * 86400;
|
||||||
|
|
||||||
|
if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) {
|
||||||
|
daysInMonth[1] = 29;
|
||||||
}
|
}
|
||||||
int numberOfDaysInPastMonths = 0;
|
|
||||||
for (int i = 0; i <= 11; i++) {
|
for (int i = 0; i < month - 1; i++) {
|
||||||
if (i <= month - 2) {
|
unixTime += daysInMonth[i] * 86400;
|
||||||
numberOfDaysInPastMonths = numberOfDaysInPastMonths + daysInMonth[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return (day * secsInOneDay) + (numberOfDaysInPastMonths * secsInOneDay) + (totalNormalYears * daysInOneYear * secsInOneDay) + (numberOfLeepYears * daysInLeepYear * secsInOneDay);
|
|
||||||
|
unixTime += (day - 1) * 86400;
|
||||||
|
|
||||||
|
return unixTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
const String getDateTimeDotFormatedFromUnix(unsigned long unixTime) {
|
const String getDateTimeDotFormatedFromUnix(unsigned long unixTime) {
|
||||||
|
|||||||
98
src/modules/exec/Tca9555/Tca9555.cpp
Normal file
98
src/modules/exec/Tca9555/Tca9555.cpp
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
#include "Global.h"
|
||||||
|
#include "classes/IoTItem.h"
|
||||||
|
#include "classes/IoTGpio.h"
|
||||||
|
#include "Wire.h"
|
||||||
|
#include "TCA9555.h"
|
||||||
|
|
||||||
|
|
||||||
|
class Tca9555Driver : public IoTGpio {
|
||||||
|
private:
|
||||||
|
TCA9555* _tca;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Tca9555Driver(int index, TCA9555* tca) : IoTGpio(index) {
|
||||||
|
_tca = tca;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pinMode(int pin, uint8_t mode) {
|
||||||
|
_tca->pinMode1(pin, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void digitalWrite(int pin, uint8_t val) {
|
||||||
|
_tca->write1(pin, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
int digitalRead(int pin) {
|
||||||
|
return _tca->read1(pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
void digitalInvert(int pin) {
|
||||||
|
_tca->write1(pin, 1 - _tca->read1(pin));
|
||||||
|
}
|
||||||
|
|
||||||
|
~Tca9555Driver() {};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Tca9555 : public IoTItem {
|
||||||
|
private:
|
||||||
|
String _addr;
|
||||||
|
Tca9555Driver* _driver;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Tca9555(String parameters) : IoTItem(parameters) {
|
||||||
|
_driver = nullptr;
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
jsonRead(parameters, "addr", _addr);
|
||||||
|
if (_addr == "") {
|
||||||
|
scanI2C();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int index;
|
||||||
|
jsonRead(parameters, "index", index);
|
||||||
|
if (index > 4) {
|
||||||
|
Serial.println(F("TCA9555 wrong index. Must be 0 - 4"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int mktype;
|
||||||
|
TCA9555* tca;
|
||||||
|
jsonRead(parameters, "mktype", mktype);
|
||||||
|
if (mktype == 35) {
|
||||||
|
tca = new TCA9535(hexStringToUint8(_addr));
|
||||||
|
} else if (mktype == 55) {
|
||||||
|
tca = new TCA9555(hexStringToUint8(_addr));
|
||||||
|
} else {
|
||||||
|
Serial.println(F("TCA9555 wrong type. Must be 35 or 55"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_driver = new Tca9555Driver(index, tca);
|
||||||
|
}
|
||||||
|
|
||||||
|
void doByInterval() {
|
||||||
|
if (_addr == "") {
|
||||||
|
scanI2C();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//возвращает ссылку на экземпляр класса Tca9555Driver
|
||||||
|
IoTGpio* getGpioDriver() {
|
||||||
|
return _driver;
|
||||||
|
}
|
||||||
|
|
||||||
|
~Tca9555() {
|
||||||
|
delete _driver;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
void* getAPI_Tca9555(String subtype, String param) {
|
||||||
|
if (subtype == F("Tca9555")) {
|
||||||
|
return new Tca9555(param);
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
47
src/modules/exec/Tca9555/modinfo.json
Normal file
47
src/modules/exec/Tca9555/modinfo.json
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
"menuSection": "executive_devices",
|
||||||
|
"configItem": [
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "Расширитель портов Tca9555",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "Tca9555",
|
||||||
|
"id": "Tca",
|
||||||
|
"widget": "",
|
||||||
|
"page": "",
|
||||||
|
"descr": "",
|
||||||
|
|
||||||
|
"mktype": 55,
|
||||||
|
"addr": "0x20",
|
||||||
|
"index": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"about": {
|
||||||
|
"authorName": "Ilya Belyakov",
|
||||||
|
"authorContact": "https://t.me/Biveraxe",
|
||||||
|
"authorGit": "https://github.com/biveraxe",
|
||||||
|
"specialThanks": "",
|
||||||
|
"moduleName": "Tca9555",
|
||||||
|
"moduleVersion": "1.0",
|
||||||
|
"usedRam": {
|
||||||
|
"esp32_4mb": 15,
|
||||||
|
"esp8266_4mb": 15
|
||||||
|
},
|
||||||
|
"title": "Расширитель портов Tca9555",
|
||||||
|
"moduleDesc": "Добавляет в систему дополнительные GPIO для элементов, которые поддерживают такую функцию.",
|
||||||
|
"propInfo": {
|
||||||
|
"mktype": "Тип устройства: 55 - TCA9555, 35 - TCA9535",
|
||||||
|
"addr": "Адрес устройства на шине, обычно 0x20",
|
||||||
|
"index": "Значения от 1 до 4, где при выборе 1 будет нумерация pin 100-115, при выборе 2 200-215 и т.д."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"defActive": false,
|
||||||
|
"usedLibs": {
|
||||||
|
"esp32*": [
|
||||||
|
"https://github.com/RobTillaart/TCA9555"
|
||||||
|
],
|
||||||
|
"esp82*": [
|
||||||
|
"https://github.com/RobTillaart/TCA9555"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,6 +17,7 @@ class AnalogAdc : public IoTItem {
|
|||||||
unsigned int _pin;
|
unsigned int _pin;
|
||||||
unsigned int _avgSteps, _avgCount;
|
unsigned int _avgSteps, _avgCount;
|
||||||
unsigned long _avgSumm;
|
unsigned long _avgSumm;
|
||||||
|
float adCresult;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
//=======================================================================================================
|
//=======================================================================================================
|
||||||
@@ -45,6 +46,7 @@ class AnalogAdc : public IoTItem {
|
|||||||
// и выполнить за несколько тактов
|
// и выполнить за несколько тактов
|
||||||
void doByInterval() {
|
void doByInterval() {
|
||||||
if (_avgSteps <= 1) value.valD = IoTgpio.analogRead(_pin);
|
if (_avgSteps <= 1) value.valD = IoTgpio.analogRead(_pin);
|
||||||
|
value.valD = adCresult;///
|
||||||
regEvent(value.valD, "AnalogAdc"); //обязательный вызов хотяб один
|
regEvent(value.valD, "AnalogAdc"); //обязательный вызов хотяб один
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,7 +58,8 @@ class AnalogAdc : public IoTItem {
|
|||||||
void loop() {
|
void loop() {
|
||||||
if (_avgSteps > 1) {
|
if (_avgSteps > 1) {
|
||||||
if (_avgCount > _avgSteps) {
|
if (_avgCount > _avgSteps) {
|
||||||
value.valD = _avgSumm / _avgSteps;
|
// value.valD = _avgSumm / (_avgSteps + 1);
|
||||||
|
adCresult = _avgSumm / (_avgSteps + 1);
|
||||||
_avgSumm = 0;
|
_avgSumm = 0;
|
||||||
_avgCount = 0;
|
_avgCount = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,9 +37,16 @@ private:
|
|||||||
int h2 = selectToMarker(endTime, ":").toInt();
|
int h2 = selectToMarker(endTime, ":").toInt();
|
||||||
int min2 = selectToMarkerLast(endTime, ":").toInt();
|
int min2 = selectToMarkerLast(endTime, ":").toInt();
|
||||||
|
|
||||||
|
int sumMin1 = h1 * 60 + min1;
|
||||||
|
int sumMin2 = h2 * 60 + min2;
|
||||||
|
|
||||||
int nowMinutes = _time_local.hour * 60 + _time_local.minute;
|
int nowMinutes = _time_local.hour * 60 + _time_local.minute;
|
||||||
|
|
||||||
return nowMinutes >= h1 * 60 + min1 && nowMinutes <= h2 * 60 + min2;
|
if (sumMin1 <= sumMin2) {
|
||||||
|
return nowMinutes >= sumMin1 && nowMinutes <= sumMin2;
|
||||||
|
} else {
|
||||||
|
return nowMinutes >= sumMin1 && nowMinutes <= 24 * 60 || nowMinutes >= 0 && nowMinutes <= sumMin2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
57
src/modules/virtual/Math/SimpleTimePeriod.json
Normal file
57
src/modules/virtual/Math/SimpleTimePeriod.json
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
"mark": "iotm",
|
||||||
|
"config": [
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "IoTMath",
|
||||||
|
"id": "math",
|
||||||
|
"widget": "anydataValue",
|
||||||
|
"page": "Ввод",
|
||||||
|
"descr": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "Variable",
|
||||||
|
"id": "start",
|
||||||
|
"needSave": 0,
|
||||||
|
"widget": "inputTm",
|
||||||
|
"page": "Ввод",
|
||||||
|
"descr": "Введите время",
|
||||||
|
"int": "0",
|
||||||
|
"val": "02:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "Variable",
|
||||||
|
"id": "stop",
|
||||||
|
"needSave": 0,
|
||||||
|
"widget": "inputTm",
|
||||||
|
"page": "Ввод",
|
||||||
|
"descr": "Введите время",
|
||||||
|
"int": "0",
|
||||||
|
"val": "02:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"type": "Writing",
|
||||||
|
"subtype": "ButtonOut",
|
||||||
|
"needSave": 0,
|
||||||
|
"id": "led",
|
||||||
|
"widget": "toggle",
|
||||||
|
"page": "Ввод",
|
||||||
|
"descr": "Освещение",
|
||||||
|
"int": 0,
|
||||||
|
"inv": 0,
|
||||||
|
"pin": 2
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
scenario=>if start | stop then {
|
||||||
|
if math.nowInTimePeriod(start, stop) then {
|
||||||
|
led = 1
|
||||||
|
} else led = 0
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user