ТермоМонитор (начало)

Список разделов РАДИОТЕХНИЧЕСКИЙ ФОРУМ Источники питания и цифровая техника

Описание: Конструкции любых блоков питания, источников тока для любых назначений. Микроконтроллеры и все, что с ними связано
Модераторы: Алаев Ян, poty

#1 Алаев Ян » 25 января 2017, 8:05

ThermoMonitor

Изображение

Технические характеристики:
1. Количество измерительных каналов: 8 (базовое);
2. Температурный диапазон измерений: -55...+125°С;
3. Точность измерений: ±0,5°С (для диапазона -10...+85°С);
4. Тип датчиков: DS18B20 Dallas Semiconductor;
5. Питание - от шины mini USB.

Содержание:
Спойлер
1. Начало /viewtopic.php?p=13650#p13650
2. Контроллер /viewtopic.php?f=79&t=312#p13714
3. Принципиальная схема /viewtopic.php?f=79&t=312&p=13716#p13716
4. Прошивка контроллера /viewtopic.php?f=79&t=312&p=13719#p13719
5. Программа верхнего уровня в среде LabView /viewtopic.php?f=79&t=312&p=13725#p13725
6. Как узнать серийный номер DS18B20? /viewtopic.php?f=16&t=312&p=13990#p13990
7. Перенес схему на монтажную плату /viewtopic.php?f=16&t=312&p=14185#p14185
8. Верхняя крышка корпуса /viewtopic.php?f=16&t=312&p=14185#p14229
9. Первый корпус /viewtopic.php?p=14341#p14341
10. FTDI vs Bluetooth /viewtopic.php?f=16&t=312&p=19193#p19193
11. Соображения по поводу использования ТермоМонитора вер. 3 /viewtopic.php?f=16&t=312&start=20#p19202
12. Опытный образец ТермоМонитора вер. 3 /viewtopic.php?f=16&t=312&p=19218#p19218
13. Внедряю CAM/CAD системы в разработку проектов /viewtopic.php?f=16&t=312&start=20#p19373
14. Коррекция кривизны платы - супер опция! /viewtopic.php?f=16&t=312&p=19389#p19389
15. Базовое ПО для TermoATtiny /viewtopic.php?f=16&t=312&p=19394#p19394
16. Не будем засорять эфир... /viewtopic.php?f=16&t=312&p=19434#p19434

Datasheet:
Спойлер
DS18B20 описание работы с датчиком температуры
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца


  • 1

Начало

#3 Алаев Ян » 26 января 2017, 10:00

Давно вынашивал в мыслях данное устройство и вот сейчас появилась его первая реализация :smoke: .
Сделал исключительно из личной необходимости, так как вижу несколько перспективных направлений его применения:
во-первых - это околонаучные и исследовательские работы, контроль температуры нужен во многих сферах и, лично для меня, это контроль температуры в ключевых точках разрабатываемого устройства. Когда я тестирую, например, ламповый усилитель, то я оставляю его включенным на всю ночь для устаканивания температурного режима. Своеобразный термопрогон. И утром я хочу знать температуру всех трансформаторов, всех радиаторов, возможно, чего-то еще и пользоваться одним термодатчиком крайне неудобно, так как сказывается его инерционность и требуется достаточно долго ждать, пока новые показания устаканятся. Инфракрасный пирометр частично решает эту задачу, но имеет большую погрешность измерения, связанную с контролем температуры тел разной излучательной способности. ТермоМонитор способен показать температуру сразу всех измерительных каналов, а также динамику изменения температуры, при необходимости провести сравнительный анализ температуры и сформировать управляющий или сигнализирующий сигнал, что угодно можно сделать по факту проведенного анализа, хоть кофеварку включить;
во-вторых - ТермоМонитор с некоторыми изменениями станет неотъемлемым модулем каждого концептуального прибора нашего производства и будет контролировать температуру в ключевых точках устройства с выводом флага/сигнала ошибки в случае перегрева. По сути, одна из ступеней защиты устройства. При возникновении сигнала ошибки от ТермоМонитора, устройство запустит процедуру автоматического выключения (возможно, включения принудительного охлаждения с помощью вентилятора/ров), также, устройство не включится пока не остынет (пока присутствует флаг ошибки от ТермоМонитора);
в-третьих - подобное устройство можно использовать в многоканальном контроле температуры для поддержания микроклимата помещения или испытательных камерах тепла и холода, сушильных камерах окраски и так далее, придумайте сами.

Из вышесказанного становится понятно, что измерительных каналов должно быть много. И тут я впал в ступор, так как нужно было решить сколько именно.
Один, два, три, восемь, шестнадцать... Я перебирал разные варианты, посчитал предполагаемые температурные зоны в усилителе :smile: , прикинул, как я буду их отображать на графике и сколько для этого нужно цветов и тут мне стало понятно, что более, чем семь, цветом на графике отображать уже сложно, глаз с трудом их различает (хотя, можно каналы отображать пунктирными линиями, черточками с точкой для дополнительного различия). В конечном итоге я остановился на цифре 8. Мне показалось, что 8 каналов должно хватить для бОльшей части потенциальных измерений, ну а для цифрового мира цифра 8 является круглой (в одном байте 8 бит и так далее...). От себя хочу сказать, что максимальное количество каналов измерения определяется только протоколом OneWire и их очень много, кажется, даже не регламентируется максимальное количество на одной шине, так как каждый датчик имеет свой уникальный 64-битный адрес и обращение к нему идет по этому адресу. Датчиков с одинаковыми адресами не существует, поэтому, максимальное количество датчиков на линии в бОльшей степени определяется внешней обвязкой устройства (подключение, питание, параметры линии связи и т.д. и т.п.).

