Merge pull request #1 from IoTManagerProject/platformio

sync with base
This commit is contained in:
Yuri Trikoz
2020-06-20 09:48:33 +03:00
committed by GitHub
141 changed files with 4631 additions and 3792 deletions

View File

@@ -1,10 +1,10 @@
{
"name": "IoTmanager",
"chipID": "",
"ssidAP": "WiFi2",
"passwordAP": "",
"ssid": "rise",
"password": "hostel3333",
"apssid": "IoTmanager",
"appass": "",
"routerssid": "rise",
"routerpass": "hostel3333",
"timezone": 2,
"ntp": "pool.ntp.org",
"mqttServer": "91.204.228.124",
@@ -12,9 +12,10 @@
"mqttPrefix": "/rise",
"mqttUser": "test",
"mqttPass": "test",
"scenario": "1",
"pushingbox_id": "v7C133E426B0C69E",
"web_login": "admin",
"web_pass": "admin",
"udponoff": "1"
"scen": "1",
"pushingboxid": "v7C133E426B0C69E",
"weblogin": "admin",
"webpass": "admin",
"udponoff": "1",
"blink":"1"
}

View File

@@ -0,0 +1,6 @@
bmp280T temp1 0x76 Температура#bmp280 Датчики any-data 1
bmp280P press1 0x76 Давление#bmp280 Датчики any-data 2
logging temp1 1 100 Температура Датчики 3
logging press1 1 100 Давление Датчики 4
//Чтение и логгирование датчика bmp280. Датчик подключается к шине i2c (esp8266 - gpio 5, 4)

View File

@@ -0,0 +1,9 @@
bme280T temp1 0x76 Температура#bmp280 Датчики any-data 1
bme280P pres1 0x76 Давление#bmp280 Датчики any-data 2
bme280H hum1 0x76 Влажность#bmp280 Датчики any-data 3
bme280A altit1 0x76 Высота#bmp280 Датчики any-data 4
logging temp1 1 100 Температура Датчики 5
logging press1 1 100 Давление Датчики 6
logging hum1 1 100 Влажность Датчики 7
//Чтение и логгирование датчика bme280. Датчик подключается к шине i2c (esp8266 - gpio 5, 4)

View File

@@ -0,0 +1,12 @@
ultrasonicPr p 14 12 Уровень#в#баке,#% Датчики fill-gauge 125 25 1
ultrasonicCm cm 14 12 Дистанция,#см Датчики any-data 2
inputDigit digit1 При#скольки#выключить? Датчики 95 3
inputDigit digit2 При#скольки#включить? Датчики 10 4
button 1 5 Насос Датчики 0 5
logging p 1 100 Вода#в#баке Датчики 6
//125 - это расстояние от датчика до дна бака в сантиметрах
//25 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах
//distancePr - эта строка выводит процент заполнения бака
//distanceCm - эта строка выводит расстояние в сантиметрах
//варианты отображения: any-data, progress-round, progress-line, fill-gauge

View File

@@ -1,6 +1,6 @@
lev > digit1
p > digit1
buttonSet 1 0
end
lev < digit2
p < digit2
buttonSet 1 1
end

1
data/configs/8-pwm.s.txt Normal file
View File

@@ -0,0 +1 @@

View File

@@ -0,0 +1 @@

View File

@@ -1,11 +0,0 @@
level lev 14 12 Вода#в#баке,#% Датчики fill-gauge 125 20 1
inputDigit digit1 При#скольки#выключить? Датчики 95 2
inputDigit digit2 При#скольки#включить? Датчики 10 3
button 1 5 Насос Датчики 0 4
button 2 line1,line2, Автоматический#режим Датчики 1 5
logging lev 1 100 Вода#в#баке Датчики 6
//125 - это расстояние от датчика до дна бака в сантиметрах
//20 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах
//вывод данных будет в процентах заполнения бака
//варианты отображения: any-data, progress-round, progress-line, fill-gauge

View File

@@ -1,3 +0,0 @@
switch 1 0 10
//физическая кнопка номер 1 подключенная к пину 0, задержка от дребезга 10 мс

View File

@@ -1,3 +0,0 @@
switch1 = 1
mqtt 3233662-1589489 buttonChange_1
end

View File

@@ -1,118 +0,0 @@
{
"configs": [
"/config.live.json",
"/config.setup.json",
"/config.option.json"
],
"class": "col-sm-offset-1 col-sm-10",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-warning"
},
{
"type": "h4",
"title": "Device ID: {{chipID}}"
},
{
"type": "h4",
"title": "IP address: {{ip}}"
},
{
"type": "h4",
"title": "Uptime: {{uptime}}"
},
{
"type": "h4",
"title": "Time: {{time}}"
},
{
"type": "hr"
},
{
"type": "dropdown",
"name": "help-url",
"class": "btn btn-warning btn-lg",
"style": "display:inline",
"title": {
"#": "Выбирите то, во что Вы хотите превратить это устройство <span class=\"caret\"></span>",
"/preset?arg=1": "1.Вкл. выкл. локального реле",
"/preset?arg=2": "2.Вкл. выкл. локального реле в определенное время",
"/preset?arg=3": "3.Вкл. выкл. локального реле на определенный период времени",
"/preset?arg=4": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
"/preset?arg=5": "5.Вкл. выкл. локального реле физической кнопкой и кнопкой в приложении параллельно (для выключателя света)",
"/preset?arg=6": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
"/preset?arg=7": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
"/preset?arg=8": "8.Широтно импульсная модуляция",
"/preset?arg=9": "9.Сенсор DHT11 и логгирование",
"/preset?arg=10": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03 и логгирование",
"/preset?arg=11": "11.Аналоговый сенсор и логгирование",
"/preset?arg=12": "12.Сенсор DS18B20 и логгирование",
"/preset?arg=13": "13.Термостат на DS18B20 с переключением в ручной режим и логгированием",
"/preset?arg=14": "14.Контроль уровня в баке на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование (управление насосом)",
"/preset?arg=15": "15.Датчик движения включающий свет",
"/preset?arg=16": "16.Охранный датчик движения",
"/preset?arg=17": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
"/preset?arg=18": "18.Система управления сервоприводами",
"/preset?arg=19": "Настройки по умолчанию"
}
},
{
"type": "h2",
"title": "Конфигурация устройства"
},
{
"type": "file",
"state": "firmware.c.txt",
"style": "width:100%;height:400px",
"title": "Сохранить",
"action": "/init?arg=2",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Подробная инструкция",
"action": "https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/wiki/Instruction",
"class": "btn btn-block btn-primary"
},
{
"type": "h2",
"title": "Сценарии"
},
{
"type": "checkbox",
"name": "scenario",
"title": "Включить сценарии",
"action": "/init?arg=[[scenario]]",
"state": "{{scenario}}"
},
{
"type": "h6",
"title": ""
},
{
"type": "file",
"state": "firmware.s.txt",
"style": "width:100%;height:400px",
"title": "Сохранить",
"action": "/init?arg=4",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Очистить логи сенсоров",
"action": "/init?arg=3",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger btn-sm"
}
]
}

Binary file not shown.

View File

@@ -1,92 +0,0 @@
{
"configs": [
"/config.live.json",
"/config.setup.json"
],
"title": "Главная",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-warning"
},
{
"type": "h3",
"title": "Список других устройств в сети:"
},
{
"type": "hr"
},
{
"type": "csv",
"title": [
"html",
"html",
"html"
],
"state": "dev.csv",
"style": "width:100%;",
"class": "nan"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Переформировать список устройств",
"action": "udp?arg=3",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Обновить страницу",
"action": "udp?arg=4",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "text",
"class": "alert alert-warning",
"title": "После нажатия на кнопку 'Переформировать список устройств' ждите примерно минуту, а затем обновите страницу и список появится вновь"
},
{
"type": "h3",
"title": "Имя этого устройства:"
},
{
"type": "input",
"title": "Имя устройства",
"name": "dev_name",
"state": "{{name}}",
"pattern": "[A-Za-z0-9]{6,12}"
},
{
"type": "button",
"title": "Сохранить",
"action": "name?arg=[[dev_name]]",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "udponoff",
"title": "Включить обмен данными между устройствами",
"action": "/udp?arg=[[udponoff]]",
"state": "{{udponoff}}"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger"
}
]
}

BIN
data/icon.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

View File

@@ -1,7 +1,8 @@
{
"configs": [
"/config.live.json",
"/config.setup.json"
"/config.setup.json",
"/lang/lang.ru.json"
],
"title": "Главная",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
@@ -9,104 +10,60 @@
{
"type": "h5",
"title": "{{name}}",
"class": "alert-warning"
"class": "alert-default"
},
{
"type": "h4",
"title": "Device ID: {{chipID}}"
},
{
"type": "h4",
"title": "IP address: {{ip}}"
},
{
"type": "h4",
"title": "Uptime: {{uptime}}"
},
{
"type": "h4",
"title": "Time: {{time}}"
},
{
"type": "h4",
"title": "Build version: {{firmware_version}}"
},
{
"type": "h4",
"title": "SPIFFS version: 2.3.3"
},
{
"type": "hr"
},
"type": "text",
"class": "alert alert-light",
"title": "<center><img src='/icon.jpeg' alt='IoT Manager'></center>"
},
{
"type": "link",
"title": "Конфигурация устройства",
"action": "/?configuration",
"class": "btn btn-block btn-primary"
},
{
"type": "hr"
"action": "/?set.device",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Список других устройств в сети",
"action": "/?dev",
"class": "btn btn-block btn-success"
"action": "/?set.udp",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Конфигурация WIFI",
"action": "/?setup",
"class": "btn btn-block btn-success"
"action": "/?set.wifi",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Конфигурация MQTT",
"action": "/?mqtt",
"class": "btn btn-block btn-success"
"action": "/?set.mqtt",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Конфигурация push",
"action": "/?pushingbox",
"class": "btn btn-block btn-success"
"action": "/?set.push",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Утилиты",
"action": "/?utilities",
"class": "btn btn-block btn-success"
},
{
"type": "h3",
"name": "my-block",
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "hr"
},
{
"type": "button",
"title": "Обновить прошивку",
"action": "/check",
"response": "[[my-block]]",
"class": "btn btn-block btn-danger"
},
{
"type": "hr"
"action": "/?set.utilities",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Скачать приложение IoT Manager для android",
"action": "https://play.google.com/store/apps/details?id=ru.esp8266.iotmanager",
"class": "btn btn-block btn-warning"
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Скачать приложение IoT Manager для iphone",
"action": "https://apps.apple.com/ru/app/iot-manager/id1155934877",
"class": "btn btn-block btn-warning"
"class": "btn btn-block btn-default"
}
]
}

