Поиск сообщества
Показаны результаты для тегов '1-wire'.
Найдено: 3 результата
-
Продолжая свой полет, неожиданно сделал давно задуманную, да почему-то постоянно откладываемую на потом, штуку... А именно: параллельный опрос нескольких термодатчиков семейства DS18x20. Дело в том, что у этих датчиков в качестве плюса технологии позиционируется обращение по уникальному адресу, что позволяет повесить на 2 провода хоть сотню датчиков и с каждым работать индивидуально. Плюс-то это плюс, да, как любой плюс, состоит из двух минусов (один вдоль, другой поперек). Последовательный опрос несколких датчиков, хоть по адресу хоть без увеличивет общее время опроса пропорционально количеству датчиков. В частности, в моих личных играх опрос 8 датчиков последовательно затягивался почти на 100 мс. С учетом того, что примерно половина этого времени будет требовать запрета прерываний (кусочками по 65 мкс примерно), такая длительность выглядит не очень хорошо. Кроме того, при "адресной" работе даже с тремя датчиками возникает проблема иного рода, так сказать, верхнеуровневая. Устройство должно как-то опознавать назначение каждого датчика по его адресу - этот измеряет температуру на улице, этот - в помещении, а этот - воду в системе отопления. И как вы себе представляете процесс присваивания "назначений" адресам этих датчиков? Сами по себе датчики никакой маркировки о собственном номере не имеют, т.е. на глаз их отличить невозможно. И получается геморрой. А когда датчиков восемь - геморроев на 1 человека получается слишком много... Нет, если вы делаете для себя, то вы, конечно, можете адреса этих датчиков и вручную прописать в программу, и красочкой их пометить... А если это "на сторону" устройство? А если датчик в процессе эксплуатации выйдет из строя и потребует замены? Вот зачем пользователю все эти проблемы с сопоставлением адреса датчика и функцией устройства? С моей точки зрения - оно ему не нужно. Альтернатива - повесить на один порт один датчик, а портов задействовать столько, сколько надо. Минус, конечно, есть, и не маленький - расход пинов микроконтроллера. Зато плюсов существенно больше. Во-первых, нет гемора с адресацией: любой датчик используется в режиме SKIP_ROM, потому как он единственный на своей линии. Достаточно к линии порта, ответственной за температуру на улице, подключить уличный датчик, и "соответствие" автоматически обеспечено. Во-вторых, считывать информацию с датчиков, подключенных к одному порту, можно одновременно, т.е. по сравнению с "последовательным опросом" многократно быстрее! Идея проста, как колумбово яйцо (правое): управляя не отдельным битом порта, а сразу всеми битами, формируются тайм-слоты чтения (при записи тоже ничто не препятствует, но это менее интересно, т.к. одновременная запись в "обычную" цепочку 1-wire датчиков возможна и так), и считывание битов из 8 линий происходит одновременно. Т.е. вместо 72 битов из одного датчика мы получаем 8х72 бита из 8-и датчиков. Накопив в отдельный массив эти 72 байта за время опроса ОДНОГО датчика, мы затем можем пройтись по этому массиву и выделить информацию каждого из восьми... Ну понятно же, что в 0-ом бите всех байтов массива будут биты из датчика с линии 0, в 1-ом бите - из датчика с линии 1 и т.д. Поскольку обработка массива может вестись на предельной частоте микроконтроллера, длиться она будет крайне незначительное время, не смотря на кажущуюся громоздскость. В частности, в своих играх я получаю информацию с 8-и параллельно подключенных к одному порту датчиков за 12 мс (примерно) - ощутите разницу! Ровно (на самом деле нет) в 8 раз быстрее, чем традиционным способом. Так что если интересуетесь многодатчиковыми системами контроля температуры - рекомендую.
-
Два и больше DHT22 на одном сигнальном проводе
Tuxford опубликовал тема в Схемотехника для начинающих
В теории 1-wire позволяет подлючать несколько успройств по одному проводу. Но идентифицировать DHT22 никак нельзя. Получается на один провод нельзя? Если мне нужно 10 таких датчиков, то нужно немеренно кабелей, да и количество gpio на Raspberry Pi 3 не так уж много, даже если ставить екстендер. Какие еще дешевые решения для подклбчения 10-20 устройств работающих по 1-wire? PS. в таких длеах новичок, поэтому сильно не ругайте. -
Всем здравствуйте. Захотелось считать,в целях саморазвития, информацию с чипа DS2430A и заодно освоить способ связи по однопроводной шине. Посмотрел даташит, много гуглил, вроде более менее понял.С чипом можно связаться по интерфейсу 1-wire. И я решил попробовать это провернуть с помощью ардуины. Написал скетч. Пока получается только считать сигнал присутствия ведомого на шине,а считать из памяти ничего не получается,выдаются одни единицы.Пробовал менять РОМ команды,начинать со старшего бита,младшего,всё равно ничего не получается .Нужна хэлпа, подскажите пожалуйста, где мог допустить ошибку в скетче. И еще если можно мб какую нибудь литературу. /*Подключить пин Мастера надо через полевой транзистор, чтобы отпускать линию было проще для прерывания будет использоваться пин №2 на плате(0 по обозначению) Подключаемся к DS2430A*/ unsigned long save;//переменная для хранения времени byte pinMas = 5;//пин мастера volatile byte pinRead = 6;// пин для чтения линии volatile boolean infa = 1;//пин для хранения состояния линии byte adr[256] = {};//массив для хранения данных int i; /***********************************************************/ void reader() //для записи состояния линии { infa = digitalRead (pinRead);// считвываем состояние линии } /***********************************************************/ void pulseReset() { delayMicroseconds(480);//заряжаем линию, ждём 500 мкс /*___________________________________________________________________*/ digitalWrite(pinMas, 0); //подаем 0, открываем полевик=опускаем линию на ноль delayMicroseconds(480);//ждём 480 мкр digitalWrite (pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию infa = 1;//чтобы в значение линии не сохранился ноль, когда линию дёргает ведущий delayMicroseconds (15);//ждём переходный процесс 15 мкр /*___________________________________________________________________*/ save = micros(); while (micros() - save < 240) {};//Здесь должно сработать прерывание и сохранение значения переменной Serial.print("Presence = ");//выводим состояние линии, если ведомый опустит линию, то Serial.println(infa); //в infa запишется ноль } void comWr0()//передача нуля { digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль delayMicroseconds(80);//ждём 80 мкc digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию delayMicroseconds(20);//ждём переходный процесс 15 мкр } void comWr1()//передача единицы { digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль на 2 мкс delayMicroseconds(3);//ждём 3 мкc digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию delayMicroseconds(90);//ждём переходный процесс 90 мкc } int comRead() { digitalWrite(pinMas, 0); //подаем 0, открываем полевик=>опускаем линию на ноль на 2 мкс delayMicroseconds(2);//ждём 2 мкc digitalWrite(pinMas, 1);//подаём 1, закрываем полевик,отпускаем линию delayMicroseconds(15); infa = digitalRead(pinRead);//читаем линию return infa;//возвращаем значение переменной infa delayMicroseconds(48);//ждём переходный процесс 48 мкc } void setup() { Serial.begin(9600); attachInterrupt(0, reader, FALLING); pinMode(pinMas, OUTPUT); pinMode (pinRead, INPUT); pulseReset(); /*******************************/ //comWr1(); comWr1(); comWr0(); comWr0(); comWr1(); comWr1(); comWr0(); comWr0(); comWr0(); comWr0(); comWr1(); comWr1(); comWr0(); comWr0(); comWr1(); comWr1();//SKIP ROM CCh с младшего бита /*******************************/ comWr0(); comWr0(); comWr0(); comWr0(); comWr1(); comWr1(); comWr1(); comWr1(); //comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); //comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); comWr1(); comWr0(); //поcылаем AAh с младшего бита /*******************************/ comWr0(); comWr0(); comWr0(); comWr0(); comWr0(); comWr0(); comWr0(); comWr0(); //посылаем адрес for ( i = 0; i < 256; i++) //записываем значение состояний линии в массив { comRead(); adr[i] = comRead(); /* Serial.print("Bit"); Serial.print(i); Serial.print(" = "); Serial.println(adr[i]);*/ } for (i = 0; i < 256; i++) { Serial.print("Bit"); Serial.print(i); Serial.print(" = "); Serial.println(adr[i]); } } void loop() { }