Делаешь: while ( ds.search(addr) ), сравниваешь считанный и записанный адрес побайтово, если байт не равен, возвращаем байт с номером признака датчика - 9й. Номер признака присваешь сам - адрес+байт признака. Массив с адресами должен быть отсортирован по возрастанию. На выходе из цикла не забывать команду ds.reset_search();
вот это и не понятно было - ds.search(addr) addr перебирается от 0 до хххххх ?
интересно - перебор всех адресов без ответа - сколько долго длится ?
Неверно выразился. Она только живые перебирает.
как это ?!!!!!!!!!!!!!!!!! буду нудеть....
как она узнает кто жив , кто нет ? не опросив каждого ?
пока нагрузили помощъю выше осознаваемого....
Спасибо , пока для поездки в "деревню" ( очень далеко ) - хватит...
Ребята, на пальцах - привязаться к пинам можно а не к адресу датчика? Пинов дофига, хотелось бы при замене датчика не лазить обратно в прошивку. А на экране точно видеть где улица а где дом.
DS18B20 только начал осваивать материал, паял поделки на AVR и PIC там как то не заморачивался над адресом датчика. Здесь начал читать - а лес все темнее... Не смог найти темы пока для двух датчиков на разных пинах, или нашел но не смог понять что это именно та тема которая мне нужна)))
p.s Имел ввиду не то что бы к пинам, понимаю что по адресу надо. ммм как бы обьяснить... есть два провода, один в доме один на улице- меняю датчики свободно на них, показания на экране все равно правильные. Тоисть провода главнее а не адреса. как-то так.
Ребята, на пальцах - привязаться к пинам можно а не к адресу датчика? Пинов дофига, хотелось бы при замене датчика не лазить обратно в прошивку. А на экране точно видеть где улица а где дом.
Протокол обмена 1-wire, по которому связываются DS18B20, работает с адресами. Без них - не работает.
То есть, Вам, при замене термометра, в любом случае эти адреса надо как-то сообщить прошивке. Либо каждый раз лезть в код, либо записывать эти адреса в eeprom при прошивке, и потом менять точно так же... Вариантов - масса, но все они предполагают некие дополнительные телодвижения при смене уникального номера термометра.
Ребята, на пальцах - привязаться к пинам можно а не к адресу датчика? Пинов дофига, хотелось бы при замене датчика не лазить обратно в прошивку. А на экране точно видеть где улица а где дом.
Протокол обмена 1-wire, по которому связываются DS18B20, работает с адресами. Без них - не работает.
То есть, Вам, при замене термометра, в любом случае эти адреса надо как-то сообщить прошивке. Либо каждый раз лезть в код, либо записывать эти адреса в eeprom при прошивке, и потом менять точно так же... Вариантов - масса, но все они предполагают некие дополнительные телодвижения при смене уникального номера термометра.
хорошо, а если с автоопредилением но на разных пинах?
Неужели такой затык с шиной?
Подождите, если на шине один датчик, то адрес а) можно не использовать б) всегда можно спросить его адрес и он один ответит. Потому если на разных пинах, на каждом своя шина и на ней только один датчик, то адреса не нужны. Но это явно не интересный вариант. А вобще привязка новых датчиков и перетасовка старых довольно скользкий вопрос. Допустим были датчики с адресами Д1 и Д2 в доме и саду. В какойто момент их заменили на Д3 и Д4. Или еще веселей, поменяли местами. Как системе узнать какой из датчиков в саду? Очевидно никак. В последнем своем подходе к задаче делал табличку соответствия адрес-роль-название в ЕЕПРОМ, и удаленно её редактировал. Новые датчики автоматом прописываются в неё как "Неизвестный" с порядковым номером. Потом можна отредактировать и указать роль и название датчика. Вроде и не плохо, но чувства глубокого удовлетворения нет.
В последнем своем подходе к задаче делал табличку соответствия адрес-роль-название в ЕЕПРОМ, и удаленно её редактировал. Новые датчики автоматом прописываются в неё как "Неизвестный" с порядковым номером. Потом можна отредактировать и указать роль и название датчика. Вроде и не плохо, но чувства глубокого удовлетворения нет.
Иначе наверно никак. Адрес + идентификатор. Я немного иначе делал. Если обнаружился новый номер или исчез какой то из запомненных, заставляет последовательно нагреть все доступные датчики (это нормально на небольшой площади и проблему замены местами тоже не решает).
У меня они на паяном шлейфе, соответственно замена только с паяльником. Уже не перепутаешь.
А проблемы по частой замене датчиков, ИМХО надуманные.
Подождите, если на шине один датчик, то адрес а) можно не использовать б) всегда можно спросить его адрес и он один ответит. Потому если на разных пинах, на каждом своя шина и на ней только один датчик, то адреса не нужны. Но это явно не интересный вариант.
Как раз интересный вариант! Вот бы тему найти об этом)
А насчёт перетасовки- уж очень кажется что удаленная правка епром действительно самый удачный вариант.
Подождите, если на шине один датчик, то адрес а) можно не использовать б) всегда можно спросить его адрес и он один ответит. Потому если на разных пинах, на каждом своя шина и на ней только один датчик, то адреса не нужны. Но это явно не интересный вариант.
Как раз интересный вариант! Вот бы тему найти об этом) А насчёт перетасовки- уж очень кажется что удаленная правка епром действительно самый удачный вариант.
Тема где то и на этом форуме была, поищите. Смысл использования дорогого адресного датчика на отдельных шинах? Его ведь изначально затевали для организации гирлянд.
Подождите, если на шине один датчик, то адрес а) можно не использовать б) всегда можно спросить его адрес и он один ответит. Потому если на разных пинах, на каждом своя шина и на ней только один датчик, то адреса не нужны. Но это явно не интересный вариант.
Как раз интересный вариант! Вот бы тему найти об этом) А насчёт перетасовки- уж очень кажется что удаленная правка епром действительно самый удачный вариант.
Тема где то и на этом форуме была, поищите. Смысл использования дорогого адресного датчика на отдельных шинах? Его ведь изначально затевали для организации гирлянд.
в wire
во первых к устройству можно обращатся не только по адресу, но и по порядковому номеру, по этому если датчик вего 1 - вполне можно не хранить его адрес...
во вторых там есть возможность получить список всех адресов которые висят на шине...
во первых к устройству можно обращатся не только по адресу, но и по порядковому номеру, по этому если датчик вего 1 - вполне можно не хранить его адрес...
Обращаемся все равно по адресу, для единственного датчика используем команду READ ROM [33h], не прибегая к сканированию адресов.
Если я не прав, то хотелось бы кусочек кода не использующий адрес.
// sends command for one device to perform a temp conversion by index
bool DallasTemperature::requestTemperaturesByIndex(uint8_t deviceIndex)
{
DeviceAddress deviceAddress;
getAddress(deviceAddress, deviceIndex);
return requestTemperaturesByAddress(deviceAddress);
}
Каюсь, похоже обманул. Вроде как можно сделать Skip ROM [CCh], а затем сразу чтение памяти [BEh]. Попробую на досуге.
Дискутировать полезно, частенько узнаешь новое.))))
попробуй. на 5 датчиков. код выглядит громоздко, но работать вроде должно (написать можно вроде с помощью структур, но я не умею). каждый датчик на свой пин (в начале указал какие), адрес не важен поэтому можно менять просто датчик
#include <OneWire.h>
// пины для датчиков
#define dallas_1 3
#define dallas_2 4
#define dallas_3 5
#define dallas_4 6
#define dallas_5 7
OneWire ds_1 (dallas_1);
OneWire ds_2 (dallas_2);
OneWire ds_3 (dallas_3);
OneWire ds_4 (dallas_4);
OneWire ds_5 (dallas_5);
unsigned long time=0;
boolean flag=0; // для измерения
byte data[12];
float temp_1, temp_2, temp_3, temp_4, temp_5;
int raw;
void setup() {
Serial.begin (9600);
izm_temp();
}
void loop(){
izm_temp(); // измеряем температуру
if(!flag){
Serial.print (F("Temp_1 " ));
Serial.print (temp_1);
Serial.print (F(" Temp_2 "));
Serial.print (temp_2);
Serial.print (F(" Temp_3 "));
Serial.print (temp_3);
Serial.print (F(" Temp_4 "));
Serial.print (temp_4);
Serial.print (F(" Temp_5 "));
Serial.println (temp_5);
Serial.flush(); //очищаем значения порта
}
}
void izm_temp(){
if(!flag){
start_izm();
time=millis();
flag=1;
}
if(flag && (millis()-time)>750){
calc_izm();
flag=0;
}
}
void start_izm(){
//запускаем измерение всех датчиков
ds_1.reset();
ds_1.write(0xCC);
ds_1.write(0x44);
ds_2.reset();
ds_2.write(0xCC);
ds_2.write(0x44);
ds_3.reset();
ds_3.write(0xCC);
ds_3.write(0x44);
ds_4.reset();
ds_4.write(0xCC);
ds_4.write(0x44);
ds_5.reset();
ds_5.write(0xCC);
ds_5.write(0x44);
}
void calc_izm(){
// Считываем и пересчитываем 1 датчик
ds_1.reset();
ds_1.write(0xCC);
ds_1.write(0xBE); // Read Scratchpad
for (byte i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds_1.read ();
}
raw = (data[1] << 8) | data[0];//=======Пересчитываем в температуру
temp_1 = (float)raw / 16.0;
// Считываем и пересчитываем 2 датчик
ds_2.reset();
ds_2.write(0xCC);
ds_2.write(0xBE); // Read Scratchpad
for (byte i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds_2.read ();
}
raw = (data[1] << 8) | data[0];//=======Пересчитываем в температуру
temp_2 = (float)raw / 16.0;
// Считываем и пересчитываем 3 датчик
ds_3.reset();
ds_3.write(0xCC);
ds_3.write(0xBE); // Read Scratchpad
for (byte i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds_3.read ();
}
raw = (data[1] << 8) | data[0];//=======Пересчитываем в температуру
temp_3 = (float)raw / 16.0;
// Считываем и пересчитываем 4 датчик
ds_4.reset();
ds_4.write(0xCC);
ds_4.write(0xBE); // Read Scratchpad
for (byte i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds_4.read ();
}
raw = (data[1] << 8) | data[0];//=======Пересчитываем в температуру
temp_4 = (float)raw / 16.0;
// Считываем и пересчитываем 5 датчик
ds_5.reset();
ds_5.write(0xCC);
ds_5.write(0xBE); // Read Scratchpad
for (byte i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds_5.read ();
}
raw = (data[1] << 8) | data[0];//=======Пересчитываем в температуру
temp_5 = (float)raw / 16.0;
}
Меня оно чисто в академическом плане заинтересовало. Как их использовать, это дело ТС.
Но платить за возможность беспроблемной замены (будет ли нужна) кратным количеству датчиков увеличением аппаратных и программных средств, имхо, излишество.
ещё как требуется!
первым делом- сделал устройство и забыл, сделал кому-то. да много чего бывает! Зря вы так! Спасибо за последний код!, думаю оно самое то!
p.s Каждый видит со своей колокольни для вас излишество использовать пины, для меня полное непонимание! у меня пинов тьма (2560) мне вообще не в напряг задействовать ещё 10 или 20 штук. А замена в приоритете потому что за год вот, сменил три датчика. но на pic я даже и не задумывался два провода, два показания. )))
Каюсь, похоже обманул. Вроде как можно сделать Skip ROM [CCh], а затем сразу чтение памяти [BEh]. Попробую на досуге.
Дискутировать полезно, частенько узнаешь новое.))))
Можна, можна..
SKIP ROM [CCh]
The master can use this command to address all devices on the bus simultaneously without sending out any ROM code information. For example, the master can make all DS18B20s on the bus perform simultaneous temperature conversions by issuing a Skip ROM command followed by a Convert T [44h] command.
Note that the Read Scratchpad [BEh] command can follow the Skip ROM command only if there is a single slave device on the bus. In this case, time is saved by allowing the master to read from the slave without sending the device’s 64-bit ROM code. A Skip ROM command followed by a Read Scratchpad command will cause a data collision on the bus if there is more than one slave since multiple devices will attempt to transmit data simultaneously.
Ребят, все проще маслянный котел на выходе стоит Даллас, как говорится про...б.ал насос включить после розжига- 10 минут и труп готов))
Вот и мастырю сейчас автоматику для всего этого ( но даже сильнее в целях обучения) приятное с полезным.
Ребят, все проще маслянный котел на выходе стоит Даллас, как говорится про...б.ал насос включить после розжига- 10 минут и труп готов)) Вот и мастырю сейчас автоматику для всего этого ( но даже сильнее в целях обучения) приятное с полезным.
Делайте сразу медную гильзу с небольшим (10см) выносом датчика в сторону: в результате температуру будет показывать ниже (решается калибровкой), но и датчик не перегреется...
Аварийную автоматику надо делать на биметаллических реле типа KSD9700. NO или NC - в зависимости от логики... Ну и надо помнить, что у них температура срабатывания может быть плюс-минус 10-15 градусов.
ты кажется не понял что хочет человек, он хочет горячую замену датчиков без прописывания адресов
Я - тоже хочу... :)
Просто не допилил механизм привязки индекса к конктерному расположению датчика. В сетапе - запускается поиск устройств и адресами заполняется массив...
да такое можно было бы сделать, но тогда ты точно не знаешь где какой, только нагревом например по отдельности можно определить где какой и настроить в менюшке например что к чему относится, я предлагаю по пину на датчик, но не знаю точно ли так будет работать
Знатаки!) Подскажите! Я хочу подключить датчиками температуры Ds18b20 к Arduino! http://proumnyjdom.ru/kontrollery/ds18b20-podklyuchenie-k-arduino.html Если еще добавить дисплей это будет здорово! Только как это все лучше срастить? И не пойму почему у меня сейчас сам датчик температуру не точно показывает( погрешность в 2 градуса это норм?
а я слышал что изза того что постоянно опрашивают без реальной необходимости. и если просто температура измеряется в комнате, не нужно каждую секунду измерять
круто ! копирую , спасибо !
Эт я идею из dimax кода содрал))).
Делаешь: while ( ds.search(addr) ), сравниваешь считанный и записанный адрес побайтово, если байт не равен, возвращаем байт с номером признака датчика - 9й. Номер признака присваешь сам - адрес+байт признака. Массив с адресами должен быть отсортирован по возрастанию. На выходе из цикла не забывать команду ds.reset_search();
вот это и не понятно было - ds.search(addr) addr перебирается от 0 до хххххх ?
Если память не очень лимитирована, на наброски автоопределения. Может уменьшишь))))
#include <OneWire.h> #include <EEPROM.h> #include <avr/wdt.h> OneWire ds(10); // on pin 10 (a 4.7K resistor is necessary) byte flag[2]; // Флаги для обслуживания датчиков Даллас byte addr[9]; int Temp [5][2]; // Массив переменных температуры const byte led=13; //Пин световой индикации const byte alarm=9; // Пин звуковой индикации void setup(void) { wdt_disable(); //Отключить собаку delay(2000); wdt_enable(WDTO_2S); // Взвести собаку на 2 секунды pinMode(led, OUTPUT); pinMode(alarm, OUTPUT); digitalWrite(led, HIGH); digitalWrite(alarm, LOW); Serial.begin(9600); colDall(); obnColDall(); addrDall(); svAddrDall(); addrDall(); prinDall(); } //***Проверка количества датчиков Даллас****** void colDall(){ Serial.println("Vhod colDall"); while ( ds.search(addr) ){ //Цикл перебора адресов датчиков flag[0]++; //Увеличение переменной числа датчиков ledBlink(1000); } if (flag[0] > 5) { //Условие превышения максимального количества //Если мало, увеличить размерность массива Serial.println("Mnogo datchikov"); //Здесь сообщение и обработка ошибки delay (5000); //Задержка для перезагрузки } } //***---------------------------------------------------------------------------------- //***Функция обновления количества датчиков Даллас***** void obnColDall() { if (flag[0] != EEPROM.read(1023)){ //Количество датчиков не соответствует запомненному Serial.println("Rabota obnColDall"); if (EEPROM.read(1023) == 255 || EEPROM.read(1023) == 0){ //если количество датчиков не указано EEPROM.write( 1023, flag[0]); //Записать количество датчиков flag[0] = 0; //Сбросить флаг flag[1] = 1; //Установить флаг. ledBlink(1000); } else { int i; for (i = 1022; i > (1022-(EEPROM.read(1023)*9)); i--){ //Перебор ячеек для адресов датчиков EEPROM.write(i, 255); //Очистка ячейки flag[1] = 1; //Установить флаг ledBlink(1000); } EEPROM.write(1023, flag[0]); //Записать новое количество датчиков flag[1] = 1; //Установить флаг flag[0] = 0; //Сбросить флаг } } } //-------------------------------------------------- //****Функция обновления адресов датчиков Даллас*** void addrDall(){ Serial.println("Vhod addrDall"); byte i; addr[8]=0; //Очистка байта признака датчика if (flag[0] == 0){ //Проверка флага Serial.println("Rabota Pishem adresa"); while ( ds.search(addr) ){ //Цикл считывания адресов датчиков for ( i = 0; i < 9; i++ ){ //Перебор байтов адреса EEPROM.write(1022-flag[0]*9-i, addr[i]); //Запись байта считанного адреса ledBlink(1000); } flag[0]++; //Увеличить переменную количества датчиков } flag[1] = 1; //Установить флаг } } //-------------------------------------------------- //***Функция сверки адресов датчиков Даллас**** void svAddrDall(){ Serial.println("Vhod svAddrDall"); byte i; flag[0]=0; //Сбросить флаг while ( ds.search(addr) ){ //Цикл считывания адреса датчика for (i = 0; i < 8; i++) { ledBlink(1000); if (addr[i] != EEPROM.read(1022-flag[0]*9-i)){ //Если считанный байт не равен записанному Serial.println("Adres ne raven"); flag[0] = 0; //Сбросить флаг. ds.reset_search(); //Обнулить счетчик адресов return; //Выход } } flag[0]++; //Увеличить переменную количества адресов } } //--------------------------------------------------- //***Функция принадлежности Даллас***** void prinDall() { Serial.print("Vhod prinDall"); Serial.print(" "); Serial.println(flag[1],DEC); byte i = 0; if (EEPROM.read(1014) == 0 || EEPROM.read(1014) == 255) { //Проверка записей принадлежности if (flag[1] == 1) { Serial.println("Perezagruzka");//Здесь сообщение о перезагрузке delay(2500); } int prinTemp[5][2]; // Временный массив температур for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) { adresDall(flag[0]); //Считать адрес Далласа razrDall(0x00); //Изменить на 9 бит разрешение } dallRead(100);//Конвертация температур delay(110); dallRead(100);//Считывание температур ledBlink(1000);//Мигнуть и пнуть собаку for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) { prinTemp[flag[0]][0] = Temp[flag[0]][0]; //Присвоение временной температуры prinTemp[flag[0]][1] = 0; //Очистка признака } flag[1] = 0; //Обнуляем, для устранения влияния //от использования в функции чтения температуры while (flag[1] == 0) { //Цикл проверки датчиков ledBlink(1000); Serial.print("Dat "); //Здесь функция отображения номера датчика Serial.println(i+1,DEC); dallRead(100); for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++){ //Перебор массива температур if (prinTemp[flag[0]][1] == 0) { //Проверка на признак принадлежности датчика if(Temp[flag[0]][0] - prinTemp[flag[0]][0] > 299) { //Проверка факта нагрева датчика prinTemp[flag[0]][1] = i+1; //Присвоение значения признака i++; //Увеличиваем значение признака } } } flag[1] = 1; //Установка флага окончания цикла проверки for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) { if (prinTemp[flag[0]][1] == 0){ //Если есть датчики без признака flag[1] = 0; //Флаг окончания цикла сбросить } } if (i == (EEPROM.read(1023)-1)) { //Остался один датчик без признака for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) { if (prinTemp[flag[0]][1] == 0) { //Определяем датчик без признака prinTemp[flag[0]][1] = i+1; //Записываем признак } } } } for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++) { //Перебор количества датчиков EEPROM.write((1023-flag[0]*9-9), prinTemp[flag[0]][1]); //Запись байта признака Temp[flag[0]][0] = prinTemp[flag[0]][0]; //Присвоение значения температуры Temp[flag[0]][1] = prinTemp[flag[0]][1]; //Присвоение значения признака adresDall(flag[0]); //Считать адрес Далласа razrDall(0x60); //Изменить на 12 бит разрешение } } } //-------------------------------------------------- //****Функция считывания адреса Далласа***** void adresDall(byte number){ byte i; for ( i = 0; i < 8; i++ ){ //Перебор номеров байтов адреса addr[i] = EEPROM.read(1022-number*9-i); //Считываем записанный байт в переменную адреса датчика ledBlink(1000); } } //------------------------------------------------- //***Функция изменения разрядности Даллас**** void razrDall(byte raz) { ds.reset(); ds.select(addr); ds.write(0x4E); ds.write(0x7F); ds.write(0xFF); ds.write(raz); ds.write(0x48); } //------------------------------------------------ //******Функция инд.свтодиодом************* void ledBlink(unsigned long interval) { static unsigned long prevTime = 0; if (millis()-prevTime > interval) //Проверка условия { prevTime = millis(); wdt_reset(); //Очистка собаки digitalWrite(led,!digitalRead(led)); //Инверсия значения } } //------------------------------------------------- //***Функция считывания температуры c Далласов***** void dallRead(unsigned long interval){ static unsigned long prevTime = 0; if (millis() - prevTime > interval) { //Проверка заданного интервала static boolean flagDall = 0; //Признак операции prevTime = millis(); flagDall =! flagDall; //Инверсия признака if (flagDall) { ds.reset(); ds.write(0xCC); //Обращение ко всем датчикам ds.write(0x44); //Команда на конвертацию flag[1] = 1; //Время возврата в секундах } else { byte i; int temp; for (flag[0] = 0; flag[0] < EEPROM.read(1023); flag[0]++){ //Перебор количества датчиков adresDall(flag[0]); //Получение адреса датчика ds.reset(); ds.select(addr); ds.write(0xBE); //Считывание значения с датчика temp = (ds.read() | ds.read()<<8); //Принимаем два байта температуры Temp[flag[0]][0] = temp*100/4/4; //Температура в целочисленном формате *100 //два знака после запятой. flag[1] = 10; //Время возврата в секундах } } } } //-------------------------------------------------- void loop() { ledBlink(1000); dallRead(flag[1]*1000); Serial.println(flag[1],DEC); Serial.println(Temp[0][0]/100.0,2); Serial.println(Temp[1][0]/100.0,2); Serial.println(Temp[2][0]/100.0,2); Serial.println(Temp[3][0]/100.0,2); Serial.println(" "); delay(900); }Не смог победить динамическое выделение массива под количество датчиков. Собака на будущие поделки забита.
круто ! копирую , спасибо !
Эт я идею из dimax кода содрал))).
вот обоим и спасибо ! :)
вот это и не понятно было - ds.search(addr) addr перебирается от 0 до хххххх ?
Возвращает по возрастанию, до окончания адресов.
Если память не очень лимитирована, на наброски автоопределения. Может уменьшишь))))
нано хватит на это
аха , щас всё брошу , изучу это дело ( год....два ) и начну уменьшать !
:)
Спасибо за предПодсказки !
Возвращает по возрастанию, до окончания адресов.
интересно - перебор всех адресов без ответа - сколько долго длится ?
Возвращает по возрастанию, до окончания адресов.
интересно - перебор всех адресов без ответа - сколько долго длится ?
Неверно выразился. Она только живые перебирает.
Возвращает по возрастанию, до окончания адресов.
интересно - перебор всех адресов без ответа - сколько долго длится ?
Неверно выразился. Она только живые перебирает.
как это ?!!!!!!!!!!!!!!!!! буду нудеть....
как она узнает кто жив , кто нет ? не опросив каждого ?
пока нагрузили помощъю выше осознаваемого....
Спасибо , пока для поездки в "деревню" ( очень далеко ) - хватит...
Спасибо :)
Сам не расскажу. Читай здесь.
не читается ссылка :(
спасибо ! :)
не читается ссылка :(
спасибо ! :)
Набери в гугле, "DS18B20, Чернов"
Ребята, на пальцах - привязаться к пинам можно а не к адресу датчика? Пинов дофига, хотелось бы при замене датчика не лазить обратно в прошивку. А на экране точно видеть где улица а где дом.
DS18B20 только начал осваивать материал, паял поделки на AVR и PIC там как то не заморачивался над адресом датчика. Здесь начал читать - а лес все темнее... Не смог найти темы пока для двух датчиков на разных пинах, или нашел но не смог понять что это именно та тема которая мне нужна)))
p.s Имел ввиду не то что бы к пинам, понимаю что по адресу надо. ммм как бы обьяснить... есть два провода, один в доме один на улице- меняю датчики свободно на них, показания на экране все равно правильные. Тоисть провода главнее а не адреса. как-то так.
Ребята, на пальцах - привязаться к пинам можно а не к адресу датчика? Пинов дофига, хотелось бы при замене датчика не лазить обратно в прошивку. А на экране точно видеть где улица а где дом.
Протокол обмена 1-wire, по которому связываются DS18B20, работает с адресами. Без них - не работает.
То есть, Вам, при замене термометра, в любом случае эти адреса надо как-то сообщить прошивке. Либо каждый раз лезть в код, либо записывать эти адреса в eeprom при прошивке, и потом менять точно так же... Вариантов - масса, но все они предполагают некие дополнительные телодвижения при смене уникального номера термометра.
В библиотеке DallasTemperature можно просто спросить количество устройств на шине и оно вернет их значение (функцию можно найти и посмотреть).
Насколько я понимаю, в 1-wire не опрашивается каждый датчик, а дается свисток: кто ответил в заданный диапазон времени - тот и живой. :)
Насколько я понимаю, в 1-wire не опрашивается каждый датчик, а дается свисток: кто ответил в заданный диапазон времени - тот и живой. :)
Не совсем, там алгоритм опроса с исключением адресов.
Ребята, на пальцах - привязаться к пинам можно а не к адресу датчика? Пинов дофига, хотелось бы при замене датчика не лазить обратно в прошивку. А на экране точно видеть где улица а где дом.
Протокол обмена 1-wire, по которому связываются DS18B20, работает с адресами. Без них - не работает.
То есть, Вам, при замене термометра, в любом случае эти адреса надо как-то сообщить прошивке. Либо каждый раз лезть в код, либо записывать эти адреса в eeprom при прошивке, и потом менять точно так же... Вариантов - масса, но все они предполагают некие дополнительные телодвижения при смене уникального номера термометра.
хорошо, а если с автоопредилением но на разных пинах?
Неужели такой затык с шиной?
Подождите, если на шине один датчик, то адрес а) можно не использовать б) всегда можно спросить его адрес и он один ответит. Потому если на разных пинах, на каждом своя шина и на ней только один датчик, то адреса не нужны. Но это явно не интересный вариант. А вобще привязка новых датчиков и перетасовка старых довольно скользкий вопрос. Допустим были датчики с адресами Д1 и Д2 в доме и саду. В какойто момент их заменили на Д3 и Д4. Или еще веселей, поменяли местами. Как системе узнать какой из датчиков в саду? Очевидно никак. В последнем своем подходе к задаче делал табличку соответствия адрес-роль-название в ЕЕПРОМ, и удаленно её редактировал. Новые датчики автоматом прописываются в неё как "Неизвестный" с порядковым номером. Потом можна отредактировать и указать роль и название датчика. Вроде и не плохо, но чувства глубокого удовлетворения нет.
В последнем своем подходе к задаче делал табличку соответствия адрес-роль-название в ЕЕПРОМ, и удаленно её редактировал. Новые датчики автоматом прописываются в неё как "Неизвестный" с порядковым номером. Потом можна отредактировать и указать роль и название датчика. Вроде и не плохо, но чувства глубокого удовлетворения нет.
Иначе наверно никак. Адрес + идентификатор. Я немного иначе делал. Если обнаружился новый номер или исчез какой то из запомненных, заставляет последовательно нагреть все доступные датчики (это нормально на небольшой площади и проблему замены местами тоже не решает).
У меня они на паяном шлейфе, соответственно замена только с паяльником. Уже не перепутаешь.
А проблемы по частой замене датчиков, ИМХО надуманные.
Подождите, если на шине один датчик, то адрес а) можно не использовать б) всегда можно спросить его адрес и он один ответит. Потому если на разных пинах, на каждом своя шина и на ней только один датчик, то адреса не нужны. Но это явно не интересный вариант.
Как раз интересный вариант! Вот бы тему найти об этом)
А насчёт перетасовки- уж очень кажется что удаленная правка епром действительно самый удачный вариант.
Подождите, если на шине один датчик, то адрес а) можно не использовать б) всегда можно спросить его адрес и он один ответит. Потому если на разных пинах, на каждом своя шина и на ней только один датчик, то адреса не нужны. Но это явно не интересный вариант.
Тема где то и на этом форуме была, поищите. Смысл использования дорогого адресного датчика на отдельных шинах? Его ведь изначально затевали для организации гирлянд.
Подождите, если на шине один датчик, то адрес а) можно не использовать б) всегда можно спросить его адрес и он один ответит. Потому если на разных пинах, на каждом своя шина и на ней только один датчик, то адреса не нужны. Но это явно не интересный вариант.
Тема где то и на этом форуме была, поищите. Смысл использования дорогого адресного датчика на отдельных шинах? Его ведь изначально затевали для организации гирлянд.
в wire
во первых к устройству можно обращатся не только по адресу, но и по порядковому номеру, по этому если датчик вего 1 - вполне можно не хранить его адрес...
во вторых там есть возможность получить список всех адресов которые висят на шине...
во первых к устройству можно обращатся не только по адресу, но и по порядковому номеру, по этому если датчик вего 1 - вполне можно не хранить его адрес...
Обращаемся все равно по адресу, для единственного датчика используем команду READ ROM [33h], не прибегая к сканированию адресов.
Если я не прав, то хотелось бы кусочек кода не использующий адрес.
sensors.getTempCByIndex(0)
sensors.getTempCByIndex(0)
хотя внутри, все равно по адресу :)
// sends command for one device to perform a temp conversion by index
bool DallasTemperature::requestTemperaturesByIndex(uint8_t deviceIndex)
{
DeviceAddress deviceAddress;
getAddress(deviceAddress, deviceIndex);
return requestTemperaturesByAddress(deviceAddress);
}
sensors.getTempCByIndex(0)
Я спрашивал за 1Wire (OneWire) , DallasTemperature - лишних 2 килобайта, без явных преимуществ.
P/S пока писал, уже ответили))))
Каюсь, похоже обманул. Вроде как можно сделать Skip ROM [CCh], а затем сразу чтение памяти [BEh]. Попробую на досуге.
Дискутировать полезно, частенько узнаешь новое.))))
попробуй. на 5 датчиков. код выглядит громоздко, но работать вроде должно (написать можно вроде с помощью структур, но я не умею). каждый датчик на свой пин (в начале указал какие), адрес не важен поэтому можно менять просто датчик
#include <OneWire.h> // пины для датчиков #define dallas_1 3 #define dallas_2 4 #define dallas_3 5 #define dallas_4 6 #define dallas_5 7 OneWire ds_1 (dallas_1); OneWire ds_2 (dallas_2); OneWire ds_3 (dallas_3); OneWire ds_4 (dallas_4); OneWire ds_5 (dallas_5); unsigned long time=0; boolean flag=0; // для измерения byte data[12]; float temp_1, temp_2, temp_3, temp_4, temp_5; int raw; void setup() { Serial.begin (9600); izm_temp(); } void loop(){ izm_temp(); // измеряем температуру if(!flag){ Serial.print (F("Temp_1 " )); Serial.print (temp_1); Serial.print (F(" Temp_2 ")); Serial.print (temp_2); Serial.print (F(" Temp_3 ")); Serial.print (temp_3); Serial.print (F(" Temp_4 ")); Serial.print (temp_4); Serial.print (F(" Temp_5 ")); Serial.println (temp_5); Serial.flush(); //очищаем значения порта } } void izm_temp(){ if(!flag){ start_izm(); time=millis(); flag=1; } if(flag && (millis()-time)>750){ calc_izm(); flag=0; } } void start_izm(){ //запускаем измерение всех датчиков ds_1.reset(); ds_1.write(0xCC); ds_1.write(0x44); ds_2.reset(); ds_2.write(0xCC); ds_2.write(0x44); ds_3.reset(); ds_3.write(0xCC); ds_3.write(0x44); ds_4.reset(); ds_4.write(0xCC); ds_4.write(0x44); ds_5.reset(); ds_5.write(0xCC); ds_5.write(0x44); } void calc_izm(){ // Считываем и пересчитываем 1 датчик ds_1.reset(); ds_1.write(0xCC); ds_1.write(0xBE); // Read Scratchpad for (byte i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds_1.read (); } raw = (data[1] << 8) | data[0];//=======Пересчитываем в температуру temp_1 = (float)raw / 16.0; // Считываем и пересчитываем 2 датчик ds_2.reset(); ds_2.write(0xCC); ds_2.write(0xBE); // Read Scratchpad for (byte i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds_2.read (); } raw = (data[1] << 8) | data[0];//=======Пересчитываем в температуру temp_2 = (float)raw / 16.0; // Считываем и пересчитываем 3 датчик ds_3.reset(); ds_3.write(0xCC); ds_3.write(0xBE); // Read Scratchpad for (byte i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds_3.read (); } raw = (data[1] << 8) | data[0];//=======Пересчитываем в температуру temp_3 = (float)raw / 16.0; // Считываем и пересчитываем 4 датчик ds_4.reset(); ds_4.write(0xCC); ds_4.write(0xBE); // Read Scratchpad for (byte i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds_4.read (); } raw = (data[1] << 8) | data[0];//=======Пересчитываем в температуру temp_4 = (float)raw / 16.0; // Считываем и пересчитываем 5 датчик ds_5.reset(); ds_5.write(0xCC); ds_5.write(0xBE); // Read Scratchpad for (byte i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds_5.read (); } raw = (data[1] << 8) | data[0];//=======Пересчитываем в температуру temp_5 = (float)raw / 16.0; }Меня оно чисто в академическом плане заинтересовало. Как их использовать, это дело ТС.
Но платить за возможность беспроблемной замены (будет ли нужна) кратным количеству датчиков увеличением аппаратных и программных средств, имхо, излишество.
за все надо платить)) ну если действительно требуется
ещё как требуется!
первым делом- сделал устройство и забыл, сделал кому-то. да много чего бывает! Зря вы так! Спасибо за последний код!, думаю оно самое то!
p.s Каждый видит со своей колокольни для вас излишество использовать пины, для меня полное непонимание! у меня пинов тьма (2560) мне вообще не в напряг задействовать ещё 10 или 20 штук. А замена в приоритете потому что за год вот, сменил три датчика. но на pic я даже и не задумывался два провода, два показания. )))
Простите, а что вы с ними делаете? Мне казалось, что для его убийства надо очень расстараться.
Каюсь, похоже обманул. Вроде как можно сделать Skip ROM [CCh], а затем сразу чтение памяти [BEh]. Попробую на досуге.
Дискутировать полезно, частенько узнаешь новое.))))
Можна, можна..
Простите, а что вы с ними делаете? Мне казалось, что для его убийства надо очень расстараться.
Ну если сеть на весь дом, без гальваноразвязки, то все выйдет легко и непринужденно.
Ребят, все проще маслянный котел на выходе стоит Даллас, как говорится про...б.ал насос включить после розжига- 10 минут и труп готов))
Вот и мастырю сейчас автоматику для всего этого ( но даже сильнее в целях обучения) приятное с полезным.
От перегрева далласы мрут? 8o И скоко же там градусов?
а код проверит кто нибудь? интересно рабочий или нет
Делайте сразу медную гильзу с небольшим (10см) выносом датчика в сторону: в результате температуру будет показывать ниже (решается калибровкой), но и датчик не перегреется...
Аварийную автоматику надо делать на биметаллических реле типа KSD9700. NO или NC - в зависимости от логики... Ну и надо помнить, что у них температура срабатывания может быть плюс-минус 10-15 градусов.
А что, надо принципиально обойтись без циклов? :)
// Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); // arrays to hold device addresses DeviceAddress Thermometer[5]; .... // print the device information for(int i=0; i < SensorCount; i++){ // printData(Thermometer[i]); printTemperature(Thermometer[i]); delay(4000); }ты кажется не понял что хочет человек, он хочет горячую замену датчиков без прописывания адресов
Я - тоже хочу... :)
Просто не допилил механизм привязки индекса к конктерному расположению датчика. В сетапе - запускается поиск устройств и адресами заполняется массив...
да такое можно было бы сделать, но тогда ты точно не знаешь где какой, только нагревом например по отдельности можно определить где какой и настроить в менюшке например что к чему относится, я предлагаю по пину на датчик, но не знаю точно ли так будет работать
а код проверит кто нибудь? интересно рабочий или нет
Жека, извиняй, огород, теплица, крыша на беседке, сушилка для белья ...... И погода самое то, думаю до дождей не доберусь.(((((
понятно. сам бы проверил но нет такого количества датчиков. один даже найти будет тяжело
Может что то не так подключил, но из 78 го поста- код не пошел((
изпользую ramps 1.4 2и 3 пины (два датчика), датчик рабочий, не увидел его, пишет все датчики= 0
или там нужно обязательно все пять цеплять?
епть... голова уже совсем не варит.. забыл 4.7 кОм впаять
ссори, тесты откладываю до утра
Работает! Работает из 78 го поста код!!
меняю между пинами датчик - показывает исправно!!!
Спасибо огромное Добр человек! одна не маловажная проблема решена!
хорошо. значит сохраню себе, вполне возможно тоже понадобится
долгая у тебя ночь была)))
Знатаки!) Подскажите! Я хочу подключить датчиками температуры Ds18b20 к Arduino! http://proumnyjdom.ru/kontrollery/ds18b20-podklyuchenie-k-arduino.html Если еще добавить дисплей это будет здорово! Только как это все лучше срастить? И не пойму почему у меня сейчас сам датчик температуру не точно показывает( погрешность в 2 градуса это норм?
про вранье датчика тоже заметил что он увеличивает температуру на 1,5-2С.
Где то читал, что типа он греется от того что на него постоянно подано напряжение питания.
а я слышал что изза того что постоянно опрашивают без реальной необходимости. и если просто температура измеряется в комнате, не нужно каждую секунду измерять