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], который может измениться при изменении топологии сети.