Binary file not shown.

Binary file not shown.

39
data/lang/lang.ru.json Normal file
View File

@@ -0,0 +1,39 @@
{
"SetDevConf": "Конфигурация устройства",
"SetDevPreset": "Выберите из списка подходящий пресет кофигурации",
"ButSave":"Сохранить",
"ButMainPage":"Главная",
"SetUDPList": "Список других устройств в сети:",
"SetUDPWarn1": "После нажатия на кнопку <b>переформировать список устройств</b> ждите примерно минуту, а затем обновите страницу и список появится вновь",
"SetUDPUpdateList":"Переформировать список устройств",
"SetUDPUpdatePage":"Обновить страницу",
"SetUDPNameOfDev":"Имя этого устройства:",
"SetUDPDateExchange":"Включить обмен данными между устройствами",
"SetUDPWarn2":"Если обмен данными включен, то устройства будут обмениваться широковещательными пакетами udp для формирования списка устройств и для осуществления посылки настроек mqtt. Данный обмен создает дополнительную нагрузку на wifi сеть.",
"SetWiFiNameOfDev":"Имя устройства:",
"SetWiFiRouterConnect":"Подключение к WiFi роутеру:",
"SetWiFiAccessPoint":"Точка доступа:",
"SetWiFiWeb":"Логин и пароль web interface:",
"SetWiFiTimeZone":"Временная зона:",
"SetWiFiNTP":"Сервер NTP:",
"SetWiFiWarn1":"Имя устройства должно состоять из английских букв и иметь длинну от 6 до 12 символов",
"SetWiFiWarn2":"После того как вы введете логин пароль от вашего wifi роутера необходимо нажать кнопку сохранить, а затем обязательно нажать кнопку <b>перезагрузить устройство</b> внизу этой страницы",
"SetWiFiWarn3":"Устройство постоянно сканирует сеть на наличие wifi. Если роутер отключен, то устройство автоматически перейдет в режим точки доступа. Когда wifi появится устройство автоматически подключится к роутеру снова, и выключит точку доступа",
"SetWiFiWarn4":"После изменения поля <b>NTP сервер</b> необходимо перезагрузить устройство",
"SetWiFiWarn5":"Светодиод статуса подключения показывает четыре состояния подключения: <br><b>1. мигает редко</b> - идет подключение к wifi <br><b>2. мигает часто</b> - идет подключение к серверу mqtt <br><b>3. горит постоянно</b> - модуль в режиме точки доступа, <br><b>4. не горит</b> - модуль подключен к wifi и к mqtt. <br>Светодиод подключен к gpio2. Если галочка стоит - то использовать этот пин нельзя",
"SetMQTTServerName":"Имя сервера:",
"SetMQTTPort":"Номер порта:",
"SetMQTTPrefix":"Префикс:",
"SetMQTTUserName":"Имя пользователя:",
"SetMQTTPassword":"Пароль:",
"SetMQTTSendSettings":"Отправить настройки MQTT с этого устройства на все остальные",
"SetMQTTWarn1":"Обратите внимание что поле префикс может состоять только из одного слова и одного разделителя: <b>/prefix</b>, вариант вида: <b>/prefix1/prefix2</b> работать не будет. После изменения поля prefix необходимо перезагрузить устройство",
"SetMQTTWarn2":"Прежде чем нажимать на кнопку <b>Отправить настройки MQTT</b> сохрание их, если Вы их меняли. Настройки получат и перезапишут все устройства в локальной сети"
}

View File

@@ -1,111 +0,0 @@
{
"configs": [
"/config.setup.json"
],
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-warning"
},
{
"type": "text",
"class": "alert alert-warning",
"title": "Обратите внимание что поле prefix может состоять только из одного слова и одного разделителя: <b>/prefix</b>, вариант вида: <b>/prefix1/prefix2</b> работать не будет. После изменения поля prefix необходимо перезагрузить устройство"
},
{
"type": "h4",
"title": "Server name:"
},
{
"type": "input",
"title": "",
"name": "1",
"state": "{{mqttServer}}"
},
{
"type": "h4",
"title": "Port:"
},
{
"type": "input",
"title": "",
"name": "2",
"state": "{{mqttPort}}"
},
{
"type": "h4",
"title": "Prefix:"
},
{
"type": "input",
"title": "",
"name": "3",
"state": "{{mqttPrefix}}"
},
{
"type": "h4",
"title": "User name:"
},
{
"type": "input",
"title": "",
"name": "4",
"state": "{{mqttUser}}"
},
{
"type": "h4",
"title": "Password:"
},
{
"type": "input",
"title": "",
"name": "5",
"state": "{{mqttPass}}"
},
{
"type": "h3",
"name": "my-block",
"style": "position:fixed;top:30%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "text",
"class": "alert alert-warning",
"title": "Прежде чем нажимать на кнопку <b>'Отправить настройки MQTT'</b> сохрание их, если Вы их меняли. Настройки получат и перезапишут все устройства в локальной сети"
},
{
"type": "button",
"title": "Сохранить",
"action": "mqttSave?mqttServer=[[1]]&mqttPort=[[2]]&mqttPrefix=[[3]]&mqttUser=[[4]]&mqttPass=[[5]]",
"class": "btn btn-block btn-success"
},
{
"type": "button",
"title": "Отправить настройки MQTT с этого устройства на все остальные",
"action": "udp?arg=2",
"class": "btn btn-block btn-success"
},
{
"type": "button",
"title": "Проверить соединение с MQTT",
"action": "mqttCheck",
"response": "[[my-block]]",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"class": "btn btn-block btn-success"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger btn-sm"
}
]
}

View File

@@ -1,46 +0,0 @@
{
"configs": [
"/config.setup.json"
],
"class":"col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class":"alert-warning"
},
{
"type": "h4",
"title": "Device id:"
},
{
"type": "input",
"title": "",
"name":"1",
"state": "{{pushingbox_id}}"
},
{
"type": "button",
"title":"Сохранить",
"action": "pushingboxDate?pushingbox_id=[[1]]",
"class": "btn btn-block btn-success",
"style": "width:100%;display:inline"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"class": "btn btn-block btn-warning"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger btn-sm"
}
]
}

143
data/set.device.json Normal file
View File

@@ -0,0 +1,143 @@
{
"configs": [
"/config.setup.json",
"/config.option.json",
"/config.live.json",
"/lang/lang.ru.json"
],
"class": "col-sm-offset-1 col-sm-10",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "Device ID: {{chipID}}"
},
{
"type": "h4",
"title": "IP address: {{ip}}"
},
{
"type": "h4",
"title": "Time: {{time}}"
},
{
"type": "h4",
"title": "Uptime: {{uptime}}"
},
{
"type": "h4",
"title": "Build version: {{firmware_version}}"
},
{
"type": "h4",
"title": "SPIFFS version: 2.3.4"
},
{
"type": "hr"
},
{
"type": "dropdown",
"name": "help-url",
"class": "btn btn-default",
"style": "display:inline",
"title": {
"#": "{{SetDevPreset}}<span class=\"caret\"></span>",
"/set?preset=1": "1.Вкл. выкл. локального реле",
"/set?preset=2": "2.Вкл. выкл. локального реле в определенное время",
"/set?preset=3": "3.Вкл. выкл. локального реле на определенный период времени",
"/set?preset=4": "4.Вкл. выкл. нескольких локальных реле кнопкой в приложении",
"/set?preset=5": "5.Вкл. выкл. локального реле физической кнопкой и кнопкой в приложении параллельно (для выключателя света)",
"/set?preset=6": "6.Вкл. выкл. нескольких удаленных реле кнопкой в приложении (нужно указать Device ID)",
"/set?preset=7": "7.Вкл. выкл. нескольких удаленных реле физической кнопкой (нужно указать Device ID)",
"/set?preset=8": "8.Широтно импульсная модуляция",
"/set?preset=9": "9.Сенсор DHT11 (темп, влажность) и логгирование",
"/set?preset=10": "10.Сенсор DHT22, DHT33, DHT44, AM2302, RHT03 (темп, влажность) и логгирование",
"/set?preset=11": "11.Аналоговый сенсор и логгирование",
"/set?preset=12": "12.Cенсор bmp280 (темп, давление) и логгирование",
"/set?preset=13": "13.Cенсор bme280 (темп, давление, влажность, высота) и логгирование",
"/set?preset=14": "12.Сенсор DS18B20 (темп) и логгирование",
"/set?preset=15": "13.Термостат на DS18B20 с переключением в ручной режим и логгированием",
"/set?preset=16": "14.Котроль уровня в баке (датчик расстояния) на сенсорах: JSN-SR04T, HC-SR04, HY-SRF05 и логгирование",
"/set?preset=17": "15.Датчик движения включающий свет",
"/set?preset=18": "16.Охранный датчик движения",
"/set?preset=19": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
"/set?preset=20": "18.Система управления сервоприводами",
"/set?preset=21": "Настройки по умолчанию"
}
},
{
"type": "h2",
"title": "{{SetDevConf}}"
},
{
"type": "file",
"state": "firmware.c.txt",
"style": "width:100%;height:350px",
"title": "Сохранить",
"action": "/set?devinit",
"class": "btn btn-block btn-default"
},
{
"type": "h2",
"title": "Сценарии"
},
{
"type": "checkbox",
"name": "scen",
"title": "Включить сценарии",
"action": "/set?scen=[[scen]]",
"state": "{{scen}}"
},
{
"type": "file",
"state": "firmware.s.txt",
"style": "width:100%;height:350px",
"title": "Сохранить",
"action": "/set?sceninit",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Инструкция к системе автоматизации",
"action": "https://github.com/DmitryBorisenko33/esp32-esp8266_iot-manager_modules_firmware/wiki/Instruction",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "Очистить логи сенсоров",
"action": "/set?cleanlog",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"name": "my-block",
"style": "position:fixed;top:50%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "button",
"title": "Обновить прошивку устройства",
"action": "/check",
"response": "[[my-block]]",
"class": "btn btn-block btn-default"
}
]
}