Я немного забежал вперед, рассказывая про то, что количество измерительных каналов можно сделать ОЧЕНЬ большим, а начать стоило с того, как вообще выбрать датчик для температурных измерений? И тут выбор для меня был очень простым. Вариантов, на самом деле, не много: взять любую реализацию аналогового датчика или взять цифровой датчик температуры. Применительно к аналоговым датчикам есть много проблем, основные из них - требуется градуировка и линеаризация датчика, многоканальные измерения аналоговых сигналов дело весьма сложное и заявить, что можно подключить хоть сотню датчиков уже не получится, АЦП и мультиплексирование сигналов не помогут в таком случае. Применительно к цифровым датчикам все значительно проще. Они уже отградуированы производителем и выдают измеренное значение согласно указанной точности (в нашем случае это ±0,5°С). Имеют 64-битный уникальный адрес и позволяют опрашивать линию по этому адресу, который является, также, его серийным номером, что позволяет подключить на шину хоть десять, хоть сто таких датчиков. Но есть и минус, адрес датчика прошит в контроллере и если подключить "незнакомца", то работать он не будет, т.е. если датчик физически сломали и заменили на новый, то придется серийный номер перезаписать в прошивке контроллера на новый. В общем, выбор однозначно был сделан в пользу цифровых датчиков температуры, а из их семейства в пользу DS18B20 производства Dallas Semiconductor. Они имеют 4 разрешения по температуре от 9 до 12 бит, что соответствует дискретности измерения температуры 0,5; 0,25; 0,125 и 0,0625 °С соответственно (с применением цифровой фильтрации, например, скользящего усреднения, легко получить разрешение в 0,01 °С), температурный диапазон измерений от -55 до +125°С, правда точность в ±0,5°С нормируется только для диапазона -10...+85 °С, при условии внешнего (не паразитного) питания. Нам этого вполне достаточно и исходя из этих соображений было решено сделать внешнее (не паразитное) питание для каждого датчика температуры. За дополнительными параметрами датчиков обращайтесь в datasheet, который прикреплен в заглавном сообщении.
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

Контроллер

#4 Алаев Ян » 31 января 2017, 16:36

Как вы, наверное, догадываетесь, контроллер может быть любым или почти любым. Такой проект можно собрать на Arduino или, как я, на голом контроллере с минимально необходимой обвязкой. В своем проекте за основу я взял контроллер Atmega 328. Взял по той причине, что он у меня был и на него уже есть наработки исходных кодов. Так всегда проще и быстрее, нежели писАть с нуля. Контроллер был сконфигурирован на работу от встроенного RC генератора на 8 МГц, что сразу избавило нас от трех деталей в обвязке (кварц и два согласующих конденсатора около кварца). В проекте нет завышенных требований к временным интервалам, поэтому без кварца можно легко обойтись. Для связи контроллера с внешним миром и для его программирования в том числе, я воспользовался мною любимым преобразователем интерфейса USB-UART на FTDI FT232.

7337043_3f06a29f-eff0-4baf-b1aa-7a5e6cbb343b.jpg
ПИ USB-UART на FTDI FT232


ПИ USB-UART на FTDI FT232 можно купить во всевозможных исполнениях очень недорого в Китае. Устройство просто в использовании и в себе таит массу скрытых возможностей (нам это не понадобится, но имейте это в виду, если прижмет). Есть специализированная программа FT_Prog, которая позволяет залезть внутрь и покопошиться в настройках непосредственно микросхемы FT232.
Итак, что мы будем делать с этим модулем?
Во-первых, мы возьмем с него питание. Наш контроллер будет питаться от шины USB через этот модуль. Непосредственно в самой микросхеме FT232 есть встроенный стабилизатор на 3.3В, поэтому, при необходимости, можно запитать контроллер и от 3.3В. Правда, тут есть небольшая засада - логические сигналы будут передаваться в TTL логике с напряжением 5В и для контроллера с напряжением питания 3.3В это не выглядит правильным, хотя, обычно контроллеры спокойно воспринимают такой разбаланс, но нужно иметь это в виду, когда что-то пойдет не так :-) .
Во-вторых, мы будем обмениваться данными с ПК по шинам Rx/Тх.
Ну и в-третьих, вывод DTR этого модуля будет помогать нам автоматически перепрошивать контроллер, который подключен к нему.
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

Принципиальная схема

#5 Алаев Ян » 1 февраля 2017, 16:40

Принципиальная схема - звучит гордо, но тут проще сказать, нежели рисовать, поскольку все подключения настолько очевидны, что разобраться в них сможет даже начинающий радиолюбитель.

2017-02-01 09.46.05.jpg
ТермоМонитор на макетке


Итак, текстовая версия принципиальной схемы:
1. Берем модуль USB-UART и втыкаем его в макетную плату (или подпаиваемся, кому как удобнее). На этом модуле нам нужны Vdd (питание), GND (земля), Rx/Tx (передача данных), DTR (для программирования контроллера).
2. Берем контроллер и запитываем его от модуля USB-UART. Желательно поставить блокировочный конденсатор на выводы питания контроллера, но я собирал на макетке и у меня все работает и без него. В рабочую плату конденсатор/ры обязателен.

arduinopinout.jpg
Atmega328 (распиновка)
03.png
DS18B20 (распиновка)


3. После того, как мы запитали контроллер, нужно позаботиться о его правильном состоянии, а именно, чтобы он случайно не ушел в перезагрузку. Для этого вывод RESET контроллера нужно притянуть резистором на 10 кОм к цепи питания (резистор хорошо виден на макетной плате).
Поскольку мы уже начали обсуждать вывод RESET контроллера, то сразу можно сделать еще одно действие - установить конденсатор 0.1 мкф между выводом RESET контроллера и выводом DTR модуля USD-UART. По этому сигналу мы будем переводить контроллер в режим программирования.
4. Далее, соединяем выводы Rx и Тх контроллера и модуля USB-UART по принципу: вывод Rx одного идет на Tx другого и наоборот. Rx - приемник, Тх - передатчик, передатчик идет на приемник и наоборот, думаю, тут все понятно.
5. Ну и последнее, что нам нужно сделать - подключить датчик или датчики температуры DS18B20. Они трехвыводные: два вывода питания и один цифровой вход/выход. Согласно datasheet - подаем питание с того же модуля USB-UART на датчик/ки температуры, а цифровой вход/выход подключаем к любому цифровому выводу контроллера. Фразу "любому цифровому" нужно читать с некоторым осмыслением, фактически, действительно можно подключить к любому, но в реальной ситуации желательно не использовать выводы АЦП, ШИМ, внешних прерываний и интерфейса, найдите вывод, на который не привязаны разные "ништяки", которые в будущем могут пригодиться. И не забудьте притянуть шину данных датчиков температуры через резистор 4.7 кОм на шину питания. На этом все, можно запускать среду программирования и оживлять железо.
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

