27 МОСКОВСКАЯ ВСТРЕЧА
Форум самогонщиков Сайт Барахолка Магазин 27 МОСКОВСКАЯ ВСТРЕЧА

Программно - аппаратный комплекс контроля температурных параметров

Форум самогонщиков Вопросы по электр(он)ике
1 2 3 2
Вася Мореман Студент Нижний Новгород 16
Отв.20  29 Авг. 20, 08:29
json по tcp - свой велосипедный протокол, или что-то общепопулярное?arkhnchul, 28 Авг. 20, 23:15
JSON широко распространённый формат передачи данных, хотя до сих пор почему-то не стандартизованный, на счёт него много копий ломается в ИТ фере.
TCP - Transport Control Protokol, без него сейчас в интернет не выйти, используется везде в веб приложениях.

Добавлено через 2мин.:

Скажем, в моей родной Уфе перепады рельефа в несколько десятков метров в пределах пары километров дальности - ничуть не редкостьarkhnchul, 29 Авг. 20, 00:49
Я сам не считал, но почему-то уверен, если пересчитать погрешность, она будет ничтожно мала.
makh Профессор Sаmara 2.1K 1K
Отв.21  29 Авг. 20, 13:03
чтобы можно былоarkhnchul, 29 Авг. 20, 00:49
Логично..

уверен, если пересчитать погрешность, она будет ничтожно малаВася Мореман, 29 Авг. 20, 08:29
По температуре кипения воды в атмосферном диапазоне -- примерно 1/3 цельсия на сто метров. Не всегда пренебрежительно..

Но давайте вспомним зачем нам эта цифра, и посмотрим на наше оборудование..
arkhnchul Доктор наук Москва, Уфа 990 367
Отв.22  29 Авг. 20, 14:57
Вася Мореман, я прекрасно знаю чо такое json и tcp)
как понимаю, там таки в протокольной части изобретен свой велосипед. А почему было не взять что-то из распространенных M2M протоколов, скажем, MQTT или MODBUS/TCP?
Я сам не считал, но почему-то уверен, если пересчитать погрешность, она будет ничтожно мала.Вася Мореман, 29 Авг. 20, 08:29
"ничтожно" - это смотря для чего. Для бытового барометра - да, совершенно пофиг. Для барометрического высотомера - очень даже определяющая разница.
Вася Мореман Студент Нижний Новгород 16
Отв.23  30 Авг. 20, 15:25
А почему было не взять что-то из распространенных M2M протоколов, скажем, MQTT или MODBUS/TCP?arkhnchul, 29 Авг. 20, 14:57
Был бы резон...
Для меня JSON проще, потому как библиотек преобразования с избытком.

Добавлено через 14мин.:

Для бытового барометра - да, совершенно пофиг. Для барометрического высотомера - очень даже определяющая разница.arkhnchul, 29 Авг. 20, 14:57
Хорошо, посчитаем...
Допустим,перепад 10 м, юто приблизительно 1 мм.рт.ст, по дельте температуры кипения это 0.03 градуса, в спиртуоэности это примерно 0.5 % спиртуозности.
Ну да, для +-10 не критично, для 100 м уже существенно..
Хорошо, посмотрю что возвращается из OpenWeather для конкретной гео.точки,возможно есть уровень высоты относительно уровня моря, пересчитаем.
Хотя, для таких перфектоционистов закладывался на индивидуальные таблицы пересчёта.

Добавлено через 10мин.:

Логично..makh, 29 Авг. 20, 13:03
Я так понял намёк на кроссплатформенность?
Могу переложить на Java, можно будет под Linux юзать, главное понять, нужно ли юто?
Возможности имеются, главное целесообразность.
Также в коде контроллеров, догадываюсь что имеется необходимость управления мощностью и всяческими клапанами, все это возможно.
Собственно поэтому здесь и опубликовал свои наработки.
arkhnchul Доктор наук Москва, Уфа 990 367
Отв.24  01 Сент. 20, 02:39
Был бы резон...Вася Мореман, 30 Авг. 20, 15:25
Как минимум это удобно и повсеместно распространено. Я если вижу датчик, с которого как-то предполагается снимать показания для телеметрии, то по-умоолчанию ожидаю, что их можно считать по какому-то популярному протоколу. Равно как и и большинство, если не все системы мониторинга умеют этими протоколами кормиться. Иначе получается совершенно негибкая ерунда - система работает только со своими датчиками/источниками данных, которые в свою очередь иначе никак не опросить.
Вася Мореман Студент Нижний Новгород 16
Отв.25  01 Сент. 20, 10:19
Прикрутил пересчет атмосферного давления по высоте над уровнем моря и текущей температуре воздуха.
Вася Мореман Студент Нижний Новгород 16
Отв.26  01 Сент. 20, 15:44
Исходники контроллеров.
При первом включении работает как точка доступа с SSID Smart Distiller пароль vp.altukhov.project и имеет IP адрес 192.168.4.1

Поддерживает запросы:

Получение информации о контроллере http://192.168.4.1/ ответ json: {"Device":"2C:3A:E8:45:1A:40","Uptime":"00:00:53"}

Проверка работоспособности http://192.168.4.1/ping ответ json: {"uid":"2C:3A:E8:45:1A:40"}

Список доступных сетей http://192.168.4.1/networks ответ json: {"Points":[{"Name":"Svyazist","Level":"-83"},{"Name":"wifi_sv","Level":"-81"},{"Name":"HP-Print-e7-LaserJet Pro MFP","Level":"-91"},{"Name":"Svyazist","Level":"-73"},{"Name":"wifi_sv","Level":"-73"}]}

Список доступных датчиков http://192.168.4.1/sensors ответ json: {"Sensors":[{"Chip":"DS18B20","Code":"28FF8A00011703F5","Celsius":"25.88"},{"Chip":"DS18B20","Code":"28FF469E82170407","Celsius":"25.88"},{"Chip":"DS18B20","Code":"28FFA58C81170516","Celsius":"26.81"}]}

Получение данных по датчику http://192.168.4.1/value?uid=28FF8A00011703F5 ответ json: {"Chip":"DS18B20","Code":"28FF8A00011703F5","Celsius":"25.69"}

Подключение к домашней WiFi сети, после этой команды и успешной авторизации на точке доступа, контроллер переходит в режим клиента и становится доступным в домашней сети WiFi. Полученный IP адрес отображается на экране. http://192.168.4.1/ssid?ssid=[ssid]&password=[password]

Файлы Sensor.h и Sensor.cpp необходимо поместить в папку \libraries\Sensor созданную в каталоге где хранятся проекты Arduino IDE

В Sensor.cpp необходимо указать порт, который будет использоваться для подключения датчиков температуры OneWire ds(XX);

Добавлена возможность установки SSID и пароля через браузер http://192.168.4.1/network
Вася Мореман Студент Нижний Новгород 16
Отв.27  01 Сент. 20, 15:52, через 9 мин
Версия 1.0.0.2
Setup.zip 6.4 Мб
Ivan_ Студент Biysk 24 1
Отв.28  02 Сент. 20, 19:37
6. Получение текущего значения атмосферного давления с ближайшей метеорологической станции с использованием OpenWeatherAPIВася Мореман, 27 Авг. 20, 17:36
Вот это мне сразу интересно. Мудохаюсь уже вторую неделю с расшифровкой полученных данных с https://openweathermap.org/forecast5/
Прогноз бесплатный на 5 дней, прочитать не могу.

Добавлено через 14мин.:

Онлайн погоду с openweathermap.org получаю легко, с пятидневным бесплатным прогнозом, вообще запарился. Получаю строку прогноза без проблем, но дальше вывода в серийный порт, дело не идёт.

Добавлено через 10мин.:

Вася Мореман,
Вот такой ответ сервера, подскажи как преобразовать в числовые значения.
JSON
Example of API response:
{
"cod": "200",
"message": 0,
"cnt": 40,
"list": [
{
"dt": 1578409200,
"main": {
"temp": 284.92,
"feels_like": 281.38,
"temp_min": 283.58,
"temp_max": 284.92,
"pressure": 1020,
"sea_level": 1020,
"grnd_level": 1016,
"humidity": 90,
"temp_kf": 1.34
},
"weather": [
{
"id": 804,
"main": "Clouds",
"description": "overcast clouds",
"icon": "04d"
}
],
"clouds": {
"all": 100
},
"wind": {
"speed": 5.19,
"deg": 211
},
"visibility": 10000,
"pop": 0.24,
"sys": {
"pod": "d"
},
"dt_txt": "2020-01-07 15:00:00"
},

...

"city": {
"id": 2643743,
"name": "London",
"coord": {
"lat": 51.5073,
"lon": -0.1277
},
"country": "GB",
"timezone": 0,
"sunrise": 1578384285,
"sunset": 1578413272
}
}
arkhnchul Доктор наук Москва, Уфа 990 367
Отв.29  02 Сент. 20, 20:13, через 36 мин
Ivan_, а в чем собственно проблема и что именно из этого преобразовать хочешь?
Ivan_ Студент Biysk 24 1
Отв.30  02 Сент. 20, 21:34
что именно из этого преобразовать хочешьarkhnchul, 02 Сент. 20, 20:13
Хочу получить величины в виде int/float из сообщения сервера, чтоб транслировать прогноз на огромное светодиодное табло. Температуру, сделали клоуны в Кельвинах -273 - 0 градуса Цельсия и т.п. JSON, покамест , для меня загадка.

Добавлено через 5мин.:

arkhnchul, на такую светодиодную матрицу хочу прогноз погоды выводить.
Программно - аппаратный комплекс контроля температурных параметров
Программно - аппаратный комплекс контроля температурных параметров. Вопросы по электр(он)ике.
makh Профессор Sаmara 2.1K 1K
Отв.31  03 Сент. 20, 00:02
намёк наВася Мореман, 30 Авг. 20, 14:25
Пытаюсь намекнуть, что практической пользы от метеорологической цифры -- ноль. Пытался когда-то с ней работать -- совсем говно получалось. Давление надо мерять, также как и температуру.. Барометрический датчик стоит доллар..

"pressure": 1020,
"sea_level": 1020,Ivan_, 02 Сент. 20, 19:37
Готовые цифры в миллибарах.. Что куда преобразовывать?
arkhnchul Доктор наук Москва, Уфа 990 367
Отв.32  03 Сент. 20, 03:02
Ivan_, ну давай продолжим допрос добывание информации
какие именно величины хочешь получить? И, главное, на чем и для какой платформы пишешь? так-то json разгрести примерно никогда не проблема.
Температуру, сделали клоуны в КельвинахIvan_, 02 Сент. 20, 21:34
чойта сразу клоуны? сделали все совершенно правильно, температура в стандартных международных научных единицах.

Добавлено через 3мин.:

Давление надо мерятьmakh, 03 Сент. 20, 00:02
удобряю. Например, в моем (конечно, весьма специфическом) помещении давление в бОльшей степени зависит от количества и режима включенных (промышленных) вытяжек и приточек, и в меньшей - от того, чо там на улице.
makh Профессор Sаmara 2.1K 1K
Отв.33  03 Сент. 20, 04:34
В помешении, на улице.. А в кипящем кубе все-равно будет больше .) Насколько -- зависит.. Выше давал ссылку на полметра гофры, например..
Вася Мореман Студент Нижний Новгород 16
Отв.34  03 Сент. 20, 07:38
Вот такой ответ сервера, подскажи как преобразовать в числовые значения.Ivan_, 02 Сент. 20, 19:37
Ну надо бы понимать, где будем преобразовывать.
Для C# есть библиотеки, я пользуюсь Newtonsoft.Json
JsonSerializerSettings settings = new JsonSerializerSettings() { CheckAdditionalContent = false };
WeatherObj weather = JsonConvert.DeserializeObject<WeatherObj>(json, settings);