133
data/set.mqtt.json Normal file
View File

@@ -0,0 +1,133 @@
{
"configs": [
"/config.setup.json",
"/lang/lang.ru.json"
],
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h4",
"title": "{{SetMQTTServerName}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttServer-arg",
"state": "{{mqttServer}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTPort}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttPort-arg",
"state": "{{mqttPort}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTPrefix}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttPrefix-arg",
"state": "{{mqttPrefix}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTUserName}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttUser-arg",
"state": "{{mqttUser}}",
"style": "width:40%;float:right"
},
{
"type": "h4",
"title": "{{SetMQTTPassword}}",
"style": "width:60%;float:left;"
},
{
"type": "input",
"title": "",
"name": "mqttPass-arg",
"state": "{{mqttPass}}",
"style": "width:40%;float:right"
},
{
"type": "h3",
"name": "my-block",
"style": "position:fixed;top:30%;left:50%;width:400px;margin-left:-200px;text-align:center;",
"class": "hidden"
},
{
"type": "button",
"title": "{{ButSave}}",
"style": "width:100%;float:left;",
"action": "set?mqttServer=[[mqttServer-arg]]&mqttPort=[[mqttPort-arg]]&mqttPrefix=[[mqttPrefix-arg]]&mqttUser=[[mqttUser-arg]]&mqttPass=[[mqttPass-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "button",
"style": "width:100%;float:left;",
"title": "{{SetMQTTSendSettings}}",
"action": "set?mqttsend",
"class": "btn btn-block btn-default"
},
{
"type": "button",
"style": "width:100%;float:left;",
"title": "Проверить соединение с MQTT",
"action": "set?mqttcheck",
"response": "[[my-block]]",
"class": "btn btn-block btn-default"
},
{
"type": "text",
"style": "width:100%;float:left;",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetMQTTWarn1}}</p></font></div>"
},
{
"type": "text",
"style": "width:100%;float:left;",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetMQTTWarn2}}</p></font></div>"
},
{
"type": "link",
"style": "width:100%;float:left;",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"class": "btn btn-block btn-danger"
}
]
}

51
data/set.push.json Normal file
View File

@@ -0,0 +1,51 @@
{
"configs": [
"/config.setup.json",
"/lang/lang.ru.json"
],
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h4",
"style": "width:60%;float:left;",
"title": "Device id:"
},
{
"type": "input",
"title": "",
"name": "push-arg",
"style": "width:40%;float:right",
"state": "{{pushingboxid}}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?pushingboxid=[[push-arg]]",
"class": "btn btn-block btn-default",
"style": "width:100%;display:inline"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"class": "btn btn-block btn-danger"
}
]
}

96
data/set.udp.json Normal file
View File

@@ -0,0 +1,96 @@
{
"configs": [
"/config.setup.json",
"/lang/lang.ru.json"
],
"title": "Главная",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetUDPList}}"
},
{
"type": "hr"
},
{
"type": "csv",
"title": [
"html",
"html",
"html"
],
"state": "dev.csv",
"style": "width:100%;",
"class": "nan"
},
{
"type": "hr"
},
{
"type": "link",
"title": "{{SetUDPUpdateList}}",
"action": "/set?updatelist",
"class": "btn btn-block btn-default"
},
{
"type": "link",
"title": "{{SetUDPUpdatePage}}",
"action": "/set?updatepage",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetUDPWarn1}}</p></font></div>",
"style": "width:100%;float:left;"
},
{
"type": "h3",
"title": "{{SetUDPNameOfDev}}"
},
{
"type": "input",
"title": "{{SetUDPNameOfDev}}",
"name": "devname-arg",
"state": "{{name}}",
"pattern": "[A-Za-z0-9]{6,12}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "/set?devname=[[devname-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "udponoff",
"title": "{{SetUDPDateExchange}}",
"action": "/set?udponoff=[[udponoff]]",
"state": "{{udponoff}}"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetUDPWarn2}}</p></font></div>"
}
]
}

View File

@@ -1,7 +1,8 @@
{
"configs": [
"/config.live.json",
"/config.setup.json"
"/config.setup.json",
"/lang/lang.ru.json"
],
"title": "Главная",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
@@ -9,7 +10,13 @@
{
"type": "h5",
"title": "{{name}}",
"class": "alert-warning"
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
@@ -25,17 +32,8 @@
{
"type": "link",
"title": "Сканировать",
"action": "/init?arg=5",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger"
"action": "/set?itoc",
"class": "btn btn-block btn-default"
}
]
}

185
data/set.wifi.json Normal file
View File

@@ -0,0 +1,185 @@
{
"configs": [
"/config.setup.json",
"/lang/lang.ru.json"
],
"title": "Конфигурация",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-default"
},
{
"type": "link",
"title": "{{ButMainPage}}",
"action": "/",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetWiFiNameOfDev}}"
},
{
"type": "input",
"title": "{{SetWiFiNameOfDev}}",
"name": "devname-arg",
"state": "{{name}}",
"pattern": "[A-Za-z0-9]{6,12}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?devname=[[devname-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn1}}</p></font></div>"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetWiFiRouterConnect}}"
},
{
"type": "input",
"title": "",
"name": "routerssid-arg",
"state": "{{routerssid}}"
},
{
"type": "password",
"title": "",
"name": "routerpass-arg",
"state": "{{routerpass}}"
},
{
"type": "button",
"title": "{{ButSave}}",
"class": "btn btn-block btn-default",
"action": "set?routerssid=[[routerssid-arg]]&routerpass=[[routerpass-arg]]"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn2}}</p></font></div>"
},
{
"type": "hr"
},
{
"type": "checkbox",
"name": "blink",
"title": "Включить светодиод статуса подключения",
"action": "/set?blink=[[blink]]",
"state": "{{blink}}"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn5}}</p></font></div>"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetWiFiAccessPoint}}"
},
{
"type": "input",
"title": "",
"name": "apssid-arg",
"state": "{{apssid}}",
"pattern": ".{1,20}"
},
{
"type": "password",
"title": "",
"name": "appass-arg",
"state": "{{appass}}",
"pattern": ".{8,20}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?apssid=[[apssid-arg]]&appass=[[appass-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn3}}</p></font></div>"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetWiFiWeb}}"
},
{
"type": "input",
"title": "Логин",
"name": "weblogin-arg",
"state": "{{weblogin}}",
"pattern": ".{1,20}"
},
{
"type": "password",
"title": "Пароль",
"name": "webpass-arg",
"state": "{{webpass}}",
"pattern": ".{1,20}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?weblogin=[[weblogin-arg]]&webpass=[[webpass-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "hr"
},
{
"type": "h3",
"title": "{{SetWiFiTimeZone}}"
},
{
"type": "input",
"title": "",
"name": "timezone-arg",
"state": "{{timezone}}",
"pattern": ".{1,20}"
},
{
"type": "input",
"title": "",
"name": "ntp-arg",
"state": "{{ntp}}"
},
{
"type": "button",
"title": "{{ButSave}}",
"action": "set?timezone=[[timezone-arg]]&ntp=[[ntp-arg]]",
"class": "btn btn-block btn-default"
},
{
"type": "text",
"title": "<div style='margin-top:10px;margin-bottom:10px;'><font color='black'><p style='border: 1px solid #DCDCDC; border-radius: 3px; background-color: #F5F5F5; padding: 10px;'>{{SetWiFiWarn4}}</p></font></div>"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/set?device=ok');}",
"class": "btn btn-block btn-danger"
}
]
}

View File

@@ -1,162 +0,0 @@
{
"configs": [
"/config.setup.json"
],
"title": "Конфигурация",
"class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6",
"content": [
{
"type": "h5",
"title": "{{name}}",
"class": "alert-warning"
},
{
"type": "link",
"title": "Главная",
"action": "/",
"class": "btn btn-block btn-danger"
},
{
"type": "hr"
},
{
"type": "h2",
"title": "Имя устройства"
},
{
"type": "input",
"title": "Имя устройства",
"name": "dev_name",
"state": "{{name}}",
"pattern": "[A-Za-z0-9]{6,12}"
},
{
"type": "button",
"title": "Сохранить",
"action": "name?arg=[[dev_name]]",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "h2",
"title": "Подключение к Wi-Fi роутеру"
},
{
"type": "input",
"title": "Сеть",
"name": "ssid",
"state": "{{ssid}}"
},
{
"type": "password",
"title": "Введите пароль",
"name": "ssidPass",
"state": "{{password}}"
},
{
"type": "button",
"title": "Сохранить",
"class": "btn btn-block btn-success",
"action": "ssid?ssid=[[ssid]]&password=[[ssidPass]]"
},
{
"type": "hr"
},
{
"type": "h2",
"title": "Точка доступа"
},
{
"type": "input",
"title": "Имя WI-FI сети",
"name": "ssidap",
"state": "{{ssidAP}}",
"pattern": ".{1,20}"
},
{
"type": "password",
"title": "Пароль",
"name": "ssidApPass",
"state": "{{passwordAP}}",
"pattern": ".{8,20}"
},
{
"type": "button",
"title": "Сохранить",
"action": "ssidap?ssidAP=[[ssidap]]&passwordAP=[[ssidApPass]]",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "h2",
"title": "Логин и пароль web interface"
},
{
"type": "input",
"title": "Логин",
"name": "web-login",
"state": "{{web_login}}",
"pattern": ".{1,20}"
},
{
"type": "password",
"title": "Пароль",
"name": "web-pass",
"state": "{{web_pass}}",
"pattern": ".{1,20}"
},
{
"type": "button",
"title": "Сохранить",
"action": "web?web_login=[[web-login]]&web_pass=[[web-pass]]",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "h2",
"title": "Временная зона"
},
{
"type": "input",
"title": "Временная зона",
"name": "1",
"state": "{{timezone}}",
"pattern": ".{1,20}"
},
{
"type": "input",
"title": "Название ntp сервера",
"name": "2",
"state": "{{ntp}}"
},
{
"type": "button",
"title": "Сохранить",
"action": "time?timezone=[[1]]&ntp=[[2]]",
"class": "btn btn-block btn-success"
},
{
"type": "hr"
},
{
"type": "text",
"class": "alert alert-warning",
"title": "После изменения поля <b>'NTP сервер'</b> необходимо перезагрузить устройство"
},
{
"type": "hr"
},
{
"type": "link",
"title": "Перезагрузить устройство",
"action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}",
"class": "btn btn-block btn-warning"
}
]
}