Прошивка контроллера

#6 Алаев Ян » 2 февраля 2017, 13:26

Я не программист, поэтому не претендую на высокую степень оптимизации кода, главное, что он работает согласно тем требованиям, которые к нему предъявляются. С точки зрения его читаемости - он однозначно проще, чем оптимизированный код профессиональных программистов, в которых новичку разобраться крайне сложно. Я программировал в среде Arduino IDE. На данный момент, у меня в наличии только три датчика температуры DS18B20, поэтому, оставшиеся 5 каналов в программе написаны виртуально. Когда заказанные датчики приедут ко мне, программа будет доработана до своего логического завершения, а пока я поделюсь исходным кодом прошивки, который вы можете использовать для своих нужд или модифицировать под себя.

Код: Выделить всё
//Прошивка платы "ТермоМонитор" "Алаев и Ко" Лаб. http://www.alaev.org/

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 10

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Thermometer1 = {0x28, 0x43, 0x1F, 0x91, 0x01, 0x00, 0x00, 0xE4};//28431F91010000E4
DeviceAddress Thermometer2 = {0x28, 0x64, 0x82, 0x49, 0x01, 0x00, 0x00, 0x91};//2864824901000091
DeviceAddress Thermometer3 = {0x28, 0xC8, 0x7C, 0x49, 0x01, 0x00, 0x00, 0xB4};//28C87C49010000B4

float tempC1;//величина, считанная с датчика DS18B20 "Канала 1"
float oldtempT1 = 25.0;//буферная величина измерений "Канала 1"
float averageFactorT1 = 5.0;//Коэффициент сглаживания показаний "Канала 1"(0 = не сглаживать)

float tempC2;//величина, считанная с датчика DS18B20 "Канала 2"
float oldtempT2 = 25.0;//буферная величина измерений "Канала 2"
float averageFactorT2 = 5.0;//Коэффициент сглаживания показаний "Канала 2"(0 = не сглаживать)

float tempC3;//величина, считанная с датчика DS18B20 "Канала 3"
float oldtempT3 = 25.0;//буферная величина измерений "Канала 3"
float averageFactorT3 = 5.0;//Коэффициент сглаживания показаний "Канала 3"(0 = не сглаживать)

float tempC4;//величина, считанная с датчика DS18B20 "Канала 4"
float oldtempT4 = 25.0;//буферная величина измерений "Канала 4"
float averageFactorT4 = 5.0;//Коэффициент сглаживания показаний "Канала 4"(0 = не сглаживать)

float tempC5;//величина, считанная с датчика DS18B20 "Канала 5"
float oldtempT5 = 25.0;//буферная величина измерений "Канала 5"
float averageFactorT5 = 5.0;//Коэффициент сглаживания показаний "Канала 5"(0 = не сглаживать)

float tempC6;//величина, считанная с датчика DS18B20 "Канала 6"
float oldtempT6 = 25.0;//буферная величина измерений "Канала 6"
float averageFactorT6 = 5.0;//Коэффициент сглаживания показаний "Канала 6"(0 = не сглаживать)

float tempC7;//величина, считанная с датчика DS18B20 "Канала 7"
float oldtempT7 = 25.0;//буферная величина измерений "Канала 7"
float averageFactorT7 = 5.0;//Коэффициент сглаживания показаний "Канала 7"(0 = не сглаживать)

float tempC8;//величина, считанная с датчика DS18B20 "Канала 8"
float oldtempT8 = 25.0;//буферная величина измерений "Канала 8"
float averageFactorT8 = 5.0;//Коэффициент сглаживания показаний "Канала 8"(0 = не сглаживать)

String MyStr;//посылка-строка в СОМ-порт

String T1 = "T1=";
String T2 = "T2=";
String T3 = "T3=";
String T4 = "T4=";
String T5 = "T5=";
String T6 = "T6=";
String T7 = "T7=";
String T8 = "T8=";
String G = "; ";//разделитель

char StrT1[10];//преобразование в строку измеренного значения "Канала 1"
char StrT2[10];//преобразование в строку измеренного значения "Канала 2"
char StrT3[10];//преобразование в строку измеренного значения "Канала 3"
char StrT4[10];//преобразование в строку измеренного значения "Канала 4"
char StrT5[10];//преобразование в строку измеренного значения "Канала 5"
char StrT6[10];//преобразование в строку измеренного значения "Канала 6"
char StrT7[10];//преобразование в строку измеренного значения "Канала 7"
char StrT8[10];//преобразование в строку измеренного значения "Канала 8"

void setup(){
  sensors.begin();

  sensors.setResolution(Thermometer1, 12);//разрешающая способность "Канала 1"
  sensors.setResolution(Thermometer2, 12);//разрешающая способность "Канала 2"
  sensors.setResolution(Thermometer3, 12);//разрешающая способность "Канала 3"

  Serial.begin(9600);
}

void printTemperature(DeviceAddress deviceAddress){
  float tempC = sensors.getTempC(deviceAddress);
}

