Главная › Форумы › Конструкторское бюро › Автоматизация › D18B20, Arduino, MODBUS, Master SCADA
- В этой теме 260 ответов, 24 участника, последнее обновление 2 месяца сделано
Алексей Юрьевич Пащенко.
-
АвторСообщения
-
14.01.2018 в 11:21 #15778
Тема слегка заглохла. В общем, устанавливать разрешения датчиков необходимо, как это делать с помощью одной только библиотеки OneWire, я не нашёл. Да и есть ли особый смысл долбиться в стену, когда в двух шагах открытая дверь? Я использую библиотеку DallasTemperature для поиска датчиков, определения их адресов и установки нужного разрешения. Всё. А дальше, когда начинается работа, используется только библиотека OneWire.
Подключение датчиков к разным выводам Arduino оказалось удобным в плане программирования, но менее удобным в плане монтажа.
Мне интересно, вообще кто-нибудь попробовал Master SCADA?
14.01.2018 в 12:41 #15780Я использую библиотеку DallasTemperature для поиска датчиков, определения их адресов и установки нужного разрешения. Всё.
Не все так просто, в библиотеке есть задержка делау, которая мешает работе основной программе, очень заметна задержка при нажатии кнопок.
Выкладывал Тут скетч без библиотеки на 5 датчиков по одному пину с максимальным разрешением, правда нужно прописывать адреса датчиков.
Скаду конечно интересно посмотреть, себе делаю на встроенный дисплее и по блютузу отображение на смарте основных параметров.14.01.2018 в 16:25 #15787в библиотеке есть задержка делау, которая мешает работе основной программе
Написал же, что библиотека DallasTemperature работает только в части setup(), потом она ни разу не используется. Если бы не нужно было устанавливать разрешение для датчиков (а если они “нулёвые”, то так и есть), эта часть программы была бы вовсе не нужна. Теоретически можно сделать спецпрограмму для установки разрешения, прогнать через неё все датчики заранее, потом просто пользоваться. Но я пока не вижу нужды так
оголодатьэкономить.К сожалению, современный народ обуяла смартфономания 🙂 Удобные простому обывателю программы пишут в основном для смартфонов (на худой конец планшетов). Лет 30 назад я бы только радовался этому, а сейчас пользоваться смартфоном в разных сабжевых целях для меня всё равно что смотреть в микроскоп. Неудобно то есть, необходимы очки для чтения, а в них всё остальное плохо видно. Мне нужно, чтобы информация отображалась на дисплее нормального (или близкого к нему) размера. Мой нетбук – компромисс между портативностью и удобством наблюдения. И то скажу, маловат экран у него (10″). Поэтому жду, когда кто-нибудь научит передавать данные по WiFi, и не просто передавать как-то там, а так, как нужно передавать 🙂
14.01.2018 в 17:25 #15788Сейчас смарты выводят на телевизор изображение, разглядеть не проблема :))
14.01.2018 в 18:40 #15801Вот код для выставления 12 бит разрешения датчика через библиотеку OneWire
ds.search(addr); // адрес на шине 1wire
if (addr[0] == DS18B20) // проверка, что мы будет писать именно в DS18B20
{
ds.reset(); // запрос шины 1-Wire
ds.select(addr); // выбор нашего DS18B20
ds.write(0x4E); // запись в scratchPad
ds.write(0x00); // User byte 0 – Unused
ds.write(0x00); // User byte 1 – Unused
ds.write(0x7F); // выставляем 12 бит (0x7F)
ds.reset(); // сбрасываем 1-Wire
}Хорошо живет на свете Винни-Пух...
14.01.2018 в 20:51 #15802Отладил, работает. И кстати ds.search(addr) начало работать без отрицания. Не знаю почему)))
ds.search(addr); // определяем адрес на шине 1wire
if (addr[0] == 40) // проверка, что мы будет писать именно в DS18B20
{
ds.reset(); // запрос шины 1-Wire
ds.select(addr); // выбор нашего DS18B20
ds.write(0x4E); // запись в scratchPad
ds.write(0x00); // User byte 0 – Unused
ds.write(0x00); // User byte 1 – Unused
ds.write(0x7F); // выставляем 12 бит (0x7F)
ds.reset(); // сбрасываем 1-Wire
}Хорошо живет на свете Винни-Пух...
14.01.2018 в 21:48 #1580514.01.2018 в 23:45 #15809Это работает. Но есть
дветри вещи, которые надо ещё сделать.1. Перед записью разрешения в scratchpad сначала проверить, какое значение там уже записано. И, если установлено разрешение, отличное от 12 бит, тогда записать новое значение.
2. После записи нового значения разрешения в scratchpad нужно перенести его в EEPROM.
3. Нужно вывести текущее значение разрешения в порт.
Пункты 2 и 3 я уже сделал, а пункт 1 пришёл в голову в последний момент, надо делать.
15.01.2018 в 00:31 #1581015.01.2018 в 00:45 #15812Есть проблема с созданием пользовательских функций. Никак не пойму, как передавать в функцию параметры, чтобы можно было этими параметрами заменять части текста внутри функции. Например, нужна функция, которая бы делала одно и то же, но над разными объектами. И это не просто числа, а части названий объектов.
Это очень тупо объяснять, приведу пример. Вот фрагмент моего скетча:
SteamSensor.reset(); // сброс шины OneWire
SteamSensor.select( SteamAddr ); // выбор датчика по полученному адресу
SteamSensor.write( 0xBE, POWER_MODE ); // команда считывания scratchpad
for( uint8_t i = 0; i < 9; i++ ) // scratchpad состоит из 9 байт
{ SteamBuffer = SteamSensor.read(); } // считываем и заносим в буфер
if( SteamBuffer[4] != 0x7F ) // если разрешение не 12 бит
{ Serial.println( “SteamSensor Resolution less than 12 bits. Change it…” ); // будем менять разрешение
SteamSensor.reset(); // сброс шины OneWire
SteamSensor.select( SteamAddr ); // выбор датчика по полученному адресу
SteamSensor.write( 0x4E, POWER_MODE ); // запись в scratchPad
SteamSensor.write( 0x00, POWER_MODE ); // неиспользуемый байт
SteamSensor.write( 0x00, POWER_MODE ); // тоже неиспользуемый
SteamSensor.write( 0x7F, POWER_MODE ); // разрешение 12 бит (0x7F)
SteamSensor.reset(); // сброс шины OneWire
delay ( 100 );
SteamSensor.reset(); // сброс шины OneWire
SteamSensor.select( SteamAddr ); // выбор датчика по полученному адресу
SteamSensor.write( 0x48, POWER_MODE ); // копирование данных из scratchpad в EEPROM
SteamSensor.reset(); // сброс шины OneWire
}Видно, что в этом фрагменте очень часто повторяется “Steam”. Если “Steam” заменить на “Pipe”, то этот фрагмент уже будет относиться к другому датчику. Хотелось бы оформить подобные фрагменты в виде функций, в которые можно было бы передать в качестве параметра это самое “Pipe” или “Water”.
15.01.2018 в 11:12 #15819Это работает. Но есть
дветри вещи, которые надо ещё сделать. 1. Перед записью разрешения в scratchpad сначала проверить, какое значение там уже записано. И, если установлено разрешение, отличное от 12 бит, тогда записать новое значение. 2. После записи нового значения разрешения в scratchpad нужно перенести его в EEPROM. 3. Нужно вывести текущее значение разрешения в порт. Пункты 2 и 3 я уже сделал, а пункт 1 пришёл в голову в последний момент, надо делать.Сделать все это можно, вопрос зачем? Тупо переписал скатчпад при инициализации и все. И в EEPROM можно не писать, т.к. при каждом запуске инициализация идет.
Хорошо живет на свете Винни-Пух...
15.01.2018 в 11:15 #15820Хотелось бы оформить подобные фрагменты в виде функций, в которые можно было бы передать в качестве параметра это самое “Pipe” или “Water”.
Массив надо сделать, в этом направлении мысль крутится. Оформится отпишусь.
Хорошо живет на свете Винни-Пух...
15.01.2018 в 11:30 #15821Сделать все это можно, вопрос зачем?
Затем же, зачем исключать одну библиотеку и пользоваться другой. Типа, так правильней и круче.
Шутка. На самом деле это не обязательно. Как и вообще устанавливать разрешение в прикладной программе. Как и проверять его и выводить в UART. Как и обнаруживать датчики и узнавать их номера. За счёт удаления “лишнего” кода можно сократить программу. Кстати, моя программа в первом своём варианте умещалась на одном экране, а теперь? Единственное оправдание всему этому – получение некоторых дополнительных знаний по проблемам программирования. Но, к сожалению, пройдёт месяц-другой, и всё забудется. Этим надо заниматься ежедневно.
Но сейчас у меня есть программа, которая работает (это уже третья!) как мне нужно.
PS Существует в C++ такое понятие, как “конкатенация строк”?
15.01.2018 в 12:00 #15826Skalinas, чуть позже. Скетч пока ужастен, я туда надергал кучу кода отовсюду и это кошмар. Местами сам не понимаю иногда, что к чему в некоторых фрагментах – учусь)). Дайте чуть времени и все выложу.
Стыдно такое показывать, это хуже взрыва на макаронной фабрике.
Хорошо живет на свете Винни-Пух...
15.01.2018 в 14:17 #15829а можно вообще без снятия ИДов? … Оператор указывает какой датчик с каким тэгом
У ардуинки только MODBUS с компом, и ГДЕ оператор будет указывать? Это надо дисплей, кнопки…
Хотя… тэги-то только в Master SCADA, так что… Ардуинку МОЖНО запрограммировать на автоматический опрос ВСЕХ подключенных датчиков и передачу их по модбасу, а уж в Мастере пусть оператор их разруливает, кто где. Типа один в снег, второй под мышку 😉 третий в кипяток… или все в кипяток по очереди.
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.