View File

@@ -1,36 +0,0 @@
#pragma once
#include "Arduino.h"
extern void CMD_init();
extern void button();
extern void buttonSet();
extern void buttonChange();
extern void pinSet();
extern void pinChange();
extern void handle_time_init();
extern void pwm();
extern void switch_();
extern void pwmSet();
extern void stepper();
extern void stepperSet();
extern void servo_();
extern void servoSet();
extern void serialBegin();
extern void serialWrite();
extern void logging();
extern void inputDigit();
extern void digitSet();
extern void inputTime();
extern void button();
extern void timeSet();
extern void text();
extern void textSet();
extern void mqttOrderSend();
extern void httpOrderSend();
extern void firmware();
extern void update_firmware();
extern void Scenario_init();
extern void txtExecution(String file);
extern void stringExecution(String str);

46
include/Consts.h Normal file
View File

@@ -0,0 +1,46 @@
#pragma once
//Здесь хранятся все настройки прошивки
#define firmware_version "2.3.4"
/*
* Firmware settings
*/
#define mb_4_of_memory 1
#define wifi_mqtt_reconnecting 20000
#define blink_pin 2
#define tank_level_times_to_send 10 //после скольки выстрелов делать отправку данных
#define statistics_update 1000 * 60 * 60 * 2
//#define OTA_enable
//#define MDNS_enable
//#define WS_enable
//#define layout_in_ram
#define UDP_enable
/*
* Sensor
*/
#define level_enable
#define analog_enable
#define dallas_enable
#define dht_enable
#define bmp_enable
#define bme_enable
/*
* Logging
*/
#define logging_enable
/*
* Gears
*/
#define stepper_enable
#define servo_enable
/*
* Other
*/
#define serial_enable
#define push_enable

View File

@@ -1,6 +0,0 @@
#pragma once
#include <Arduino.h>
#include <SPIFFS.h>
extern void File_system_init();

388
include/Global.h Normal file
View File

@@ -0,0 +1,388 @@
#pragma once
//=========ПОДКЛЮЧЕНИЕ ОБЩИХ БИБЛИОТЕК===============
#include <Arduino.h>
#include <ArduinoJson.h>
#include <Bounce2.h>
#include <ESPAsyncWebServer.h>
extern AsyncWebServer server;
#include <Adafruit_BME280.h>
#include <Adafruit_BMP280.h>
#include <DHTesp.h>
#include <DallasTemperature.h>
#include <FS.h>
#include <OneWire.h>
#include <PubSubClient.h>
#include <SPIFFSEditor.h>
#include <StringCommand.h>
#include <TickerScheduler.h>
#include <UpTime.h>
#include <Wire.h>
#include <time.h>
#include "Consts.h"
#include "GyverFilters.h"
//==============ESP8266 БИБЛИОТЕКИ===============
#ifdef ESP8266
#include <ESP8266HTTPClient.h>
#include <ESP8266HTTPUpdateServer.h>
#include <ESP8266WiFi.h>
#include <ESP8266httpUpdate.h>
ESP8266HTTPUpdateServer httpUpdater;
#include <WiFiUdp.h>
WiFiUDP Udp;
#include <Servo.h>
#ifdef MDNS_enable
#include <ESP8266mDNS.h>
#endif
#endif
//==============ESP32 БИБЛИОТЕКИ===============
#ifdef ESP32
#include <AsyncTCP.h>
#include <AsyncUDP.h>
#include <ESP32Servo.h>
#include <HTTPClient.h>
#include <HTTPUpdate.h>
#include <SPIFFS.h>
#include <WiFi.h>
#include <analogWrite.h>
extern AsyncUDP udp;
#ifdef MDNS_enable
#include <ESPmDNS.h>
#endif
#endif
#ifdef OTA_enable
#include <ArduinoOTA.h>
#endif
extern Servo myServo1;
extern Servo myServo2;
//==============================Objects.h(без данных)==================================
#ifdef WS_enable
extern AsyncWebSocket ws;
#endif
//extern AsyncEventSource events;
extern TickerScheduler ts;
enum { ROUTER_SEARCHING,
WIFI_MQTT_CONNECTION_CHECK,
SENSORS,
STEPPER1,
STEPPER2,
LOG1,
LOG2,
LOG3,
LOG4,
LOG5,
TIMER_COUNTDOWN,
TIME,
TIME_SYNC,
STATISTICS,
UPTIME,
UDP,
UDP_DB,
TEST };
extern WiFiClient espClient;
extern PubSubClient client_mqtt;
extern StringCommand sCmd;
extern AsyncWebServer server;
//AsyncWebSocket ws;
//AsyncEventSource events;
#define NUM_BUTTONS 6
extern boolean but[NUM_BUTTONS];
extern Bounce *buttons;
extern GMedian<10, int> medianFilter;
extern OneWire *oneWire;
extern DallasTemperature sensors;
extern DHTesp dht;
extern Adafruit_BMP280 bmp;
extern Adafruit_Sensor *bmp_temp;
extern Adafruit_Sensor *bmp_pressure;
extern Adafruit_BME280 bme;
extern Adafruit_Sensor *bme_temp;
extern Adafruit_Sensor *bme_pressure;
extern Adafruit_Sensor *bme_humidity;
extern uptime_interval myUpTime;
///////////////////////////////////// Global vars ////////////////////////////////////////////////////////////////////
extern boolean udp_busy;
extern unsigned int udp_port;
extern IPAddress udp_multicastIP;
extern String received_ip;
extern String received_udp_line;
extern int udp_period;
extern boolean just_load;
extern const char *hostName;
extern String configSetupJson; //все настройки
extern String configLiveJson; //все данные с датчиков (связан с mqtt)
extern String configOptionJson; //для трансфера
extern String chipID;
extern String prex;
extern String all_widgets;
extern String scenario;
extern String order_loop;
extern String analog_value_names_list;
extern int enter_to_analog_counter;
extern String levelPr_value_name;
extern String ultrasonicCm_value_name;
extern String dhtT_value_name;
extern String dhtH_value_name;
extern String bmp280T_value_name;
extern String bmp280P_value_name;
extern String bme280T_value_name;
extern String bme280P_value_name;
extern String bme280H_value_name;
extern String bme280A_value_name;
extern String logging_value_names_list;
extern int enter_to_logging_counter;
extern String current_time;
extern int scenario_line_status[40];
extern int wifi_lost_error;
extern int mqtt_lost_error;
extern String last_version;
extern boolean upgrade_url;
extern boolean upgrade;
extern boolean mqtt_connection;
extern boolean udp_data_parse;
extern boolean mqtt_send_settings_to_udp;
extern boolean i2c_scanning;
extern int sensors_reading_map[15];
///////////////////////////////////// Functions////////////////////////////////////////////////////////////////////
// StringUtils
extern uint8_t hexStringToUint8(String hex);
extern uint16_t hexStringToUint16(String hex);
extern String selectToMarkerLast(String str, String found);
extern String selectToMarker(String str, String found);
extern String deleteAfterDelimiter(String str, String found);
extern String deleteBeforeDelimiter(String str, String found);
extern String deleteBeforeDelimiterTo(String str, String found);
extern String selectFromMarkerToMarker(String str, String found, int number);
// JsonUtils
extern String jsonReadStr(String &json, String name);
extern int jsonReadInt(String &json, String name);
extern String jsonWriteInt(String &json, String name, int volume);
extern String jsonWriteStr(String &json, String name, String volume);
extern String jsonWriteFloat(String &json, String name, float volume);
// Cmd
extern void CMD_init();
extern void button();
extern void buttonSet();
extern void buttonChange();
extern void pinSet();
extern void pinChange();
extern void handle_time_init();
extern void pwm();
extern void switch_();
extern void pwmSet();
extern void stepper();
extern void stepperSet();
extern void servo_();
extern void servoSet();
extern void serialBegin();
extern void serialWrite();
extern void logging();
extern void inputDigit();
extern void digitSet();
extern void inputTime();
extern void button();
extern void timeSet();
extern void text();
extern void textSet();
extern void mqttOrderSend();
extern void httpOrderSend();
extern void firmwareVersion();
extern void firmwareUpdate();
extern void Scenario_init();
extern void txtExecution(String file);
extern void stringExecution(String str);
// FileSystem
extern void File_system_init();
// i2c_bu
extern void do_i2c_scanning();
extern String i2c_scan();
// Init
extern void All_init();
extern void statistics_init();
extern void Scenario_init();
extern void Device_init();
extern void prsets_init();
extern void up_time();
// Logging
extern void logging();
extern void deleteOldDate(String file, int seted_number_of_lines, String date_to_add);
extern void clean_log_date();
extern void choose_log_date_and_send();
// Main
void getMemoryLoad(String text);
extern void saveConfig();
extern String getURL(const String &urls);
extern String writeFile(String fileName, String strings);
extern String readFile(String fileName, size_t len);
extern String addFile(String fileName, String strings);
extern void servo_();
extern boolean isDigitStr(String str);
extern String jsonWriteStr(String &json, String name, String volume);
extern void led_blink(String satus);
extern int count(String str, String found);
// Mqtt
extern void MQTT_init();
extern boolean MQTT_Connecting();
extern boolean sendMQTT(String end_of_topik, String data);
extern boolean sendCHART(String topik, String data);
extern void sendSTATUS(String topik, String state);
extern void sendCONTROL(String id, String topik, String state);
extern void do_mqtt_connection();
extern void handleMQTT();
extern String selectFromMarkerToMarker(String str, String found, int number);
// WiFiUtils
extern void WIFI_init();
extern void All_init();
extern bool StartAPMode();
extern void ROUTER_Connecting();
//Scenario
extern void eventGen(String event_name, String number);
extern String add_set(String param_name);
//Sensors
// И как раз тут хорошо просто в Sensors.h это пихать - а не в один здоровенный ФАЙЛ
extern void sensors_init();
extern void levelPr();
extern void ultrasonicCm();
extern void ultrasonic_reading();
extern void analog();
extern void analog_reading1();
extern void analog_reading2();
extern void dallas_reading();
extern void dhtT_reading();
extern void dallas();
extern void bmp280T();
extern void bmp280P();
extern void bmp280T_reading();
extern void bmp280P_reading();
extern void bme280T();
extern void bme280P();
extern void bme280H();
extern void bme280A();
extern void bme280T_reading();
extern void bme280P_reading();
extern void bme280H_reading();
extern void bme280A_reading();
extern void dhtT();
extern void dhtH();
extern void dhtP();
extern void dhtC();
extern void dhtD();
extern void dhtH_reading();
extern void dhtP_reading();
extern void dhtC_reading();
extern void dhtD_reading();
//Timers
extern void Timer_countdown_init();
extern void timerStart_();
extern void addTimer(String number, String time);
extern void timerStop_();
extern void delTimer(String number);
extern int readTimer(int number);
//TimeUtils
extern void Time_Init();
extern int timeToMin(String Time);
extern String GetDataDigital();
extern String GetDate();
extern String GetTimeWOsec();
extern String GetTime();
extern String GetTimeUnix();
extern void reconfigTime();
extern void saveConfig();
extern String GetTimeUnix();
extern void time_check();
//Upgrade
extern void initUpgrade();
//widget
extern void createWidget(String widget_name, String page_name, String page_number, String file, String topic);
extern void createWidgetParam(String widget_name, String page_name, String page_number, String file, String topic, String name1, String param1, String name2, String param2, String name3, String param3);
extern void choose_widget_and_create(String widget_name, String page_name, String page_number, String type, String topik);
extern void createChart(String widget_name, String page_name, String page_number, String file, String topic, String maxCount);
// Push
extern void Push_init();
// UDP
extern void UDP_init();
extern void do_udp_data_parse();
extern void do_mqtt_send_settings_to_udp();
// WebServer
extern void Web_server_init();
//iot_firmware
extern void not_async_actions();
extern void handleCMD_loop();
extern void handleButton();
extern void handleScenario();
extern void handleUdp();
extern void do_upgrade_url();
extern void do_upgrade();
//uptime
extern void handle_uptime();
extern void handle_statistics();
extern void uptime_init();
extern void web_init();