void loop(){
 
  sensors.requestTemperatures();

  tempC1 = sensors.getTempC(Thermometer1);//считываем показания термометра "Канала 1"
  tempC2 = sensors.getTempC(Thermometer2);//считываем показания термометра "Канала 2"
  tempC3 = sensors.getTempC(Thermometer3);//считываем показания термометра "Канала 3"

  tempC4=4.0;
  tempC5=5.0;
  tempC6=6.0;
  tempC7=7.0;
  tempC8=8.0;

  if (averageFactorT1 > 0.0){// усреднение показаний "Канала 1"
    tempC1 = (oldtempT1 * (averageFactorT1 - 1.0) + tempC1) / averageFactorT1;
    oldtempT1=tempC1;
  }

  if (averageFactorT2 > 0.0){// усреднение показаний "Канала 2"
    tempC2 = (oldtempT2 * (averageFactorT2 - 1.0) + tempC2) / averageFactorT2;
    oldtempT2=tempC2;
  }

  if (averageFactorT3 > 0.0){// усреднение показаний "Канала 3"
    tempC3 = (oldtempT3 * (averageFactorT3 - 1.0) + tempC3) / averageFactorT3;
    oldtempT3=tempC3;
  }
 
  if (averageFactorT4 > 0.0){// усреднение показаний "Канала 4"
    tempC4 = (oldtempT4 * (averageFactorT4 - 1.0) + tempC4) / averageFactorT4;
    oldtempT4=tempC4;
  }
 
  if (averageFactorT5 > 0.0){// усреднение показаний "Канала 5"
    tempC5 = (oldtempT5 * (averageFactorT5 - 1.0) + tempC5) / averageFactorT5;
    oldtempT5=tempC5;
  }
 
  if (averageFactorT6 > 0.0){// усреднение показаний "Канала 6"
    tempC6 = (oldtempT6 * (averageFactorT6 - 1.0) + tempC6) / averageFactorT6;
    oldtempT6=tempC6;
  }
 
  if (averageFactorT7 > 0.0){// усреднение показаний "Канала 7"
    tempC7 = (oldtempT7 * (averageFactorT7 - 1.0) + tempC7) / averageFactorT7;
    oldtempT7=tempC7;
  }
 
  if (averageFactorT8 > 0.0){// усреднение показаний "Канала 8"
    tempC8 = (oldtempT8 * (averageFactorT8 - 1.0) + tempC8) / averageFactorT8;
    oldtempT8=tempC8;
  }

  dtostrf(tempC1, 2, 2, StrT1);//выводим в строку StrT1 2 разряда до 2 разрядов после запятой
  dtostrf(tempC2, 2, 2, StrT2);//выводим в строку StrT2 2 разряда до 2 разрядов после запятой
  dtostrf(tempC3, 2, 2, StrT3);//выводим в строку StrT3 2 разряда до 2 разрядов после запятой
  dtostrf(tempC4, 2, 2, StrT4);//выводим в строку StrT4 2 разряда до 2 разрядов после запятой
  dtostrf(tempC5, 2, 2, StrT5);//выводим в строку StrT5 2 разряда до 2 разрядов после запятой
  dtostrf(tempC6, 2, 2, StrT6);//выводим в строку StrT6 2 разряда до 2 разрядов после запятой
  dtostrf(tempC7, 2, 2, StrT7);//выводим в строку StrT7 2 разряда до 2 разрядов после запятой
  dtostrf(tempC8, 2, 2, StrT8);//выводим в строку StrT8 2 разряда до 2 разрядов после запятой

  MyStr = T1 + StrT1 + G + T2 + StrT2 + G + T3 + StrT3 + G + T4 + StrT4 + G + T5 + StrT5 + G + T6 + StrT6 + G + T7 + StrT7 + G + T8 + StrT8;   
  Serial.println(MyStr);//отправляем в СОМ-порт накопленные данные
}

Структура программы очень проста: контроллер производит чтение измеренной величины с каждого датчика температуры, далее, чтобы не было ступенчатых/дискретных показаний от датчиков, применяется механизм скользящего усреднения (данные накапливаются в индивидуальный буфер и каждое последующее измерение сопоставляется (берется среднее значение) с показаниями буфера), после чего данные подготавливаются для вывода в порт. Так накапливаются все измерения и формируется посылка для отправки в СОМ-порт, которая имеет определенную структуру, которую в будущем мы будем распознавать и разбирать по составляющим, чтобы построить графическое представление выведенных данных. Если запустить монитор СОМ-порта, то можно наглядно увидеть структуру отправляемой посылки.

Скриншот 2017-02-02 11.31.08.png
Структура посылки с данными
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

Программа верхнего уровня в среде LabView

#7 Алаев Ян » 3 февраля 2017, 9:28

LabView - это среда графического программирования, в ней можно делать проекты просто сумасшедшей сложности, но на мой взгляд - это среда для тех, кто не умеет программировать, не знает языков верхнего уровня, кто не понимает, как все это устроено, т.е. для таких, как я. У меня есть некоторые представления о программировании верхнего уровня, но они настолько поверхностные, что среда LabView для меня стала настоящим спасением, так как там достаточно понимать логически, что ты хочешь, а все промежуточные связи программа сделает автоматически за счет использования заранее запрограммированных модулей. Чтобы прочувствовать это - лучше один раз попробовать и дальше использовать уже по своему назначению. Написание программы в LabView сводится к созданию блок-диаграммы из функциональных модулей, что я и сделал.

Блок-диаграмма.png
Блок-диаграмма программы


