D18B20, Arduino, MODBUS, Master SCADA

  • В этой теме 259 ответов, 23 участника, последнее обновление 5 лет сделано Роман.
Просмотр 15 сообщений - с 46 по 60 (из 260 всего)
  • Автор
    Сообщения
  • #15778
    Роман
    Участник
    • Ответов: 291
    @papazol

    Тема слегка заглохла. В общем, устанавливать разрешения датчиков необходимо, как это делать с помощью одной только библиотеки OneWire, я не нашёл. Да и есть ли особый смысл долбиться в стену, когда в двух шагах открытая дверь? Я использую библиотеку DallasTemperature для поиска датчиков, определения их адресов и установки нужного разрешения. Всё. А дальше, когда начинается работа, используется только библиотека OneWire.

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

    Мне интересно, вообще кто-нибудь попробовал Master SCADA?

    #15780
    skalinas
    Участник
    • Ответов: 441
    @skalinas

    Я использую библиотеку DallasTemperature для поиска датчиков, определения их адресов и установки нужного разрешения. Всё.

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

    #15787
    Роман
    Участник
    • Ответов: 291
    @papazol

    в библиотеке есть задержка делау, которая мешает работе основной программе

    Написал же, что библиотека DallasTemperature работает только в части setup(), потом она ни разу не используется. Если бы не нужно было устанавливать разрешение для датчиков (а если они “нулёвые”, то так и есть), эта часть программы была бы вовсе не нужна. Теоретически можно сделать спецпрограмму для установки разрешения, прогнать через неё все датчики заранее, потом просто пользоваться. Но я пока не вижу нужды так оголодать экономить.

    К сожалению, современный народ обуяла смартфономания 🙂 Удобные простому обывателю программы пишут в основном для смартфонов (на худой конец планшетов). Лет 30 назад я бы только радовался этому, а сейчас пользоваться смартфоном в разных сабжевых целях для меня всё равно что смотреть в микроскоп. Неудобно то есть, необходимы очки для чтения, а в них всё остальное плохо видно. Мне нужно, чтобы информация отображалась на дисплее нормального (или близкого к нему) размера. Мой нетбук – компромисс между портативностью и удобством наблюдения. И то скажу, маловат экран у него (10″). Поэтому жду, когда кто-нибудь научит передавать данные по WiFi, и не просто передавать как-то там, а так, как нужно передавать 🙂

    #15788
    skalinas
    Участник
    • Ответов: 441
    @skalinas

    Сейчас смарты выводят на телевизор изображение, разглядеть не проблема :))

    #15801
    Счастливчик
    Хранитель
    • Ответов: 2655
    @wpadm

    Вот код для выставления 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
    }

    Хорошо живет на свете Винни-Пух...

    #15802
    Счастливчик
    Хранитель
    • Ответов: 2655
    @wpadm

    Отладил, работает. И кстати 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
    }

    Хорошо живет на свете Винни-Пух...

    #15805
    skalinas
    Участник
    • Ответов: 441
    @skalinas

    Отладил, работает.

    Хотелось бы посмотреть полный скетч, что бы по ковырять.

    #15809
    Роман
    Участник
    • Ответов: 291
    @papazol

    Это работает. Но есть две три вещи, которые надо ещё сделать.

    1. Перед записью разрешения в scratchpad сначала проверить, какое значение там уже записано. И, если установлено разрешение, отличное от 12 бит, тогда записать новое значение.

    2. После записи нового значения разрешения в scratchpad нужно перенести его в EEPROM.

    3. Нужно вывести текущее значение разрешения в порт.

    Пункты 2 и 3 я уже сделал, а пункт 1 пришёл в голову в последний момент, надо делать.

    #15810
    Роман
    Участник
    • Ответов: 291
    @papazol

    Ну вот, всё доделал.

    Вложения:
    Вы должны войти для просмотра вложений.
    #15812
    Роман
    Участник
    • Ответов: 291
    @papazol

    Есть проблема с созданием пользовательских функций. Никак не пойму, как передавать в функцию параметры, чтобы можно было этими параметрами заменять части текста внутри функции. Например, нужна функция, которая бы делала одно и то же, но над разными объектами. И это не просто числа, а части названий объектов.

    Это очень тупо объяснять, приведу пример. Вот фрагмент моего скетча:

    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”.

    #15819
    Счастливчик
    Хранитель
    • Ответов: 2655
    @wpadm

    Это работает. Но есть две три вещи, которые надо ещё сделать. 1. Перед записью разрешения в scratchpad сначала проверить, какое значение там уже записано. И, если установлено разрешение, отличное от 12 бит, тогда записать новое значение. 2. После записи нового значения разрешения в scratchpad нужно перенести его в EEPROM. 3. Нужно вывести текущее значение разрешения в порт. Пункты 2 и 3 я уже сделал, а пункт 1 пришёл в голову в последний момент, надо делать.

    Сделать все это можно, вопрос зачем? Тупо переписал скатчпад при инициализации и все. И в EEPROM можно не писать, т.к. при каждом запуске инициализация идет.

    Хорошо живет на свете Винни-Пух...

    #15820
    Счастливчик
    Хранитель
    • Ответов: 2655
    @wpadm

    Хотелось бы оформить подобные фрагменты в виде функций, в которые можно было бы передать в качестве параметра это самое “Pipe” или “Water”.

    Массив надо сделать, в этом направлении мысль крутится. Оформится отпишусь.

    Хорошо живет на свете Винни-Пух...

    #15821
    Роман
    Участник
    • Ответов: 291
    @papazol

    Сделать все это можно, вопрос зачем?

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

    Шутка. На самом деле это не обязательно. Как и вообще устанавливать разрешение в прикладной программе. Как и проверять его и выводить в UART. Как и обнаруживать датчики и узнавать их номера. За счёт удаления “лишнего” кода можно сократить программу. Кстати, моя программа в первом своём варианте умещалась на одном экране, а теперь? Единственное оправдание всему этому – получение некоторых дополнительных знаний по проблемам программирования. Но, к сожалению, пройдёт месяц-другой, и всё забудется. Этим надо заниматься ежедневно.

    Но сейчас у меня есть программа, которая работает (это уже третья!) как мне нужно.

    PS Существует в C++ такое понятие, как “конкатенация строк”?

    #15826
    Счастливчик
    Хранитель
    • Ответов: 2655
    @wpadm

    Skalinas, чуть позже. Скетч пока ужастен, я туда надергал кучу кода отовсюду и это кошмар. Местами сам не понимаю иногда, что к чему в некоторых фрагментах – учусь)). Дайте чуть времени и все выложу.

    Стыдно такое показывать, это хуже взрыва на макаронной фабрике.

    Хорошо живет на свете Винни-Пух...

    #15829
    Степан
    Участник
    • Ответов: 51
    @sten58

    а можно вообще без снятия ИДов?  … Оператор указывает какой датчик с каким тэгом

    У ардуинки только MODBUS с компом, и ГДЕ оператор будет указывать? Это надо дисплей, кнопки…

    Хотя… тэги-то только в Master SCADA, так что… Ардуинку МОЖНО запрограммировать на автоматический опрос ВСЕХ подключенных датчиков и передачу их по модбасу, а уж в Мастере пусть оператор их разруливает, кто где. Типа один в снег, второй под мышку 😉 третий в кипяток… или все в кипяток по очереди.

Просмотр 15 сообщений - с 46 по 60 (из 260 всего)
  • Для ответа в этой теме необходимо авторизоваться.