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

Arduino Mega. Контроллер теплицы. Хроники

Тема в разделе "Теплицы и парники", создана пользователем DIYMan, 05.01.16.

Статус темы:
Закрыта.
  1. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Ещё одна попытка:
    2.png
    Нерабочая?
     
  2. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    На ардуинору поправили:
    3.jpg
    Вдуплял-вдуплял, вроде должно работать :)
     
  3. Snark
    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424

    Snark

    Живу здесь

    Snark

    Живу здесь

    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424
    Адрес:
    Лобня
    Всем привет!

    Коротенький статус репорт по RF датчикам (желательны комментарии, предложения по решениям):
    - после тяжелых боев заработала пара RF 2.4 от Quazar, на базе чипа CC2500. Лежат две ардуины - переругиваются через эфир.
    - заработал на макетке датчик влажности почвы через 1-Wire. Покупной датчик использовался только для использование размеров "вилки" втыкаемой в землю и получения калибровочной шкалы. То есть просто измеряем сопротивление между рожками в вилке, конвертируем в проценты влажности и отдаем по 1-wire. Ну и используем 1-wire чтобы записать в датчик его RF ID и калибровочные константы. Функции 1-wire search_rom и match_rom пришлось выкинуть для экономии памяти, то есть несколько датчиков на одном проводе работать не будет. Ну нам вроде и не очень надо, нихть? (решение №1)

    Код датчика и 1-wire клиента - около 800 байт. Осталось 200. Если RF чип потребует инициировать все дохренадцать регистров через SPI (как я сейчас делаю) тогда не влезем. Предложения по контроллеру для плана "B" ? (решение №2)

    RF чип требует совсем простую обвязку (десяток двуногих) и имеет несложный корпус (не BGA ;)). Есль ли смысл использовать готовый RF модуль (дорогой) или RF чип на плату датчика засунуть? (решение №3)
    Места на плате - море! Батарейный отсек купил на 2 батареи АА, а именно он определяет (30 на 55 мм). Правда платы под RF 2.4 я еще не разводил, может и фигня получиться.

    Кстати, RF датчик будет универсальный - предусматриваю места для распайки термодатчиков (DS), датчика влажности/температуры и фоторезистора (будет самодельный датчик освещенности, калибровать будем по 1-wire используя покупной датчик освещенности).
    Все это одновременно работать не будет! Памяти не хватит. Будут разные прошивки. (Разве что освещенность можно подключить в пару к любому из остальных датчиков, там всего 20 байт код.) Подо что еще нужно предусмотреть места на плате?
     
  4. olegmak3
    Регистрация:
    14.08.11
    Сообщения:
    524
    Благодарности:
    442

    olegmak3

    Живу здесь

    olegmak3

    Живу здесь

    Регистрация:
    14.08.11
    Сообщения:
    524
    Благодарности:
    442
    Адрес:
    Санкт-Петербург
    Работает.
     
  5. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    1. search rom и match rom - в топку, согласен. Можно отказаться и ещё от нескольких команд, если это возможно. Вариант вижу такой - по 1-wire контроллер выдаёт одну команду на чтение, и одну команду на запись, всё. Читать надо, побайтово: 1 байт код контроллера, к которому привязан датчик; 1 байт - ID датчика; 1 байт - его тип. Писать, соответственно, тоже несколько байт: ID контроллера, ID датчика. Получать показания по 1-Wire - по вкусу, можно и без этого, раз всё равно на RF замахнулись. Так что в первом приближении можно код и подсократить, теоретически.

    2. Плохо. Совсем не влезем?

    3. Если можно обойтись без готового RF-модуля, а впаять свой - то я за целостность подхода.

    4. На плате - только разводка под один тип датчиков, кмк, городить огород с парой разных датчиков на плате - не стоит.

    Вопрос: цифровые датчики не вместятся в прошивку? Имею в виду BH1750 и Si7021, и то, и другое - по I2C. Если нет - значит, надо МК подбирать, чтобы вмещалось. Потому что этот вопрос - важный.
     
  6. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    А по ходу отказываться-то больше особо не от чего :) Разве что skip rom загасить, если определимся, что оно точно не надо.
     
  7. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Вопрос возник: ок, допустим, для технически грамотного подхода всё-таки надо и по 1-Wire показания отдавать. Следовательно, для обеспечения прозрачности надо придерживаться одного протокола обмена, правильно? Вопрос, собственно, как раз о нём - как сейчас передаются данные? Т. е. - что входит в пакет?

    Нам бы вот об этом договориться, чтобы уже обдумать - и не возвращаться к этому вопросу. Вот, допустим, выдал я команду read rom - шо я должен прочитать? Как вижу я, на первый дилетантский взгляд:

    Код:
    Wire.reset();
    if(!Wire.select()) return;
    
    Wire.write(read_rom);
    
    controller_id = Wire.read(); // ID контроллера - всегда читаем
    sensor_type = Wire.read(); // тип сенсора - всегда читаем
    sensor_idx = Wire.read(); // индекс сенсора - всегда читаем
    
    // а вот тут - читаем в зависимости от типа датчика?
    switch(sensor_type)
    {
      case temperature: Wire.read(); Wire.read(); break;
      case humidity: break;
    }
    В общем, интересует больше заголовок пакета, который читается мастером всегда - как бы чего там не пропустить важного, на будущее? Тот же самый вопрос - с записью в клиента: надо и там тоже пакетик как-то оформить ;)

    Можно, конечно, несколько байт оставить как резерв, надо думать.

    Что скажет мастер?
     
  8. Snark
    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424

    Snark

    Живу здесь

    Snark

    Живу здесь

    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424
    Адрес:
    Лобня
    Это я не понимаю. Поясните. Зачем мне делать 5 видов печетных плат, по количеству типов датчиков, если можно сделать один - универсальный. С тем что бы можно было просто впаять только нужный датчики и загрузить нужную прошивку?

    Цифровые будут подключаться обязательно. Ну а реализация I2C еще проще (меньше по размеру кода) чем мое самопальное измерение сопротивления между зубъями вилки в земле.
    Тем не менее - микропроцессор будем заменять по необходимости.
    Я вообще не понимаю - чего я уперся в 13А. Нужно будет - поставим и 25 и 45 и 85, в том же корпусе.
    Ну - будет на 50 рублей дороже.

    Уже)

    Ну, пока сделано максимально примитивно - есть scratchpad, это 8 байт в памяти тиньки. Есть команды READ_SCRATCHPAD (0x4E) и WRITE_SCRATCHPAD (0xBE). После выдачи этих значений контроллером в линию - идет чтение/запись 9 байт scratchpad (девятый - CRC)
    А, ну измерение запускается командой MEASURE (0x44)

    В самом scratchpad, байты:
    0,1 - значение датчика row data. Для влажности земли - количество тринадцатимикросекундных интервалов в постоянной времени цепи "вилки"
    2 - 0x55 означает что измерение завершено (а то могли спросить значение не дождавшись завершения измерения, начатого командой MEASURE).
    3 - Значение датчика в процентах влажности
    4 - RF ID датчика
    5 - RF ID теплицы (что бы с соседями не конфликтовало)
    6,7 - калибровочные константы

    При обмене по RF - этот же scratchpad+ CRC уйдет в эфир.

    Если есть возражения/предложения - говорите. Длина данных может быть увеличена без увеличения кода прошивки.
     
  9. Snark
    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424

    Snark

    Живу здесь

    Snark

    Живу здесь

    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424
    Адрес:
    Лобня
    Все же - не в первой версии устройства. Первую делаю с готовыми RF модулями и отдаю кому нибудь на опытную эксплуатацию, с прикручиванием к коду основного контроллера.

    А там может и с выбором RF чипа ясность появится.
     
  10. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Я неточно выразился. Я имел в виду, что разводка, конечно-же, универсальная, но на одной плате - один тип датчика в конечном счёте будет стоять
    Ага, чудесно. Смотрите, у нас при передаче по RF максимальная длина пакета - 32 байта. Используем 8, как scratchpad тиньки. Предлагаю пока не париться, и сделать отсылку тупо 16-ти байт, мало ли что там потом пригодится. ну и при записи scratchpad вычитывать те же 16 байт. Думаю, этого будет не то что за глаза - по горлышко :)
    Ок, согласен, разумно.
     
  11. Snark
    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424

    Snark

    Живу здесь

    Snark

    Живу здесь

    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424
    Адрес:
    Лобня
    А вот не уверен.
    Пример - дальний угол теплицы, со своим модулем полива и освещения. Зачем там ставить два RF устройства (с удвоением геморроя с заменой батареек), если можно к плате датчика влажности почвы допаять фоторезистор за два рубля?

    Кстати, забыл в scratchpad добавить напряжение батареи. Еще байт - 15-20 кода уйдет.
     
  12. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    Разумно. Тогда тем более надо продумать формат пакета.
    Ага, согласен, надо.

    Теперь, что предлагаю по формату пакета и протоколу, который гоняется туда/сюда по 1-Wire и по RF. Принимаем за постулат, что пакет имеет одинаковую структуру в две стороны, т. е. и на запись, и на чтение - для упрощения кода. Итак, что предлагается по структуре пакета:

    {
    controller_id: 1 byte
    sensor_index: 1 byte
    battery_status: 1 byte
    calibration_factor1: 1 byte
    calibration_factor2: 1 byte
    reserved: 6 bytes
    sensors_count: 1 byte
    sensors_data: n bytes
    crc8: 1 byte
    }

    где sensors_data -
    {
    sensor_type: 1 byte
    sensor_value: 2 bytes
    }

    В итоге для одного датчика вычитывать надо 16 байт, для двух и более - на каждый датчик + ещё по 3 байта. Плюс - имеем офигенный резерв в 6 байт :) Критикуйте.
     
  13. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.889
    Адрес:
    80 км от Краснодара
    По скорости чтения при стандартных для 1-Wire 15 Кбит/с у меня получилось 1,5мс на вычитку 16 байт, вполне приемлемо.
     
  14. Snark
    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424

    Snark

    Живу здесь

    Snark

    Живу здесь

    Регистрация:
    17.10.11
    Сообщения:
    366
    Благодарности:
    424
    Адрес:
    Лобня
    Ох, а давайте без "n"?
    Пусть будут 3 слота для датчиков. То есть 3 пары type-value?
    Ну - куда больше?

    И количество датчиков передавать не надо. type = nil, и все тут.

    Кстати - датчики давления и влажности еще и температуру тащат. То есть 2 слота - совсем минимум, даже если решим ограничиться одним аппаратным датчиком.
     
  15. Voron74
    Регистрация:
    29.01.16
    Сообщения:
    411
    Благодарности:
    227

    Voron74

    Живу здесь

    Voron74

    Живу здесь

    Регистрация:
    29.01.16
    Сообщения:
    411
    Благодарности:
    227
    Адрес:
    Магнитогорск
    :faq: последние несколько сообщений вообще не понял :faq:. Коды для меня такооой темный лес. вот дайте мне железную часть, я её буду грузить до посинения, пока не спалю если она окажется "неубиваемой" :)]
     
Статус темы:
Закрыта.