На первый взгляд становится страшно при виде такой большой схемы, но на самом деле там 8 раз повторяется одно и то же, 8 раз под каждый измерительный канал. Я постараюсь пояснить логику, заложенную в эту диаграмму. Когда мы подключаем модуль USB-FTDI - он создает виртуальный СОМ-порт и присваивает ему номер, в моем случае это СОМ14, поэтому, на этой диаграмме мы открываем СОМ-порт, даем возможность выбора его номера и возможность выбора скорости обмена. Ранее в прошивке контроллера мы указали скорость обмена 9600 бод, соответственно, здесь мы выбираем такую же. Дальше у нас идет бесконечный цикл (серая рамка по периметру) выйти из которого можно только по кнопке "СТОП". Модуль VISA Read Function настроен на режим чтения из выбранного СОМ-порта. Чтобы понять и правильно распределить данные из СОМ-порта по местам - используется специализированный модуль Scan From String Function, который, как говорят программисты, парсит посылку, а если по-русски, то он читает строковую посылку из СОМ-порта и так как ему заранее сообщили структуру посылки, он распределяет полученные данные поканально. Т.е. мы заранее знаем в какой структуре передаем данные в СОМ-порт, а модулю Scan From String Function сообщаем структуру посылки, которая к нему придет (своеобразный аналог протокола обмена данными, только в одну сторону, в режиме чтения из СОМ-порта). Дальше все просто, модуль Bundle Function работает как мультиплексор и собирает данные 8-ми каналов измерений для вывода на единый дисплей, на модуль Graph Indicators Chart, на котором мы и видим графическое представление измеренных значений. Внутри бесконечного цикла каждый измерительный канал обрабатывается модулем Greater Or Equal? Function, который работает по принципу, если измеренное значение больше, чем уставка введенная с индикатора, то срабатывает модуль Boolean и сигнализирует об аварии. В итоге, мы получаем вот такую фронтальную панель.

Фронтальная панель.png
Фронтальная панель программы


Работа с программой очень проста. Мы выбираем нужный СОМ-порт и скорость обмена, по умолчанию она уже прописана такой, как надо - 9600 бод. Запускаем режим измерений и программа начинает чтение измеренных значений из нашей железки. Видимость необходимых каналов можно включать и выключать, можно менять цвет канала и способ его отображения. В приведенном примере включено отображение трех измерительных каналов. Дисплей работает в режиме автомасштабирования и отображает данные от минимума до максимума намерянных чисел. Числовые значения измеренных каналов выводятся рядом с их наименованиями всегда, независимо от видимости их на графическом индикаторе. На сам монитор выводится графическое представление измеренных значений с буфером приблизительно 15 минут и интервалом опроса 1 секунда, потом накопленные данные затираются. Верхний ряд параметров соответствует аварийным уставкам, уставка 1 соответствует каналу 1, уставка 2 каналу 2 и так далее. Логика работы уставки - "на повышение", т.е. если измеренное значение становится больше, чем значение уставки - индикатор меняет цвет с зеленого на красный с появлением сообщения "ПЕРЕГРЕВ".

Приведу пример практического применения - мы распределили датчики по контрольным зонам, в уставках записали предельные температуры, до которых разрешено нагреваться и запустили режим измерений. Все, можно идти пить чай и следить за цветом индикаторов. Ну и не забываем, что при необходимости любую логику работы можно изменить и модифицировать. Для удобства понимания всех настроек выкладываю свой виртуальный инструмент:

TermoMonitor.vi
NI виртуальный инструмент
Размер: 23.78 КБ
Скачиваний: 23


Изображение

Выводы:
На мой скромный вкус - получилось неплохо, в любом случае было интересно, поучительно и познавательно.
Идеи на будущее:
1. Можно сделать автономную версию, например, с выводом на LCD дисплей;
2. Хочется попробовать режим работы с модулем Bluetooth, чтобы передавать данные удаленно, правда, в этом случае от провода избавиться все равно не получится, интерфейсный кабель заменится сетевым, не от батареек же питать все это дело;
3. В случае использования модуля Bluetooth можно попробовать вывести данные на телефон, но, по большому счету, это уже баловство :-) .
Буду рад, если для кого-то этот материал будет полезен! :wink: Удачи!
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

#8 Евгений Михеев » 3 февраля 2017, 9:36

Очень хорошая идея - использовать данный монитор в ламповых, например, устройствах. Нагрев всегда имеет место быть, а вот насколько - как правило, только догадки. Отличная работа.
Дорогу осилит идущий
Евгений Михеев
Заслуженный Ветеран
Заслуженный Ветеран
Аватара
Возраст: 33
Откуда: Республика Коми, Ухта
Репутация: 54 (+54/−0)
Лояльность: 19 (+19/−0)
Сообщения: 2414
Темы: 9
С нами: 3 года

#9 Алаев Ян » 3 февраля 2017, 9:41

Евгений Михеев писал(а):Очень хорошая идея - использовать данный монитор в ламповых, например, устройствах. Нагрев всегда имеет место быть, а вот насколько - как правило, только догадки. Отличная работа.
Спасибо. Для ламповых устройств планируется отдельный модуль без интерфейсной платы, в него по желанию разработчика будет прописана аварийная уставка на каждый измерительный канал. Устройство будет иметь один дискретный выход (0/1), сигнализирующий о нахождении температуры в допустимых пределах.
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

#10 seurf » 3 февраля 2017, 16:05

Чудо контроль! Действительно ночью спишь, а утром смотришь результат. Или после работы. А прогрев идёт и в случае аварийного подскока температуры отключает устройство. Отличная тема.
seurf
Форумщик
Форумщик
Аватара
Возраст: 60
Откуда: Волгоград
Репутация: 37 (+37/−0)
Лояльность: 0 (+0/−0)
Сообщения: 479
Темы: 6
С нами: 2 года 1 месяц

#11 Алаев Ян » 3 февраля 2017, 16:48

seurf писал(а):Отличная тема.
Благодарю!
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

Как узнать серийный номер DS18B20?

#12 Алаев Ян » 17 февраля 2017, 8:07

Несколько раз в ЛС и по email меня спрашивали, как узнать серийный номер датчиков DS18B20, чтобы подключить их в многоканальном режиме. Сделать это совсем не сложно. Для этого нужно загрузить демонстрационный скетч от Dallas Semiconductor, который называется Multiple. Он есть в примерах в Arduino IDE или можете скачать его ниже:

Код: Выделить всё
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define TEMPERATURE_PRECISION 9

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
DeviceAddress insideThermometer, outsideThermometer;

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();

  // locate devices on the bus
  Serial.print("Locating devices...");
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");

  // assign address manually.  the addresses below will beed to be changed
  // to valid device addresses on your bus.  device address can be retrieved
  // by using either oneWire.search(deviceAddress) or individually via
  // sensors.getAddress(deviceAddress, index)
  //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
  //outsideThermometer   = { 0x28, 0x3F, 0x1C, 0x31, 0x2, 0x0, 0x0, 0x2 };

  // search for devices on the bus and assign based on an index.  ideally,
  // you would do this to initially discover addresses on the bus and then
  // use those addresses and manually assign them (see above) once you know
  // the devices on your bus (and assuming they don't change).
  //
  // method 1: by index
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
  if (!sensors.getAddress(outsideThermometer, 1)) Serial.println("Unable to find address for Device 1");

  // method 2: search()
  // search() looks for the next device. Returns 1 if a new address has been
  // returned. A zero might mean that the bus is shorted, there are no devices,
  // or you have already retrieved all of them.  It might be a good idea to
  // check the CRC to make sure you didn't get garbage.  The order is
  // deterministic. You will always get the same devices in the same order
  //
  // Must be called before search()
  //oneWire.reset_search();
  // assigns the first address found to insideThermometer
  //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");
  // assigns the seconds address found to outsideThermometer
  //if (!oneWire.search(outsideThermometer)) Serial.println("Unable to find address for outsideThermometer");

  // show the addresses we found on the bus
  Serial.print("Device 0 Address: ");
  printAddress(insideThermometer);
  Serial.println();

  Serial.print("Device 1 Address: ");
  printAddress(outsideThermometer);
  Serial.println();

  // set the resolution to 9 bit
  sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
  sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);

  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC);
  Serial.println();

  Serial.print("Device 1 Resolution: ");
  Serial.print(sensors.getResolution(outsideThermometer), DEC);
  Serial.println();
}

// function to print a device address
void printAddress(DeviceAddress deviceAddress)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    // zero pad the address if necessary
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(tempC);
  Serial.print(" Temp F: ");
  Serial.print(DallasTemperature::toFahrenheit(tempC));
}

// function to print a device's resolution
void printResolution(DeviceAddress deviceAddress)
{
  Serial.print("Resolution: ");
  Serial.print(sensors.getResolution(deviceAddress));
  Serial.println();   
}

// main function to print information about a device
void printData(DeviceAddress deviceAddress)
{
  Serial.print("Device Address: ");
  printAddress(deviceAddress);
  Serial.print(" ");
  printTemperature(deviceAddress);
  Serial.println();
}

void loop(void)
{
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();
  Serial.println("DONE");

  // print the device information
  printData(insideThermometer);
  printData(outsideThermometer);
}


Загружаем скетч и включаем "Монитор порта". Находим в "Мониторе" опознанный серийный номер - выделил синим курсором.

Скриншот 2017-02-16 17.47.31.png
Серийный номер DS18B20


После чего записываем серийный номер в свой скетч в формате - выделил оранжевым цветом.

Скриншот 2017-02-16 17.49.32.png
Запись серийного номера DS18B20
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

Перенес схему на монтажную плату

#13 Алаев Ян » 25 февраля 2017, 20:55

В связи с острой необходимостью освобождения отладочной платы - пришлось перенести схему на монтажную плату, да и есть желание оформить это изделие в виде "железки". Получилось вот так...

2017-02-25 15.30.38.jpg
2017-02-25 15.31.02.jpg


Я не особо заморачивался на предмет размера и внешнего вида, так как планирую провести ряд критических испытаний, например, мне любопытно, сохранится ли обмен с "железкой" по RS232 при предельных температурах? Сейчас у меня используется встроенный RC-генератор, в то время, как для стабильного обмена рекомендуют устанавливать внешний кварцевый резонатор. При предельных температурах в режиме использования RC-генератора обмен может сбоить вплоть до полного отказа, хочу проверить и для этого один датчик температуры разместил прямо на разъеме "железки" внутри корпуса.

Относительно ранее описанной принципиальной схемы /viewtopic.php?f=16&t=312#p13716 здесь есть некоторые дополнения. Я немного доработал модуль FTDI, а именно, убрал джампер 3.3/5.0В и запаял на 5В нулевым резистором. Я не очень люблю ненадежные контакты питания. Еще оказалось, что оба светодиода Rx/Tx у меня зеленые, а светодиод на питании красный. Я поменял местами светодиод питания и Tx и теперь включенное питание отображается зеленым цветом, Tx (передача данных) красным цветом, Rx (прием данных) остался без изменений зеленым цветом. Между шинами Rx/Tx модуля FTDI и контроллером я установил защитные ограничительные резисторы на 100 Ом. Общую цепь питания 5В зашунтировал танталовым конденсатором 100 мкф и еще вывел традиционный для всех ардуин LED13 на случай, если надо будет чем-то поморгать или индицировать достижение пороговой температуры, в общем, пригодится где-нибудь. LED13 я сделал оранжевым цветом. Восемь разъемов для подключения термодатчиков включены параллельно и равноправно друг относительно друга, это общая однопроводная шина данных с внешним питанием.

Скриншот 2017-02-25 20.11.20.png
3D-модель корпуса для ТермоМонитора (низ)
Скриншот 2017-02-25 20.11.09.png
3D-модель корпуса для ТермоМонитора (низ)


Исходные файлы здесь: https://cloud.mail.ru/public/3a5d/VUUJ3aP2C

Как показала практика, напечатать крупный корпус на 3D-принтере не так уж и просто. Лично я столкнулся с таким эффектом, как деламинация (отслоение от опоры, вызванное неравномерным нагревом/остыванием детали, можно более подробно найти в интернете). Из-за этого дефекта корпус получился на троечку, но переделывать я его не стану, он вполне функционален и полностью подходит под концепцию отладочной модели.

2017-02-25 15.52.07.jpg
Нижняя часть корпуса для ТермоМонитора
2017-02-25 15.53.01.jpg
Нижняя часть корпуса для ТермоМонитора
2017-02-25 15.53.14.jpg
Нижняя часть корпуса для ТермоМонитора
2017-02-25 15.53.20.jpg
Нижняя часть корпуса для ТермоМонитора
2017-02-25 15.53.40.jpg
Нижняя часть корпуса для ТермоМонитора