View File

@@ -1,5 +0,0 @@
#pragma once
extern void Scenario_init();
extern void Device_init();
extern void prsets_init();

43
include/JsonUtils.h Normal file
View File

@@ -0,0 +1,43 @@
#pragma once
#include <Arduino.h>
#include <ArduinoJson.h>
String jsonReadStr(String& json, String name) {
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
return root[name].as<String>();
}
int jsonReadInt(String& json, String name) {
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
return root[name];
}
String jsonWriteStr(String& json, String name, String volume) {
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
root[name] = volume;
json = "";
root.printTo(json);
return json;
}
String jsonWriteInt(String& json, String name, int volume) {
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
root[name] = volume;
json = "";
root.printTo(json);
return json;
}
String jsonWriteFloat(String& json, String name, float volume) {
DynamicJsonBuffer jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(json);
root[name] = volume;
json = "";
root.printTo(json);
return json;
}

View File

@@ -1,7 +0,0 @@
#pragma once
#include <Arduino.h>
extern void logging();
extern void deleteOldDate(String file, int seted_number_of_lines, String date_to_add);
extern void clean_log_date();

View File

@@ -1,11 +0,0 @@
#pragma once
#include <Arduino.h>
extern boolean MQTT_Connecting();
extern boolean sendMQTT(String end_of_topik, String data);
extern boolean sendCHART(String topik, String data);
extern void sendSTATUS(String topik, String state);
extern void sendCONTROL(String id, String topik, String state);
extern void do_mqtt_connection();

View File

@@ -1,5 +0,0 @@
#pragma once
#include <Arduino.h>
extern void eventGen(String event_name, String number);

View File

@@ -1,3 +0,0 @@
#pragma once
void sensors_init();

64
include/StringUtils.h Normal file
View File

@@ -0,0 +1,64 @@
#pragma once
#include "Arduino.h"
String selectToMarkerLast(String str, String found) {
int p = str.lastIndexOf(found);
return str.substring(p + found.length());
}
String selectToMarker(String str, String found) {
int p = str.indexOf(found);
return str.substring(0, p);
}
String deleteAfterDelimiter(String str, String found) {
int p = str.indexOf(found);
return str.substring(0, p);
}
String deleteBeforeDelimiter(String str, String found) {
int p = str.indexOf(found) + found.length();
return str.substring(p);
}
String deleteBeforeDelimiterTo(String str, String found) {
int p = str.indexOf(found);
return str.substring(p);
}
String deleteToMarkerLast(String str, String found) {
int p = str.lastIndexOf(found);
return str.substring(0, p);
}
String selectToMarkerPlus(String str, String found, int plus) {
int p = str.indexOf(found);
return str.substring(0, p + plus);
}
String selectFromMarkerToMarker(String str, String found, int number) {
if (str.indexOf(found) == -1) return "not found"; // если строки поиск нет сразу выход
str += found; // добавим для корректного поиска
uint8_t i = 0; // Индекс перебора
do {
if (i == number) return selectToMarker(str, found); // если индекс совпал с позицией законцим вернем резултат
str = deleteBeforeDelimiter(str, found); // отбросим проверенный блок до разделителя
i++; // увеличим индекс
} while (str.length() != 0); // повторим пока строка не пустая
return "not found"; // Достигли пустой строки и ничего не нашли
}
inline uint8_t hexStringToUint8(String hex) {
uint8_t tmp = strtol(hex.c_str(), NULL, 0);
if (tmp >= 0x00 && tmp <= 0xFF) {
return tmp;
}
}
inline uint16_t hexStringToUint16(String hex) {
uint16_t tmp = strtol(hex.c_str(), NULL, 0);
if (tmp >= 0x0000 && tmp <= 0xFFFF) {
return tmp;
}
}

View File

@@ -1,5 +1,6 @@
#pragma once
//Strings
// #include <stdafx.h>
#include <stdio.h>
@@ -135,4 +136,4 @@ inline void char_array::printinput() {
inline void char_array::changedefaultsize() {
printf("Input new default input string size: ");
scanf("%i", charinput);
}
}

View File

@@ -1,14 +0,0 @@
#pragma once
#include <Arduino.h>
extern int timeToMin(String Time);
extern String GetDataDigital();
extern String GetDate();
extern String GetTimeWOsec();
extern String GetTime();
extern String GetTimeUnix();
extern void reconfigTime();
extern void saveConfig();
extern String GetTimeUnix();
extern void time_check();

View File

@@ -1,10 +0,0 @@
#pragma once
#include <Arduino.h>
extern void Timer_countdown_init();
extern void addTimer(String number, String time);
extern int readTimer(int number);
extern void delTimer(String number);
extern void timerStop();
extern void delTimer(String number);

View File

@@ -1,3 +0,0 @@
#pragma once
extern void initUpgrade();

View File

@@ -1,4 +0,0 @@
#pragma once
extern bool StartAPMode();
extern void ROUTER_Connecting();

View File

@@ -1,8 +0,0 @@
#pragma once
#include <Arduino.h>
extern void createWidget(String widget_name, String page_name, String page_number, String file, String topic);
extern void createWidgetParam(String widget_name, String page_name, String page_number, String file, String topic, String name1, String param1, String name2, String param2, String name3, String param3);
extern void choose_widget_and_create(String widget_name, String page_name, String page_number, String type, String topik);
extern void createChart(String widget_name, String page_name, String page_number, String file, String topic, String maxCount);

View File

@@ -1,7 +0,0 @@
#pragma once
#include <Arduino.h>
extern void do_i2c_scanning();
extern String i2c_scan();

View File

@@ -1,31 +0,0 @@
#pragma once
#include <Arduino.h>
void getMemoryLoad(String text);
extern String jsonReadStr(String& json, String name);
extern int jsonReadInt(String& json, String name);
extern String jsonWriteInt(String& json, String name, int volume);
extern String jsonWriteStr(String& json, String name, String volume);
extern void saveConfig();
extern String jsonWriteFloat(String& json, String name, float volume);
extern String getURL(String urls);
extern String writeFile(String fileName, String strings);
extern String readFile(String fileName, size_t len);
extern String addFile(String fileName, String strings);
extern String selectFromMarkerToMarker(String str, String found, int number);
extern String selectToMarker(String str, String found);
extern String deleteAfterDelimiter(String str, String found);
extern String deleteBeforeDelimiter(String str, String found);
extern String deleteBeforeDelimiterTo(String str, String found);
extern void servo_();
extern boolean isDigitStr(String str);
extern String jsonWriteStr(String& json, String name, String volume);
extern void led_blink(String satus);

View File

