mirror of
https://github.com/IoTManagerProject/IoTManager.git
synced 2026-03-30 03:49:13 +03:00
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,2 @@
|
|||||||
.pio
|
.pio
|
||||||
.vscode
|
.vscode
|
||||||
/myProfile_wm.json
|
|
||||||
|
|||||||
@@ -399,45 +399,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "27. DS2423 счетчик 1",
|
"name": "27. Аналоговый счетчик импульсов",
|
||||||
"type": "Reading",
|
|
||||||
"subtype": "Ds2423a",
|
|
||||||
"id": "dscounta",
|
|
||||||
"widget": "anydataDef",
|
|
||||||
"page": "Счетчики",
|
|
||||||
"descr": "DS1 V",
|
|
||||||
"plus": 0,
|
|
||||||
"multiply": 1,
|
|
||||||
"pin": 4,
|
|
||||||
"index": 0,
|
|
||||||
"addr": "",
|
|
||||||
"int": 10,
|
|
||||||
"round": 0,
|
|
||||||
"needSave": 0,
|
|
||||||
"num": 27
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"global": 0,
|
|
||||||
"name": "28. DS2423 счетчик 2",
|
|
||||||
"type": "Reading",
|
|
||||||
"subtype": "Ds2423b",
|
|
||||||
"id": "dscountb",
|
|
||||||
"widget": "anydataDef",
|
|
||||||
"page": "Счетчики",
|
|
||||||
"descr": "DS2 V",
|
|
||||||
"plus": 0,
|
|
||||||
"multiply": 1,
|
|
||||||
"pin": 4,
|
|
||||||
"index": 0,
|
|
||||||
"addr": "",
|
|
||||||
"int": 10,
|
|
||||||
"round": 0,
|
|
||||||
"needSave": 0,
|
|
||||||
"num": 28
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"global": 0,
|
|
||||||
"name": "29. Аналоговый счетчик импульсов",
|
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Impulse",
|
"subtype": "Impulse",
|
||||||
"id": "impulse",
|
"id": "impulse",
|
||||||
@@ -450,32 +412,11 @@
|
|||||||
"pinMode": "INPUT",
|
"pinMode": "INPUT",
|
||||||
"debounceDelay": 3,
|
"debounceDelay": 3,
|
||||||
"multiply": 1,
|
"multiply": 1,
|
||||||
"num": 29
|
"num": 27
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "30. Cенсор температуры NTC",
|
"name": "28. PZEM 004t Напряжение",
|
||||||
"type": "Reading",
|
|
||||||
"subtype": "Ntc",
|
|
||||||
"id": "Ntctmp",
|
|
||||||
"widget": "anydataTmp",
|
|
||||||
"page": "Сенсоры",
|
|
||||||
"descr": "NTC Температура",
|
|
||||||
"needSave": 0,
|
|
||||||
"val": "0",
|
|
||||||
"int": 15,
|
|
||||||
"pin": "35",
|
|
||||||
"R1": "10000",
|
|
||||||
"R0": "10000",
|
|
||||||
"Beta": "3950.0",
|
|
||||||
"T0": "25",
|
|
||||||
"Vs": "3.3",
|
|
||||||
"round": 1,
|
|
||||||
"num": 30
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"global": 0,
|
|
||||||
"name": "31. PZEM 004t Напряжение",
|
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004v",
|
"subtype": "Pzem004v",
|
||||||
"id": "v",
|
"id": "v",
|
||||||
@@ -485,11 +426,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 31
|
"num": 28
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "32. PZEM 004t Сила тока",
|
"name": "29. PZEM 004t Сила тока",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004a",
|
"subtype": "Pzem004a",
|
||||||
"id": "a",
|
"id": "a",
|
||||||
@@ -499,11 +440,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 32
|
"num": 29
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "33. PZEM 004t Мощность",
|
"name": "30. PZEM 004t Мощность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004w",
|
"subtype": "Pzem004w",
|
||||||
"id": "w",
|
"id": "w",
|
||||||
@@ -513,11 +454,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 33
|
"num": 30
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "34. PZEM 004t Энергия",
|
"name": "31. PZEM 004t Энергия",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004wh",
|
"subtype": "Pzem004wh",
|
||||||
"id": "wh",
|
"id": "wh",
|
||||||
@@ -527,11 +468,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 34
|
"num": 31
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "35. PZEM 004t Частота",
|
"name": "32. PZEM 004t Частота",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004hz",
|
"subtype": "Pzem004hz",
|
||||||
"id": "hz",
|
"id": "hz",
|
||||||
@@ -541,11 +482,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 35
|
"num": 32
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "36. PZEM 004t Косинус",
|
"name": "33. PZEM 004t Косинус",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004pf",
|
"subtype": "Pzem004pf",
|
||||||
"id": "pf",
|
"id": "pf",
|
||||||
@@ -555,11 +496,11 @@
|
|||||||
"int": 15,
|
"int": 15,
|
||||||
"addr": "0xF8",
|
"addr": "0xF8",
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 36
|
"num": 33
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "37. PZEM настройка",
|
"name": "34. PZEM настройка",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pzem004cmd",
|
"subtype": "Pzem004cmd",
|
||||||
"id": "set",
|
"id": "set",
|
||||||
@@ -571,11 +512,11 @@
|
|||||||
"changeaddr": 0,
|
"changeaddr": 0,
|
||||||
"setaddr": "0x01",
|
"setaddr": "0x01",
|
||||||
"reset": 0,
|
"reset": 0,
|
||||||
"num": 37
|
"num": 34
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "38. Часы реального времени",
|
"name": "35. Часы реального времени",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "RTC",
|
"subtype": "RTC",
|
||||||
"id": "rtc",
|
"id": "rtc",
|
||||||
@@ -591,11 +532,11 @@
|
|||||||
"int": 5,
|
"int": 5,
|
||||||
"btn-setUTime": "0",
|
"btn-setUTime": "0",
|
||||||
"btn-setSysTime": "nil",
|
"btn-setSysTime": "nil",
|
||||||
"num": 38
|
"num": 35
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "39. (S8) Cенсор качества воздуха",
|
"name": "36. (S8) Cенсор качества воздуха",
|
||||||
"num": 39,
|
"num": 36,
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "S8co",
|
"subtype": "S8co",
|
||||||
"id": "s8co",
|
"id": "s8co",
|
||||||
@@ -609,50 +550,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "40. SCD40 Углекислый газ",
|
"name": "37. Sht20 Температура",
|
||||||
"type": "Reading",
|
|
||||||
"subtype": "Scd40co2",
|
|
||||||
"id": "Scd40co2",
|
|
||||||
"widget": "anydataPpm",
|
|
||||||
"page": "Сенсоры",
|
|
||||||
"descr": "SCD40 Углекислый газ",
|
|
||||||
"int": 15,
|
|
||||||
"round": 0,
|
|
||||||
"lowPeriodic": 1,
|
|
||||||
"autoCalibration": 1,
|
|
||||||
"btn-Recalibration": 0,
|
|
||||||
"num": 40
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"global": 0,
|
|
||||||
"name": "41. SCD40 Влажность",
|
|
||||||
"type": "Reading",
|
|
||||||
"subtype": "Scd40h",
|
|
||||||
"id": "Scd40h",
|
|
||||||
"widget": "anydataHum",
|
|
||||||
"page": "Сенсоры",
|
|
||||||
"descr": "SCD40 Влажность",
|
|
||||||
"int": 15,
|
|
||||||
"round": 1,
|
|
||||||
"num": 41
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"global": 0,
|
|
||||||
"name": "42. SCD40 Температура",
|
|
||||||
"type": "Reading",
|
|
||||||
"subtype": "Scd40t",
|
|
||||||
"id": "Scd40t",
|
|
||||||
"widget": "anydataTmp",
|
|
||||||
"page": "Сенсоры",
|
|
||||||
"descr": "SCD40 Температура",
|
|
||||||
"int": 15,
|
|
||||||
"round": 1,
|
|
||||||
"offset": 4,
|
|
||||||
"num": 42
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"global": 0,
|
|
||||||
"name": "43. Sht20 Температура",
|
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht20t",
|
"subtype": "Sht20t",
|
||||||
"id": "tmp2",
|
"id": "tmp2",
|
||||||
@@ -661,11 +559,11 @@
|
|||||||
"descr": "Температура",
|
"descr": "Температура",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 43
|
"num": 37
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "44. Sht20 Влажность",
|
"name": "38. Sht20 Влажность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht20h",
|
"subtype": "Sht20h",
|
||||||
"id": "Hum2",
|
"id": "Hum2",
|
||||||
@@ -674,11 +572,11 @@
|
|||||||
"descr": "Влажность",
|
"descr": "Влажность",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 44
|
"num": 38
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "45. Sht30 Температура",
|
"name": "39. Sht30 Температура",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht30t",
|
"subtype": "Sht30t",
|
||||||
"id": "tmp30",
|
"id": "tmp30",
|
||||||
@@ -687,11 +585,11 @@
|
|||||||
"descr": "SHT30 Температура",
|
"descr": "SHT30 Температура",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 45
|
"num": 39
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "46. Sht30 Влажность",
|
"name": "40. Sht30 Влажность",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sht30h",
|
"subtype": "Sht30h",
|
||||||
"id": "Hum30",
|
"id": "Hum30",
|
||||||
@@ -700,12 +598,12 @@
|
|||||||
"descr": "SHT30 Влажность",
|
"descr": "SHT30 Влажность",
|
||||||
"int": 15,
|
"int": 15,
|
||||||
"round": 1,
|
"round": 1,
|
||||||
"num": 46
|
"num": 40
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "47. HC-SR04 Ультразвуковой дальномер",
|
"name": "41. HC-SR04 Ультразвуковой дальномер",
|
||||||
"num": 47,
|
"num": 41,
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Sonar",
|
"subtype": "Sonar",
|
||||||
"id": "sonar",
|
"id": "sonar",
|
||||||
@@ -717,7 +615,7 @@
|
|||||||
"int": 5
|
"int": 5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "48. UART",
|
"name": "42. UART",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "UART",
|
"subtype": "UART",
|
||||||
"page": "",
|
"page": "",
|
||||||
@@ -729,14 +627,14 @@
|
|||||||
"line": 2,
|
"line": 2,
|
||||||
"speed": 9600,
|
"speed": 9600,
|
||||||
"eventFormat": 0,
|
"eventFormat": 0,
|
||||||
"num": 48
|
"num": 42
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"header": "Исполнительные устройства"
|
"header": "Исполнительные устройства"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "49. Кнопка подключенная к пину",
|
"name": "43. Кнопка подключенная к пину",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "ButtonIn",
|
"subtype": "ButtonIn",
|
||||||
"id": "btn",
|
"id": "btn",
|
||||||
@@ -751,11 +649,11 @@
|
|||||||
"debounceDelay": 50,
|
"debounceDelay": 50,
|
||||||
"fixState": 0,
|
"fixState": 0,
|
||||||
"inv": 0,
|
"inv": 0,
|
||||||
"num": 49
|
"num": 43
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "50. Управление пином",
|
"name": "44. Управление пином",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "ButtonOut",
|
"subtype": "ButtonOut",
|
||||||
"needSave": 0,
|
"needSave": 0,
|
||||||
@@ -766,11 +664,11 @@
|
|||||||
"int": 0,
|
"int": 0,
|
||||||
"inv": 0,
|
"inv": 0,
|
||||||
"pin": 2,
|
"pin": 2,
|
||||||
"num": 50
|
"num": 44
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "51. Пассивный звуковой извещатель",
|
"name": "45. Пассивный звуковой извещатель",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Buzzer",
|
"subtype": "Buzzer",
|
||||||
"id": "buzzer",
|
"id": "buzzer",
|
||||||
@@ -789,11 +687,11 @@
|
|||||||
"cycle": 0,
|
"cycle": 0,
|
||||||
"indication": 1,
|
"indication": 1,
|
||||||
"val": 0,
|
"val": 0,
|
||||||
"num": 51
|
"num": 45
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "52. Энкодер",
|
"name": "46. Энкодер",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Encoder",
|
"subtype": "Encoder",
|
||||||
"id": "enc",
|
"id": "enc",
|
||||||
@@ -806,11 +704,11 @@
|
|||||||
"step": 1,
|
"step": 1,
|
||||||
"stepOnPress": 5,
|
"stepOnPress": 5,
|
||||||
"pins": "4,5,2",
|
"pins": "4,5,2",
|
||||||
"num": 52
|
"num": 46
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "53. Сервопривод",
|
"name": "47. Сервопривод",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "IoTServo",
|
"subtype": "IoTServo",
|
||||||
"id": "servo",
|
"id": "servo",
|
||||||
@@ -821,11 +719,11 @@
|
|||||||
"pin": 12,
|
"pin": 12,
|
||||||
"apin": -1,
|
"apin": -1,
|
||||||
"amap": "0, 4096, 0, 180",
|
"amap": "0, 4096, 0, 180",
|
||||||
"num": 53
|
"num": 47
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "54. Расширитель портов Mcp23017",
|
"name": "48. Расширитель портов Mcp23017",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Mcp23017",
|
"subtype": "Mcp23017",
|
||||||
"id": "Mcp",
|
"id": "Mcp",
|
||||||
@@ -835,11 +733,11 @@
|
|||||||
"int": "0",
|
"int": "0",
|
||||||
"addr": "0x20",
|
"addr": "0x20",
|
||||||
"index": 1,
|
"index": 1,
|
||||||
"num": 54
|
"num": 48
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "55. MP3 плеер",
|
"name": "49. MP3 плеер",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Mp3",
|
"subtype": "Mp3",
|
||||||
"id": "mp3",
|
"id": "mp3",
|
||||||
@@ -849,11 +747,11 @@
|
|||||||
"int": 1,
|
"int": 1,
|
||||||
"pins": "14,12",
|
"pins": "14,12",
|
||||||
"volume": 20,
|
"volume": 20,
|
||||||
"num": 55
|
"num": 49
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "56. Сенсорная кнопка",
|
"name": "50. Сенсорная кнопка",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Multitouch",
|
"subtype": "Multitouch",
|
||||||
"id": "impulse",
|
"id": "impulse",
|
||||||
@@ -867,11 +765,11 @@
|
|||||||
"pinMode": "INPUT",
|
"pinMode": "INPUT",
|
||||||
"debounceDelay": 50,
|
"debounceDelay": 50,
|
||||||
"PWMDelay": 500,
|
"PWMDelay": 500,
|
||||||
"num": 56
|
"num": 50
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "57. Расширитель портов Pcf8574",
|
"name": "51. Расширитель портов Pcf8574",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Pcf8574",
|
"subtype": "Pcf8574",
|
||||||
"id": "Pcf",
|
"id": "Pcf",
|
||||||
@@ -881,11 +779,11 @@
|
|||||||
"int": "0",
|
"int": "0",
|
||||||
"addr": "0x20",
|
"addr": "0x20",
|
||||||
"index": 1,
|
"index": 1,
|
||||||
"num": 57
|
"num": 51
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "58. PWM ESP8266",
|
"name": "52. PWM ESP8266",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "Pwm8266",
|
"subtype": "Pwm8266",
|
||||||
"id": "pwm",
|
"id": "pwm",
|
||||||
@@ -897,11 +795,11 @@
|
|||||||
"freq": 5000,
|
"freq": 5000,
|
||||||
"val": 0,
|
"val": 0,
|
||||||
"apin": -1,
|
"apin": -1,
|
||||||
"num": 58
|
"num": 52
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "59. Телеграм-Лайт",
|
"name": "53. Телеграм-Лайт",
|
||||||
"type": "Writing",
|
"type": "Writing",
|
||||||
"subtype": "TelegramLT",
|
"subtype": "TelegramLT",
|
||||||
"id": "tg",
|
"id": "tg",
|
||||||
@@ -910,14 +808,14 @@
|
|||||||
"descr": "",
|
"descr": "",
|
||||||
"token": "",
|
"token": "",
|
||||||
"chatID": "",
|
"chatID": "",
|
||||||
"num": 59
|
"num": 53
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"header": "Экраны"
|
"header": "Экраны"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"global": 0,
|
"global": 0,
|
||||||
"name": "60. LCD экран 2004",
|
"name": "54. LCD экран 2004",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Lcd2004",
|
"subtype": "Lcd2004",
|
||||||
"id": "Lcd",
|
"id": "Lcd",
|
||||||
@@ -929,10 +827,10 @@
|
|||||||
"size": "20,4",
|
"size": "20,4",
|
||||||
"coord": "0,0",
|
"coord": "0,0",
|
||||||
"id2show": "id датчика",
|
"id2show": "id датчика",
|
||||||
"num": 60
|
"num": 54
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "61. LCD экран 1602",
|
"name": "55. LCD экран 1602",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Lcd2004",
|
"subtype": "Lcd2004",
|
||||||
"id": "Lcd",
|
"id": "Lcd",
|
||||||
@@ -944,6 +842,6 @@
|
|||||||
"size": "16,2",
|
"size": "16,2",
|
||||||
"coord": "0,0",
|
"coord": "0,0",
|
||||||
"id2show": "id датчика",
|
"id2show": "id датчика",
|
||||||
"num": 61
|
"num": 55
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -118,7 +118,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/sensors/Ds2423",
|
"path": "src/modules/sensors/Ds2423",
|
||||||
"active": true
|
"active": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/sensors/Emon",
|
"path": "src/modules/sensors/Emon",
|
||||||
@@ -160,6 +160,10 @@
|
|||||||
"path": "src/modules/sensors/IoTWiegand",
|
"path": "src/modules/sensors/IoTWiegand",
|
||||||
"active": false
|
"active": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "src/modules/sensors/ld2410",
|
||||||
|
"active": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/sensors/Max6675",
|
"path": "src/modules/sensors/Max6675",
|
||||||
"active": false
|
"active": false
|
||||||
@@ -170,7 +174,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/sensors/Ntc",
|
"path": "src/modules/sensors/Ntc",
|
||||||
"active": true
|
"active": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/sensors/Pzem004t",
|
"path": "src/modules/sensors/Pzem004t",
|
||||||
@@ -190,7 +194,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/sensors/Scd40",
|
"path": "src/modules/sensors/Scd40",
|
||||||
"active": true
|
"active": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/sensors/Sds011",
|
"path": "src/modules/sensors/Sds011",
|
||||||
@@ -238,6 +242,10 @@
|
|||||||
"path": "src/modules/exec/EspCam",
|
"path": "src/modules/exec/EspCam",
|
||||||
"active": false
|
"active": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "src/modules/exec/Ftp",
|
||||||
|
"active": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/exec/HttpGet",
|
"path": "src/modules/exec/HttpGet",
|
||||||
"active": false
|
"active": false
|
||||||
@@ -312,6 +320,10 @@
|
|||||||
"path": "src/modules/display/NextionUpload",
|
"path": "src/modules/display/NextionUpload",
|
||||||
"active": false
|
"active": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "src/modules/display/Smi2_m",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/display/Ws2812b",
|
"path": "src/modules/display/Ws2812b",
|
||||||
"active": false
|
"active": false
|
||||||
|
|||||||
@@ -8,14 +8,14 @@
|
|||||||
<link rel="icon" type="image/png" href="/favicon.ico" />
|
<link rel="icon" type="image/png" href="/favicon.ico" />
|
||||||
<link
|
<link
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
href="https://iotmanager.org/esp01ota/build/bundle.css?443"
|
href="https://iotmanager.org/esp01ota/build/bundle.css?450"
|
||||||
/>
|
/>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<script>
|
<script>
|
||||||
let script = document.createElement("script");
|
let script = document.createElement("script");
|
||||||
script.src = "https://iotmanager.org/esp01ota/build/bundle.js?443";
|
script.src = "https://iotmanager.org/esp01ota/build/bundle.js?450";
|
||||||
script.onload = execute;
|
script.onload = execute;
|
||||||
document.head.append(script);
|
document.head.append(script);
|
||||||
script.onerror = error;
|
script.onerror = error;
|
||||||
|
|||||||
@@ -33,8 +33,16 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Размер буфера json
|
// Размер буфера json
|
||||||
#define JSON_BUFFER_SIZE 2048 // держим 2 кб не меняем
|
#define JSON_BUFFER_SIZE 4096 // держим 2 кб не меняем
|
||||||
#define WEB_SOCKETS_FRAME_SIZE 2048
|
|
||||||
|
/*
|
||||||
|
WEB_SOCKETS_FRAME_SIZE создан для того что бы не загружать оперативку.
|
||||||
|
Эта технология передаёт в сокеты большие файлы по частям.
|
||||||
|
Чем меньше этот фрейм тем теоретически лучше.
|
||||||
|
Но и сильно малый он тоже быть не должен.
|
||||||
|
Я опытным путём установил что размер 1024 является оптимальным. Можно так же поставить 2048
|
||||||
|
*/
|
||||||
|
#define WEB_SOCKETS_FRAME_SIZE 1024
|
||||||
|
|
||||||
// #define LOOP_DEBUG
|
// #define LOOP_DEBUG
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ class IoTItem {
|
|||||||
int _map3 = 0;
|
int _map3 = 0;
|
||||||
int _map4 = 0;
|
int _map4 = 0;
|
||||||
int _round = 1; // 1, 10, 100, 1000, 10000
|
int _round = 1; // 1, 10, 100, 1000, 10000
|
||||||
|
int _numDigits = 1; // количество целых значений, не значимые позиции заменяются нулем в строковом формате
|
||||||
|
|
||||||
bool _global = false; // характеристика айтема, что ему нужно слать и принимать события из внешнего мира
|
bool _global = false; // характеристика айтема, что ему нужно слать и принимать события из внешнего мира
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ extern bool jsonRead(const String& json, String key, int& value, bool e = true);
|
|||||||
|
|
||||||
extern String jsonReadStr(const String& json, String name, bool e = true);
|
extern String jsonReadStr(const String& json, String name, bool e = true);
|
||||||
extern int jsonReadInt(const String& json, String name, bool e = true);
|
extern int jsonReadInt(const String& json, String name, bool e = true);
|
||||||
|
long int jsonReadLInt(const String& json, String name, bool e=true);
|
||||||
extern boolean jsonReadBool(const String& json, String name, bool e = true);
|
extern boolean jsonReadBool(const String& json, String name, bool e = true);
|
||||||
|
|
||||||
extern bool jsonWriteStr_(String& json, const String& name, const String& value, bool e = true);
|
extern bool jsonWriteStr_(String& json, const String& name, const String& value, bool e = true);
|
||||||
|
|||||||
@@ -45,3 +45,7 @@ String uint64ToString(uint64_t input, uint8_t base = 10);
|
|||||||
void cleanString(String& str);
|
void cleanString(String& str);
|
||||||
|
|
||||||
unsigned char ChartoHex(char ch);
|
unsigned char ChartoHex(char ch);
|
||||||
|
|
||||||
|
std::vector<String> splitStr(const String& str, const String& delimiter);
|
||||||
|
|
||||||
|
bool strInVector(const String& str, const std::vector<String>& vec);
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
BIN
iotm/esp8266_4mb/400/firmware.bin
Normal file
BIN
iotm/esp8266_4mb/400/firmware.bin
Normal file
Binary file not shown.
BIN
iotm/esp8266_4mb/400/littlefs.bin
Normal file
BIN
iotm/esp8266_4mb/400/littlefs.bin
Normal file
Binary file not shown.
@@ -160,6 +160,10 @@
|
|||||||
"path": "src/modules/sensors/IoTWiegand",
|
"path": "src/modules/sensors/IoTWiegand",
|
||||||
"active": false
|
"active": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "src/modules/sensors/ld2410",
|
||||||
|
"active": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/sensors/Max6675",
|
"path": "src/modules/sensors/Max6675",
|
||||||
"active": false
|
"active": false
|
||||||
@@ -316,6 +320,10 @@
|
|||||||
"path": "src/modules/display/NextionUpload",
|
"path": "src/modules/display/NextionUpload",
|
||||||
"active": false
|
"active": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "src/modules/display/Smi2_m",
|
||||||
|
"active": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "src/modules/display/Ws2812b",
|
"path": "src/modules/display/Ws2812b",
|
||||||
"active": false
|
"active": false
|
||||||
|
|||||||
@@ -248,11 +248,11 @@ lib_deps =
|
|||||||
adafruit/Adafruit BME280 Library
|
adafruit/Adafruit BME280 Library
|
||||||
adafruit/Adafruit BMP280 Library
|
adafruit/Adafruit BMP280 Library
|
||||||
https://github.com/milesburton/Arduino-Temperature-Control-Library
|
https://github.com/milesburton/Arduino-Temperature-Control-Library
|
||||||
IRremote @ ^4.1.2
|
|
||||||
https://github.com/tremaru/iarduino_RTC
|
https://github.com/tremaru/iarduino_RTC
|
||||||
robtillaart/SHT2x@^0.1.1
|
robtillaart/SHT2x@^0.1.1
|
||||||
WEMOS SHT3x@1.0.0
|
WEMOS SHT3x@1.0.0
|
||||||
plerup/EspSoftwareSerial
|
plerup/EspSoftwareSerial
|
||||||
|
gyverlibs/EncButton @ ^2.0
|
||||||
adafruit/Adafruit MCP23017 Arduino Library@^2.1.0
|
adafruit/Adafruit MCP23017 Arduino Library@^2.1.0
|
||||||
adafruit/Adafruit BusIO @ ^1.13.2
|
adafruit/Adafruit BusIO @ ^1.13.2
|
||||||
adafruit/Adafruit BusIO @ ^1.13.2
|
adafruit/Adafruit BusIO @ ^1.13.2
|
||||||
@@ -273,7 +273,7 @@ build_src_filter =
|
|||||||
+<modules/sensors/Bmp280>
|
+<modules/sensors/Bmp280>
|
||||||
+<modules/sensors/Ds18b20>
|
+<modules/sensors/Ds18b20>
|
||||||
+<modules/sensors/Impulse>
|
+<modules/sensors/Impulse>
|
||||||
+<modules/sensors/IRswitch>
|
+<modules/sensors/Ntc>
|
||||||
+<modules/sensors/Pzem004t>
|
+<modules/sensors/Pzem004t>
|
||||||
+<modules/sensors/RTC>
|
+<modules/sensors/RTC>
|
||||||
+<modules/sensors/Sht20>
|
+<modules/sensors/Sht20>
|
||||||
@@ -282,6 +282,8 @@ build_src_filter =
|
|||||||
+<modules/sensors/UART>
|
+<modules/sensors/UART>
|
||||||
+<modules/exec/ButtonIn>
|
+<modules/exec/ButtonIn>
|
||||||
+<modules/exec/ButtonOut>
|
+<modules/exec/ButtonOut>
|
||||||
|
+<modules/exec/Buzzer>
|
||||||
|
+<modules/exec/Enconder>
|
||||||
+<modules/exec/Mcp23017>
|
+<modules/exec/Mcp23017>
|
||||||
+<modules/exec/Multitouch>
|
+<modules/exec/Multitouch>
|
||||||
+<modules/exec/Pcf8574>
|
+<modules/exec/Pcf8574>
|
||||||
@@ -374,6 +376,7 @@ build_src_filter =
|
|||||||
+<modules/sensors/Bmp280>
|
+<modules/sensors/Bmp280>
|
||||||
+<modules/sensors/Ds18b20>
|
+<modules/sensors/Ds18b20>
|
||||||
+<modules/sensors/Impulse>
|
+<modules/sensors/Impulse>
|
||||||
|
+<modules/sensors/Ntc>
|
||||||
+<modules/sensors/Pzem004t>
|
+<modules/sensors/Pzem004t>
|
||||||
+<modules/sensors/RTC>
|
+<modules/sensors/RTC>
|
||||||
+<modules/sensors/Sht20>
|
+<modules/sensors/Sht20>
|
||||||
@@ -382,6 +385,7 @@ build_src_filter =
|
|||||||
+<modules/sensors/UART>
|
+<modules/sensors/UART>
|
||||||
+<modules/exec/ButtonIn>
|
+<modules/exec/ButtonIn>
|
||||||
+<modules/exec/ButtonOut>
|
+<modules/exec/ButtonOut>
|
||||||
|
+<modules/exec/Buzzer>
|
||||||
+<modules/exec/Enconder>
|
+<modules/exec/Enconder>
|
||||||
+<modules/exec/Mcp23017>
|
+<modules/exec/Mcp23017>
|
||||||
+<modules/exec/Multitouch>
|
+<modules/exec/Multitouch>
|
||||||
@@ -397,11 +401,7 @@ lib_deps =
|
|||||||
adafruit/Adafruit BMP280 Library
|
adafruit/Adafruit BMP280 Library
|
||||||
beegee-tokyo/DHT sensor library for ESPx
|
beegee-tokyo/DHT sensor library for ESPx
|
||||||
https://github.com/milesburton/Arduino-Temperature-Control-Library
|
https://github.com/milesburton/Arduino-Temperature-Control-Library
|
||||||
https://github.com/jbechter/arduino-onewire-DS2423
|
|
||||||
paulstoffregen/OneWire @ ^2.3.7
|
|
||||||
https://github.com/tremaru/iarduino_RTC
|
https://github.com/tremaru/iarduino_RTC
|
||||||
Sensirion I2C SCD4x @0.4.0
|
|
||||||
Sensirion Core @0.6.0
|
|
||||||
robtillaart/SHT2x@^0.1.1
|
robtillaart/SHT2x@^0.1.1
|
||||||
WEMOS SHT3x@1.0.0
|
WEMOS SHT3x@1.0.0
|
||||||
plerup/EspSoftwareSerial
|
plerup/EspSoftwareSerial
|
||||||
@@ -428,13 +428,10 @@ build_src_filter =
|
|||||||
+<modules/sensors/Bmp280>
|
+<modules/sensors/Bmp280>
|
||||||
+<modules/sensors/Dht1122>
|
+<modules/sensors/Dht1122>
|
||||||
+<modules/sensors/Ds18b20>
|
+<modules/sensors/Ds18b20>
|
||||||
+<modules/sensors/Ds2423>
|
|
||||||
+<modules/sensors/Impulse>
|
+<modules/sensors/Impulse>
|
||||||
+<modules/sensors/Ntc>
|
|
||||||
+<modules/sensors/Pzem004t>
|
+<modules/sensors/Pzem004t>
|
||||||
+<modules/sensors/RTC>
|
+<modules/sensors/RTC>
|
||||||
+<modules/sensors/S8>
|
+<modules/sensors/S8>
|
||||||
+<modules/sensors/Scd40>
|
|
||||||
+<modules/sensors/Sht20>
|
+<modules/sensors/Sht20>
|
||||||
+<modules/sensors/Sht30>
|
+<modules/sensors/Sht30>
|
||||||
+<modules/sensors/Sonar>
|
+<modules/sensors/Sonar>
|
||||||
@@ -454,29 +451,43 @@ build_src_filter =
|
|||||||
|
|
||||||
[env:esp32_4mb_fromitems]
|
[env:esp32_4mb_fromitems]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
|
https://github.com/enjoyneering/AHTxx.git
|
||||||
|
adafruit/Adafruit BME280 Library
|
||||||
|
adafruit/Adafruit BMP280 Library
|
||||||
|
beegee-tokyo/DHT sensor library for ESPx
|
||||||
https://github.com/milesburton/Arduino-Temperature-Control-Library
|
https://github.com/milesburton/Arduino-Temperature-Control-Library
|
||||||
https://github.com/jbechter/arduino-onewire-DS2423
|
|
||||||
paulstoffregen/OneWire @ ^2.3.7
|
|
||||||
https://github.com/tremaru/iarduino_RTC
|
https://github.com/tremaru/iarduino_RTC
|
||||||
|
robtillaart/SHT2x@^0.1.1
|
||||||
WEMOS SHT3x@1.0.0
|
WEMOS SHT3x@1.0.0
|
||||||
plerup/EspSoftwareSerial
|
plerup/EspSoftwareSerial
|
||||||
gyverlibs/EncButton @ ^2.0
|
gyverlibs/EncButton @ ^2.0
|
||||||
|
https://github.com/RoboticsBrno/ServoESP32
|
||||||
|
adafruit/Adafruit MCP23017 Arduino Library@^2.1.0
|
||||||
adafruit/Adafruit BusIO @ ^1.13.2
|
adafruit/Adafruit BusIO @ ^1.13.2
|
||||||
|
dfrobot/DFRobotDFPlayerMini @ ^1.0.5
|
||||||
|
adafruit/Adafruit BusIO @ ^1.13.2
|
||||||
|
https://github.com/robotclass/RobotClass_LiquidCrystal_I2C
|
||||||
|
marcoschwartz/LiquidCrystal_I2C@^1.1.4
|
||||||
build_src_filter =
|
build_src_filter =
|
||||||
+<modules/virtual/Cron>
|
+<modules/virtual/Cron>
|
||||||
+<modules/virtual/GoogleSheet>
|
|
||||||
+<modules/virtual/Loging>
|
+<modules/virtual/Loging>
|
||||||
+<modules/virtual/LogingDaily>
|
+<modules/virtual/LogingDaily>
|
||||||
+<modules/virtual/Timer>
|
+<modules/virtual/Timer>
|
||||||
+<modules/virtual/Variable>
|
+<modules/virtual/Variable>
|
||||||
+<modules/virtual/VariableColor>
|
+<modules/virtual/VariableColor>
|
||||||
+<modules/virtual/VButton>
|
+<modules/virtual/VButton>
|
||||||
|
+<modules/sensors/Acs712>
|
||||||
|
+<modules/sensors/AhtXX>
|
||||||
+<modules/sensors/AnalogAdc>
|
+<modules/sensors/AnalogAdc>
|
||||||
|
+<modules/sensors/Bme280>
|
||||||
|
+<modules/sensors/Bmp280>
|
||||||
|
+<modules/sensors/Dht1122>
|
||||||
+<modules/sensors/Ds18b20>
|
+<modules/sensors/Ds18b20>
|
||||||
+<modules/sensors/Ds2423>
|
|
||||||
+<modules/sensors/Impulse>
|
+<modules/sensors/Impulse>
|
||||||
+<modules/sensors/Ntc>
|
+<modules/sensors/Pzem004t>
|
||||||
+<modules/sensors/RTC>
|
+<modules/sensors/RTC>
|
||||||
|
+<modules/sensors/S8>
|
||||||
|
+<modules/sensors/Sht20>
|
||||||
+<modules/sensors/Sht30>
|
+<modules/sensors/Sht30>
|
||||||
+<modules/sensors/Sonar>
|
+<modules/sensors/Sonar>
|
||||||
+<modules/sensors/UART>
|
+<modules/sensors/UART>
|
||||||
@@ -484,9 +495,15 @@ build_src_filter =
|
|||||||
+<modules/exec/ButtonOut>
|
+<modules/exec/ButtonOut>
|
||||||
+<modules/exec/Buzzer>
|
+<modules/exec/Buzzer>
|
||||||
+<modules/exec/Enconder>
|
+<modules/exec/Enconder>
|
||||||
|
+<modules/exec/IoTServo>
|
||||||
|
+<modules/exec/Mcp23017>
|
||||||
|
+<modules/exec/Mp3>
|
||||||
+<modules/exec/Multitouch>
|
+<modules/exec/Multitouch>
|
||||||
+<modules/exec/Pcf8574>
|
+<modules/exec/Pcf8574>
|
||||||
+<modules/exec/Pwm32>
|
+<modules/exec/Pwm32>
|
||||||
|
+<modules/exec/TelegramLT>
|
||||||
|
+<modules/display/Lcd2004>
|
||||||
|
+<modules/display/Smi2_m>
|
||||||
|
|
||||||
[env:esp32s2_4mb_fromitems]
|
[env:esp32s2_4mb_fromitems]
|
||||||
lib_deps =
|
lib_deps =
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ void setup() {
|
|||||||
Serial.println("FIRMWARE NAME " + String(FIRMWARE_NAME));
|
Serial.println("FIRMWARE NAME " + String(FIRMWARE_NAME));
|
||||||
Serial.println("FIRMWARE VERSION " + String(FIRMWARE_VERSION));
|
Serial.println("FIRMWARE VERSION " + String(FIRMWARE_VERSION));
|
||||||
Serial.println("WEB VERSION " + getWebVersion());
|
Serial.println("WEB VERSION " + getWebVersion());
|
||||||
const String buildTime = String(BUILD_DAY) + "/" + String(BUILD_MONTH) + "/" + String(BUILD_YEAR) + " " + String(BUILD_HOUR) + ":" + String(BUILD_MIN) + ":" + String(BUILD_SEC);
|
const String buildTime = String(BUILD_DAY) + "." + String(BUILD_MONTH) + "." + String(BUILD_YEAR) + " " + String(BUILD_HOUR) + ":" + String(BUILD_MIN) + ":" + String(BUILD_SEC);
|
||||||
Serial.println("BUILD TIME " + buildTime);
|
Serial.println("BUILD TIME " + buildTime);
|
||||||
jsonWriteStr_(errorsHeapJson, F("bt"), buildTime);
|
jsonWriteStr_(errorsHeapJson, F("bt"), buildTime);
|
||||||
Serial.println(F("------------------------"));
|
Serial.println(F("------------------------"));
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ IoTItem::IoTItem(const String& parameters) {
|
|||||||
if (!jsonRead(parameters, F("multiply"), _multiply, false)) _multiply = 1;
|
if (!jsonRead(parameters, F("multiply"), _multiply, false)) _multiply = 1;
|
||||||
if (!jsonRead(parameters, F("plus"), _plus, false)) _plus = 0;
|
if (!jsonRead(parameters, F("plus"), _plus, false)) _plus = 0;
|
||||||
if (!jsonRead(parameters, F("round"), _round, false)) _round = -1;
|
if (!jsonRead(parameters, F("round"), _round, false)) _round = -1;
|
||||||
|
if (!jsonRead(parameters, F("numDigits"), _numDigits, false)) _numDigits = 1;
|
||||||
|
|
||||||
if (!jsonRead(parameters, F("global"), _global, false)) _global = false;
|
if (!jsonRead(parameters, F("global"), _global, false)) _global = false;
|
||||||
|
|
||||||
@@ -119,9 +120,9 @@ String IoTItem::getRoundValue() {
|
|||||||
if (_round >= 0 && _round <= 6) {
|
if (_round >= 0 && _round <= 6) {
|
||||||
int sot = _round ? pow(10, (int)_round) : 1;
|
int sot = _round ? pow(10, (int)_round) : 1;
|
||||||
value.valD = round(value.valD * sot) / sot;
|
value.valD = round(value.valD * sot) / sot;
|
||||||
|
//todo: оптимизировать. Вынести расчет строки формата округления, чтоб использовать постоянно готовую
|
||||||
char buf[15];
|
char buf[15];
|
||||||
sprintf(buf, ("%1." + (String)_round + "f").c_str(), value.valD);
|
sprintf(buf, ("%0" + (String)(_numDigits + _round) + "." + (String)_round + "f").c_str(), value.valD);
|
||||||
value.valS = (String)buf;
|
value.valS = (String)buf;
|
||||||
return value.valS;
|
return value.valS;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -15,13 +15,10 @@ void* getAPI_Bme280(String subtype, String params);
|
|||||||
void* getAPI_Bmp280(String subtype, String params);
|
void* getAPI_Bmp280(String subtype, String params);
|
||||||
void* getAPI_Dht1122(String subtype, String params);
|
void* getAPI_Dht1122(String subtype, String params);
|
||||||
void* getAPI_Ds18b20(String subtype, String params);
|
void* getAPI_Ds18b20(String subtype, String params);
|
||||||
void* getAPI_Ds2423(String subtype, String params);
|
|
||||||
void* getAPI_Impulse(String subtype, String params);
|
void* getAPI_Impulse(String subtype, String params);
|
||||||
void* getAPI_Ntc(String subtype, String params);
|
|
||||||
void* getAPI_Pzem004(String subtype, String params);
|
void* getAPI_Pzem004(String subtype, String params);
|
||||||
void* getAPI_RTC(String subtype, String params);
|
void* getAPI_RTC(String subtype, String params);
|
||||||
void* getAPI_S8(String subtype, String params);
|
void* getAPI_S8(String subtype, String params);
|
||||||
void* getAPI_Scd40(String subtype, String params);
|
|
||||||
void* getAPI_Sht20(String subtype, String params);
|
void* getAPI_Sht20(String subtype, String params);
|
||||||
void* getAPI_Sht30(String subtype, String params);
|
void* getAPI_Sht30(String subtype, String params);
|
||||||
void* getAPI_Sonar(String subtype, String params);
|
void* getAPI_Sonar(String subtype, String params);
|
||||||
@@ -56,13 +53,10 @@ if ((tmpAPI = getAPI_Bme280(subtype, params)) != nullptr) return tmpAPI;
|
|||||||
if ((tmpAPI = getAPI_Bmp280(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Bmp280(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Dht1122(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Dht1122(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Ds18b20(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Ds18b20(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Ds2423(subtype, params)) != nullptr) return tmpAPI;
|
|
||||||
if ((tmpAPI = getAPI_Impulse(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Impulse(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Ntc(subtype, params)) != nullptr) return tmpAPI;
|
|
||||||
if ((tmpAPI = getAPI_Pzem004(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Pzem004(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_RTC(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_RTC(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_S8(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_S8(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Scd40(subtype, params)) != nullptr) return tmpAPI;
|
|
||||||
if ((tmpAPI = getAPI_Sht20(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Sht20(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Sht30(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Sht30(subtype, params)) != nullptr) return tmpAPI;
|
||||||
if ((tmpAPI = getAPI_Sonar(subtype, params)) != nullptr) return tmpAPI;
|
if ((tmpAPI = getAPI_Sonar(subtype, params)) != nullptr) return tmpAPI;
|
||||||
|
|||||||
@@ -1,22 +1,14 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
#include "classes/IoTItem.h"
|
#include "classes/IoTItem.h"
|
||||||
|
|
||||||
//#include "LiquidCrystal_I2C.h"
|
|
||||||
#include <RobotClass_LiquidCrystal_I2C.h>
|
#include <RobotClass_LiquidCrystal_I2C.h>
|
||||||
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
void scanI2C();
|
|
||||||
|
|
||||||
//LiquidCrystal_I2C *LCDI2C;
|
|
||||||
RobotClass_LiquidCrystal_I2C *LCDI2C;
|
RobotClass_LiquidCrystal_I2C *LCDI2C;
|
||||||
|
|
||||||
class Lcd2004 : public IoTItem {
|
class Lcd2004 : public IoTItem {
|
||||||
private:
|
private:
|
||||||
unsigned int _x;
|
unsigned int _x;
|
||||||
unsigned int _y;
|
unsigned int _y;
|
||||||
String _id2show;
|
String _id2show, _prefix = "", _postfix = "";
|
||||||
String _descr;
|
|
||||||
int _prevStrSize;
|
int _prevStrSize;
|
||||||
String _addr;
|
String _addr;
|
||||||
|
|
||||||
@@ -37,42 +29,52 @@ class Lcd2004 : public IoTItem {
|
|||||||
int w = selectFromMarkerToMarker(size, ",", 0).toInt(); //количество столбцов
|
int w = selectFromMarkerToMarker(size, ",", 0).toInt(); //количество столбцов
|
||||||
int h = selectFromMarkerToMarker(size, ",", 1).toInt(); //количество строк
|
int h = selectFromMarkerToMarker(size, ",", 1).toInt(); //количество строк
|
||||||
if (LCDI2C == nullptr) { //инициализации экрана еще не было
|
if (LCDI2C == nullptr) { //инициализации экрана еще не было
|
||||||
//LCDI2C = new LiquidCrystal_I2C(hexStringToUint8(_addr), w, h);
|
|
||||||
LCDI2C = new RobotClass_LiquidCrystal_I2C(hexStringToUint8(_addr), w, h, CP_UTF8);
|
LCDI2C = new RobotClass_LiquidCrystal_I2C(hexStringToUint8(_addr), w, h, CP_UTF8);
|
||||||
if (LCDI2C != nullptr) {
|
if (LCDI2C != nullptr) {
|
||||||
LCDI2C->init();
|
LCDI2C->init();
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LCDI2C->clear();
|
LCDI2C->clear();
|
||||||
LCDI2C->backlight();
|
LCDI2C->backlight();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
jsonRead(parameters, "coord", xy);
|
jsonRead(parameters, "coord", xy);
|
||||||
_x = selectFromMarkerToMarker(xy, ",", 0).toInt();
|
_x = selectFromMarkerToMarker(xy, ",", 0).toInt();
|
||||||
_y = selectFromMarkerToMarker(xy, ",", 1).toInt();
|
_y = selectFromMarkerToMarker(xy, ",", 1).toInt();
|
||||||
|
|
||||||
jsonRead(parameters, "descr", _descr);
|
|
||||||
jsonRead(parameters, "id2show", _id2show);
|
jsonRead(parameters, "id2show", _id2show);
|
||||||
|
jsonRead(parameters, "prefix", _prefix);
|
||||||
|
jsonRead(parameters, "postfix", _postfix);
|
||||||
}
|
}
|
||||||
|
|
||||||
void doByInterval() {
|
void drawItem(IoTItem* item) {
|
||||||
if (LCDI2C != nullptr) {
|
String tmpStr = _prefix;
|
||||||
printBlankStr(_prevStrSize);
|
tmpStr += item->getValue();
|
||||||
|
tmpStr += _postfix;
|
||||||
|
|
||||||
String tmpStr = getItemValue(_id2show);
|
printBlankStr(_prevStrSize);
|
||||||
if (_descr != "none") tmpStr = _descr + " " + tmpStr;
|
|
||||||
LCDI2C->setCursor(_x, _y);
|
LCDI2C->setCursor(_x, _y);
|
||||||
LCDI2C->print(tmpStr);
|
LCDI2C->print(tmpStr);
|
||||||
|
|
||||||
//LCDI2C->print("Helloy,Manager 404 !");
|
|
||||||
//Serial.printf("ffff %s\n", _id2show);
|
|
||||||
_prevStrSize = tmpStr.length();
|
_prevStrSize = tmpStr.length();
|
||||||
} else {
|
}
|
||||||
scanI2C();
|
|
||||||
|
void setValue(const IoTValue& Value, bool genEvent = true) {
|
||||||
|
if (LCDI2C == nullptr) return;
|
||||||
|
|
||||||
|
value = Value;
|
||||||
|
drawItem(this);
|
||||||
|
IoTItem::setValue(Value, genEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void onRegEvent(IoTItem* eventItem) {
|
||||||
|
if (LCDI2C == nullptr) { scanI2C(); return;}
|
||||||
|
if (!eventItem || _id2show == "") return;
|
||||||
|
|
||||||
|
if (_id2show == eventItem->getID()) {
|
||||||
|
setValue(eventItem->value, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IoTValue execute(String command, std::vector<IoTValue> ¶m) { // будет возможным использовать, когда сценарии запустятся
|
IoTValue execute(String command, std::vector<IoTValue> ¶m) {
|
||||||
if (command == "noBacklight")
|
if (command == "noBacklight")
|
||||||
LCDI2C->noBacklight();
|
LCDI2C->noBacklight();
|
||||||
else if (command == "backlight")
|
else if (command == "backlight")
|
||||||
@@ -99,9 +101,13 @@ class Lcd2004 : public IoTItem {
|
|||||||
if (param.size()) {
|
if (param.size()) {
|
||||||
_y = param[0].valD;
|
_y = param[0].valD;
|
||||||
}
|
}
|
||||||
} else if (command == "descr") {
|
} else if (command == "prefix") {
|
||||||
if (param.size()) {
|
if (param.size()) {
|
||||||
_descr = param[0].valS;
|
_prefix = param[0].valS;
|
||||||
|
}
|
||||||
|
} else if (command == "postfix") {
|
||||||
|
if (param.size()) {
|
||||||
|
_postfix = param[0].valS;
|
||||||
}
|
}
|
||||||
} else if (command == "id2show") {
|
} else if (command == "id2show") {
|
||||||
if (param.size()) {
|
if (param.size()) {
|
||||||
|
|||||||
@@ -7,30 +7,32 @@
|
|||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Lcd2004",
|
"subtype": "Lcd2004",
|
||||||
"id": "Lcd",
|
"id": "Lcd",
|
||||||
"widget": "",
|
"widget": "inputTxt",
|
||||||
"page": "",
|
"page": "Экраны",
|
||||||
"descr": "T",
|
"descr": "LCD Экран",
|
||||||
|
|
||||||
"int": 15,
|
|
||||||
"addr": "0x27",
|
"addr": "0x27",
|
||||||
"size": "20,4",
|
"size": "20,4",
|
||||||
"coord": "0,0",
|
"coord": "0,0",
|
||||||
"id2show": "id датчика"
|
"id2show": "",
|
||||||
|
"prefix": "",
|
||||||
|
"postfix": ""
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "LCD экран 1602",
|
"name": "LCD экран 1602",
|
||||||
"type": "Reading",
|
"type": "Reading",
|
||||||
"subtype": "Lcd2004",
|
"subtype": "Lcd2004",
|
||||||
"id": "Lcd",
|
"id": "Lcd",
|
||||||
"widget": "",
|
"widget": "inputTxt",
|
||||||
"page": "",
|
"page": "Экраны",
|
||||||
"descr": "T",
|
"descr": "LCD Экран",
|
||||||
|
|
||||||
"int": 15,
|
|
||||||
"addr": "0x27",
|
"addr": "0x27",
|
||||||
"size": "16,2",
|
"size": "16,2",
|
||||||
"coord": "0,0",
|
"coord": "0,0",
|
||||||
"id2show": "id датчика"
|
"id2show": "",
|
||||||
|
"prefix": "",
|
||||||
|
"postfix": ""
|
||||||
}],
|
}],
|
||||||
|
|
||||||
"about": {
|
"about": {
|
||||||
@@ -46,11 +48,12 @@
|
|||||||
},
|
},
|
||||||
"moduleDesc": "Позволяет выводить на символьные экраны по указанным позициям значения других элементов конфигурации.",
|
"moduleDesc": "Позволяет выводить на символьные экраны по указанным позициям значения других элементов конфигурации.",
|
||||||
"propInfo": {
|
"propInfo": {
|
||||||
"int": "Период времени в секундах обновления информации на экране по конкретному элементу.",
|
"addr": "Адрес устройства на шине, обычно 0x27. Установите пустую строку для включения режима сканирования адресов на шине (результат в консоли).",
|
||||||
"addr": "Адрес устройства на шине, обычно 0x27.",
|
|
||||||
"size": "Размерность матрицы экрана.",
|
"size": "Размерность матрицы экрана.",
|
||||||
"coord": "Координата позиции для вывода данных элемента конфигурации.",
|
"coord": "Координата позиции для вывода данных элемента конфигурации.",
|
||||||
"id2show": "id элемента конфигурации."
|
"id2show": "id элемента конфигурации для отображения на экране. Если пустое значение, то данные берутся из собственной переменной.",
|
||||||
|
"prefix": "Символы до значения.",
|
||||||
|
"postfix": "Символы после значения."
|
||||||
},
|
},
|
||||||
"funcInfo": [
|
"funcInfo": [
|
||||||
{
|
{
|
||||||
@@ -89,10 +92,15 @@
|
|||||||
"params": ["Номер столбца первого символа"]
|
"params": ["Номер столбца первого символа"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "descr",
|
"name": "prefix",
|
||||||
"descr": "Задает приставку слева от значения",
|
"descr": "Задает приставку слева от значения",
|
||||||
"params": ["Строка"]
|
"params": ["Строка"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "postfix",
|
||||||
|
"descr": "Задает приставку справа от значения",
|
||||||
|
"params": ["Строка"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "id2show",
|
"name": "id2show",
|
||||||
"descr": "Задает ИД элемента, значение которого хотим отображать на экране",
|
"descr": "Задает ИД элемента, значение которого хотим отображать на экране",
|
||||||
|
|||||||
150
src/modules/display/Smi2_m/Modbus_master_for_Smi2_m.cpp
Normal file
150
src/modules/display/Smi2_m/Modbus_master_for_Smi2_m.cpp
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
#include "Modbus_master_for_Smi2_m.h"
|
||||||
|
|
||||||
|
Smi_display::Smi_display() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Modbus Master
|
||||||
|
void Smi_display::modbus_update() {
|
||||||
|
idle();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Smi_display::idle() {
|
||||||
|
static unsigned int packet_index;
|
||||||
|
|
||||||
|
unsigned int failed_connections = 0;
|
||||||
|
|
||||||
|
unsigned char current_connection;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (packet_index == total_no_of_packets) // wrap around to the beginning
|
||||||
|
packet_index = 0;
|
||||||
|
|
||||||
|
// proceed to the next packet
|
||||||
|
packet = &packetArray[packet_index];
|
||||||
|
|
||||||
|
// get the current connection status
|
||||||
|
current_connection = packet->connection;
|
||||||
|
|
||||||
|
if (!current_connection) {
|
||||||
|
// If all the connection attributes are false return
|
||||||
|
// immediately to the main sketch
|
||||||
|
if (++failed_connections == total_no_of_packets)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
packet_index++;
|
||||||
|
|
||||||
|
// if a packet has no connection get the next one
|
||||||
|
} while (!current_connection);
|
||||||
|
|
||||||
|
constructPacket();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Smi_display::constructPacket() {
|
||||||
|
packet->requests++;
|
||||||
|
frame[0] = packet->id;
|
||||||
|
frame[1] = packet->function;
|
||||||
|
frame[2] = packet->address >> 8; // address Hi
|
||||||
|
frame[3] = packet->address & 0xFF; // address Lo
|
||||||
|
frame[4] = packet->data >> 8; // MSB
|
||||||
|
frame[5] = packet->data & 0xFF; // LSB
|
||||||
|
|
||||||
|
unsigned char frameSize;
|
||||||
|
|
||||||
|
// construct the frame according to the modbus function
|
||||||
|
if (packet->function == PRESET_MULTIPLE_REGISTERS)
|
||||||
|
frameSize = construct_F16();
|
||||||
|
else // else functions 1,2,3,4,5 & 6 is assumed. They all share the exact same request format.
|
||||||
|
frameSize = 8; // the request is always 8 bytes in size for the above mentioned functions.
|
||||||
|
|
||||||
|
unsigned int crc16 = calculateCRC(frameSize - 2);
|
||||||
|
frame[frameSize - 2] = crc16 >> 8; // split crc into 2 bytes
|
||||||
|
frame[frameSize - 1] = crc16 & 0xFF;
|
||||||
|
sendPacket(frameSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char Smi_display::construct_F16() {
|
||||||
|
unsigned char no_of_bytes = packet->data * 2;
|
||||||
|
|
||||||
|
// first 6 bytes of the array + no_of_bytes + 2 bytes CRC
|
||||||
|
frame[6] = no_of_bytes; // number of bytes
|
||||||
|
unsigned char index = 7; // user data starts at index 7
|
||||||
|
unsigned char no_of_registers = packet->data;
|
||||||
|
/*unsigned*/ int temp;
|
||||||
|
|
||||||
|
for (unsigned char i = 0; i < no_of_registers; i++) {
|
||||||
|
temp = register_array[packet->local_start_address + i]; // get the data
|
||||||
|
frame[index] = temp >> 8;
|
||||||
|
index++;
|
||||||
|
frame[index] = temp & 0xFF;
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
unsigned char frameSize = (9 + no_of_bytes); // first 7 bytes of the array + 2 bytes CRC + noOfBytes
|
||||||
|
return frameSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Smi_display::modbus_configure(HardwareSerial* SerialPort,
|
||||||
|
long baud,
|
||||||
|
unsigned char byteFormat,
|
||||||
|
int rx,
|
||||||
|
int tx,
|
||||||
|
unsigned int _TxEnablePin,
|
||||||
|
Packet* _packets,
|
||||||
|
unsigned int _total_no_of_packets,
|
||||||
|
/*unsigned*/ int* _register_array) {
|
||||||
|
TxEnablePin = _TxEnablePin;
|
||||||
|
total_no_of_packets = _total_no_of_packets;
|
||||||
|
packetArray = _packets;
|
||||||
|
register_array = _register_array;
|
||||||
|
|
||||||
|
ModbusPort = SerialPort;
|
||||||
|
(*ModbusPort).begin(baud, byteFormat, rx, tx);
|
||||||
|
|
||||||
|
pinMode(TxEnablePin, OUTPUT);
|
||||||
|
digitalWrite(TxEnablePin, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Smi_display::modbus_construct(Packet* _packet,
|
||||||
|
unsigned char id,
|
||||||
|
unsigned char function,
|
||||||
|
unsigned int address,
|
||||||
|
unsigned int data,
|
||||||
|
unsigned int local_start_address) {
|
||||||
|
_packet->id = id;
|
||||||
|
_packet->function = function;
|
||||||
|
_packet->address = address;
|
||||||
|
_packet->data = data;
|
||||||
|
_packet->local_start_address = local_start_address;
|
||||||
|
_packet->connection = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int Smi_display::calculateCRC(unsigned char bufferSize) {
|
||||||
|
unsigned int temp, temp2, flag;
|
||||||
|
temp = 0xFFFF;
|
||||||
|
for (unsigned char i = 0; i < bufferSize; i++) {
|
||||||
|
temp = temp ^ frame[i];
|
||||||
|
for (unsigned char j = 1; j <= 8; j++) {
|
||||||
|
flag = temp & 0x0001;
|
||||||
|
temp >>= 1;
|
||||||
|
if (flag)
|
||||||
|
temp ^= 0xA001;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Reverse byte order.
|
||||||
|
temp2 = temp >> 8;
|
||||||
|
temp = (temp << 8) | temp2;
|
||||||
|
temp &= 0xFFFF;
|
||||||
|
// the returned value is already swapped
|
||||||
|
// crcLo byte is first & crcHi byte is last
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Smi_display::sendPacket(unsigned char bufferSize) {
|
||||||
|
digitalWrite(TxEnablePin, HIGH);
|
||||||
|
|
||||||
|
for (unsigned char i = 0; i < bufferSize; i++)
|
||||||
|
(*ModbusPort).write(frame[i]);
|
||||||
|
|
||||||
|
(*ModbusPort).flush();
|
||||||
|
|
||||||
|
digitalWrite(TxEnablePin, LOW);
|
||||||
|
}
|
||||||
71
src/modules/display/Smi2_m/Modbus_master_for_Smi2_m.h
Normal file
71
src/modules/display/Smi2_m/Modbus_master_for_Smi2_m.h
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "HardwareSerial.h"
|
||||||
|
|
||||||
|
#define PRESET_MULTIPLE_REGISTERS 16
|
||||||
|
#define BUFFER_SIZE 64
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
unsigned char id;
|
||||||
|
unsigned char function;
|
||||||
|
unsigned int address;
|
||||||
|
|
||||||
|
unsigned int data;
|
||||||
|
unsigned int local_start_address;
|
||||||
|
|
||||||
|
unsigned int requests;
|
||||||
|
unsigned int successful_requests;
|
||||||
|
unsigned int failed_requests;
|
||||||
|
unsigned int exception_errors;
|
||||||
|
unsigned int retries;
|
||||||
|
|
||||||
|
unsigned char connection;
|
||||||
|
|
||||||
|
} Packet;
|
||||||
|
|
||||||
|
class Smi_display {
|
||||||
|
public:
|
||||||
|
Smi_display();
|
||||||
|
|
||||||
|
~Smi_display();
|
||||||
|
|
||||||
|
public:
|
||||||
|
void modbus_update();
|
||||||
|
void modbus_construct(Packet* _packet,
|
||||||
|
unsigned char id,
|
||||||
|
unsigned char function,
|
||||||
|
unsigned int address,
|
||||||
|
unsigned int data,
|
||||||
|
unsigned _local_start_address);
|
||||||
|
|
||||||
|
void modbus_configure(HardwareSerial* SerialPort,
|
||||||
|
long baud,
|
||||||
|
unsigned char byteFormat,
|
||||||
|
int rx,
|
||||||
|
int tx,
|
||||||
|
unsigned int _TxEnablePin,
|
||||||
|
Packet* _packets,
|
||||||
|
unsigned int _total_no_of_packets,
|
||||||
|
/*unsigned*/ int* _register_array);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void idle();
|
||||||
|
void constructPacket();
|
||||||
|
unsigned char construct_F16();
|
||||||
|
unsigned int calculateCRC(unsigned char bufferSize);
|
||||||
|
void sendPacket(unsigned char bufferSize);
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned char state;
|
||||||
|
unsigned char retry_count;
|
||||||
|
unsigned int TxEnablePin;
|
||||||
|
unsigned char frame[BUFFER_SIZE];
|
||||||
|
unsigned char buffer;
|
||||||
|
unsigned int T1_5;
|
||||||
|
unsigned int frameDelay;
|
||||||
|
unsigned int total_no_of_packets;
|
||||||
|
Packet* packetArray;
|
||||||
|
Packet* packet;
|
||||||
|
/*unsigned*/ int* register_array;
|
||||||
|
HardwareSerial* ModbusPort;
|
||||||
|
};
|
||||||
71
src/modules/display/Smi2_m/Smi2_m.cpp
Normal file
71
src/modules/display/Smi2_m/Smi2_m.cpp
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
|
||||||
|
#include "Global.h"
|
||||||
|
#include "classes/IoTItem.h"
|
||||||
|
|
||||||
|
#include "Modbus_master_for_Smi2_m.h"
|
||||||
|
|
||||||
|
// Общая сумма доступной памяти на ведущем устройстве, чтобы хранить данные
|
||||||
|
#define TOTAL_NO_OF_REGISTERS 4
|
||||||
|
|
||||||
|
// This is the easiest way to create new packets
|
||||||
|
// Add as many as you want. TOTAL_NO_OF_PACKETS
|
||||||
|
// is automatically updated.
|
||||||
|
enum {
|
||||||
|
PACKET1,
|
||||||
|
TOTAL_NO_OF_PACKETS // leave this last entry
|
||||||
|
};
|
||||||
|
|
||||||
|
// Масив пакетов модбус
|
||||||
|
Packet packets[TOTAL_NO_OF_PACKETS];
|
||||||
|
|
||||||
|
// Массив хранения содержимого принятых и передающихся регистров
|
||||||
|
/*unsigned*/ int regs[TOTAL_NO_OF_REGISTERS];
|
||||||
|
|
||||||
|
class Smi2_m : public IoTItem {
|
||||||
|
private:
|
||||||
|
Smi_display* smi;
|
||||||
|
unsigned int _pin; // номер порта, управляющий передачей по RS-485
|
||||||
|
long int _baud; // скорость обмена, бит/с
|
||||||
|
int _rx, _tx; // номера ножек мк, к которым подключен UART
|
||||||
|
String _show;
|
||||||
|
int i = 10;
|
||||||
|
|
||||||
|
public:
|
||||||
|
public:
|
||||||
|
Smi2_m(String parameters) : IoTItem(parameters) {
|
||||||
|
smi = new Smi_display();
|
||||||
|
|
||||||
|
_pin = jsonReadInt(parameters, "pin");
|
||||||
|
_baud = jsonReadLInt(parameters, "baud");
|
||||||
|
_rx = jsonReadInt(parameters, "rx");
|
||||||
|
_tx = jsonReadInt(parameters, "tx");
|
||||||
|
// Настраиваем пакеты
|
||||||
|
// Шестой параметр - это индекс ячейки в массиве, размещенном в памяти ведущего устройства, в которую будет
|
||||||
|
// помещен результат или из которой будут браться данные для передачи в подчиненное устройство. В нашем коде - это массив reg
|
||||||
|
// Пакет,SLAVE адрес,функция модбус,адрес регистра,количесво запрашиваемых регистров,локальный адрес регистра.
|
||||||
|
// Пакет,SLAVE адрес,функция модбус,адрес регистра,данные,локальный адрес регистра.
|
||||||
|
smi->modbus_construct(&packets[PACKET1], 1, PRESET_MULTIPLE_REGISTERS, 4200, 1, 0);
|
||||||
|
smi->modbus_configure(&Serial, _baud, SERIAL_8N1, _rx, _tx, _pin, packets, TOTAL_NO_OF_PACKETS, regs);
|
||||||
|
|
||||||
|
jsonRead(parameters, "id2show", _show);
|
||||||
|
}
|
||||||
|
|
||||||
|
void doByInterval() {
|
||||||
|
if (smi) {
|
||||||
|
smi->modbus_update();
|
||||||
|
|
||||||
|
float tmpStr = getItemValue(_show).toFloat();
|
||||||
|
regs[0] = tmpStr * 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~Smi2_m(){};
|
||||||
|
};
|
||||||
|
|
||||||
|
void* getAPI_Smi2_m(String subtype, String param) {
|
||||||
|
if (subtype == F("Smi2_m")) {
|
||||||
|
return new Smi2_m(param);
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
56
src/modules/display/Smi2_m/modinfo.json
Normal file
56
src/modules/display/Smi2_m/modinfo.json
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"menuSection": "Экраны",
|
||||||
|
"configItem": [
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "Smi2_m",
|
||||||
|
"type": "Writing",
|
||||||
|
"subtype": "Smi2_m",
|
||||||
|
"id": "Smi",
|
||||||
|
"widget": "",
|
||||||
|
"page": "Дисплеи",
|
||||||
|
"descr": "",
|
||||||
|
"int": 2,
|
||||||
|
"pin": 4,
|
||||||
|
"id2show": "id датчика",
|
||||||
|
"baud": "9600",
|
||||||
|
"rx": "16",
|
||||||
|
"tx": "17"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"about": {
|
||||||
|
"moduleName": "Smi2_m",
|
||||||
|
"moduleVersion": "1.0",
|
||||||
|
"usedRam": {
|
||||||
|
"esp32_4mb": 15,
|
||||||
|
"esp8266_4mb": 15
|
||||||
|
},
|
||||||
|
"moduleDesc": "Позволяет вывести индикацию на семисегментный индикатор по Modbus (Работает в Slave режиме, Read Holding Registers 0х03)",
|
||||||
|
"propInfo": {
|
||||||
|
"int": "Период времени в секундах обновления информации на экране по конкретному элементу.",
|
||||||
|
"pin": "номер порта, управляющий передачей по RS-485",
|
||||||
|
"id2show": "id элемента конфигурации.",
|
||||||
|
"baud": "скорость обмена, бит/с"
|
||||||
|
},
|
||||||
|
"funcInfo": [
|
||||||
|
{
|
||||||
|
"name": "descr",
|
||||||
|
"descr": "Задает приставку слева от значения",
|
||||||
|
"params": [
|
||||||
|
"Строка"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "id2show",
|
||||||
|
"descr": "Задает ИД элемента, значение которого хотим отображать на экране",
|
||||||
|
"params": [
|
||||||
|
"Имя элемента конфигурации"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"defActive": true,
|
||||||
|
"usedLibs": {
|
||||||
|
"esp32_4mb": []
|
||||||
|
}
|
||||||
|
}
|
||||||
86
src/modules/display/TM16XX/TM16XX.cpp
Normal file
86
src/modules/display/TM16XX/TM16XX.cpp
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
#include "Global.h"
|
||||||
|
#include "classes/IoTItem.h"
|
||||||
|
|
||||||
|
#include <TM1637.h>
|
||||||
|
#include <TM1638.h>
|
||||||
|
#include <TM16xxDisplay.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class TM16XX : public IoTItem {
|
||||||
|
private:
|
||||||
|
TM16xxDisplay *_display = nullptr;
|
||||||
|
TM16xx *_module = nullptr;
|
||||||
|
std::vector<String> _ids2show;
|
||||||
|
|
||||||
|
public:
|
||||||
|
TM16XX(String parameters) : IoTItem(parameters) {
|
||||||
|
//jsonRead(parameters, "id2show", _id2show);
|
||||||
|
|
||||||
|
int DIO, CLK, STB, chip, numDigits, intensity;
|
||||||
|
bool onoff;
|
||||||
|
String id2show;
|
||||||
|
jsonRead(parameters, "DIO", DIO);
|
||||||
|
jsonRead(parameters, "CLK", CLK);
|
||||||
|
jsonRead(parameters, "STB", STB);
|
||||||
|
jsonRead(parameters, "chip", chip);
|
||||||
|
jsonRead(parameters, "numDigits", numDigits);
|
||||||
|
jsonRead(parameters, "intensity", intensity);
|
||||||
|
jsonRead(parameters, "on", onoff);
|
||||||
|
|
||||||
|
jsonRead(parameters, "id2show", id2show);
|
||||||
|
if (id2show != "") _ids2show = splitStr(id2show, ",");
|
||||||
|
|
||||||
|
if (chip == 1637) {
|
||||||
|
_module = new TM1637(DIO, CLK, numDigits);
|
||||||
|
} else if (chip == 1638) {
|
||||||
|
_module = new TM1638(DIO, CLK, STB, numDigits);
|
||||||
|
}
|
||||||
|
_module->setupDisplay(onoff, intensity);
|
||||||
|
_display = new TM16xxDisplay(_module, numDigits);
|
||||||
|
}
|
||||||
|
|
||||||
|
void doByInterval() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void setValue(const IoTValue& Value, bool genEvent = true) {
|
||||||
|
if (_display == nullptr) return;
|
||||||
|
|
||||||
|
value = Value;
|
||||||
|
_display->println(getValue());
|
||||||
|
IoTItem::setValue(Value, genEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void onRegEvent(IoTItem* eventItem) {
|
||||||
|
if (_display == nullptr) return;
|
||||||
|
if (!eventItem || _ids2show.size() == 0) return;
|
||||||
|
|
||||||
|
if (strInVector(eventItem->getID(), _ids2show)) {
|
||||||
|
if (_ids2show.size() == 1) {
|
||||||
|
_display->println(eventItem->getValue());
|
||||||
|
} else {
|
||||||
|
_display->println();
|
||||||
|
for (int i = 0; i < _ids2show.size(); i++) {
|
||||||
|
IoTItem* item = findIoTItem(_ids2show[i]);
|
||||||
|
if (item) {
|
||||||
|
_display->print(item->getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~TM16XX() {
|
||||||
|
delete _display;
|
||||||
|
delete _module;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
void *getAPI_TM16XX(String subtype, String param) {
|
||||||
|
if (subtype == F("TM16XX")) {
|
||||||
|
return new TM16XX(param);
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
133
src/modules/display/TM16XX/modinfo.json
Normal file
133
src/modules/display/TM16XX/modinfo.json
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
{
|
||||||
|
"menuSection": "Экраны",
|
||||||
|
|
||||||
|
"configItem": [{
|
||||||
|
"global": 0,
|
||||||
|
"name": "7 сегментный дисплей TM16XX",
|
||||||
|
"type": "Writing",
|
||||||
|
"subtype": "TM16XX",
|
||||||
|
"id": "tm",
|
||||||
|
"widget": "inputTxt",
|
||||||
|
"page": "Экраны",
|
||||||
|
"descr": "Экран",
|
||||||
|
"round": 0,
|
||||||
|
|
||||||
|
"chip": 1637,
|
||||||
|
"numDigits": 4,
|
||||||
|
"DIO": "13",
|
||||||
|
"CLK": "14",
|
||||||
|
"STB": "12",
|
||||||
|
"intensity": "5",
|
||||||
|
"on": "1",
|
||||||
|
"id2show": ""
|
||||||
|
}],
|
||||||
|
|
||||||
|
"about": {
|
||||||
|
"authorName": "Ilya Belyakov",
|
||||||
|
"authorContact": "https://t.me/Biveraxe",
|
||||||
|
"authorGit": "https://github.com/biveraxe",
|
||||||
|
"specialThanks": "",
|
||||||
|
"moduleName": "TM16XX",
|
||||||
|
"moduleVersion": "1.0",
|
||||||
|
"usedRam": {
|
||||||
|
"esp32_4mb": 15,
|
||||||
|
"esp8266_4mb": 15
|
||||||
|
},
|
||||||
|
"moduleDesc": "Позволяет выводить на 7 сегментный экран серии TM16XX (TM1637, TM1638). Может быть расширен до поддержки TM1616, TM1620, TM1628, TM1630, TM1637, TM1638, TM1640, TM1650, TM1652 и TM1668",
|
||||||
|
"propInfo": {
|
||||||
|
"int": "Период времени в секундах обновления информации на экране по конкретному элементу.",
|
||||||
|
"chip": "Номер чипа TM1637 или TM1638",
|
||||||
|
"numDigits": "Число цифр на дисплее",
|
||||||
|
"DIO": "Номер пина данных",
|
||||||
|
"CLK": "Номер пина часового сигнала",
|
||||||
|
"intensity": "Яркость 0-7",
|
||||||
|
"on": "Вкл/выкл при старте 1/0",
|
||||||
|
"STB": "Номер пина стекового сигнала - не используется на определенных моделях",
|
||||||
|
"id2show": "id элемента конфигурации для отображения. Если пустая строка, то дисплей использует свою переменную. Если указать несколько значений через запятую, то все данные будут последовательно выводиться в строку."
|
||||||
|
},
|
||||||
|
"funcInfo": [
|
||||||
|
{
|
||||||
|
"name": "noBacklight",
|
||||||
|
"descr": "Выключить подсветку",
|
||||||
|
"params": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "backlight",
|
||||||
|
"descr": "Включить подсветку",
|
||||||
|
"params": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "noDisplay",
|
||||||
|
"descr": "Спрятать все данные",
|
||||||
|
"params": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "display",
|
||||||
|
"descr": "Показать данные на экране",
|
||||||
|
"params": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "toggle",
|
||||||
|
"descr": "Переключает видимость значений на экране",
|
||||||
|
"params": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "x",
|
||||||
|
"descr": "Устанавливает первую координату",
|
||||||
|
"params": ["Номер строки первого символа"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "y",
|
||||||
|
"descr": "Устанавливает вторую координату",
|
||||||
|
"params": ["Номер столбца первого символа"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "descr",
|
||||||
|
"descr": "Задает приставку слева от значения",
|
||||||
|
"params": ["Строка"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "id2show",
|
||||||
|
"descr": "Задает ИД элемента, значение которого хотим отображать на экране",
|
||||||
|
"params": ["Имя элемента конфигурации"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
"defActive": true,
|
||||||
|
|
||||||
|
"usedLibs": {
|
||||||
|
"esp32_4mb": [
|
||||||
|
"https://github.com/maxint-rd/TM16xx",
|
||||||
|
"adafruit/Adafruit GFX Library @ ^1.11.5"
|
||||||
|
],
|
||||||
|
"esp8266_4mb": [
|
||||||
|
"https://github.com/maxint-rd/TM16xx",
|
||||||
|
"adafruit/Adafruit GFX Library @ ^1.11.5"
|
||||||
|
],
|
||||||
|
"esp8266_1mb": [
|
||||||
|
"https://github.com/maxint-rd/TM16xx",
|
||||||
|
"adafruit/Adafruit GFX Library @ ^1.11.5"
|
||||||
|
],
|
||||||
|
"esp8266_1mb_ota": [
|
||||||
|
"https://github.com/maxint-rd/TM16xx",
|
||||||
|
"adafruit/Adafruit GFX Library @ ^1.11.5"
|
||||||
|
],
|
||||||
|
"esp8285_1mb": [
|
||||||
|
"https://github.com/maxint-rd/TM16xx",
|
||||||
|
"adafruit/Adafruit GFX Library @ ^1.11.5"
|
||||||
|
],
|
||||||
|
"esp8285_1mb_ota": [
|
||||||
|
"https://github.com/maxint-rd/TM16xx",
|
||||||
|
"adafruit/Adafruit GFX Library @ ^1.11.5"
|
||||||
|
],
|
||||||
|
"esp8266_2mb": [
|
||||||
|
"https://github.com/maxint-rd/TM16xx",
|
||||||
|
"adafruit/Adafruit GFX Library @ ^1.11.5"
|
||||||
|
],
|
||||||
|
"esp8266_2mb_ota": [
|
||||||
|
"https://github.com/maxint-rd/TM16xx",
|
||||||
|
"adafruit/Adafruit GFX Library @ ^1.11.5"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -39,18 +39,18 @@ class RTC : public IoTItem {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
ulong getRtcUnixTime() {
|
unsigned long getRtcUnixTime() {
|
||||||
return _watch->gettimeUnix();
|
return _watch->gettimeUnix() - jsonReadInt(settingsFlashJson, F("timezone")) * 60 * 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
void onModuleOrder(String &key, String &value) {
|
void onModuleOrder(String &key, String &value) {
|
||||||
if (key == "setUTime") {
|
if (key == "setUTime") {
|
||||||
char *stopstring;
|
char *stopstring;
|
||||||
ulong ut = strtoul(value.c_str(), &stopstring, 10);
|
unsigned long ut = strtoul(value.c_str(), &stopstring, 10);
|
||||||
_watch->settimeUnix(ut);
|
_watch->settimeUnix(ut);
|
||||||
SerialPrint("i", F("RTC"), "Устанавливаем время: " + value);
|
SerialPrint("i", F("RTC"), "Устанавливаем время: " + value);
|
||||||
} else if (key == "setSysTime") {
|
} else if (key == "setSysTime") {
|
||||||
_watch->settimeUnix(unixTime);
|
_watch->settimeUnix(unixTime + jsonReadInt(settingsFlashJson, F("timezone")) * 60 * 60);
|
||||||
SerialPrint("i", F("RTC"), F("Запоминаем системное время"));
|
SerialPrint("i", F("RTC"), F("Запоминаем системное время"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
432
src/modules/sensors/ld2410/ld2410.cpp
Normal file
432
src/modules/sensors/ld2410/ld2410.cpp
Normal file
@@ -0,0 +1,432 @@
|
|||||||
|
#include "Global.h"
|
||||||
|
#include "classes/IoTItem.h"
|
||||||
|
|
||||||
|
#define MONITOR_SERIAL Serial
|
||||||
|
#define RADAR_SERIAL Serial1
|
||||||
|
// #define RADAR_RX_PIN 32
|
||||||
|
// #define RADAR_TX_PIN 33
|
||||||
|
|
||||||
|
#include <ld2410.h>
|
||||||
|
// ld2410 radar;
|
||||||
|
|
||||||
|
ld2410 *radar = nullptr;
|
||||||
|
|
||||||
|
ld2410 *instanceradar(uint8_t _rx, uint8_t _tx)
|
||||||
|
{
|
||||||
|
if (!radar)
|
||||||
|
{ // Если библиотека ранее инициализировалась, т о просто вернем указатель
|
||||||
|
// Инициализируем библиотеку
|
||||||
|
radar = new ld2410();
|
||||||
|
// radar->begin(); // При необходимости делаем begin библиотеке
|
||||||
|
|
||||||
|
RADAR_SERIAL.begin(256000, SERIAL_8N1, _rx, _tx); // UART for monitoring the radar
|
||||||
|
|
||||||
|
if (radar->begin(RADAR_SERIAL))
|
||||||
|
{
|
||||||
|
SerialPrint("i", "LD2410", "Radar sensor подключен");
|
||||||
|
SerialPrint("i", "LD2410", "Connect LD2410 radar TX to GPIO: " + String(_rx));
|
||||||
|
SerialPrint("i", "LD2410", "Connect LD2410 radar RX to GPIO: " + String(_tx));
|
||||||
|
SerialPrint("i", "LD2410", "LD2410 firmware version: " + String(radar->firmware_major_version));
|
||||||
|
SerialPrint("i", "LD2410", "LD2410 firmware version: " + String(radar->firmware_minor_version));
|
||||||
|
SerialPrint("i", "LD2410", "LD2410 firmware version: " + String(radar->firmware_bugfix_version));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("i", "LD2410", "Radar sensor не подключен");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return radar;
|
||||||
|
}
|
||||||
|
|
||||||
|
int presence = 0;
|
||||||
|
int presence_last = 0;
|
||||||
|
int movement = 0;
|
||||||
|
int movement_last = 0;
|
||||||
|
int distance = 0;
|
||||||
|
int distance_last = 0;
|
||||||
|
int energy = 0;
|
||||||
|
int energy_last = 0;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
|
uint32_t lastReadingP = 0;
|
||||||
|
uint32_t lastReadingM = 0;
|
||||||
|
uint32_t lastReadingD = 0;
|
||||||
|
uint32_t lastReadingE = 0;
|
||||||
|
bool radarConnected = false;
|
||||||
|
|
||||||
|
// датчик присутствия
|
||||||
|
class ld2410m : public IoTItem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
int _ticker;
|
||||||
|
uint8_t _rx, _tx;
|
||||||
|
|
||||||
|
public:
|
||||||
|
//=======================================================================================================
|
||||||
|
// setup()
|
||||||
|
|
||||||
|
ld2410m(String parameters) : IoTItem(parameters)
|
||||||
|
{
|
||||||
|
jsonRead(parameters, "ticker", _ticker);
|
||||||
|
String tmp;
|
||||||
|
jsonRead(parameters, "RX", tmp);
|
||||||
|
_rx = tmp.toInt();
|
||||||
|
jsonRead(parameters, "TX", tmp);
|
||||||
|
_tx = tmp.toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
instanceradar(_rx, _tx)->read();
|
||||||
|
if (instanceradar(_rx, _tx)->isConnected() && millis() - lastReadingP > 1000) // Report every 1000ms
|
||||||
|
{
|
||||||
|
lastReadingP = millis();
|
||||||
|
err = 0;
|
||||||
|
presence = instanceradar(_rx, _tx)->presenceDetected();
|
||||||
|
if (instanceradar(_rx, _tx)->stationaryTargetDetected())
|
||||||
|
{
|
||||||
|
movement = 0;
|
||||||
|
distance = instanceradar(_rx, _tx)->stationaryTargetDistance();
|
||||||
|
energy = instanceradar(_rx, _tx)->stationaryTargetEnergy();
|
||||||
|
}
|
||||||
|
if (instanceradar(_rx, _tx)->movingTargetDetected())
|
||||||
|
{
|
||||||
|
movement = 1;
|
||||||
|
distance = instanceradar(_rx, _tx)->movingTargetDistance();
|
||||||
|
energy = instanceradar(_rx, _tx)->movingTargetEnergy();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (presence != presence_last)
|
||||||
|
{
|
||||||
|
value.valD = int(presence);
|
||||||
|
regEvent(value.valD, "ld2410m");
|
||||||
|
presence_last = presence;
|
||||||
|
// SerialPrint("i", "LD2410", "присутствие: " + String(int(presence)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (presence && movement != movement_last)
|
||||||
|
{
|
||||||
|
value.valD = int(presence);
|
||||||
|
regEvent(value.valD, "ld2410m");
|
||||||
|
}
|
||||||
|
if (presence && _ticker)
|
||||||
|
{
|
||||||
|
value.valD = int(presence);
|
||||||
|
regEvent(value.valD, "ld2410m");
|
||||||
|
presence_last = presence;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!instanceradar(_rx, _tx)->isConnected())
|
||||||
|
{
|
||||||
|
if (err == 0)
|
||||||
|
{
|
||||||
|
// value.valD = "Err";
|
||||||
|
// regEvent(value.valD, "ld2410m");
|
||||||
|
// SerialPrint("E", "LD2410", "Radar sensor ошибка получения данных");
|
||||||
|
}
|
||||||
|
err = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IoTValue execute(String command, std::vector<IoTValue> ¶m)
|
||||||
|
{
|
||||||
|
if (command == "setmaxvalues")
|
||||||
|
{
|
||||||
|
if (param[0].isDecimal && param[1].isDecimal && param[2].isDecimal)
|
||||||
|
{
|
||||||
|
uint8_t newMovingMaxDistance = param[0].valD;
|
||||||
|
uint8_t newStationaryMaxDistance = param[1].valD;
|
||||||
|
uint16_t inactivityTimer = param[2].valD;
|
||||||
|
if (newMovingMaxDistance > 0 && newStationaryMaxDistance > 0 && newMovingMaxDistance <= 8 && newStationaryMaxDistance <= 8)
|
||||||
|
{
|
||||||
|
if (instanceradar(_rx, _tx)->setMaxValues(newMovingMaxDistance, newStationaryMaxDistance, inactivityTimer))
|
||||||
|
{
|
||||||
|
SerialPrint("i", "LD2410", "Параметры установлены. Перезапустите датчик");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("E", "LD2410", "Ошибка записи параметров.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("E", "LD2410", "Заданы не корректные параметры. Диапазон от 1 до 8 ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (command == "setsensitivity")
|
||||||
|
{
|
||||||
|
if (param[0].isDecimal && param[1].isDecimal && param[2].isDecimal)
|
||||||
|
{
|
||||||
|
uint8_t gate = param[0].valD;
|
||||||
|
uint8_t motionSensitivity = param[1].valD;
|
||||||
|
uint16_t stationarySensitivity = param[2].valD;
|
||||||
|
if (motionSensitivity >= 0 && stationarySensitivity >= 0 && motionSensitivity <= 100 && stationarySensitivity <= 100)
|
||||||
|
{
|
||||||
|
if (instanceradar(_rx, _tx)->setGateSensitivityThreshold(gate, motionSensitivity, stationarySensitivity))
|
||||||
|
{
|
||||||
|
SerialPrint("i", "LD2410", "Параметры установлены. Перезапустите датчик");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("E", "LD2410", "Ошибка записи параметров.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("E", "LD2410", "Заданы не корректные параметры. Диапазон от 1 до 100 ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (command == "enableengineeringmode")
|
||||||
|
{
|
||||||
|
if (instanceradar(_rx, _tx)->requestStartEngineeringMode())
|
||||||
|
{
|
||||||
|
SerialPrint("i", "LD2410", "Параметры установлены. Перезапустите датчик");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("E", "LD2410", "Ошибка записи параметров.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (command == "disableengineeringmode")
|
||||||
|
{
|
||||||
|
if (instanceradar(_rx, _tx)->requestEndEngineeringMode())
|
||||||
|
{
|
||||||
|
SerialPrint("i", "LD2410", "Параметры установлены. Перезапустите датчик");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("E", "LD2410", "Ошибка записи параметров.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (command == "restart")
|
||||||
|
{
|
||||||
|
if (instanceradar(_rx, _tx)->requestRestart())
|
||||||
|
{
|
||||||
|
SerialPrint("i", "LD2410", "Датчик перезапущен");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("E", "LD2410", "Ошибка перезапуска датчика.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (command == "readversion")
|
||||||
|
{
|
||||||
|
if (instanceradar(_rx, _tx)->requestFirmwareVersion())
|
||||||
|
{
|
||||||
|
SerialPrint("i", "LD2410", (String)instanceradar(_rx, _tx)->firmware_major_version);
|
||||||
|
SerialPrint("i", "LD2410", (String)instanceradar(_rx, _tx)->firmware_minor_version);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("E", "LD2410", "Ошибка получения версии.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (command == "factoryreset")
|
||||||
|
{
|
||||||
|
if (instanceradar(_rx, _tx)->requestFactoryReset())
|
||||||
|
{
|
||||||
|
SerialPrint("i", "LD2410", "Параметры установлены. Перезапустите датчик");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SerialPrint("E", "LD2410", "Ошибка сброса параметров.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~ld2410m(){};
|
||||||
|
};
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// движение / стационарное - присутствие
|
||||||
|
class ld2410t : public IoTItem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint8_t _rx, _tx;
|
||||||
|
|
||||||
|
public:
|
||||||
|
//=======================================================================================================
|
||||||
|
// setup()
|
||||||
|
|
||||||
|
ld2410t(String parameters) : IoTItem(parameters)
|
||||||
|
{
|
||||||
|
String tmp;
|
||||||
|
jsonRead(parameters, "RX", tmp);
|
||||||
|
_rx = tmp.toInt();
|
||||||
|
jsonRead(parameters, "TX", tmp);
|
||||||
|
_tx = tmp.toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
instanceradar(_rx, _tx)->read();
|
||||||
|
if (instanceradar(_rx, _tx)->isConnected() && millis() - lastReadingM > 1000) // Report every 1000ms
|
||||||
|
{
|
||||||
|
lastReadingM = millis();
|
||||||
|
err = 0;
|
||||||
|
presence = instanceradar(_rx, _tx)->presenceDetected();
|
||||||
|
if (instanceradar(_rx, _tx)->stationaryTargetDetected())
|
||||||
|
{
|
||||||
|
movement = 0;
|
||||||
|
// distance = instanceradar(_rx, _tx)->stationaryTargetDistance();
|
||||||
|
// energy = instanceradar(_rx, _tx)->stationaryTargetEnergy();
|
||||||
|
}
|
||||||
|
if (instanceradar(_rx, _tx)->movingTargetDetected())
|
||||||
|
{
|
||||||
|
movement = 1;
|
||||||
|
// distance = instanceradar(_rx, _tx)->movingTargetDistance();
|
||||||
|
// energy = instanceradar(_rx, _tx)->movingTargetEnergy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (presence == 0 && movement_last != 0)
|
||||||
|
{
|
||||||
|
movement = 0;
|
||||||
|
}
|
||||||
|
if (movement != movement_last)
|
||||||
|
{
|
||||||
|
value.valD = int(movement);
|
||||||
|
regEvent(value.valD, "ld2410t");
|
||||||
|
movement_last = movement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
~ld2410t(){};
|
||||||
|
};
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// дистанция
|
||||||
|
class ld2410d : public IoTItem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint8_t _rx, _tx;
|
||||||
|
|
||||||
|
public:
|
||||||
|
//=======================================================================================================
|
||||||
|
// setup()
|
||||||
|
|
||||||
|
ld2410d(String parameters) : IoTItem(parameters)
|
||||||
|
{
|
||||||
|
String tmp;
|
||||||
|
jsonRead(parameters, "RX", tmp);
|
||||||
|
_rx = tmp.toInt();
|
||||||
|
jsonRead(parameters, "TX", tmp);
|
||||||
|
_tx = tmp.toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
instanceradar(_rx, _tx)->read();
|
||||||
|
if (instanceradar(_rx, _tx)->isConnected() && millis() - lastReadingD > 1000) // Report every 1000ms
|
||||||
|
{
|
||||||
|
lastReadingD = millis();
|
||||||
|
err = 0;
|
||||||
|
presence = instanceradar(_rx, _tx)->presenceDetected();
|
||||||
|
if (instanceradar(_rx, _tx)->stationaryTargetDetected())
|
||||||
|
{
|
||||||
|
// movement = 0;
|
||||||
|
distance = instanceradar(_rx, _tx)->stationaryTargetDistance();
|
||||||
|
// energy = instanceradar(_rx, _tx)->stationaryTargetEnergy();
|
||||||
|
}
|
||||||
|
if (instanceradar(_rx, _tx)->movingTargetDetected())
|
||||||
|
{
|
||||||
|
// movement = 1;
|
||||||
|
distance = instanceradar(_rx, _tx)->movingTargetDistance();
|
||||||
|
// energy = instanceradar(_rx, _tx)->movingTargetEnergy();
|
||||||
|
}
|
||||||
|
if (presence == 0 && distance_last != 0)
|
||||||
|
{
|
||||||
|
distance = 0;
|
||||||
|
}
|
||||||
|
if (distance != distance_last)
|
||||||
|
{
|
||||||
|
value.valD = int(distance);
|
||||||
|
regEvent(value.valD, "ld2410d");
|
||||||
|
distance_last = distance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~ld2410d(){};
|
||||||
|
};
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// энергия
|
||||||
|
class ld2410e : public IoTItem
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint8_t _rx, _tx;
|
||||||
|
|
||||||
|
public:
|
||||||
|
//=======================================================================================================
|
||||||
|
// setup()
|
||||||
|
|
||||||
|
ld2410e(String parameters) : IoTItem(parameters)
|
||||||
|
{
|
||||||
|
String tmp;
|
||||||
|
jsonRead(parameters, "RX", tmp);
|
||||||
|
_rx = tmp.toInt();
|
||||||
|
jsonRead(parameters, "TX", tmp);
|
||||||
|
_tx = tmp.toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
instanceradar(_rx, _tx)->read();
|
||||||
|
if (instanceradar(_rx, _tx)->isConnected() && millis() - lastReadingE > 1000) // Report every 1000ms
|
||||||
|
{
|
||||||
|
lastReadingE = millis();
|
||||||
|
err = 0;
|
||||||
|
presence = instanceradar(_rx, _tx)->presenceDetected();
|
||||||
|
if (instanceradar(_rx, _tx)->stationaryTargetDetected())
|
||||||
|
{
|
||||||
|
// movement = 0;
|
||||||
|
// distance = instanceradar(_rx, _tx)->stationaryTargetDistance();
|
||||||
|
energy = instanceradar(_rx, _tx)->stationaryTargetEnergy();
|
||||||
|
}
|
||||||
|
if (instanceradar(_rx, _tx)->movingTargetDetected())
|
||||||
|
{
|
||||||
|
// movement = 1;
|
||||||
|
// distance = instanceradar(_rx, _tx)->movingTargetDistance();
|
||||||
|
energy = instanceradar(_rx, _tx)->movingTargetEnergy();
|
||||||
|
}
|
||||||
|
if (presence == 0 && energy_last != 0)
|
||||||
|
{
|
||||||
|
energy = 0;
|
||||||
|
}
|
||||||
|
if (energy != energy_last)
|
||||||
|
{
|
||||||
|
value.valD = int(energy);
|
||||||
|
regEvent(value.valD, "ld2410e");
|
||||||
|
// value = Value;
|
||||||
|
// regEvent((String)(int)value.valD, F("ld2410e"), false, true);
|
||||||
|
// SerialPrint("i", "LD2410", "Radar sensor энергия: " + String(energy));
|
||||||
|
energy_last = energy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~ld2410e(){};
|
||||||
|
};
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
void *getAPI_ld2410(String subtype, String param)
|
||||||
|
{
|
||||||
|
if (subtype == F("ld2410m"))
|
||||||
|
{
|
||||||
|
return new ld2410m(param);
|
||||||
|
}
|
||||||
|
else if (subtype == F("ld2410t"))
|
||||||
|
{
|
||||||
|
return new ld2410t(param);
|
||||||
|
}
|
||||||
|
else if (subtype == F("ld2410d"))
|
||||||
|
{
|
||||||
|
return new ld2410d(param);
|
||||||
|
}
|
||||||
|
else if (subtype == F("ld2410e"))
|
||||||
|
{
|
||||||
|
return new ld2410e(param);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
92
src/modules/sensors/ld2410/modinfo.json
Normal file
92
src/modules/sensors/ld2410/modinfo.json
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
{
|
||||||
|
"menuSection": "Сенсоры",
|
||||||
|
"configItem": [
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "LD2410 Датчик присутствия",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "ld2410m",
|
||||||
|
"id": "ld2410m",
|
||||||
|
"widget": "anydataDef",
|
||||||
|
"page": "Сенсоры",
|
||||||
|
"descr": "Присутствие",
|
||||||
|
"RX": 32,
|
||||||
|
"TX": 33,
|
||||||
|
"val": 0,
|
||||||
|
"round": 0,
|
||||||
|
"ticker": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "LD2410 подвижность объета",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "ld2410t",
|
||||||
|
"id": "ld2410t",
|
||||||
|
"widget": "anydataDef",
|
||||||
|
"page": "Сенсоры",
|
||||||
|
"descr": "Движение",
|
||||||
|
"RX": 32,
|
||||||
|
"TX": 33,
|
||||||
|
"val": 0,
|
||||||
|
"round": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "LD2410 дистанция до объекта",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "ld2410d",
|
||||||
|
"id": "ld2410d",
|
||||||
|
"widget": "anydataCm",
|
||||||
|
"page": "Сенсоры",
|
||||||
|
"descr": "Дистанция",
|
||||||
|
"RX": 32,
|
||||||
|
"TX": 33,
|
||||||
|
"val": 0,
|
||||||
|
"round": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"global": 0,
|
||||||
|
"name": "LD2410 отраженная энергия",
|
||||||
|
"type": "Reading",
|
||||||
|
"subtype": "ld2410e",
|
||||||
|
"id": "ld2410e",
|
||||||
|
"widget": "anydataHum",
|
||||||
|
"page": "Сенсоры",
|
||||||
|
"descr": "Энергия",
|
||||||
|
"RX": 32,
|
||||||
|
"TX": 33,
|
||||||
|
"val": 0,
|
||||||
|
"round": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"about": {
|
||||||
|
"authorName": "AVAKS",
|
||||||
|
"authorContact": "https://t.me/avaks",
|
||||||
|
"authorGit": "https://github.com/avaksru",
|
||||||
|
"exampleURL": "https://iotmanager.org/wiki",
|
||||||
|
"specialThanks": "Mitchel https://t.me/Mit4bmw",
|
||||||
|
"moduleName": "ld2410",
|
||||||
|
"moduleVersion": "1.0",
|
||||||
|
"usedRam": {
|
||||||
|
"esp32_4mb": 15,
|
||||||
|
"esp8266_4mb": 0
|
||||||
|
},
|
||||||
|
"subTypes": [
|
||||||
|
"ld2410m",
|
||||||
|
"ld2410t",
|
||||||
|
"ld2410d",
|
||||||
|
"ld2410e"
|
||||||
|
],
|
||||||
|
"title": "Радарный датчик присутствия человека Hi-Link HLK-LD2410",
|
||||||
|
"moduleDesc": "Умный датчик, который измеряет расстояние, определяет стоит объект или двигается. Умеет разбивать зоны движения (всего можно до 8 зон задать). ",
|
||||||
|
"propInfo": {
|
||||||
|
"ticker": "1 - генерирует событие каждую секунду пока обнаружено присутствие, 0 - событие генереруется только один раз когда присутствие обнаружено или когда обьект вышел из поля обнаружения датчика"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"defActive": false,
|
||||||
|
"usedLibs": {
|
||||||
|
"esp32_4mb": [
|
||||||
|
"ncmreynolds/ld2410@^0.1.3"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -238,6 +238,18 @@ int jsonReadInt(const String& json, String name, bool e) {
|
|||||||
return doc[name].as<int>();
|
return doc[name].as<int>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long int jsonReadLInt(const String& json, String name, bool e) {
|
||||||
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
|
DeserializationError error = deserializeJson(doc, json);
|
||||||
|
if (error) {
|
||||||
|
if (e) {
|
||||||
|
SerialPrint("E", F("jsonRead"), error.f_str());
|
||||||
|
jsonErrorDetected();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return doc[name].as<long int>();
|
||||||
|
}
|
||||||
|
|
||||||
// depricated========================================================================
|
// depricated========================================================================
|
||||||
String jsonWriteStr(String& json, String name, String value, bool e) {
|
String jsonWriteStr(String& json, String name, String value, bool e) {
|
||||||
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ void stInit() {
|
|||||||
|
|
||||||
void updateDeviceStatus() {
|
void updateDeviceStatus() {
|
||||||
String ret;
|
String ret;
|
||||||
String serverIP;
|
String serverIP = "http://iotmanager.org";
|
||||||
jsonRead(settingsFlashJson, F("serverip"), serverIP);
|
// jsonRead(settingsFlashJson, F("serverip"), serverIP);
|
||||||
String url = serverIP + F("/projects/esprebootstat.php");
|
String url = serverIP + F("/projects/esprebootstat.php");
|
||||||
// SerialPrint("i", "Stat", "url " + url);
|
// SerialPrint("i", "Stat", "url " + url);
|
||||||
if ((WiFi.status() == WL_CONNECTED)) {
|
if ((WiFi.status() == WL_CONNECTED)) {
|
||||||
|
|||||||
@@ -205,3 +205,22 @@ void cleanString(String& str) {
|
|||||||
if (allowedChars.indexOf(str.charAt(i)) == -1) str.setCharAt(i, ' ');
|
if (allowedChars.indexOf(str.charAt(i)) == -1) str.setCharAt(i, ' ');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<String> splitStr(const String& str, const String& delimiter) {
|
||||||
|
std::vector<String> result;
|
||||||
|
size_t newPos, pos = 0;
|
||||||
|
while ((newPos = str.indexOf(delimiter, pos)) != -1) {
|
||||||
|
result.push_back(str.substring(pos, newPos));
|
||||||
|
pos = newPos + delimiter.length();
|
||||||
|
}
|
||||||
|
result.push_back(str.substring(pos));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool strInVector(const String& str, const std::vector<String>& vec) {
|
||||||
|
for (size_t i = 0; i < vec.size(); i++) {
|
||||||
|
if (vec[i] == str) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
#include "Global.h"
|
#include "Global.h"
|
||||||
#include "utils/StringUtils.h"
|
#include "utils/StringUtils.h"
|
||||||
|
|
||||||
static const char* TIME_FORMAT PROGMEM = "%02d:%02d"; //:%02d";
|
static const char* TIME_FORMAT PROGMEM = "%02d:%02d:%02d";
|
||||||
static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %02d:%02d";
|
static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %02d:%02d";
|
||||||
|
|
||||||
const String prettySeconds(unsigned long time_s) {
|
const String prettySeconds(unsigned long time_s) {
|
||||||
|
|||||||
Reference in New Issue
Block a user