onewire вывести адрес, для дальнейшего для "прямой" индексации

eldev
Offline
Зарегистрирован: 14.05.2012

дано: датчики температуры, ds18b20, arduino

написал следующий скетч:

#include <DallasTemperature.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 10 //указываем порт на котором у нас висят датчики температуры

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

int incomingByte = 0;   // для входящей информации изначально устанавливаем 0
int i = 0;
long previousMillis = 0;        // храним время последнего переключения светодиода
long interval = 500;           // интервал между запросами информации с датчиков (0.5 минут)
// интервал подбирается в зависимости от применения датчиков. Если планируется просто мониторить уличную температуру, то, думаю не имеет смысла ставить интервал меньше 5 минут
// вопрос с интервалом запросов приведен для ускорения вывода информации в порт

void setup() {
        Serial.begin(9600);     // открываем порт и выставляем скорость обмена 9600 bps
        sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement
        sensors.setResolution(TEMP_12_BIT); //устанавливаем разрешение 12 бит
        sensors.setWaitForConversion(true);
        
}

void loop() {
        // посылаем запрос только после появления информации на порту
        if (Serial.available() > 0) {
                // read the incoming byte:
                unsigned long currentMillis = millis(); 
                if(currentMillis - previousMillis > interval) { //если время от последнего запроса превышает интервал то выполняем следующий запрос
                  previousMillis = currentMillis; //сохраняем время последнего запроса
                  sensors.requestTemperatures(); // посылаем комманду запроса температуры
                }
                incomingByte = Serial.read(); //читаем данные порта 
                if (incomingByte > 48){ //На случай проверки в терминалах нужно уменьшать на 48, тк дальнейший скрипт принимает только 1 или 2, а с терминала приходит ascii последовательность
                  incomingByte = incomingByte - 48;
                }
                //Serial.flush(); //опустошаем порт //не знаю, насколько это нужно...
                if (incomingByte >= 1 && incomingByte <= sensors.getDeviceCount()) { //проверяем входящие данные на соответствие количеству сенсоров
                
                while (sensors.getTempCByIndex(incomingByte-1) == 85.00 || sensors.getTempCByIndex(incomingByte-1) == 0.00 || sensors.getTempCByIndex(incomingByte-1) == -127.00 && i <= 100) { //выполняем проверку на корректность данных по запросу 
                //и если проверка проходит успешно (т.е. имеются ошибки), то повторяем запрос к датчикам
                    sensors.requestTemperatures(); // посылаем комманду запроса температуры
                    previousMillis = currentMillis;//сохраняем время последнего запроса
                    sensors.getTempCByIndex(incomingByte-1); //получаем значение температуры
                    i++;
                }   
                  i = 0; // на случай если выполнялся счетчик
                  Serial.println(sensors.getTempCByIndex(incomingByte-1)); // запрос по индексу осуществляется для того чтобы иметь возможность подключать более одного датчика на шину
                  //Serial.flush(); //опустошаем порт //не знаю, насколько это нужно...
                } else {
                  Serial.println(incomingByte); // печатаем ошибку если введеное число не сообтветсвует количеству датчиков
                }
                
        }
}

теперь встал вопрос в том, что при смене количества датчиков, подключенных к шине они автоматически пересортируются 

никак не могу понять, как выводить адреса данных датчиков...

eldev
Offline
Зарегистрирован: 14.05.2012

 опечатка, не 0,5 минут, а 0,5 секунд. (изначально интервал стоял на 5 минут те 300000ms)

leshak
Offline
Зарегистрирован: 29.09.2011

 А примеры идущие с библиотекой  DallasTemperatureControl смотрели? Пример "Multiple"?

Да и у библиотеки oneWire пример "DS18x20_Temperature" имеется.

EvgenKir
Offline
Зарегистрирован: 17.09.2013

Здравствуйте. Использовал ваш код. но на выходе у меня в мониторе порта ничего нету.

 

Поменял порт, на котором у меня висят 4 датчика.

vityukalex
vityukalex аватар
Offline
Зарегистрирован: 17.10.2013

Я когда-то подключал эти датчики к FreeBSD, могу сказать, что пересортировуются они потому что у них у каждого свой индивидуальный номер, например:

28.0D5BE4030000
28.BE4AE4030000
28.F02AE4030000

Looka
Offline
Зарегистрирован: 24.04.2012

Вариантов может быть множество.  В зависимости от Вашей задачи и фантазии. 

Можно использовать ЕЕPROM для хранения адресов. 
В нормальном режиме работы адреса считываются из памяти, прога знает адрес каждого конкретного датчика.
Это снимает проблему когда в процессе работы глюкнет или отвалится один из датчиков. 

Для записи адресов можно использовать режим инициализации, скажем нажать кнопку при включении МК  - софтинка считает все что подключено и запишет в EEPROM.    

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

 

com
Offline
Зарегистрирован: 06.09.2013

можно посоветовать заранее выяснить у каждого датчика его номер, в примерах это подробно расписано, а потом обращаться к каждому датчику по его уникальному номеру. это позволит не привязываться к индексу sensors[i], который может измениться при изменении топологии сети.