@@ -1,12 +1,11 @@
#pragma once
#include "main.h"
#include "set.h"
#include "Global.h"
inline void Push_init() {
void Push_init() {
server.on("/pushingboxDate", HTTP_GET, [](AsyncWebServerRequest* request) {
if (request->hasArg("pushingbox_id")) {
jsonWriteStr(configSetup, "pushingbox_id", request->getParam("pushingbox_id")->value());
jsonWriteStr(configSetupJson, "pushingbox_id", request->getParam("pushingbox_id")->value());
}
saveConfig();
@@ -24,7 +23,7 @@ inline void pushControl() {
static String body_old;
const char* logServer = "api.pushingbox.com";
String deviceId = jsonReadStr(configSetup, "pushingbox_id");
String deviceId = jsonReadStr(configSetupJson, "pushingbox_id");
Serial.println("- starting client");

View File

@@ -1,225 +0,0 @@
#pragma once
#include <Arduino.h>
/*******************************************************************
**********************FIRMWARE SETTINGS****************************
******************************************************************/
String firmware_version = "2.3.3";
boolean mb_4_of_memory = true;
//#define OTA_enable
//#define MDNS_enable
//#define WS_enable
//#define layout_in_ram
#define UDP_enable
/*==========================SENSORS===============================*/
//#define level_enable
//#define analog_enable
//#define dallas_enable
//#define dht_enable //подъедает оперативку сука
//#define bmp_enable
//#define bme_enable
/*=========================LOGGING================================*/
#define logging_enable
/*==========================GEARS=================================*/
#define stepper_enable
#define servo_enable
/*=========================OTHER==================================*/
#define serial_enable
#define push_enable
/*================================================================*/
#define wifi_mqtt_reconnecting 20000
#define blink_pin 2
#define tank_level_times_to_send 10 //после скольки выстрелов делать отправку данных
#define statistics_update 1000 * 60 * 60 * 2
/*================================================================*/
//===============общие библиотеки и объекты===============================
#include <Arduino.h>
#include <ArduinoJson.h>
#include <ESPAsyncWebServer.h>
#include <FS.h>
#include <SPIFFSEditor.h>
#include <time.h>
//===============библиотеки и объекты для ESP8266=======================
#ifdef ESP8266
#include <ESP8266HTTPClient.h>
#include <ESP8266HTTPUpdateServer.h>
#include <ESP8266WiFi.h>
#include <ESP8266httpUpdate.h>
ESP8266HTTPUpdateServer httpUpdater;
#include <WiFiUdp.h>
WiFiUDP Udp;
#include <Servo.h>
Servo myServo1;
Servo myServo2;
#ifdef MDNS_enable
#include <ESP8266mDNS.h>
#endif
#endif
//===============библиотеки и объекты для ESP32===========================
#ifdef ESP32
#include <AsyncTCP.h>
#include <AsyncUDP.h>
#include <HTTPClient.h>
#include <HTTPUpdate.h>
#include <SPIFFS.h>
#include <WiFi.h>
#include <analogWrite.h>
AsyncUDP udp;
#include <ESP32Servo.h>
Servo myServo1;
Servo myServo2;
#ifdef MDNS_enable
#include <ESPmDNS.h>
#endif
#endif
#ifdef OTA_enable
#include <ArduinoOTA.h>
#endif
AsyncWebServer server(80);
#ifdef WS_enable
AsyncWebSocket ws("/ws");
#endif
AsyncEventSource events("/events");
#include <TickerScheduler.h>
#include <time.h>
enum { ROUTER_SEARCHING,
WIFI_MQTT_CONNECTION_CHECK,
SENSORS,
STEPPER1,
STEPPER2,
LOG1,
LOG2,
LOG3,
LOG4,
LOG5,
TIMER_COUNTDOWN,
TIME,
TIME_SYNC,
STATISTICS,
UDP,
UDP_DB,
TEST };
TickerScheduler ts(TEST + 1);
#include <PubSubClient.h>
WiFiClient espClient;
PubSubClient client_mqtt(espClient);
#include <StringCommand.h>
StringCommand sCmd;
#include <Bounce2.h>
#define NUM_BUTTONS 6
boolean but[NUM_BUTTONS];
Bounce *buttons = new Bounce[NUM_BUTTONS];
#ifdef level_enable
#include "GyverFilters.h" //настраивается в GyverHacks.h - MEDIAN_FILTER_SIZE
GMedian medianFilter;
#endif
#ifdef dallas_enable
#include <DallasTemperature.h>
#include <OneWire.h>
OneWire *oneWire;
DallasTemperature sensors;
#endif
#ifdef dht_enable
#include <DHTesp.h>
DHTesp dht;
#endif
#include <Wire.h>
#ifdef bmp_enable
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // use I2C interface
Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor();
Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor();
#endif
#ifdef bme_enable
#include <Adafruit_BME280.h>
Adafruit_BME280 bme; // use I2C interface
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
#endif
//#include <SoftwareSerial.h>
//SoftwareSerial mySerial(14, 12);
//===============FIRMWARE VARS========================
boolean just_load = true;
const char *hostName = "IoT Manager";
//JSON
String configSetup = "{}";
String configJson = "{}";
String optionJson = "{}";
//MQTT
String chipID = "";
String prex;
String all_widgets = "";
String scenario;
String order_loop;
//SENSORS
String analog_value_names_list;
int enter_to_analog_counter;
String level_value_name;
String dhtT_value_name;
String dhtH_value_name;
String bmp280T_value_name;
String bmp280P_value_name;
String bme280T_value_name;
String bme280P_value_name;
String bme280H_value_name;
String bme280A_value_name;
int sensors_reading_map[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
//============================0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14
//LOGGING
String logging_value_names_list;
int enter_to_logging_counter;
//NTP and TIME
String current_time;
//SCENARIO
int scenario_line_status[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
//ERRORS
int wifi_lost_error = 0;
int mqtt_lost_error = 0;
String last_version;
//ASYNC ACTIONS
boolean upgrade_url = false;
boolean upgrade = false;
boolean mqtt_connection = false;
boolean udp_data_parse = false;
boolean mqtt_send_settings_to_udp = false;
boolean i2c_scanning = false;
//UDP
boolean udp_busy = false;
unsigned int udp_port = 4210;
#ifdef ESP8266
IPAddress udp_multicastIP(255, 255, 255, 255);
#endif
#ifdef ESP32
IPAddress udp_multicastIP(239, 255, 255, 255);
#endif
String received_ip;
String received_udp_line;
int udp_period;
//i2c
String i2c_list;

View File

@@ -0,0 +1,2 @@
0.01 2019-01-14
- initial version

View File

@@ -0,0 +1,15 @@
all: README examples/UpTime_tick/README examples/UpTime_synopsis/README
clean:
rm -f README README.bak \
examples/UpTime_tick/README examples/UpTime_tick/README.bak \
examples/UpTime_synopsis/README examples/UpTime_synopsis/README.bak
README: UpTime.h
pod2readme $< $@ && rm -f $@.bak
examples/UpTime_tick/README: examples/UpTime_tick/UpTime_tick.ino
pod2readme $< $@ && rm -f $@.bak
examples/UpTime_synopsis/README: examples/UpTime_synopsis/UpTime_synopsis.ino
pod2readme $< $@ && rm -f $@.bak

99
lib/Arduino-UpTime/README Normal file
View File

@@ -0,0 +1,99 @@
NAME
UpTime.h - Arduino uptime and events in seconds
SYNOPSIS
#include <Arduino.h>
#include <UpTime.h> // https://github.com/jozef/Arduino-UpTime
uptime_interval fire2(2);
uptime_interval fire5(5,UPTIME_RIGHT_AWAY);
void setup () {
Serial.begin(9600);
}
void loop () {
Serial.println("uptime: "+uptime_as_string()+" or "+uptime()+"s");
if (fire2.check()) Serial.println("2s elapsed");
if (fire5.check()) Serial.println("5s elapsed");
delay(1400);
}
will output:
uptime: 00:00:00 or 0s
5s elapsed
uptime: 00:00:01 or 1s
uptime: 00:00:02 or 2s
2s elapsed
uptime: 00:00:04 or 4s
2s elapsed
uptime: 00:00:05 or 5s
5s elapsed
uptime: 00:00:07 or 7s
2s elapsed
uptime: 00:00:08 or 8s
2s elapsed
uptime: 00:00:09 or 9s
uptime: 00:00:11 or 11s
2s elapsed
5s elapsed
uptime: 04:41:23 or 16883s
uptime: 04:41:25 or 16885s
2s elapsed
5s elapsed
uptime: 04:41:26 or 16886s
2s elapsed
uptime: 04:41:28 or 16888s
2s elapsed
uptime: 04:41:29 or 16889s
uptime: 04:41:30 or 16890s
2s elapsed
5s elapsed
DESCRIPTION
Uptime class is made to to track uptime of Arduino in seconds. The
uptime() or check() functions has to be called at least once for 0xFFFF
seconds (once in 18h) to work. Seconds will be counted even after
Arduinos millis() overrun and the seconds of unsigned long are enough
to not overrun sooner then in 136+ years. Once 0xFFFF0000 seconds is
elapsed, will trigger reset so that Arduino program clearly starts all
over again.
METHODS
bool check()
Returns true/false if the interval elapset.
void reset(bool postpone = true)
Will reset the time to count from current moment in until interval. If
postpone is set to false, check() will return true with next call.
INSTALL
git clone https://github.com/jozef/Arduino-UpTime sketchbook/libraries/UpTime
EXAMPLES
examples/UpTime_tick/UpTime_synopsis.ino
synopsis section example
examples/UpTime_tick/UpTime_tick.ino
print formatted and raw uptime in seconds und 4x interval
LICENSE
This is free software, licensed under the MIT License.
AUTHOR
Jozef Kutej

View File

@@ -0,0 +1,65 @@
/* see UpTime.h */
#include <Arduino.h>
#include <UpTime.h>
unsigned long _uptime_seconds = 0;
void (*time_to_die)(void) = 0; // reset Arduino after 136+ years
unsigned long uptime() {
unsigned int cur_second = millis() / 1000;
unsigned int _uptime_seconds_uint = _uptime_seconds;
while (_uptime_seconds_uint != cur_second) {
_uptime_seconds++;
_uptime_seconds_uint++;
if (_uptime_seconds > 0xFFFF0000) time_to_die();
}
return _uptime_seconds;
}
uptime_interval::uptime_interval(unsigned int inte, bool postpone) : interval(inte) {
reset(postpone);
}
bool uptime_interval::check() {
if (next <= uptime()) {
next += interval;
return true;
}
return false;
}
void uptime_interval::reset(bool postpone) {
next = (postpone ? _uptime_seconds + interval : _uptime_seconds);
}
String _uptime_two_dig(uint8_t x) {
if (x > 9) {
return String(x);
}
else {
return "0"+String(x);
}
}
String uptime_as_string() {
unsigned long tmp_uptime = uptime();
unsigned long seconds;
unsigned long minutes;
unsigned long hours;
unsigned long days;
seconds = tmp_uptime % 60;
tmp_uptime = tmp_uptime / 60;
minutes = tmp_uptime % 60;
tmp_uptime = tmp_uptime / 60;
hours = tmp_uptime % 24;
days = tmp_uptime / 24;
return (days ? String(days)+'d'+' ' : "")
+ _uptime_two_dig(hours)
+ ':' + _uptime_two_dig(minutes)
+ ':' + _uptime_two_dig(seconds);
}

124
lib/Arduino-UpTime/UpTime.h Normal file
View File

@@ -0,0 +1,124 @@
/* VERSION 0.01; 14.1.2019; see below for description and documentation */
#ifndef UpTime_h
#define UpTime_h
#define UPTIME_RIGHT_AWAY false
unsigned long uptime();
String uptime_as_string();
class uptime_interval {
private:
unsigned long next;
unsigned int interval;
public:
uptime_interval(unsigned int inte, bool postpone = true);
bool check();
void reset(bool postpone = true);
};
#endif
/*
=head1 NAME
UpTime.h - Arduino uptime and events in seconds
=head1 SYNOPSIS
#include <Arduino.h>
#include <UpTime.h> // https://github.com/jozef/Arduino-UpTime
uptime_interval fire2(2);
uptime_interval fire5(5,UPTIME_RIGHT_AWAY);
void setup () {
Serial.begin(9600);
}
void loop () {
Serial.println("uptime: "+uptime_as_string()+" or "+uptime()+"s");
if (fire2.check()) Serial.println("2s elapsed");
if (fire5.check()) Serial.println("5s elapsed");
delay(1400);
}
will output:
uptime: 00:00:00 or 0s
5s elapsed
uptime: 00:00:01 or 1s
uptime: 00:00:02 or 2s
2s elapsed
uptime: 00:00:04 or 4s
2s elapsed
uptime: 00:00:05 or 5s
5s elapsed
uptime: 00:00:07 or 7s
2s elapsed
uptime: 00:00:08 or 8s
2s elapsed
uptime: 00:00:09 or 9s
uptime: 00:00:11 or 11s
2s elapsed
5s elapsed
uptime: 04:41:23 or 16883s
uptime: 04:41:25 or 16885s
2s elapsed
5s elapsed
uptime: 04:41:26 or 16886s
2s elapsed
uptime: 04:41:28 or 16888s
2s elapsed
uptime: 04:41:29 or 16889s
uptime: 04:41:30 or 16890s
2s elapsed
5s elapsed
=head1 DESCRIPTION
Uptime class is made to to track uptime of Arduino in seconds. The uptime()
or check() functions has to be called at least once for 0xFFFF seconds
(once in 18h) to work. Seconds will be counted even after Arduinos
millis() overrun and the seconds of unsigned long are enough to not overrun
sooner then in 136+ years. Once 0xFFFF0000 seconds is elapsed, will trigger
reset so that Arduino program clearly starts all over again.
=head1 METHODS
=head2 bool check()
Returns true/false if the interval elapset.
=head2 void reset(bool postpone = true)
Will reset the time to count from current moment in until interval. If
C<postpone> is set to false, check() will return true with next call.
=head1 INSTALL
git clone https://github.com/jozef/Arduino-UpTime sketchbook/libraries/UpTime
=head1 EXAMPLES
=head2 examples/UpTime_tick/UpTime_synopsis.ino
synopsis section example
=head2 examples/UpTime_tick/UpTime_tick.ino
print formatted and raw uptime in seconds und 4x interval
=head1 LICENSE
This is free software, licensed under the MIT License.
=head1 AUTHOR
Jozef Kutej
=cut
*/

View File

@@ -0,0 +1,4 @@
DESCRIPTION
synopsis section example from UpTime.h

View File

@@ -0,0 +1,24 @@
/*
=head1 DESCRIPTION
synopsis section example from UpTime.h
=cut
*/
#include <Arduino.h>
#include <UpTime.h> // https://github.com/jozef/Arduino-UpTime
uptime_interval fire2(2);
uptime_interval fire5(5,UPTIME_RIGHT_AWAY);
void setup () {
Serial.begin(9600);
}
void loop () {
Serial.println("uptime: "+uptime_as_string()+" or "+uptime()+"s");
if (fire2.check()) Serial.println("2s elapsed");
if (fire5.check()) Serial.println("5s elapsed");
delay(1400);
}

View File

@@ -0,0 +1,11 @@
NAME
UpTime_tick.ino - print formatted and raw uptime in seconds und 4x
interval
DESCRIPTION
On serial port will print current uptime in seconds with 4 interval
checks. Each loop has random 0-5s delay. Intervals will be printed once
elapsed.

View File

@@ -0,0 +1,52 @@
/*
=head1 NAME
UpTime_tick.ino - print formatted and raw uptime in seconds und 4x interval
=head1 DESCRIPTION
On serial port will print current uptime in seconds with 4 interval checks.
Each loop has random 0-5s delay. Intervals will be printed once elapsed.
=cut
*/
#include <Arduino.h>
#include <UpTime.h> // https://github.com/jozef/Arduino-UpTime
uptime_interval fire2(2);
uptime_interval fire5(5);
uptime_interval fire10(10, UPTIME_RIGHT_AWAY);
uptime_interval fire60(60, UPTIME_RIGHT_AWAY);
void setup () {
Serial.begin(9600);
while (Serial.available()) { Serial.read(); }
randomSeed(analogRead(0));
}
void loop () {
Serial.print("uptime: ");
Serial.println(uptime_as_string());
if (fire2.check()) {
Serial.println("fire 2s");
}
if (fire5.check()) {
Serial.println("fire 5s");
}
if (fire10.check()) {
Serial.println("fire 10s");
}
if (fire60.check()) {
Serial.println("fire 60s");
}
int rand_delay = random(5000);
Serial.print("delay(");
Serial.print(rand_delay);
Serial.println(")");
delay(rand_delay);
}

View File

@@ -1,17 +0,0 @@
# Auto detect text files and perform LF normalization
* text=auto
# Custom for Visual Studio
*.cs diff=csharp
# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain

View File

@@ -1,215 +0,0 @@
/*
Copyright (c) 2016 TheThings.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Original Maker: Mateo Velez - Metavix for TheThings Inc
Modified and Maintened by: Jose Garcia - TheThings Inc
*/
#include "TheThingsMQTT.h"
TheThings::TheThings(char* token){
initialize(token, NULL);
}
TheThings::TheThings(char* token, char* clientName) {
initialize(token, clientName);
}
void TheThings::begin(void (*callback)(char*,uint8_t*,unsigned int)) {
this->callback = callback;
_client.setServer(_server, MQTT_PORT);
_client.setCallback(callback);
}
bool TheThings::add(char* variableLabel, float value) {
return add(variableLabel, value, "NULL", "NULL");
}
bool TheThings::add(char* variableLabel, float value, char *context) {
return add(variableLabel, value, context, "NULL");
}
bool TheThings::add(char* variableLabel, float value, char *context, char *timestamp) {
(val+currentValue)->_variableLabel = variableLabel;
(val+currentValue)->_value = value;
(val+currentValue)->_context = context;
(val+currentValue)->_timestamp = timestamp;
currentValue++;
if (currentValue > MAX_VALUES) {
Serial.println(F("You are sending more than the maximum of consecutive variables"));
currentValue = MAX_VALUES;
}
return true;
}
bool TheThings::connected(){
return _client.connected();
}
char* TheThings::getMac(){
// Obtains the MAC of the device
Serial.println("entra");
byte mac[6];
WiFi.macAddress(mac);
char macAddr[18];
sprintf(macAddr, "%2X%2X%2X%2X%2X%2X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
return macAddr;
}
void TheThings::initialize(char* token, char* clientName){
_server = SERVER;
_token = token;
currentValue = 0;
val = (Value *)malloc(MAX_VALUES*sizeof(Value));
if(clientName!=NULL){
_clientName = clientName;
}
}
bool TheThings::loop() {
if (!_client.connected()) {
reconnect();
}
return _client.loop();
}
void TheThings::reconnect() {
while (!_client.connected()) {
Serial.print("Attempting MQTT connection...");
if (_client.connect(_clientName, _token, NULL)) {
Serial.println("connected");
break;
} else {
Serial.print("failed, rc=");
Serial.print(_client.state());
Serial.println(" try again in 3 seconds");
delay(3000);
}
}
}
void TheThings::setDebug(bool debug){
_debug = debug;
}
void TheThings:: setBroker(char* broker){
if (_debug){
Serial.println("Broker set for Business Account");
}
_server = broker;
}
bool TheThings::subscribe() {
char topic[150];
sprintf(topic, "%s%s", FIRST_PART_TOPIC, _token);
if (!_client.connected()) {
reconnect();
}
if (_debug){
Serial.println("Subscribed to: ");
Serial.println(topic);
}
return _client.subscribe(topic);
}
bool TheThings::publish() {
char topic[150];
char payload[500];
String str;
sprintf(topic, "%s%s", FIRST_PART_TOPIC, _token);
sprintf(payload, "[");
for (int i = 0; i <= currentValue; ) {
str = String((val+i)->_value, 1);
sprintf(payload,"%s{\"key\":\"%s\",\"value\":%s",payload,(val+i)->_variableLabel, str.c_str());
if ((val+i)->_timestamp != "NULL") {
sprintf(payload, "%s, \"timestamp\": %s", payload, (val+i)->_timestamp);
}
if ((val+i)->_context != "NULL") {
sprintf(payload, "%s, \"context\": {%s}", payload, (val+i)->_context);
}
i++;
if (i >= currentValue) {
sprintf(payload, "%s}]", payload);
break;
} else {
sprintf(payload, "%s},", payload);
}
}
if (_debug){
Serial.println("publishing to TOPIC: ");
Serial.println(topic);
Serial.print("JSON dict: ");
Serial.println(payload);
}
currentValue = 0;
return _client.publish(topic, payload, 512);
}
bool TheThings::wifiConnection(char* ssid, char* pass) {
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(F("WiFi connected"));
Serial.println(F("IP address: "));
Serial.println(WiFi.localIP());
if(_clientName==NULL){
_clientName = getMac();
}
}
bool TheThings::wifiConnection2() {
WiFiManager wifiManager;
wifiManager.setTimeout(180);
//if(!wifiManager.autoConnect("AutoConnectAP")) {
if(!wifiManager.autoConnect()) {
Serial.println("failed to connect and hit timeout");
delay(3000);
ESP.reset();
delay(5000);
}
}
int TheThings::state() {
return _client.state();
}

View File

@@ -1,58 +0,0 @@
#ifndef TheThingsMQTT_H
#define TheThingsMQTT_H
//#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <WiFiManager.h>
#define MQTT_PORT 1883
#define SERVER "mqtt.thethings.io"
#define MAX_VALUES 5
#define FIRST_PART_TOPIC "v2/things/"
#define META_DEBUG Serial
typedef struct Value {
char* _variableLabel;
float _value;
char* _context;
char* _timestamp;
} Value;
class TheThings {
private:
void (*callback)(char*, uint8_t*, unsigned int);
char* getMac();
void initialize(char* token, char* clientName);
WiFiClient espClient;
PubSubClient _client = PubSubClient(espClient);
WiFiManager wifiManager;
char* _clientName = NULL;
bool _debug = false;
uint8_t currentValue;
char* _password;
char* _server;
char* _ssid;
char* _token;
Value* val;
public:
TheThings(char* token);
TheThings(char* token, char* clientName);
bool add(char* variableLabel, float value);
bool add(char* variableLabel, float value, char* context);
bool add(char* variableLabel, float value, char* context, char* timestamp);
void begin(void (*callback)(char*, uint8_t*, unsigned int));
bool connected();
bool loop();
bool subscribe();
bool publish();
void setBroker(char* broker);
void reconnect();
void setDebug(bool debug);
bool wifiConnection(char* ssid, char* pass);
bool wifiConnection2();
int state();
};
#endif

View File

@@ -1,79 +0,0 @@
#pragma once
#include <arduino.h>
#include <stdint.h>
class Ticker {
typedef void (*ticker_callback_t)(bool *);
private:
bool is_attached = false;
uint32_t period = 0;
uint32_t last_tick = 0;
ticker_callback_t callback;
bool *callback_argument;
public:
void Tick() {
if (is_attached && millis() - last_tick >= period) {
callback(callback_argument);
last_tick = millis();
}
}
void detach() {
this->is_attached = true;
}
template <typename TArg>
void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg) {
this->period = milliseconds;
this->callback = callback;
this->callback_argument = arg;
this->is_attached = true;
}
};
#ifdef ARDUINO_ARCH_ESP8266
#include <Ticker.h>
#include <functional>
#endif
void tickerFlagHandle(volatile bool *flag);
#ifdef _GLIBCXX_FUNCTIONAL
typedef std::function<void(void *)> tscallback_t;
#else
typedef void (*tscallback_t)(void *);
#endif
struct TickerSchedulerItem {
Ticker t;
volatile bool flag = false;
tscallback_t cb;
void *cb_arg;
uint32_t period;
volatile bool is_used = false;
};
class TickerScheduler {
private:
uint8_t size;
TickerSchedulerItem *items = NULL;
void handleTicker(tscallback_t, void *, volatile bool *flag);
static void handleTickerFlag(volatile bool *flag);
public:
TickerScheduler(uint8_t size);
~TickerScheduler();
bool add(uint8_t i, uint32_t period, tscallback_t, void *, boolean shouldFireNow = false);
bool remove(uint8_t i);
bool enable(uint8_t i);
bool disable(uint8_t i);
void enableAll();
void disableAll();
void update();
};

View File

@@ -1,182 +0,0 @@
/****************************************
* Include Libraries
****************************************/
#include "TheThingsMQTT.h"
#include "TickerScheduler.h"
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
/****************************************
* Define Constants
****************************************/
#define TOKEN "" // Your TheThings TOKEN
#define WIFINAME "" //Your SSID
#define WIFIPASS "" // Your Wifi Pass
TheThings client(TOKEN);
#define DHTPIN 14 // Pin which is cosnnected to the DHT sensor.
// Uncomment the type of sensor in use:
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;
#define TRIGGER_PIN 0
#define FRECUENCY 2000
char *AP="TEST_BQ";
String prefix="rel";
const char WiFiAPPSK[] = "prueba";
WiFiManager wifiManager;
#define RELAY1 12
#define RELAY2 13
#define MEASUREMENT_TIME 30000 // Time in milisecons
float Temperature,Humidity;
TickerScheduler ts(1);
/****************************************
* Auxiliar Functions
****************************************/
//void configWiFi(){
// wifiManager.resetSettings();
// if(!wifiManager.autoConnect(AP,WiFiAPPSK)) {
// Serial.println("Reconfiguration called");
// delay(3000);
// //reset and try again, or maybe put it to deep sleep
// ESP.reset();
// delay(15000);
// }
//}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived");
// handle message arrived
String text = "";
for (int i = 0; i < length; i++)
text.concat((char)payload[i]);
Serial.println(text);
text.replace(" ", "");
text.toUpperCase();
if (text.indexOf("\"KEY\":\"REL1\"") >= 0) {
if (text.indexOf("\"VALUE\":\"ON\"") >= 0) digitalWrite(RELAY1,HIGH);
else if (text.indexOf("\"VALUE\":\"OFF\"") >= 0) digitalWrite(RELAY1,LOW);
}
else if (text.indexOf("\"KEY\":\"REL2\"") >= 0) {
if (text.indexOf("\"VALUE\":\"ON\"") >= 0) digitalWrite(RELAY2,HIGH);
else if (text.indexOf("\"VALUE\":\"OFF\"") >= 0) digitalWrite(RELAY2,LOW);
}
}
float temperatureMeasurement(sensors_event_t event, DHT_Unified dht){
// Get temperature event and print its value.
dht.temperature().getEvent(&event);
if (isnan(event.temperature)) {
Serial.println("Error reading temperature!");
}
else {
Serial.print("Temperature: ");
Serial.print(event.temperature);
Serial.println(" *C");
return event.temperature;
}
}
float humidityMeasurement(sensors_event_t event, DHT_Unified dht){
// Get humidity event and print its value.
dht.humidity().getEvent(&event);
if (isnan(event.relative_humidity)) {
Serial.println("Error reading humidity!");
}
else {
Serial.print("Humidity: ");
Serial.print(event.relative_humidity);
Serial.println("%");
return event.relative_humidity;
}
}
void measureAndSend(){
sensors_event_t event;
Temperature=temperatureMeasurement(event,dht);
Humidity=humidityMeasurement(event,dht);
client.add("Temperature", Temperature);
client.add("Humidity", Humidity);
client.publish();
}
/****************************************
* Main Functions
****************************************/
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
delay(100);
pinMode(RELAY1,OUTPUT);
pinMode(RELAY2,OUTPUT);
dht.begin();
sensor_t sensor;
// pinMode(TRIGGER_PIN, INPUT);
// attachInterrupt(digitalPinToInterrupt(TRIGGER_PIN), configWiFi, RISING);
//
// //sets timeout until configuration portal gets turned off
// //useful to make it all retry or go to sleep
// //in seconds
// wifiManager.setTimeout(280);
//
// //fetches ssid and pass and tries to connect
// //if it does not connect it starts an access point with the specified name
// //here "AutoConnectAP"
// //and goes into a blocking loop awaiting configuration
// if(!wifiManager.autoConnect(AP,WiFiAPPSK)) {
// Serial.println("failed to connect and hit timeout");
// delay(3000);
// //reset and try again, or maybe put it to deep sleep
// //ESP.reset();
// delay(FRECUENCY);
// }
// //if you get here you have connected to the WiFi
// Serial.println("connected...yeey :)");
client.wifiConnection(WIFINAME, WIFIPASS);
//client.wifiConnection2();
client.begin(callback);
client.subscribe(); //Insert the dataSource and Variable's Labels
ts.add(0, MEASUREMENT_TIME, [&](void*) { measureAndSend(); }, nullptr, false);
ts.enableAll();
}
void loop() {
// put your main code here, to run repeatedly:
ts.update();
if(!client.connected()){
client.reconnect();
client.subscribe(); //Insert the dataSource and Variable's Labels
}
client.loop();
}

View File

@@ -0,0 +1,16 @@
#include "GyverFilters.h"
GFilterRA analog0; // фильтр назовём analog0
void setup() {
Serial.begin(9600);
// установка коэффициента фильтрации (0.0... 1.0). Чем меньше, тем плавнее фильтр
analog0.setCoef(0.01);
// установка шага фильтрации (мс). Чем меньше, тем резче фильтр
analog0.setStep(10);
}
void loop() {
Serial.println(analog0.filteredTime(analogRead(0)));
}

View File

@@ -0,0 +1,32 @@
/*
Пример линейной аппроксимации методом наименьших квадратов
Два массива: по оси Х и по оси У
Линейная аппроксимация повозоляет получить уравнение прямой,
равноудалённой от точек на плоскости ХУ. Удобно для расчёта
роста изменяющейся шумящей величины. Уравнение вида у = A*x + B
В папке с данным примером есть скриншот из excel,
иллюстрирующий работу аппроксимации с такими же исходными
*/
// два массива с данными (одинаковой размероности и размера)
int x_array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int y_array[] = {1, 5, 2, 8, 3, 9, 10, 5, 15, 12};
#include <GyverFilters.h>
GLinear<int> test; // указываем тип данных в <>
void setup() {
Serial.begin(9600);
// передаём массивы и размер одного из них
test.compute((int*)x_array, (int*)y_array, sizeof(x_array));
// Уравнение вида у = A*x + B
Serial.println(test.getA()); // получить коэффициент А
Serial.println(test.getB()); // получить коэффициент В
Serial.println(test.getDelta()); // получить изменение (аппроксимированное)
}
void loop() {
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Some files were not shown because too many files have changed in this diff Show More