onewire вывести адрес, для дальнейшего для "прямой" индексации
- Войдите на сайт для отправки комментариев
Пт, 08/06/2012 - 13:44
дано: датчики температуры, 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); // печатаем ошибку если введеное число не сообтветсвует количеству датчиков
}
}
}
теперь встал вопрос в том, что при смене количества датчиков, подключенных к шине они автоматически пересортируются
никак не могу понять, как выводить адреса данных датчиков...
опечатка, не 0,5 минут, а 0,5 секунд. (изначально интервал стоял на 5 минут те 300000ms)
А примеры идущие с библиотекой DallasTemperatureControl смотрели? Пример "Multiple"?
Да и у библиотеки oneWire пример "DS18x20_Temperature" имеется.
Здравствуйте. Использовал ваш код. но на выходе у меня в мониторе порта ничего нету.
Поменял порт, на котором у меня висят 4 датчика.
Я когда-то подключал эти датчики к FreeBSD, могу сказать, что пересортировуются они потому что у них у каждого свой индивидуальный номер, например:
28.0D5BE4030000
28.BE4AE4030000
28.F02AE4030000
Вариантов может быть множество. В зависимости от Вашей задачи и фантазии.
Можно использовать ЕЕPROM для хранения адресов.
В нормальном режиме работы адреса считываются из памяти, прога знает адрес каждого конкретного датчика.
Это снимает проблему когда в процессе работы глюкнет или отвалится один из датчиков.
Для записи адресов можно использовать режим инициализации, скажем нажать кнопку при включении МК - софтинка считает все что подключено и запишет в EEPROM.
И так далее, можно добавлять режим перестановки датчиков в памяти, дабы привязать конкретный датчик к конкретному месту.
можно посоветовать заранее выяснить у каждого датчика его номер, в примерах это подробно расписано, а потом обращаться к каждому датчику по его уникальному номеру. это позволит не привязываться к индексу sensors[i], который может измениться при изменении топологии сети.