Где WeatherObj это класс описанный согласно структуре получаемого JSON.
В Java есть свои библиотеки.
Ну а если необходимо в ESP на C++ разобрать JSON, то это нужно смотреть в сторону, например этой библиотеки
https://arduinojson.org/

Добавлено через 4мин.:

Вот здесь даже для ESP32 проект готовый
https://www.instructables.com/...-BME280-Sensor/

Добавлено через 13мин.:

Барометрический датчик стоит долларmakh, 03 Сент. 20, 00:02
Какие датчики используешь?
Про измерение давления думал, но есть определенные условия, которые хотелось соблюсти.
На кубах, колоннах и всяческих других элементах аппарата обычно делают патрубок диаметром 6 мм. для измерения температуры.
Туда как раз очень хорошо вставляется датчик DS18B20, чтото еще воткнуть уже затруднительно.
Если бы скомпоновать в одно целое DS18B20 и барометрический датчик, было бы дело...

P.S. я не изобретаю велосипед, я хочу соорудить аппаратно - программный комплекс, который легко мог бы использовать каждый, а не каждый имеет возможности модернизировать колонну и всякие примочки сооружать.
makh Профессор Sаmara 2.1K 1K
Отв.35  04 Сент. 20, 03:09
Какие датчикиВася Мореман, 03 Сент. 20, 07:38
Пользую MS5611 (фабричная калибровка и широкий диапазон -- вакуум), для атмосферы сгодятся и BMP180/280, которые по баксу..

скомпоновать в одно целое DS18B20 и барометрический датчикВася Мореман, 03 Сент. 20, 07:38
Пару месяцев назад делал брательнику показометр, скомпоновал следуюшим образом:

800.jpg
800. Программно - аппаратный комплекс контроля температурных параметров. Вопросы по электр(он)ике.


Т.е. шланг рядом с кабелем.. Датчик надо же как-то защитить от паров и высокой температуры..
Градусник Si7051, два датчика MS5611.. Дополнительно показывает разницу между атмосферой и шлангом, спиртуозность жидкой и паровой фазы, ткип воды, и уже не помню что еще.. Всего 8 сущностей..

DS18B20 на этой задаче лажает. Или долго и муторно калибровать нелинейное.. Si7051 фабрично калиброванные с максимальной ошибкой 0.1 (0.13 в "атмосферном" диапазоне), и разрешение намного выше -- красивая получается цифра без лишних телодвижений..

Добавлено через 5мин.:

[Абсолютный датчик давления MS5611]
Вася Мореман Студент Нижний Новгород 16
Отв.36  04 Сент. 20, 22:22
makh, спасибо, буду копать в сторону предложенных датчиков, только по всей видимости все это перельётся в разработку конструктива для измерения давления и температуры одновременно.
Ivan_ Студент Biysk 24 1
Отв.37  10 Сент. 20, 21:17
Вася Мореман, немножко не в тему, но я себе сегодня прикольные часы NTP сделал. Больше года мучился и сегодня сделал как мне хотелось. Матрица P5 64/32 RGB, ESP32 DEVKIT V1.
Программно - аппаратный комплекс контроля температурных параметров
Программно - аппаратный комплекс контроля температурных параметров. Вопросы по электр(он)ике.

еСТЕСТВЕННО, это будет самогонный комп, в конечном итоге.

Добавлено через 3мин.:

Если интересно. Исходник взял тут https://github.com/pisuke/Heltec_OLED_NPT_Clock.
В мирное время, это будут часы/погодная станция. При погоне, буду девайс юзать как самогонный компьютер.

Добавлено через 4мин.:

#include <Adafruit_GFX.h>
#include <P3RGB64x32MatrixPanel.h>
#include <Fonts/FreeSansBold9pt7b.h>
#include <Fonts/FreeSansBold12pt7b.h>
#include <Fonts/FreeSansBold24pt7b.h>
#include "Arduino.h"
#include <ESPPerfectTime.h>
#include <TimeLib.h> // Time library https://github.com/PaulStoffregen/Time
#include <WiFi.h>
#include <WiFiUdp.h>
#include <ArduinoJson.h>
P3RGB64x32MatrixPanel matrix;
// WiFi configuration
const char ssid[] = "tele2"; // your network SSID (name)
const char pass[] = "ta20242024"; // your network password
// NTP configuration
const char *ntpServerName = "pool.ntp.org";
const int timeZone = 0; // UTC
const int daylightOffset_sec = 3600; // DST offset in seconds
// Other variables and objects
WiFiClient wifiClient;
char timeZoneAbbreviation[10];
char timeZone_str[40];
time_t prevDisplay = 0; // when the digital clock was displayed
int a = 0;
// Начало функции обработки кириллических символов
String utf8rus(String source) // Функция для конвертации русских символов из кодировки CP1251 в UTF8
{
int i,k;
String target;
unsigned char n;
char m[2] = { '0', '' };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;

if (n >= 0xBF){
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) { n = 0xA8; break; }
if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) { n = 0xB7; break; }
if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}
// Конец функции обработки кириллических симоволов
void setup()
{
Serial.begin(115200);
while (!Serial) ; // Needed for Leonardo only
delay(250);
Serial.println("
ESP32 NTP clock");
// Connect to WiFi SSID
connectWiFi();
// Request http://worldtimeapi.org/api/ip
DynamicJsonDocument jsonDoc = httpJSONRequest(wifiClient, "worldtimeapi.org", "/api/ip");
strcpy(timeZoneAbbreviation, jsonDoc["abbreviation"]);
bool dst = jsonDoc["dst"]; // true
int dst_offset = jsonDoc["dst_offset"]; // 3600
strcpy(timeZone_str, jsonDoc["timezone"]);
const char* utc_offset = jsonDoc["utc_offset"]; // "+01:00"
// int week_number = jsonDoc["week_number"]; // 30
// convert UTC offset to signed float
float utc_offset_float = ((float)utc_offset[1] - 48) * 10 + ((float)utc_offset[2] - 48) + (((float)utc_offset[4] - 48) * 10 + ((float)utc_offset[5] - 48)) / 60.0;
if ((int)utc_offset[0] == 45) {
utc_offset_float *= -1;
}
Serial.println(timeZoneAbbreviation);
Serial.println(dst);
Serial.println(timeZone_str);
Serial.println(utc_offset);
Serial.println(utc_offset_float);
pftime::configTime(utc_offset_float * 3600, 0, ntpServerName);
}
void loop()
{
if (now() != prevDisplay) { //update the display only if time has changed
// matrix.begin();//СТАРТ МАТРИЦЫ
prevDisplay = now();
// Get current local time as struct tm by calling pftime::localtime(nullptr)
struct tm *tm = pftime::localtime(nullptr);
// Get microseconds at the same time by passing suseconds_t* as 2nd argument
suseconds_t usec;
tm = pftime::localtime(nullptr, &usec);
// Get the time string
String dateString = getDateString(tm, usec);
String timeString = getTimeString(tm, usec);
// Print the time to serial
Serial.println(dateString + " | " + timeString + " " + timeZoneAbbreviation + " " + timeZone_str);
if (tm->tm_sec==0){
//ПЕЧАТЬ ДАННЫХ НА МАТРИЦЕ
matrix.begin();//СТАРТ МАТРИЦЫ
matrix.setTextColor(matrix.color444(0, 1, 0));//ЦВЕТ ТЕКСТА RGB ОТ 1 ДО 15
matrix.setFont(&FreeSansBold12pt7b);
// matrix.setFont();
matrix.setTextSize(0);
matrix.setTextWrap(false);//ЗАПРЕТ ПЕРЕНОСА СТРОКИ
//matrix.fillScreen(0);
// matrix.setFont();
// matrix.setCursor(2, 17);
// matrix.print(utf8rus("Русский алфавит"));
// delay(3000);
matrix.setFont(&FreeSansBold12pt7b);
matrix.fillScreen(0);
matrix.setCursor(2, 17);
matrix.print(timeString);
matrix.setCursor(2, 31);
matrix.setFont(0);
matrix.setTextColor(matrix.color444(0, 0, 3));
matrix.print(dateString); }
if (tm->tm_sec==30){
matrix.setTextColor(matrix.color444(0, 3, 0));//трансляция бегущей строки
matrix.setFont(&FreeSansBold24pt7b);
while ( a < 55) {
matrix.fillScreen(0);
matrix.setCursor(0-a, 31);
matrix.print(timeString);
a=a+1;
delay(25);
}
delay(1000);
while ( a>= 0) {
matrix.fillScreen(0);
matrix.setCursor(0-a, 31);
matrix.print(timeString);
a=a-1;
delay(25);
}
delay(1000);
matrix.setTextColor(matrix.color444(0, 1, 0));//ЦВЕТ ТЕКСТА RGB ОТ 0 ДО 15
matrix.setFont(&FreeSansBold12pt7b);
matrix.setTextSize(0);
matrix.fillScreen(0);
matrix.setCursor(2, 17);
matrix.print(timeString);
matrix.setCursor(2, 31);
matrix.setFont(0);
matrix.setTextColor(matrix.color444(0, 0, 3));
matrix.print(dateString);
}
}
}
void connectWiFi() {
WiFi.disconnect();
WiFi.mode(WIFI_MODE_STA);
WiFi.begin(ssid, pass);
Serial.print("
Connecting to WiFi SSID " + String(ssid) + " ...");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("
Connected. ");
Serial.print("The IP number assigned by DHCP is ");
Serial.println(WiFi.localIP());
}

String getDateString(struct tm *tm, suseconds_t usec) {
char time_string[100];
sprintf(time_string, "%02d.%02d.%04d",
tm->tm_mday,
tm->tm_mon + 1,
tm->tm_year + 1900);
return time_string;
}
String getTimeString(struct tm *tm, suseconds_t usec) {
char time_string[100];
sprintf(time_string, "%02d:%02d",
tm->tm_hour,
tm->tm_min);
// sprintf(time_string, "%02d:%02d:%02d",
// tm->tm_hour,
// tm->tm_min,
// tm->tm_sec);
Serial.println(tm->tm_sec);
return time_string;
}

Добавлено через 1мин.:

#include <WiFi.h>

DynamicJsonDocument httpJSONRequest(WiFiClient client, char *hostname, String endpoint) {
const size_t capacity = JSON_OBJECT_SIZE(15) + 350;
DynamicJsonDocument doc(capacity);

// Connect to HTTP server
client.setTimeout(10000);
if (!client.connect(hostname, 80)) {
Serial.println(F("Connection failed"));
return doc;
}

Serial.println(F("HTTP request client connected"));

// Send HTTP request
client.print(F("GET /"));
client.print(endpoint);
client.println(F(" HTTP/1.0"));
client.print(F("Host: "));
client.println(hostname);
client.println(F("Connection: close"));
if (client.println() == 0) {
Serial.println(F("Failed to send request"));
return doc;
}

// Check HTTP status
char status[32] = {0};
client.readBytesUntil(' ', status, sizeof(status));
// It should be "HTTP/1.0 200 OK" or "HTTP/1.1 200 OK"
if (strcmp(status + 9, "200 OK") != 0) {
Serial.print(F("Unexpected response: "));
Serial.println(status);
return doc;
}

// Skip HTTP headers
char endOfHeaders[] = "

";
if (!client.find(endOfHeaders)) {
Serial.println(F("Invalid response"));
return doc;
}

// Parse the JSON response
deserializeJson(doc, client);
return doc;
}

Добавлено через 1мин.:

Естественно, погодная станция будет встроена.
Вася Мореман Студент Нижний Новгород 16
Отв.38  11 Сент. 20, 05:45
Выкладывать исходники в сообщении - не лучшая идея.
Ivan_ Студент Biysk 24 1
Отв.39  25 Сент. 20, 21:04
Вася Мореман, ладно, больше не буду.