D18B20, Arduino, MODBUS, Master SCADA

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

    Я бы вообще порекомендовал закинуть уже ардуину как не актуальную, а использовать хотябы nodemcu ESP8266

    У вас есть конкретные технические решения в свете данного совета? Хотелось бы ознакомиться.

    #15636
    Юрий
    Участник
    • Ответов: 26
    @hleva

    А я вот думаю как бы мне сделать систему сигнализации на захлеб колонны…

    JUST DO IT !!!!!

    #15637
    Юрий
    Участник
    • Ответов: 26
    @hleva

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

     

    JUST DO IT !!!!!

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

    А еще я думаю как бы мне так отслеживать отбор через ардуинку,

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

    А я вот думаю как бы мне сделать систему сигнализации на захлеб колонны…

    Нужно знать предзахлебную мощность и поддерживать мощность на 5…10% меньше, для этого нужно контролировать и регулировать потребляемую мощность нагревателя. Для измерения мощности можно использовать PZEM-004T и передавать измерения в ардуино.

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

    Допилил я датчики без адресов. У меня скетч с несколькими вкладками. Выложу пока как есть кусок про датчики. А целиком скетч пока совсем мрак – сырой. Его пока не выложу, надо еще поработать.

    #include <OneWire.h>

    // Инициация датчиков температуры
    OneWire ds(5); //Датчик на D1
    OneWire ds2(4); // Датчик на D2
    byte addr[8]; //Адрес датчика на D1
    byte addr2[8]; //Адрес датчика на D2

    int flagDallRead = 1; //Переменная опроса датчиков, для определения периодичности опроса

    void setup() {

    // Определяем адреса датчиков температуры
    !ds.search(addr);
    !ds2.search(addr2);

    }

    void loop() {

    dallRead(flagDallRead*1000);
    }

    void dallRead(unsigned long interval){
    int Temper =0;
    int Temper2 =0;

    static unsigned long prevTime = 0;
    if (millis() – prevTime > interval) { //Проверка заданного интервала
    static boolean flagDall = 0; //Признак операции
    prevTime = millis();
    flagDall =! flagDall; //Инверсия признака
    if (flagDall) {
    ds.reset();
    ds.write(0xCC); //Обращение ко всем датчикам
    ds.write(0x44); //Команда на конвертацию
    ds2.reset();
    ds2.write(0xCC); //Обращение ко всем датчикам
    ds2.write(0x44); //Команда на конвертацию
    flagDallRead = 1; //Время возврата в секундах
    }
    else {

    int temp=0;
    int temp2=0;

    ds.reset();
    ds.select(addr);
    ds.write(0xBE); //Считывание значения с датчика
    temp = (ds.read() | ds.read()<<8); //Принимаем два байта температуры

    // !ds2.search(addr2);
    ds2.reset();
    ds2.select(addr2);
    ds2.write(0xBE); //Считывание значения с датчика
    temp2 = (ds2.read() | ds2.read()<<8); //Принимаем два байта температуры

    Temper = (float)temp/16.0;
    Temper2 = (float) temp2 / 16.0;

    flagDallRead = 2; //Время возврата в секундах

    }
    }
    }

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

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

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

    Это не особо сложно. Дойдут руки – сделаю.

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

    #15641
    SanyaNapalm
    Участник
    • Ответов: 276
    @balsan

    по другому никак

    ну почему-же, люди вон сделали каплесчитатель. Конечно диапазон сильно ограничен,но все же…

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

    Сделал так, как хотел Счастливчик.

    Неплохо, посмотрите в моем коде, как без далласовской библиотеки можно адреса вытащить.  А почему Вы циклы не используете? Или целиком байты не вытаскиваете?

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

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

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

    Мне понравилась концепция обработки постоянно повторяющихся действий в прерываниях. Это я у Эдуарда присмотрел.

    Далее немного философских размышлений 🙂

    Чем хорошо программирование, это тем, что можно сделать так, эдак и ещё кучей способов. И этим же оно плохо. Я не программист, а самоучка, начинал с ассемблера для MSC51. Ардуина показалась хорошей как раз своей “народностью”, то есть, как вы писали, низким порогом вхождения. Пусть программы, написанные на языках высокого уровня, не оптимальны, зато пишутся быстро и так же быстро отлаживаются.

    Но, несмотря на кажущуюся простоту использования, мало кто разбирается в библиотеках Arduino, а тем более может сам библиотеку написать. Поэтому приходится пытаться пользоваться примерами, которые авторы библиотек прикладывают. А там далеко не всё понятно. Особенно напрягает косноязычие C++. Зачастую написанное на этом языке можно сравнить с иероглифами регулярными выражениями. Поэтому для нас, любителей, очень полезны нормально написанные на русском языке уроки по программированию. К сожалению, их не очень много в сети. Вот так и живём 🙂

    Как должна описываться функция, чтобы любой первый встречный понял, как её применять? Должно быть название функции, описание словами того, что эта функция делает, список аргументов с описанием словами, что каждый из них означает, возвращаемые значения. И пример записи. Это всё. К сожалению, в Arduino (а, может быть, и в C++) так не принято. И этот факт сильно осложняет нам жизнь.

    Вот в вашем скетче встречаются записи типа

    !ds.search(addr);
    !ds2.search(addr2);

    Насколько понимаю я, а я понимаю слабо, восклицательный знак перед чем-либо означает логическую операцию НЕ. Или, может, в данном случае это трактуется иначе? Я не розумию!

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

    Это отрицание.  Операция аргумент.search(адрес) является логической и выдает на выходе true или false. Она нам сама по себе не нужна, но мимоходом она заполняет переменную addr адресом датчика. Для этого я ее и использовал. А потом по этому адресу идет опрос.

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

    Вы правы, способов куча, главное, чтобы работало!

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

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

    Допилил я датчики без адресов. У меня скетч с несколькими вкладками. Выложу пока как есть кусок про датчики.

    Не смог проверить, выдает ошибку.

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

    Это отрицание.

    Вероятно, для чего-то нужно инвертировать результат операции? Но, если он в виде true/false нам не нужен, можно было и оставить как есть? Или это такая программистская уловка?

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

    Что-то у меня не получилось средствами библиотеки OneWire установить нужное разрешение датчиков. А это, как показывает практика, необходимо делать.

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

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

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

    Инверсия операции идет для того, чтобы эту функцию задействовать. Либо инверсию сделать, либо ее значение присвоить произвольной переменной. Само булево значение этой функции нас не интересует, нам важен побочный результат – получение адреса датчика в переменную addr.

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

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

    Посмотреть бы текст.

    показания берутся в виде пары байтов и вынимаются через различные математические операции

    Так делается при любом установленном разрешении. Но не зря же в далласовской библиотеке есть специальная функция установки разрешения. Она записывает в 4-й байт scratchpad’а код, соответствующий устанавливаемому разрешению.

    Либо инверсию сделать, либо ее значение присвоить произвольной переменной.

    Это означает, что без инверсии компилятор выдаст ошибку или функция не будет работать? По сути, где-нибудь написано, что вот так оно работает, а эдак – нет? Право слово, язык хуже китайского.

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