Прикрутить onewire интерфейс к аналоговму пину

Тема в разделе "Arduino & Shields", создана пользователем Nekto_nikto, 10 сен 2020.

  1. Nekto_nikto

    Nekto_nikto Нерд

    Нет я ничего не путаю, он работает и по одному проводу, если замкнуть 4 ножку на GND и использовать для общения с ним файл DHT.h, но строго говоря это не совсем oneWire, но вопрос у меня в другом, как подружить DS18B20 c AM2320?
    вот пример использования по одному проводу
    https://dineradmin.wordpress.com/2016/05/26/arduino-sd18b20-am2320/
     
  2. a1000

    a1000 Гик

  3. a1000

    a1000 Гик

    В приведённой вами статье меня очень смущает
    Код (C++):
    //Подключение DS18B20
    //1 pin - GND
    //2 pin - Arduino Digital Pin 3
    //3 pin - +5V
    // 2 pin ----[100 Om]---- 3 pin
    //  ____
    // /_____\
    // |     |

    // |  DS |
    // |18B20|
    // |_____|
    //  | | |
    //  1 2 3
    //  | | |
    //2016-05-26
    а именно 2 pin ----[100 Om]---- 3 pin
     
  4. Nekto_nikto

    Nekto_nikto Нерд

    Я не против пусть пишут...
    Вы еще и даташит почитайте на датчик AM2320 на странице 21.
     
  5. a1000

    a1000 Гик

    Выскажу свое мнение. Не утверждаю, что оно на 100% правильно.
    Ну да, AM2320 может работать в режиме похожем на 1-Wire. Но это не совсем 1-Wire. Протокол тот-же что и в датчиках DHT.
    Как работает DHT. Контроллер выдаёт сигнал старта (прижимает шину к земле). Датчик сообщает о готовности и начинает сыпать на шину 40 бит информации.
    Как работает DS18B20. Контроллер так-же выдаёт сигнал старта (тут он называется сброс, но это не важно). Датчик сообщает о готовности и ждёт от контроллера команду. В этот момент AM2320, думая, что обратились к нему, начинает сыпать свою информацию. Для DS18B20 это ни разу не похоже на ожидаемые команды и он ничего не делает.
    На мой взгляд как-то так. Так, что посадить эти два датчика на одну шину не получится. AM2320 будет постоянно забивать DS18B20.
     
  6. Nekto_nikto

    Nekto_nikto Нерд

    Не соглашусь и вот почему:
    У DS18B20 в процедуре инициализации датчика пин на котором он висит инициализируется как INPUT, а у AM2320 этот пин инициализируется как INPUT_PULLUP и именно поэтому я и думаю, что забивать сигналами они друг друга не смогут, т.к. один не увидит сигналы адресованные другому и наоборот. А ситуация интерсна именно тем, что если просто повесить AM2320 параллельно DS18B20 и инициализировать ТОЛЬКО DS18B20, то он никак не реагирует.
     
  7. akl

    akl Гуру

    если этот пин и так подтянут к питанию внешним резистором, то внутренний INPUT_PULLUP ничего не изменит.
     
  8. a1000

    a1000 Гик

    Цифровой пин, в процессе работы с датчиками, переключается как на вход так и на выход. Так, что первоначальная инициализация не имеет значения. Ну это лирика теперь о конкретном.
    По вашей задумке шина должна быть одна. Как физически на ней формируются уровни? Единица формируется подтягивающим резистором между шиной и плюсом питания. Если микроконтроллер или датчик хотят сформировать ноль, то он должен замкнуть шину на землю. Ноль или единица формируется на всей шине и их видят все подключённые к ней устройства. Теперь к самой работе. Начало работы с обоими датчиками начинается с опускания шины микроконтроллером в ноль на 600 - 1000 мкс. И это видят оба датчика ибо они подключены к одной шине. Как вы хотите реализовать
    После прохождения стартового сигнала заведутся оба датчика. И проблема в том, что после старта AM2320 уже не остановить, а для DS18B20 по барабану кто дёргает шину. Он ждёт команду а получает муссор.
     
  9. Nekto_nikto

    Nekto_nikto Нерд

    Я бы с вами согласился, но как тогда объяснить то что если я просто инициализирую поочереди оба датчика и потом пытаюсь снять с них информацию, используя их родные библиотеки для этого, то в ответ получаю нули, а вот если я перед тем как обратиться к AM2320 инициализирую КАЖДЫЙ раз пин в INPUT_PULLUP, то он мне исправно выдает значения, а вот DS18B20, даже если я только его инициализирую выдает нули.
     
  10. a1000

    a1000 Гик

    Не совсем понял ваш пост. Для ясности выложите код.
     
  11. parovoZZ

    parovoZZ Гуру

    Насколько я помню, в OneWire логические уровни формируются длительностями импульсов на шине.
     
  12. akl

    akl Гуру

    а вся лишняя чпу-шная хрень в виде резисторов и конденсаторов с этого пина полностью удалена? может стоит попробовать все это на обычной какой-нибудь голой ардуине, а не на этих мозгах для чпу
     
  13. a1000

    a1000 Гик

    Смотрим пояснение

     
  14. Nekto_nikto

    Nekto_nikto Нерд

    a1000:
    AM2320 работает только если обновлять конфигурацию пинов так
    Код (C++):
    #include "pins.h"
    #include "DHT.h"
    #include <OneWire.h>      // Требуется ручная установка из менеджера библиотек

    String S="";              // Переменная передаваемая через COM порт
    byte data[2];             // Буфер, куда будут передаваться значения температур датчиков DS18B20 TANK_TEMP и ROOTS_TEMP
    byte data2[4];            // Буфер куда будут записываться значения температуры и влажности с сенсора AM2320, который находится на одном пине с датчиком температуры в зоне корней
    byte TANK_addr[8];        // 2 буфера, куда записываются адреса устройств, с которых будем считывать данные
    byte ROOTS_addr[8];    // Вполне возможно можно указать массив 2 на 8, а в коде укзывать адреса первых элементов addr[2][8]->&addr[0][0];&addr[1][0]
    float TANK_TEMP_=0;       // Значение температуры TANK_TEMP
    float ROOTS_TEMP_=0;      // Значение температуры ROOTS_TEMP
    float AM2320_TEMP;       // Значение температуры с датчика AM2320
    float AM2320_HUMIDITY;   // Значение влажности с датчика AM2320
    int16_t temp;             // Значение считанное с датчика
    int16_t *Pdata=(int16_t*)&data[0];      // Указатель на буфер

    long lastUpdateTime = 0;  // Переменная для хранения времени последнего считывания с датчика
    const int TEMP_UPDATE_TIME = 1000; // Определяем периодичность проверок

    DHT dht1(ROOTS_TEMP_HUMIDITY, DHT22);   // ставлю определение AM2320 датчика впереди, потому что сначала инициализация будет происходить на датчиках типа DS18B20
                                            // поэтому пин, на котором висит и AM2320 и DS18B20, должен быть сначала сконфигурирован для датчика DS18B20
    OneWire ds1(TANK_TEMP);
    OneWire ds2(ROOTS_TEMP_HUMIDITY);

    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600); // подключаем последовательный порт

    // Получаем адреса датчиков
    ds1.search(&TANK_addr[0]);      
    ds2.search(&ROOTS_addr[0]);
    ds1.reset_search();
    ds2.reset_search();
    delay(250);   // Необходимая пауза

    dht1.begin();


    }



    void GetSensors()
    {
    // Конфигурирую пин на котором висят разные датчики, под датчик DS18B20
    pinMode(ROOTS_TEMP_HUMIDITY, INPUT);

    ds1.reset();
    ds1.select(&TANK_addr[0]);
    ds1.write(0x44);            // Инициируем определение температуры датчиком
    ds2.reset();
    ds2.select(&ROOTS_addr[0]);
    ds2.write(0x44);            // Инициируем определение температуры датчиком
    delay(1000);

    ds1.reset();
    ds1.select(&TANK_addr[0]);
    ds1.write(0xBE);
    data[0] = ds1.read();
    data[1] = ds1.read();
    temp=*Pdata;
    TANK_TEMP_=(float)temp/16;

    ds2.reset();
    ds2.select(&ROOTS_addr[0]);
    ds2.write(0xBE);
    data[0] = ds2.read();
    data[1] = ds2.read();
    temp=*Pdata;
    ROOTS_TEMP_=(float)temp/16;

    // Конфигурирую пин на котором висят разные датчики, под датчик AM2320
    pinMode(ROOTS_TEMP_HUMIDITY, INPUT_PULLUP);
    delay(250);

    AM2320_HUMIDITY=dht1.readHumidity();
    AM2320_TEMP=dht1.readTemperature();
    }


    void loop() {
    // put your main code here, to run repeatedly:
    GetSensors(); // Получаем данные со всех датчиков

      S="TANK_TEMP="+(String)TANK_TEMP_;
      Serial.println(S);
      S="ROOTS_TEMP="+(String)ROOTS_TEMP_;
      Serial.println(S);
      S="   AM2320_TEMPERATURE="+(String)AM2320_TEMP;
      Serial.print(S);
      S="   AM2320_HUMIDITY="+(String)AM2320_HUMIDITY+"%";
      Serial.print(S);
      Serial.println("");

    }
    если пины не обновлять, то датчики ничего не показывают.

    akl:
    сборку резисторов я удалил, конденсаторы не стал искать, т.к. как я понял их местами как и резисторов нет.
    Но в принципе и голая arduino nano имеется.
     
  15. a1000

    a1000 Гик

    Как-то не совсем понятно.
    Сколько у вас датчиков DS18B20?
    Что это за библиотека pins.h?
     
  16. Nekto_nikto

    Nekto_nikto Нерд

    На пине с AM2320 всего один.
    Плюс еще один на другом пине.
    В pins.h просто обозначаются пины, так удобнее.
     
  17. a1000

    a1000 Гик

    Это целая библиотека что-бы дать пину символическое имя? Через define делается одной строчкой.
    Код (C++):
    #define ONE_WIRE_BUS 2
    и всё - пин 2 это ONE_WIRE_BUS. Может вам так удобно, не знаю.
    Хотелось увидеть ещё схему включения и вопрос - DS18B20, который на отдельном пине, работает нормально?
     
  18. Nekto_nikto

    Nekto_nikto Нерд

    Работает нормально, с AM2320 расхождение при 33% влажности порядка 0,4 градуса C.
    Схема включения стандартная все контакты подключены параллельно
    Код (C++):

    вилка на плате        VCC  GND  SIGNAL
    AM2320                VCC  GND  SIGNAL
    DS18B20               VCC  GND  SIGNAL
     
  19. asam

    asam Гик

    Код (C++):
    header_file != library
     
  20. a1000

    a1000 Гик

    Нарисовать можете? Не обязательно в электронном виде. Просто карандашом на бумаге и выложите фото.