Проблему деламинации я впоследствии устранил, а вот тот факт, что я с первого раза попал в размер и все крепежные отверстия и прочие дырки оказались там, где надо, не мог не порадовать. Я был готов к результату, когда либо не влезет, либо будет болтаться, но нет, все вошло плотненько, как по родному месту.
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

Верхняя крышка корпуса

#14 Алаев Ян » 28 февраля 2017, 16:14

Скриншот 2017-02-28 17.11.21.png
Верхняя крышка корпуса


Нарисовал верхнюю крышку, ну и добавил несколько новых элементов, которые не применял ранее, чтобы потренироваться... посмотрим, что из этого получится.

Исходные файлы здесь: https://cloud.mail.ru/public/LxmA/8rznFi6TE
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

Первый корпус

#15 Алаев Ян » 28 июля 2017, 10:31

Первый корпус, как и первый блин получился комом... грубо, со множеством ошибок, но, тем не менее, получился.

2017-03-03 07.59.42.jpg
Результат


На долю этого корпуса выпало много всего:
1. деламинация при печати /viewtopic.php?f=74&t=307&p=14212#p14212 ;
2. ошибки при моделировании, например, стоило сделать ребра жесткости и другие корпусные ухищрения, сделать четыре крепежные стойки, а не две;
3. печать корпуса обнажила ошибки метрологии 3D-принтера, на маленьких размерах это сказывается значительно заметнее, например, отверстие, которое должно было быть 3 мм, получилось приблизительно 2.6 мм, не смертельно, но на будущее надо будет поправить, чтобы сразу печатать в размер. На самом деле, очень тяжело себя остановить и не начать что-то печатать, а заниматься калибровкой принтера. Тут процесс идет от обратного, сначала он как-то заработал, потом я начал пробовать разные варианты и только сейчас подхожу к этапу, когда настраиваю качество печати (визуальное) и точность печати.

Теперь это изделие я опробую в деле и приобщу его к своим постоянным испытаниям, посмотрим, как ТермоМонитор проявит себя на практике. В данный момент я задействовал только 4 из 8 возможных каналов, при необходимости подключу и другие.

От виртуального инструмента к установочному файлу.
Далеко не у каждого на ПК установлена программа LabView и даже мне лень ее ставить на том ПК, который находится в непосредственной близости от тестируемых устройств, и для того, чтобы "железка" начала работать под windows без всяких предустановленных программ, нужно превратить виртуальный инструмент, который раньше носил название TermoMonitor.vi, в установочный файл, который может сам установиться на любой ПК.
Для такого преобразования нам нужен application builder, который скомпилирует нашу разработку в установочный файл. Лично я руководствовался вот этим видеоуроком, за что ему большое спасибо!

phpBB [media]


Теперь на ПК можно просто установить ранее разработанную программу и пользоваться без установки приложений разработки.

Скриншот 2017-03-03 15.00.36.png
Программа ТермоМонитор (версия 1.0.0)
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

ТермоМонитор (версия 2)

#16 Алаев Ян » 13 октября 2017, 16:13

Получил недавно кучку восьминогих контроллеров ATTiny85 и тут же вспомнил о проектах, для которых их заказал. Одним из таких проектов является ТермоМонитор. Контроллер Atmega328Р для задачи ТермоМонитора слишком избыточен своим функционалом, поэтому я присмотрел для этих целей ATTiny85. У контроллера 8 ног из которых функциональные только 6. Ну чтож, попытаемся уложиться.
Набросал приблизительное видение того, что я хочу получить в конечном итоге и реализовать в железе.

TermoMonitor_ver.2.jpg
Предварительная ("сырая") схема ТермоМонитора (версия 2)


Краткое пояснение по схеме:
1. 8 миниатюрных разъемов для подключения термодатчиков DS18B20 (J4-J11). На практике можно использовать любое количество от 0 до 8, так как один термодатчик будет жестко запаян на плату ТермоМонитора (U4). Хотя тут все гибко (можно его и не ставить, если жалко, но место под него точно будет предусмотрено). Считаю, что 8 подконтрольных зон для контроля температуры внутри прибора достаточно для любой задачи (или почти любой).
2. Индикатор срабатывания любой из уставок (D1) работает синхронно с сигналом управления REL (реле) и OPTO (оптопара). Тут нужно оперировать назначением ТермоМонитора в системе. Если реле или опторазвязка не нужны, то можно не запаивать и не использовать эти элементы.
Примеры:
Спойлер
1. Коммутация с помощью реле: при перегреве реле может разомкнуть цепи питания устройства или, например, включить принудительное охлаждение.
2. Сигнал о перегреве через оптопару: гальваническиразвязанный выход ОК (открытый коллектор) предназначен для формирования ноля или единицы на стороне главного блока управления, анализ которых будет приводить к дальнейшим действиям согласно логике работы блока управления.

3. Разъем J1 - технологический для программирования МК.
4. Разъем J2 - диагностический для возможности передачи измеренных значений всех каналов на ПК/планшет/смартфон через Bluetooth, например, при разработке и тестировании устройства. Для технических задач других разработок.
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

#17 Алаев Ян » 18 октября 2017, 7:38

Попробовал перенести код "ТермоМонитора" на новый контроллер и, как выяснилось, не зря. У Attiny85 всего 8 кБ флеш-памяти, а этого оказалось совершенно недостаточно, чтобы сделать программный UART (аппаратного там нет) и написать обмен с датчиками по интерфейсу 1-Ware. Возможно, можно как-то впихнуть невпихуемое путем жуткой оптимизации кода, но мне это пока не под силу. Получаемый код как минимум в два раза больше имеющегося места... Не думаю, что смогу ужать его в два раза, поэтому в данном проекте мы совершенно обоснованно возвращаемся к Atmega328, а Attiny85 опробуем на других, менее жрущих проектах.
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

