РЕКЛАМА НА ФОРУМХАУС Отдельный вход для каждого датчика видел, даже один такой модуль у меня стоит. Чтобы сразу 1wire шлейф зацепить - такого не видел.
И это весьма странно, если не сказать больше. Видел то, что нужно от некоей конторы reallab. Но ценник в 7,5 круб как то не радует.
Кстати, насчет электромагнитной совместимости. На фото макет контроллера Dali для управления светом. На 16 кнопочных выключателей. На плате видно много оптопар. Так как все выключатели подключены через опторазвязку. Шина Dali тоже подключена через оптопары. В качестве мозгов - Ардуинка. И да, прерывания тоже используются.
Интересно, как там привязаны идентификаторы датчиков к modbus регистрам? Хотя можно сделать пары регистров типа 1-wire адрес - значение температуры с датчика. Так что сделайте сами на Ардуинке. Вроде, получается совсем не сложно У меня подобная проблема была когда-то решена через Raspberry + NodeRed
А как и куда идентификаторы привязаны в самом 1-wire? Да никак и никуда. Ардуинку как раз не хотелось. Перехожу на s7-1200 и лепить туда ардуино. Есть ещё на али ds18b20 типа сразу с выходом rs485 и поддержкой modbus rtu. Тогда все менять, и не факт что заработает.
В точку! Буквально со следующего от начального уровня. Нужно просто понять, что Ардуино - это не более чем игрушка. Это как детский конструктор.
Нет там такой проблемы (интересно что надо сделать с несчастным пином чтобы она появилась?) Мониторинг аналоговых датчиков (3 шт), мониторинг батарей аккумуляторов (2), девайс для КТС вопиют нещадно - "нет у нас такой проблемы!" Как вы это делаете?)
Я имел в виду, что датчики имеют (по умолчанию), неизвестные и случайные 1-wire адреса. Если у нас для каждого датчика отдельный вход, то проблем нет. Для каждого датчика есть свой модбас регистр, привязанный к этому входу. Если же у нас есть шина 1-wire, то как привязать неизвестное количество датчиков к определенным модбас регистрам? Выше я предложил заполнять регистры парами. Типа 1-wire адрес - значение температуры для этого датчика. Иначе получаем полную "угадайку" - с какого датчика это конкретное значение? У меня стоит подобный модуль под 18b20 от WellPro, работает, в целом, стабильно.
Да вот в сами микросхемы DS и привязаны, ROM address. Они там фиксированы. Чтобы отразить каждый в определенный адрес modbus - нужно либо жестко прописать их в программе, либо сделать конфигуратор на веб-интерфейсе ESP. Или можно просто выдавать их в MQTT, парами адрес-значение, и разбирать уже там где используются значения. Подключить шлейф DS-сенсоров к ардуине или ESP - лехко: Вот только процедуру опроса датчиков лучше написать самому, вместо той что в библиотеках. Не хотите ардуину - покупайте за 7 т. ну да, разумеется - если пользоваться только книжкой-раскраской "сделай моргалку синим светодиодом") Ардуино - это плата с распаяным на ней контроллером с неким обвесом, с залитым бутлодером для облегчения программирования, и набором инструментов для его программирования. А уж что вы с ним делать будете - рисовать по картинкам из "раскраски" или что-то свое сумеете сделать - это вопрос не к ардуине...
Синим отмечен блок "тишины". 50 мс пауза, перед замером. Можно наверное и меньше. Без этой паузы аналоговое считывание не стабильно.
Да уж... Как я понял из кода, вы вызываете процедуры по флагу flagii, который поднимаете раз в секунду. Если отвлечься от вопроса, зачем вы это делаете, то код в начале главного цикла можно переписать проще и понятнее при том же результате: Отсюда видно, что "период тишины" у вас не 50мс, а 1000мс. Правда, зачем это, не понятно... Как и многое другое в вашем коде. P. S. Естественно, переменные timeNew и timeOld должны быть unsigned
Раз в секунду производятся все необходимые действия, в том числе формирование массива данных для отправки и прием данных которые пришли от сервера. Строка, отмеченная синим как раз и есть тишина 50 мс. Потом дельта становится больше 1000, и следующая строка гарантированно тут же выполнится. В первой строке условие ПОКА меньше или равно, а в следующей если БОЛЬШЕ или равно. В коде так же учитывается переполнение счетчика мс. Если это не учитывать, то в итоге из меньшего будет вычитаться большее. На Ардуино это порядка 40 дней. Я в одном коде это потерял, в итоге пришлось специально ехать перепрошивать.
Вот это подчеркнутое синим - вы загоняете процессор в цикл, не давая ему делать ничего полезного. Естественно, что WiFi это как бы не понимает, потому что обмен пакетами не хочет ждать, пока там оно отработает. О существовании delay в курсе? О том, что ADC там в принципе не предназначен для ТОЧНОГО считывания напряжения, и поэтому к результатам счета надо применять хотя бы простейшее усреднение по N замерам? Ну и так разное по мелочам уже. В общем, понятно в чем проблема.
Вот это как раз и работает. Цикл может быть и больше 50 мс. dalay() на ESP вставляет код работы с WIFI, вот точно "тишины" не будет. Обмен пакетами и так идет, это обмена между буфером и программой нет. В секунду приходит один пакет, он гарантированно считается. А вот на UDP сервере, на котором вообще все крутится без задержек, иногда пакеты пропадают, так как даже за малый промежуток времени может прилететь больше 5 пакетов. Именно по этому, все устройства и посылают пакеты раз в секунду. АЦП достаточно точно считывает. Шум если и идет то 2-3 единицы. Если, для перевода в нужные единицы, результат нужно делить на 3 и больше, то можно считать один раз. Я обычно считываю 4 раза подряд, и беру среднее.
Проверьте еще раз вашу логику. Она работает именно так, как сокращенный вариант, который я привел выше. То есть, в вашей терминологии, "тишина" 1000мс, а не 50мс Похоже, вы сами запутались в своих условных операторах Я полагал, что уже все в курсе, как работать с такими счетчиками. Если у вас тип переменных unsigned, (длина должна соответствовать длине millis, хотя и не обязательно), то при вычитании из меньшего большего будет правильный результат. Я не зря это указал в P. S. Если не верите - проверьте сами. Уточню, что и переменная timeAbs тоже должна быть типа unsigned long, как timeNew и timeOld. Тогда будет работать, так называемая, модульная арифметика. Когда разница значений всегда считается правильно, независимо от переполнения. Тогда если в результате получается отрицательное число, то к нему прибавляется максимальное значение типа unsigned long +1. Пример для длины unsigned 8 бит. Пусть у нас счетчик увеличился на две единицы от 255 до 1 255+1 = 0, затем 0 + 1 =1 Далее вычитание по модулю 256 для 8-ми битного числа: 1 - 255 = -254 отрицательных чисел в беззнаковом типе не бывает, поэтому прибавляем (макс. значение +1) -254 + (255+1) = 2 Всё правильно, получили разницу значений 2. P. S. Кстати, длина unsigned переменных может быть и короче, чем unsigned long функции millis(). Тогда старшие биты millis() просто обрежутся, а переполнение будет проходить чаще, примерно раз в 65 секунд. Но это не страшно, если измеряемые периоды меньше.