1 2 3 4 5 6 7 8 9 10 7.5/10 7,63оценок: 8

Домашняя автоматика - своими силами

Тема в разделе "Умный дом", создана пользователем ВИД, 07.01.08.

Метки:
  1. Arcnet
    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277

    Arcnet

    Живу здесь

    Arcnet

    Живу здесь

    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277
    Адрес:
    Пермь
    Отдельный вход для каждого датчика видел, даже один такой модуль у меня стоит.
    Чтобы сразу 1wire шлейф зацепить - такого не видел. :no:
     
  2. arv13
    Регистрация:
    30.09.13
    Сообщения:
    685
    Благодарности:
    96

    arv13

    Живу здесь

    arv13

    Живу здесь

    Регистрация:
    30.09.13
    Сообщения:
    685
    Благодарности:
    96
    И это весьма странно, если не сказать больше. Видел то, что нужно от некоей конторы reallab. Но ценник в 7,5 круб как то не радует.
     
  3. Arcnet
    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277

    Arcnet

    Живу здесь

    Arcnet

    Живу здесь

    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277
    Адрес:
    Пермь
    Кстати, насчет электромагнитной совместимости.
    На фото макет контроллера Dali для управления светом. На 16 кнопочных выключателей.
    На плате видно много оптопар. Так как все выключатели подключены через опторазвязку. Шина Dali тоже подключена через оптопары. В качестве мозгов - Ардуинка. :)
    И да, прерывания тоже используются.

    Dali PCB _.jpg
     
  4. Arcnet
    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277

    Arcnet

    Живу здесь

    Arcnet

    Живу здесь

    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277
    Адрес:
    Пермь
    Интересно, как там привязаны идентификаторы датчиков к modbus регистрам?
    Хотя можно сделать пары регистров типа 1-wire адрес - значение температуры с датчика.
    Так что сделайте сами на Ардуинке. Вроде, получается совсем не сложно :)
    У меня подобная проблема была когда-то решена через Raspberry + NodeRed
     
  5. arv13
    Регистрация:
    30.09.13
    Сообщения:
    685
    Благодарности:
    96

    arv13

    Живу здесь

    arv13

    Живу здесь

    Регистрация:
    30.09.13
    Сообщения:
    685
    Благодарности:
    96
    А как и куда идентификаторы привязаны в самом 1-wire? Да никак и никуда. Ардуинку как раз не хотелось. Перехожу на s7-1200 и лепить туда ардуино. Есть ещё на али ds18b20 типа сразу с выходом rs485 и поддержкой modbus rtu. Тогда все менять, и не факт что заработает.
     
  6. Kass-1
    Регистрация:
    27.10.21
    Сообщения:
    4.203
    Благодарности:
    1.524

    Kass-1

    Живу здесь

    Kass-1

    Живу здесь

    Регистрация:
    27.10.21
    Сообщения:
    4.203
    Благодарности:
    1.524
    Адрес:
    Москва
    В точку! Буквально со следующего от начального уровня. Нужно просто понять, что Ардуино - это не более чем игрушка. Это как детский конструктор.
     
  7. Netbyka
    Регистрация:
    30.07.15
    Сообщения:
    3.916
    Благодарности:
    2.303

    Netbyka

    Живу здесь

    Netbyka

    Живу здесь

    Регистрация:
    30.07.15
    Сообщения:
    3.916
    Благодарности:
    2.303
    Нет там такой проблемы (интересно что надо сделать с несчастным пином чтобы она появилась?)
    Мониторинг аналоговых датчиков (3 шт), мониторинг батарей аккумуляторов (2), девайс для КТС вопиют нещадно - "нет у нас такой проблемы!"

    Как вы это делаете?)
     
  8. Arcnet
    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277

    Arcnet

    Живу здесь

    Arcnet

    Живу здесь

    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277
    Адрес:
    Пермь
    Я имел в виду, что датчики имеют (по умолчанию), неизвестные и случайные 1-wire адреса. Если у нас для каждого датчика отдельный вход, то проблем нет. Для каждого датчика есть свой модбас регистр, привязанный к этому входу.
    Если же у нас есть шина 1-wire, то как привязать неизвестное количество датчиков к определенным модбас регистрам? Выше я предложил заполнять регистры парами. Типа 1-wire адрес - значение температуры для этого датчика. Иначе получаем полную "угадайку" - с какого датчика это конкретное значение?

    У меня стоит подобный модуль под 18b20 от WellPro, работает, в целом, стабильно.
    wp3066.PNG
     
    Последнее редактирование: 02.01.24
  9. Netbyka
    Регистрация:
    30.07.15
    Сообщения:
    3.916
    Благодарности:
    2.303

    Netbyka

    Живу здесь

    Netbyka

    Живу здесь

    Регистрация:
    30.07.15
    Сообщения:
    3.916
    Благодарности:
    2.303
    Да вот в сами микросхемы DS и привязаны, ROM address. Они там фиксированы.
    Чтобы отразить каждый в определенный адрес modbus - нужно либо жестко прописать их в программе, либо сделать конфигуратор на веб-интерфейсе ESP.
    Или можно просто выдавать их в MQTT, парами адрес-значение, и разбирать уже там где используются значения.

    Подключить шлейф DS-сенсоров к ардуине или ESP - лехко:
    Screenshot from 2023-11-27 00-38-37.png
    Вот только процедуру опроса датчиков лучше написать самому, вместо той что в библиотеках.
    Не хотите ардуину - покупайте за 7 т.

    ну да, разумеется - если пользоваться только книжкой-раскраской "сделай моргалку синим светодиодом")
    Ардуино - это плата с распаяным на ней контроллером с неким обвесом, с залитым бутлодером для облегчения программирования, и набором инструментов для его программирования.
    А уж что вы с ним делать будете - рисовать по картинкам из "раскраски" или что-то свое сумеете сделать - это вопрос не к ардуине...
     
    Последнее редактирование: 02.01.24
  10. AVG111
    Регистрация:
    25.09.18
    Сообщения:
    2.752
    Благодарности:
    1.264

    AVG111

    Живу здесь

    AVG111

    Живу здесь

    Регистрация:
    25.09.18
    Сообщения:
    2.752
    Благодарности:
    1.264
    Адрес:
    Москва
    Снимок.JPG
    Синим отмечен блок "тишины". 50 мс пауза, перед замером. Можно наверное и меньше. Без этой паузы аналоговое считывание не стабильно.
     
  11. Arcnet
    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277

    Arcnet

    Живу здесь

    Arcnet

    Живу здесь

    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277
    Адрес:
    Пермь
    Да уж...
    Как я понял из кода, вы вызываете процедуры по флагу flagii, который поднимаете раз в секунду.
    Если отвлечься от вопроса, зачем вы это делаете, то код в начале главного цикла можно переписать проще и понятнее при том же результате:

    Отсюда видно, что "период тишины" у вас не 50мс, а 1000мс. Правда, зачем это, не понятно... Как и многое другое в вашем коде.

    P. S. Естественно, переменные timeNew и timeOld должны быть unsigned
     
  12. AVG111
    Регистрация:
    25.09.18
    Сообщения:
    2.752
    Благодарности:
    1.264

    AVG111

    Живу здесь

    AVG111

    Живу здесь

    Регистрация:
    25.09.18
    Сообщения:
    2.752
    Благодарности:
    1.264
    Адрес:
    Москва
    Раз в секунду производятся все необходимые действия, в том числе формирование массива данных для отправки и прием данных которые пришли от сервера.
    Строка, отмеченная синим как раз и есть тишина 50 мс. Потом дельта становится больше 1000, и следующая строка гарантированно тут же выполнится. В первой строке условие ПОКА меньше или равно, а в следующей если БОЛЬШЕ или равно.
    В коде так же учитывается переполнение счетчика мс. Если это не учитывать, то в итоге из меньшего будет вычитаться большее. На Ардуино это порядка 40 дней. Я в одном коде это потерял, в итоге пришлось специально ехать перепрошивать.
     
  13. Netbyka
    Регистрация:
    30.07.15
    Сообщения:
    3.916
    Благодарности:
    2.303

    Netbyka

    Живу здесь

    Netbyka

    Живу здесь

    Регистрация:
    30.07.15
    Сообщения:
    3.916
    Благодарности:
    2.303
    Вот это подчеркнутое синим - вы загоняете процессор в цикл, не давая ему делать ничего полезного. Естественно, что WiFi это как бы не понимает, потому что обмен пакетами не хочет ждать, пока там оно отработает.
    О существовании delay в курсе?
    О том, что ADC там в принципе не предназначен для ТОЧНОГО считывания напряжения, и поэтому к результатам счета надо применять хотя бы простейшее усреднение по N замерам?
    Ну и так разное по мелочам уже.
    В общем, понятно в чем проблема.
     
  14. AVG111
    Регистрация:
    25.09.18
    Сообщения:
    2.752
    Благодарности:
    1.264

    AVG111

    Живу здесь

    AVG111

    Живу здесь

    Регистрация:
    25.09.18
    Сообщения:
    2.752
    Благодарности:
    1.264
    Адрес:
    Москва
    Вот это как раз и работает. Цикл может быть и больше 50 мс. dalay() на ESP вставляет код работы с WIFI, вот точно "тишины" не будет. Обмен пакетами и так идет, это обмена между буфером и программой нет. В секунду приходит один пакет, он гарантированно считается. А вот на UDP сервере, на котором вообще все крутится без задержек, иногда пакеты пропадают, так как даже за малый промежуток времени может прилететь больше 5 пакетов. Именно по этому, все устройства и посылают пакеты раз в секунду.
    АЦП достаточно точно считывает. Шум если и идет то 2-3 единицы. Если, для перевода в нужные единицы, результат нужно делить на 3 и больше, то можно считать один раз. Я обычно считываю 4 раза подряд, и беру среднее.
     
  15. Arcnet
    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277

    Arcnet

    Живу здесь

    Arcnet

    Живу здесь

    Регистрация:
    24.12.09
    Сообщения:
    3.117
    Благодарности:
    3.277
    Адрес:
    Пермь
    Проверьте еще раз вашу логику. Она работает именно так, как сокращенный вариант, который я привел выше. То есть, в вашей терминологии, "тишина" 1000мс, а не 50мс
    Похоже, вы сами запутались в своих условных операторах :aga:

    Я полагал, что уже все в курсе, как работать с такими счетчиками.
    Если у вас тип переменных 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 секунд. Но это не страшно, если измеряемые периоды меньше.
     
    Последнее редактирование: 03.01.24