Главная › Форумы › Конструкторское бюро › Автоматизация › D18B20, Arduino, MODBUS, Master SCADA
-
АвторСообщения
-
11.01.2018 в 21:35 #15635
Я бы вообще порекомендовал закинуть уже ардуину как не актуальную, а использовать хотябы nodemcu ESP8266
У вас есть конкретные технические решения в свете данного совета? Хотелось бы ознакомиться.
12.01.2018 в 00:50 #15636А я вот думаю как бы мне сделать систему сигнализации на захлеб колонны…
JUST DO IT !!!!!
12.01.2018 в 00:58 #15637А еще я думаю как бы мне так отслеживать отбор через ардуинку, ибо уж больно хочется поставить сервомотор на кран отбора.
JUST DO IT !!!!!
12.01.2018 в 01:08 #15638А еще я думаю как бы мне так отслеживать отбор через ардуинку,
Применять весы под емкости отбора и по времени смотреть скорость отбора, по другому никак. Себе делаю подобную автоматику.
А я вот думаю как бы мне сделать систему сигнализации на захлеб колонны…
Нужно знать предзахлебную мощность и поддерживать мощность на 5…10% меньше, для этого нужно контролировать и регулировать потребляемую мощность нагревателя. Для измерения мощности можно использовать PZEM-004T и передавать измерения в ардуино.
12.01.2018 в 01:54 #15639Допилил я датчики без адресов. У меня скетч с несколькими вкладками. Выложу пока как есть кусок про датчики. А целиком скетч пока совсем мрак – сырой. Его пока не выложу, надо еще поработать.
#include <OneWire.h>
// Инициация датчиков температуры
OneWire ds(5); //Датчик на D1
OneWire ds2(4); // Датчик на D2
byte addr[8]; //Адрес датчика на D1
byte addr2[8]; //Адрес датчика на D2int 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; //Время возврата в секундах
}
}
}Хорошо живет на свете Винни-Пух...
12.01.2018 в 01:55 #15640А еще я думаю как бы мне так отслеживать отбор через ардуинку, ибо уж больно хочется поставить сервомотор на кран отбора.
Это не особо сложно. Дойдут руки – сделаю.
Хорошо живет на свете Винни-Пух...
12.01.2018 в 02:04 #15641по другому никак
ну почему-же, люди вон сделали каплесчитатель. Конечно диапазон сильно ограничен,но все же…
12.01.2018 в 02:07 #15642Сделал так, как хотел Счастливчик.
Неплохо, посмотрите в моем коде, как без далласовской библиотеки можно адреса вытащить. А почему Вы циклы не используете? Или целиком байты не вытаскиваете?
Хорошо живет на свете Винни-Пух...
12.01.2018 в 11:34 #15647Можно вообще обойтись без далласовской библиотеки, адреса-то особо не нужны. Но тогда система получается “слепой”, она ничего не сообщает о том, подключены ли датчики, сколько их. Если быть уверенным в том, что все датчики подключены и исправны, можно ничего в порт не выводить, тогда программа упрощается, и библиотека не нужна.
Мне понравилась концепция обработки постоянно повторяющихся действий в прерываниях. Это я у Эдуарда присмотрел.
Далее немного философских размышлений 🙂
Чем хорошо программирование, это тем, что можно сделать так, эдак и ещё кучей способов. И этим же оно плохо. Я не программист, а самоучка, начинал с ассемблера для MSC51. Ардуина показалась хорошей как раз своей “народностью”, то есть, как вы писали, низким порогом вхождения. Пусть программы, написанные на языках высокого уровня, не оптимальны, зато пишутся быстро и так же быстро отлаживаются.
Но, несмотря на кажущуюся простоту использования, мало кто разбирается в библиотеках Arduino, а тем более может сам библиотеку написать. Поэтому приходится пытаться пользоваться примерами, которые авторы библиотек прикладывают. А там далеко не всё понятно. Особенно напрягает косноязычие C++. Зачастую написанное на этом языке можно сравнить с
иероглифамирегулярными выражениями. Поэтому для нас, любителей, очень полезны нормально написанные на русском языке уроки по программированию. К сожалению, их не очень много в сети. Вот так и живём 🙂Как должна описываться функция, чтобы любой первый встречный понял, как её применять? Должно быть название функции, описание словами того, что эта функция делает, список аргументов с описанием словами, что каждый из них означает, возвращаемые значения. И пример записи. Это всё. К сожалению, в Arduino (а, может быть, и в C++) так не принято. И этот факт сильно осложняет нам жизнь.
Вот в вашем скетче встречаются записи типа
!ds.search(addr);
!ds2.search(addr2);Насколько понимаю я, а я понимаю слабо, восклицательный знак перед чем-либо означает логическую операцию НЕ. Или, может, в данном случае это трактуется иначе? Я не розумию!
12.01.2018 в 11:53 #15648Это отрицание. Операция аргумент.search(адрес) является логической и выдает на выходе true или false. Она нам сама по себе не нужна, но мимоходом она заполняет переменную addr адресом датчика. Для этого я ее и использовал. А потом по этому адресу идет опрос.
Записи в серийный порт я использовал для отладки, а в реальной программе вся информация о датчиках будет в веб-интерфейсе.
Вы правы, способов куча, главное, чтобы работало!
Хорошо живет на свете Винни-Пух...
12.01.2018 в 11:57 #15650Допилил я датчики без адресов. У меня скетч с несколькими вкладками. Выложу пока как есть кусок про датчики.
Не смог проверить, выдает ошибку.
12.01.2018 в 14:09 #15665Это отрицание.
Вероятно, для чего-то нужно инвертировать результат операции? Но, если он в виде true/false нам не нужен, можно было и оставить как есть? Или это такая программистская уловка?
12.01.2018 в 16:22 #15677Что-то у меня не получилось средствами библиотеки OneWire установить нужное разрешение датчиков. А это, как показывает практика, необходимо делать.
13.01.2018 в 02:39 #15703Коллеги, я выдрал смысловые куски из своего кода. В лоб может и не работает без разных других нюансов. В моем скетче работает без проблем.
Про разрешение хороший вопрос, показания берутся в виде пары байтов и вынимаются через различные математические операции. Как-то так, дополнительно проверю и отпишусь.
Инверсия операции идет для того, чтобы эту функцию задействовать. Либо инверсию сделать, либо ее значение присвоить произвольной переменной. Само булево значение этой функции нас не интересует, нам важен побочный результат – получение адреса датчика в переменную addr.
Хорошо живет на свете Винни-Пух...
13.01.2018 в 10:51 #15709Посмотреть бы текст.
показания берутся в виде пары байтов и вынимаются через различные математические операции
Так делается при любом установленном разрешении. Но не зря же в далласовской библиотеке есть специальная функция установки разрешения. Она записывает в 4-й байт scratchpad’а код, соответствующий устанавливаемому разрешению.
Либо инверсию сделать, либо ее значение присвоить произвольной переменной.
Это означает, что без инверсии компилятор выдаст ошибку или функция не будет работать? По сути, где-нибудь написано, что вот так оно работает, а эдак – нет? Право слово, язык хуже китайского.
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.