Merge branch 'IoTManagerProject:ver3' into ver3

This commit is contained in:
Dmitry Borisenko
2021-12-15 00:20:04 +01:00
committed by GitHub
7 changed files with 88 additions and 13 deletions

View File

@@ -2,6 +2,10 @@
#include <Arduino.h> #include <Arduino.h>
void hex2string(byte array[], unsigned int len, char buffer[]);
int string2hex(const char* str, unsigned char* bytes );
uint8_t hexStringToUint8(String hex); uint8_t hexStringToUint8(String hex);
uint16_t hexStringToUint16(String hex); uint16_t hexStringToUint16(String hex);

View File

@@ -5,17 +5,19 @@
#include <DallasTemperature.h> #include <DallasTemperature.h>
#include "Global.h" #include "Global.h"
//ИНТЕГРИРУЮ: Объявляем глагольные переменные необходимые интегрируемой библиотеке
extern DallasTemperature sensors; extern DallasTemperature sensors;
extern OneWire* oneWire; extern OneWire* oneWire;
//ИНТЕГРИРУЮ: следим за наименованиями далее
class SensorDallas; class SensorDallas;
typedef std::vector<SensorDallas> MySensorDallasVector; typedef std::vector<SensorDallas> MySensorDallasVector;
class SensorDallas { class SensorDallas {
public: public:
SensorDallas(unsigned long interval, unsigned int pin, unsigned int index, String key); //ИНТЕГРИРУЮ: обращаем внимание на параметры, берутся из таблицы настроек
SensorDallas(unsigned long interval, unsigned int pin, unsigned int index, String addr, String key);
~SensorDallas(); ~SensorDallas();
void loop(); void loop();
@@ -27,6 +29,7 @@ class SensorDallas {
unsigned long difference; unsigned long difference;
unsigned long _interval; unsigned long _interval;
String _key; String _key;
String _addr;
unsigned int _pin; unsigned int _pin;
unsigned int _index; unsigned int _index;
}; };

View File

@@ -101,6 +101,7 @@ void csvCmdExecute(String& cmdStr) {
#ifdef EnableSensorUltrasonic #ifdef EnableSensorUltrasonic
sCmd.addCommand(order.c_str(), ultrasonic); sCmd.addCommand(order.c_str(), ultrasonic);
#endif #endif
//ИНТЕГРИРУЮ: Первая интеграция в ядро. Следим за наименованием
} else if (order == F("dallas-temp")) { } else if (order == F("dallas-temp")) {
#ifdef EnableSensorDallas #ifdef EnableSensorDallas
sCmd.addCommand(order.c_str(), dallas); sCmd.addCommand(order.c_str(), dallas);

View File

@@ -163,6 +163,7 @@ void clearVectors() {
pwmOut_EnterCounter = -1; pwmOut_EnterCounter = -1;
#endif #endif
//================================== //==================================
//ИНТЕГРИРУЮ: Вторая интеграция в ядро. Следим за наименованием
#ifdef EnableSensorDallas #ifdef EnableSensorDallas
if (mySensorDallas2 != nullptr) { if (mySensorDallas2 != nullptr) {
mySensorDallas2->clear(); mySensorDallas2->clear();

View File

@@ -62,6 +62,41 @@ String selectFromMarkerToMarker(String str, String tofind, int number) {
return "not found"; return "not found";
} }
//преобразовываем байтовый массив в человеческий вид HEX в строке
void hex2string(byte array[], unsigned int len, char buffer[])
{
for (unsigned int i = 0; i < len; i++)
{
byte nib1 = (array[i] >> 4) & 0x0F;
byte nib2 = (array[i] >> 0) & 0x0F;
buffer[i*2+0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA;
buffer[i*2+1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA;
}
buffer[len*2] = '\0';
}
inline unsigned char ChartoHex( char ch )
{
return ( ( ch >= 'A' ) ? ( ch - 'A' + 0xA ) : ( ch - '0' ) ) & 0x0F;
}
// str - указатель на массив символов
// bytes - выходной буфер
// функция возвращает колл-во байт
//
int string2hex(const char* str, unsigned char* bytes )
{
unsigned char Hi, Lo;
int i = 0;
while( ( Hi = *str++ ) && ( Lo = *str++ ) )
{
bytes[i++] = ( ChartoHex( Hi ) << 4 ) | ChartoHex( Lo );
}
return i;
}
uint8_t hexStringToUint8(String hex) { uint8_t hexStringToUint8(String hex) {
uint8_t tmp = strtol(hex.c_str(), NULL, 0); uint8_t tmp = strtol(hex.c_str(), NULL, 0);
if (tmp >= 0x00 && tmp <= 0xFF) { if (tmp >= 0x00 && tmp <= 0xFF) {

View File

@@ -4,26 +4,38 @@
#include "BufferExecute.h" #include "BufferExecute.h"
#include "Class/LineParsing.h" #include "Class/LineParsing.h"
#include "Global.h" #include "Global.h"
#include "DallasTemperature.h"
#include "Utils/StringUtils.h"
#include <Arduino.h> #include <Arduino.h>
//ИНТЕГРИРУЮ: переменные необходимые для работы интегрируемой библиотеки. Аналог Arduino
OneWire* oneWire; OneWire* oneWire;
DallasTemperature sensors; DallasTemperature sensors;
SensorDallas::SensorDallas(unsigned long interval, unsigned int pin, unsigned int index, String key) { //ИНТЕГРИРУЮ:
//Для каждого датчика указанного в конфигурации вызывается конструктор для настройки перед запуском. Аналог функции setup() в Arduino.
//В параметрах передаются дополнительные настройки, указанные все в той же таблице настройки устройства.
SensorDallas::SensorDallas(unsigned long interval, unsigned int pin, unsigned int index, String addr, String key) {
//все особые параметры сливаем в локальные переменные экземпляра для будущего доступа
_interval = interval * 1000; _interval = interval * 1000;
_key = key; _key = key;
_pin = pin; _pin = pin;
_index = index; _index = index;
_addr = addr;
//ИНТЕГРИРУЮ:
//вызываем необходимые инициирующие функции интегрируемой библиотеки
oneWire = new OneWire((uint8_t)_pin); oneWire = new OneWire((uint8_t)_pin);
sensors.setOneWire(oneWire); sensors.setOneWire(oneWire);
sensors.begin(); sensors.begin();
sensors.setResolution(12); sensors.setResolution(12);
} }
//ИНТЕГРИРУЮ: оставляем как есть или развиваем, если нужно правильно завершить работу с интегрируемой библиотекой после отключения датчика
SensorDallas::~SensorDallas() {} SensorDallas::~SensorDallas() {}
//ИНТЕГРИРУЮ: аналог loop() в Arduino. Требуется изменить, если интегрируемая библиотека нуждается в другом алгоритме квотирования времени.
void SensorDallas::loop() { void SensorDallas::loop() {
currentMillis = millis(); currentMillis = millis();
difference = currentMillis - prevMillis; difference = currentMillis - prevMillis;
@@ -33,34 +45,52 @@ void SensorDallas::loop() {
} }
} }
//ИНТЕГРИРУЮ: вызывается из цикла loop каждый установленный временно интервал в параметрах датчика. Необходимо изменить для чтения данных из датчика.
void SensorDallas::readDallas() { void SensorDallas::readDallas() {
sensors.requestTemperaturesByIndex(_index); //запускаем опрос измерений у всех датчиков на линии
float value = sensors.getTempCByIndex(_index); sensors.requestTemperatures();
//Определяем адрес. Если парамтер addr не установлен, то узнаем адрес по индексу
DeviceAddress deviceAddress;
if (_addr == "") {
sensors.getAddress(deviceAddress, _index);
} else {
string2hex(_addr.c_str(), deviceAddress);
}
//получаем температуру по адресу
float value = sensors.getTempC(deviceAddress);
//ИНТЕГРИРУЮ: блок генерации уведомлений в ядре системы. Стоит обратить внимание только на формат выводимого сообщения в консоли.
eventGen2(_key, String(value)); eventGen2(_key, String(value));
jsonWriteStr(configLiveJson, _key, String(value)); jsonWriteStr(configLiveJson, _key, String(value));
publishStatus(_key, String(value)); publishStatus(_key, String(value));
String path = mqttRootDevice + "/" +_key + "/status"; char addrStr[20] = "";
String json = "{}"; hex2string(deviceAddress, 8, addrStr);
jsonWriteStr(json, "status", String(value)); SerialPrint("I", "Sensor", "'" + _key + "' data: " + String(value) + "' addr: " + String(addrStr));
String MyJson = json;
jsonWriteStr(MyJson, "topic", path);
ws.textAll(MyJson);
SerialPrint("I", "Sensor", "'" + _key + "' data: " + String(value));
} }
//ИНТЕГРИРУЮ: глобальная переменная необходима для интеграции в ядро. Следим за наименованием.
MySensorDallasVector* mySensorDallas2 = nullptr; MySensorDallasVector* mySensorDallas2 = nullptr;
//ИНТЕГРИРУЮ: функция вызывается ядром для каждой записи в таблице настроки для создания экземпляров датчиков
//некоторые датчики записаны в таблице в виде нескольких строк, поэтому необходимо контролировать итерации обращения к данной функции
void dallas() { void dallas() {
//ИНТЕГРИРУЮ: не меняем
myLineParsing.update(); myLineParsing.update();
//ИНТЕГРИРУЮ: устанавливаем в соответствии с параметрами таблицы
String interval = myLineParsing.gint(); String interval = myLineParsing.gint();
String pin = myLineParsing.gpin(); String pin = myLineParsing.gpin();
String index = myLineParsing.gindex(); String index = myLineParsing.gindex();
String key = myLineParsing.gkey(); String key = myLineParsing.gkey();
String addr = myLineParsing.gaddr();
//ИНТЕГРИРУЮ: не меняем
myLineParsing.clear(); myLineParsing.clear();
//ИНТЕГРИРУЮ: блок создания экземпляров датчиков. Обратить внимание на наименования и передаваемые параметры в конструктор
static bool firstTime = true; static bool firstTime = true;
if (firstTime) mySensorDallas2 = new MySensorDallasVector(); if (firstTime) mySensorDallas2 = new MySensorDallasVector();
firstTime = false; firstTime = false;
mySensorDallas2->push_back(SensorDallas(interval.toInt(), pin.toInt(), index.toInt(), key)); mySensorDallas2->push_back(SensorDallas(interval.toInt(), pin.toInt(), index.toInt(), addr, key));
} }
#endif #endif

View File

@@ -138,6 +138,7 @@ void loop() {
} }
} }
#endif #endif
//ИНТЕГРИРУЮ: Третья интеграция в ядро. Следим за наименованием
#ifdef EnableLogging #ifdef EnableLogging
if (myLogging != nullptr) { if (myLogging != nullptr) {
for (unsigned int i = 0; i < myLogging->size(); i++) { for (unsigned int i = 0; i < myLogging->size(); i++) {