#18 poty » 20 октября 2017, 18:23

А есть исходный код этого программного UART? Я бы покопался...
Владислав
poty
Профи
Профи
Аватара
Возраст: 52
Откуда: Россия, Москва
Репутация: 73 (+73/−0)
Лояльность: 42 (+43/−1)
Сообщения: 3051
Темы: 1
С нами: 4 года 2 месяца

#19 Алаев Ян » 20 октября 2017, 18:29

Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

ТермоМонитор (версия 2) новая волна

#20 Алаев Ян » 9 февраля 2018, 16:02

Прошло некоторое время и путем вычитывания на просторах интернета различной полезной и бесполезной информации по программированию контроллеров, мне удалось впихнуть все желаемое и ранее запланированное в маленькую Attiny85!!!
Немножко напомню, с кем мы имеем дело...
attiny85.png
Attiny85

Восьминогий контроллер у которого мы можем нормально использовать только 5 выводов. При особом желании можно задействовать вывод RESET, но это повлечет за собой серьезные проблемы с последующим программированием контроллера по последовательной шине. Поэтому, будем считать, что можно задействовать только 5 цифровых выводов, два из которых могут иметь ШИМ-модуляцию, три из которых могут работать в режиме АЦП.

TermoMonitor_ver.2.jpg


TermoMonitor_ver.2.pdsprj
Размер: 24.12 КБ
Скачиваний: 15


Небольшое пояснение по данной разработке:
1. Предполагается использовать до 9 цифровых датчиков температуры типа DS18B20, передающих данные на микроконтроллер по однопроводной шине 1-Ware. Соображения по поводу их количества... Один датчик планируется штатно размещать на плате ТермоМонитора, например, чтобы можно было измерять температуру в зоне расположения платы. Это может быть одноканальный термометр или термостат для других специфических применений, например, термокамера или сушильная камера для поддержания необходимой температуры - терморегулятор. Остальные восемь термодатчиков планируется использовать посредством подключения к разъемам на плате ТермоМонитора. Восемь разъемов запланированы исключительно из соображений симметричного расположения на плате. Необходимое количество разъемов предполагается запаивать по факту их планируемого применения. Полагаю, что 8+1 контрольных термозон в устройстве вполне достаточно. При большой необходимости можно параллельно подцепить еще нужное количество термодатчиков, но не думаю, что до этого когда-то дойдет. Все термодатчики передают измеренное значение по однопроводной шине 1-Ware, микроконтроллер обрабатывает данные индивидуально с каждого термодатчика согласно серийного номера. К каждому термодатчику можно применить независимые настройки демпфирования (усреднения измеренных значений по алгоритму скользящего среднего).

2. Разъем J1 используется для программирования контроллера, также туда может быть подключен интерфейсный модуль (FTDI232 - TTL) для передачи данных на ПК. Опционально. Можно ставить, можно нет. На ваше усмотрение.

3. Разъем J2 используется для подключения модуля Bluetooth. Опционально. Можно ставить, можно нет. На ваше усмотрение. По Bluetooth на внешнее устройство (смарфон, планшет, ПК) передается информация о температуре каждого термодатчика, состояние цепей сигнализации (включены/выключены) и статус срабатывания уставок (измеренное значение термодатчика больше, чем максимально разрешенная температура в данной зоне).

4. По факту срабатывания любой из уставок ТермоМонитора (уставки могут быть любые на каждый измерительный канал) на выходе "D3_LED" формируется логическая единица, которая включает каналы сигнализации:
а) полевой транзистор Q3, который может коммутировать нагрузку, подключенную к разъему J27. Например, это может быть вентилятор охлаждения или реле.
б) оптрон U2, который обеспечивает коммутацию гальванически развязанной нагрузки, а также может использоваться для передачи статуса состояния прибора на главный контроллер, который гальванически развязан от ТермоМонитора. К примеру, перегрева нет, на выходе логический ноль, главный контроллер запускает устройство в работу. ТермоМонитор зафиксировал перегрев в любой из зон - выставляется логическая единица и передается на главный контроллер как флаг перегрева, главный контроллер автоматически завершает работу прибора и выключает его сообщая пользователю о ошибке. Последующее включение прибора будет возможно только после того, как будет снят флаг ошибки с ТермоМонитора.
Цепи сигнализации также являются опциональными и предполагается использовать только ту часть, которая необходима в проекте.

5. Цепи аварийного отключения реализованы на реле RL1. Управление осуществляется по сигналу "D4_ALARM". Логика работы аналогичная п. 4.
Пример: в п. 4 сработала цепь сигнализации и включила, например, вентилятор охлаждения. Если предположить, что нагрев такой, что вентилятор охлаждения не справляется со своей задачей (или неисправен), то по достижению аварийной уставки, которая больше уставок перегрева, формируется логическая единица в цепи "D4_ALARM", которая открывает полевой транзистор Q1 и приводит к срабатыванию реле RL1, через контактные группы которого заведено напряжение питания основной нагрузки прибора. Цепи аварийного отключения также являются опциональными и используются при необходимости.

6. Стабилизатор напряжения U3 на 78M05 служит для питания контроллера от внешнего источника питания. При наличии стабилизированного выходного напряжения 5В - ТермоМонитор может быть запитан через разъем J14.
Стремление к совершенству рождает шедевры! http://www.alaev.org
Алаев Ян
Автор темы, Основатель Форума
Аватара
Возраст: 34
Откуда: Саратов
Репутация: 60 (+60/−0)
Лояльность: 173 (+174/−1)
Сообщения: 2202
С нами: 4 года 3 месяца

#21 poty » 9 февраля 2018, 16:58

Реле питается от нестабилизированного напряжения?
Владислав
poty
Профи
Профи
Аватара
Возраст: 52
Откуда: Россия, Москва
Репутация: 73 (+73/−0)
Лояльность: 42 (+43/−1)
Сообщения: 3051
Темы: 1
С нами: 4 года 2 месяца

След.

Вернуться в Источники питания и цифровая техника



Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость