Подключение нескольких DS18b20 на одну шину и на разные выводы
- Войдите на сайт для отправки комментариев
Втр, 15/09/2015 - 20:53
Всем доброго времени суток.
Выручайте, мужики. Весь мозг себе сломал.
Есть вроде бы простая задача подключить несколько датчиков DS18b20 на одну шину и на разные выводы, а конкретно 3 датчика подключить на пин 8 и по одному датчику на пины 5, 6, 7. Примеров в интернете море, НО
1)Многие примеры создатели "гавно-сайтов" просто копипастят не понимая смысла и потому код нерабочий.
Например, описывают подключение нескольких DS18b20 на шину, а в коде объявляют переменные только для одного датчика :
byte data[12];
byte addr[8];
2)Есть примеры, в которых ID (ROM) каждого DS18b20 надо определять отдельно и прописывать в коде. По-моему это как мерседес заводить ручкой ("кривым стартером")
3)Рабочие примеры для нескольких датчиков DS18b20 даны с использованием библиотеки DallasTemperature.h. Но в ней прописана задержка 750мсек, что для моего проекта не подходит.
Вот список страниц, на которых в какой-то степени есть решение моего вопроса:
http://playground.arduino.cc/Learning/OneWire Dallas Semiconductor's 1-Wire Protocol
http://research.andbas.com/2012/02/1-wire-ds18s20.html Измерение температуры или освоение 1-wire протокола на примере DS18S20
http://robocraft.ru/blog/187.html вопрос по DS18B20
http://habrahabr.ru/post/242377/ Читаем все датчики в автоматическом режиме
http://mk90.blogspot.com.by/2013/05/web.html Web-термометр
http://geektimes.ru/post/257256/ Zyxel Keenetic 4G, arduino и датчики температуры ds18b20
http://arduino.ru/forum/programmirovanie/3-datchika-ds18b20arduino 3 датчика DS18B20+Arduino
http://arduino.ru/forum/programmirovanie/pomogite-optimizirovat-kod-i-pa... Помогите оптимизировать код и пару вопросов по 1-Ware
Решения на приведенных страницах я не нашел.
Что хочу я?
1)Решить вопрос с использованием библиотеки OneWire.h средствами ардуино
2)Понимать используемый код, т.е. какие переменные используются и как они изменяются
3)Подключенные датчики DS18B20 автоматически определяются в SETUP, что бы в LOOP использовать без потери времени.
Вот часть моего кода в части DS18B20
#include <OneWire.h>//для работы с DS18b20(датчик температуры) //****************** Создаем объекты библиотечных классов ********************************** //Если на 1-шине сидит один датчик, то его ID знать не требуется! OneWire ds5(5); // создаем объект ds класса OneWire с единственным параметром номер пина шины OneWire OneWire ds6(6); OneWire ds7(7); OneWire ds(8);//!!!! на этой шине будет несколько датчиков const byte kol_DS = 3; //количество датчиков на 1-wire шине byte addr[kol_DS][8];//Создал массив: строки-кол-во датчиков по 8 байт в каждой для хранения адреса(ROM, ID) датчика byte present = 0; byte data[kol_DS][12];//Создал массив: строки-ном датчика по 12 байт с температурой byte type_s; void setup(void) { Serial.begin(9600); Serial.println("Find"); //Find DS18хх Find_DS18b20();//вызов подпрограммы } void loop(void) { //Когда данные датчиков будут в массиве, тогда понятно как получать температуру } void Find_DS18b20() { //Пример кода, когда датчиков 2шт: http://playground.arduino.cc/Learning/OneWire // 1) Сначала проверим, а есть ли хоть какой датчик на шине for (byte i = 0; i < kol_DS; i++) //начало цикла (0,1,2) определения адресов датчиков { Serial.println(i); if ( !ds.search(addr[i])) //тогда нет. addr - у меня двумерный массив байтов, в котором будет храниться номер п.п. и адрес { Serial.println("NoDS");//No DS18" //delay(50); //break; ds.reset_search(); // если не нашли, сбрасываем поиск в начало return; // и возвращаемся в самое начало главного цикла void loop(void) }//КонецIF else // что-то на шине есть { //*********для отладки****** for (int g = 0; g < 8; g++) { Serial.write(' '); Serial.print(addr[i][g], HEX); } Serial.println(); //******конец для отладки*************** // ds.reset_search();//addr[k] Если разремировать, то определяется только один датчик)!!!!!!!!!!!!!!! // { // switch (addr[i][0]) //n_ds18xx - номер п/п датчика, 0- 1-й байт содержит тип датчика // { // case 0x10://Find_Chip: DS18S20 // type_s = 1; // break; // case 0x28: // //Serial.println("Find_Chip: DS18B20"); // type_s = 0; // break; // case 0x22://Find_Chip: DS1822 // type_s = 0; // break; // //default: // //Serial.println("Device is not a DS18x20 family device."); // // return; // }//КонецSwitch // } } } }
Вот что программа выдает при этом коде
Find
0
28 51 2 45 6 0 0 34
1
28 69 F6 44 6 0 0 4E
2
28 D5 AC 2 5 0 0 11
Но мне нужен весь код. Если я разремирую,
#include <OneWire.h>//для работы с DS18b20(датчик температуры) //****************** Создаем объекты библиотечных классов ********************************** //Если на 1-шине сидит один датчик, то его ID знать не требуется! OneWire ds5(5); // создаем объект ds класса OneWire с единственным параметром номер пина шины OneWire OneWire ds6(6); OneWire ds7(7); OneWire ds(8);//на этой шине будет несколько датчиков const byte kol_DS = 3; //количество датчиков на 1-wire шине byte addr[kol_DS][8];//Создал массив: строки-кол-во датчиков по 8 байт в каждой для хранения адреса(ROM, ID) датчика byte present = 0; byte data[kol_DS][12];//Создал массив: строки-ном датчика по 12 байт с температурой byte type_s; byte Gl_buffer_save[16];//Буфер (0-16) сбора информации void setup(void) { Serial.begin(9600); Serial.println("Find"); //Find DS18хх Find_DS18b20();//вызов подпрограммы } void loop(void) { //Когда данные датчиков будут в массиве, тогда понятно как получать температуру //start_termo();//начать измерение температуры //delay(1000); //get_termo(); //Send_UART_SD();//отправка данных в UART } void Find_DS18b20() { //Пример кода, когда датчиков 2шт: http://playground.arduino.cc/Learning/OneWire // 1) Сначала проверим, а есть ли хоть какой датчик на шине for (byte i = 0; i < kol_DS; i++) //начало цикла (0,1,2) определения адресов датчиков { Serial.println(i); if ( !ds.search(addr[i])) //тогда нет. addr - у меня двумерный массив байтов, в котором будет храниться номер п.п. и адрес { Serial.println("NoDS");//No DS18" //delay(50); //break; ds.reset_search(); // если не нашли, сбрасываем поиск в начало return; // и возвращаемся в самое начало главного цикла void loop(void) }//КонецIF else // что-то на шине есть { //*********для отладки****** for (int g = 0; g < 8; g++) { Serial.write(' '); Serial.print(addr[i][g], HEX); } Serial.println(); //******конец для отладки*************** ds.reset_search();//addr[k] Если разремировать, то определяется только один датчик)!!!!!!!!!!!!!!! { switch (addr[i][0]) //n_ds18xx - номер п/п датчика, 0- 1-й байт содержит тип датчика { case 0x10://Find_Chip: DS18S20 type_s = 1; break; case 0x28: //Serial.println("Find_Chip: DS18B20"); type_s = 0; break; case 0x22://Find_Chip: DS1822 type_s = 0; break; //default: //Serial.println("Device is not a DS18x20 family device."); // return; }//КонецSwitch } } } }
то получу :
Find
0
28 51 2 45 6 0 0 34
1
28 51 2 45 6 0 0 34
2
28 51 2 45 6 0 0 34
Т.е. программа видит только один датчик.
Также хотелось бы от умных людей услышать описание "на пальцах" приведенных ниже команд.
Вот как понимаю их я:
ds.search(addr[i])
Арудино пытается определить есть ли хоть какое-нибуть устройство на 1-wire. Если есть, то записывает
"засветившийся" ROM (8байт) в строку i массива addr. Это понятно для одного датчика. Но если датчиков много, то при каждом обращении к шине подается сигнал сброса (здесь не видно) и первым откликнувшимся опять является "шустрый" DS18x20, что собственно и видно из второго примера.
Допустим, библиоткека сама определяет, что такой ROM она уже сохранила и продолжает "пинговать" шину, пока не словит нововый ROM. Т.е. я подсовываю команде ds.search()только место для сохранения ROM, а она сама все делает.
Но тогда непонятен смысл команды ds.reset_search(). Что я ей должен скормить? Она что-то куда-то запишет?
P.S. Кода решится вопрос с несколькми датчиками, я думаю, что сам разберусь с датчиками на отдельных пинах.
P.S.S Толковый учитель по вопросам ученика видит его больше, чем по ответам. И только даун при любом вопросе видит дауна.
Очень надеюсь на помощь.
Почитайте , там весьма подробно описаны все команды и алгоритмы.
VCC на 3,3 В
GND на GND
Все DATA на нужный пин
Между пином DATA и VCC подключаешь резистор на 4,7 кОм.
У каждого датчика есть свой уникальный адрес типа MAC на сетевой карте. В примере из DallasTemperature для двух датчиков есть кусок для получения адремсов всех датчков на пине.
Если у тебя датчики привязаны к конкретному месту уставноки, то храни адреса в EEPROM (один адрес - 8 байт), считывай их при запуске контроллера и используй в программе.
Команду на начала измерений можно пулять без задания адреса, тогда её получат все датчики на шине и начнут замер.
Почитайте , там весьма подробно описаны все команды и алгоритмы.
Спасибо, но Яндекс говорит, что такой страницы нет (404)
VCC на 3,3 В
GND на GND
Все DATA на нужный пин
Между пином DATA и VCC подключаешь резистор на 4,7 кОм.
У каждого датчика есть свой уникальный адрес типа MAC на сетевой карте. В примере из DallasTemperature для двух датчиков есть кусок для получения адремсов всех датчков на пине.
Если у тебя датчики привязаны к конкретному месту уставноки, то храни адреса в EEPROM (один адрес - 8 байт), считывай их при запуске контроллера и используй в программе.
Команду на начала измерений можно пулять без задания адреса, тогда её получат все датчики на шине и начнут замер.
Похоже у Вас между мозгом и глазами стоит стена. Я не спрашиваю как мне ОБОЙТИ проблему, я спрашиваю как её РЕШИТЬ в конкретных условиях. Чувствуете разницу?
Утро вечера мудреннее. Вот рабочий скетч для поиска и использования НЕСКОЛЬКИХ (2, 3, 4, 5, 6 ...) датчиков (указывается в настройках #define kol_DS 3 ) DS18b20 на одной шине с использованием библиотеки OneWire.h
компилировал под IDE 1.6.5. Библиотеку OneWire скачивал, так как в "коробке 1.6.5" не было. http://www.pjrc.com/teensy/td_libs_OneWire.html Version 2.1:
Пользуйтесь на здоровье! И забудьте про этот дебилизм загонять ID датчиков в прошивку
Обратите внимание на одну тонкость: для хранения темпрературы я выделил байт. Т.е. можно записать число от 0 до 255, но тепература может быть отрицательной . Положительная температура будет записана числом от 0 до 127, а отрицательная от 128 (старший бит =1) до 255. Поэтому ставим знак минус перед числом. а модуль температуры получаем как (256-число)
> указывается в настройках #define kol_DS 3
Взоржал с тебя.
Не путай flash и eeprom, засмеют.
И вопрос со звездочкой. Как датчик успеет измерить температуру, если у тебя не предполагаются задерки?
А код бибилиотеки всё же изучи. Много полезного про нее узнаешь.
Тогда наберите "DS18B20 описание на русском" Чернов Геннадий.
На тему загоняния адресов в прошивку или EEPROM, готов сильно поспорить. После сбоя питания, откуда программа узнает местонахождение всех датчиков? Ваша попытка повесить их на отдельные пины, подозреваю связана именно с этим.
Похоже у Вас между мозгом и глазами стоит стена. Я не спрашиваю как мне ОБОЙТИ проблему, я спрашиваю как её РЕШИТЬ в конкретных условиях. Чувствуете разницу?
Вот бы Пухлявому так ответил)))))))
> указывается в настройках #define kol_DS 3
Взоржал с тебя.
1)Смех продлевает жизнь, а ржачь делает из человека животное.
Не путай flash и eeprom, засмеют.
2) Меня это не смущает. Есть пословица: Умный промолчит, дурак не заметит. Засмеивающие, мне кажется, ближе ко второй категории. Не стоит обращать на них внимания. За информацию спасибо. Гляну. Но код от этого не перестанет работать
И вопрос со звездочкой. Как датчик успеет измерить температуру, если у тебя не предполагаются задерки?
Открываем канал между глазами и мозгами и смотрим функцию LOOP
Я сделаю и забуду про этот проект. Некогда вникать во все библиотеки.
И все таки, как прога определяет местонахождение датчика? Могу предположить: датчики отсортированы по адресам и расположены последовательно. Что делать если датчик сдох? Перемещать все датчики, у которых адрес выше? Объясните, в чем преимущество вашего метода? Крику много, но не понятно.
1)И все таки, как прога определяет местонахождение датчика? 2)Могу предположить: датчики отсортированы по адресам и расположены последовательно. 3)Что делать если датчик сдох? 4)Перемещать все датчики, у которых адрес выше? 5)Объясните, в чем преимущество вашего метода? 6)Крику много, но не понятно.
Извините, но внес в цитаты цифры, что бы проще было отвечать.
1)датчики, подключенные к отдельным пинам будут установлены на определенные физические объекты и под это будет заточена программа. "Гирлянда" будет крепиться по обстоятельствам. Как узнать местонашождения датчика с гирлянды? Погреть и записать на бумажку, если угодно.
2)Ничего не сортировал. Ответ в п1
3)Если датчик сдох на отдельном пине, то об этом сообщит программа. Заменю, перезагружу программу и забуду. Если на "гирлянде" - тоже самое.
4)Наши абстракции не пересекаются. Не понимаю, о чем Вы.
5)Я не знаю, что Вы подразумеваете под "моим методом".
6)Странно, я вообще-то не кричал.
Видимо Ваши вопросы от потери контекста моего вопроса. Кратко повтою. Интесовал код для работы несколькими датчиками DS18b20 в определенных программных условиях. Другие моменты неактуальны, например, точность температуры.
1)Извини чувак, я хрустальный шар вчера разбил, хотя будущее он всё равно хреново показывал.
2)А хамить не надо, хамить я и сам умею. А таких шибкоумных велосипедостроителей тут в неделю по 5 штук бывает.
3)И вот тут я ловлю тебя на слове.
4)Ты сначала говришь про неприемлимость делаев и вот уже правишь пост с delay(1000). Либо крестик сними, либо трусы надень.
А устройство с двумя датчиками и адресами в EEPROM у меня сейчас на подоконнике лежит и температуру показывает.
> И все таки, как прога определяет местонахождение датчика?
5)Да никак. Я уже имел дело с таким говнокодером. Сренькнул и в кусты.
1)Думаю моё прощение Вам не поможет.
2)При обвинениях приводят цитаты. Но "чуваки" об этом не знают.
3)Опять бы цитата не помешала.
4)Т.е. моя фраза "Вот часть моего кода в части DS18B20" Вам ничего не говорит. Ладно скажу по другому. Так как проект очень большой и нет смысла его весь выкладывать, я выложил только часть кода, которая показывает суть проблемы. А что бы этот демо-код работал я добавил задержку в 1 сек там где надо.
5)Вообще-то я сам решил свой вопрос и выложил решение в общий доступ. Но у Вас, очевидно, к таким поспупкам свое специфическое отношение. Поэтому более с Вами объясняться не желаю.
Мальчики не сортесь по пустякам! 123ksn Ты вобще чего хотел то?! смотри стр.57
// ds.reset_search();
заремлен. В цикле нашли 1 датчик, потом 2 и третий. Разремилds.reset_search();
и нашли 1 датчик сбросили контекст поиска снованашли первый датчик.. Уберds.reset_search();
на...Да, еще как с тремя датчиками на одном выводе буш работать, то конвертацию запускай по очереди, иначе питания может нехватать, если сильно надо одновременно, то надо подпитку приличную. Но токо вот зачем оно может быть надо одновременно, не термоядерный реактор мониторить же, температура меняется не быстро. Можна и все датчики на один вывод поцепить.
А с сканированием датчиков кажется класно, типа новый датчик подключил, он автоматом обнаружился, но в реале неудобняк - ну нашли допустим ваши 3 датчика (а что если 2, или 4 обнаружилось?), а какой из них какую температуру меряет? Нужна табличка соответствия, с сохранением адресов датчиков в энергонезависимой памяти данных ;) Это загрузка, и/или редактирование. Невесело получается. Подключил новый датчик - пропиши его, заменил старый - правь табличку. Если же есть табличка - нафига сканировать каждый раз?!
А с сканированием датчиков кажется класно, типа новый датчик подключил, он автоматом обнаружился, но в реале неудобняк - ну нашли допустим ваши 3 датчика (а что если 2, или 4 обнаружилось?), а какой из них какую температуру меряет? Нужна табличка соответствия, с сохранением адресов датчиков в энергонезависимой памяти данных ;) Это загрузка, и/или редактирование. Невесело получается. Подключил новый датчик - пропиши его, заменил старый - правь табличку. Если же есть табличка - нафига сканировать каждый раз?!
Не, ну это мелочи, пришел такой крутой чувак, рассказал всем, что можно адреса в массив считать. Потом для его удобства и нежелания подумать, вместо одного шлейфа использовать три. Открыл истину, как хранить отрицательные числа в байте. В итоге получил высокотехнологичную х-ню на дорогом цифровом датчике, с которой вполне может справиться любой p-n переход.
1) Да, еще как с тремя датчиками на одном выводе буш работать, то конвертацию запускай по очереди, иначе питания может нехватать, если сильно надо одновременно, то надо подпитку приличную. Но токо вот зачем оно может быть надо одновременно, не термоядерный реактор мониторить же, температура меняется не быстро. Можна и все датчики на один вывод поцепить.
2)А с сканированием датчиков кажется класно, типа новый датчик подключил, он автоматом обнаружился, но в реале неудобняк - ну нашли допустим ваши 3 датчика (а что если 2, или 4 обнаружилось?), а какой из них какую температуру меряет? Нужна табличка соответствия, с сохранением адресов датчиков в энергонезависимой памяти данных ;) Это загрузка, и/или редактирование. Невесело получается. Подключил новый датчик - пропиши его, заменил старый - правь табличку. Если же есть табличка - нафига сканировать каждый раз?!
1)Я датчики DS18b20 давно использую и с тонкостями знаком. Вот на ардуине впервый раз. Но спасибо за добрый совет.
2)Logik, не придумывайте сложности. Пусть каждый делает как ему лучше, а я буду делать как мне лучше. Как говорится на вкус и цвет... DS18b20 можно подключить квазизвездой. Пользователь может даже не знать, что перед ним не звезда. Переключил вилку в нужную розетку и готово (Я использую провода и коннекторы от телефона)
Да, извините, строку 57 нет смысла обсуждать, так как я опубликовал пример рабочего кода
Кароч вывод простой : каждый точит как хочет :)
Ваши углы заточки возможно оптимальны для Вашего проекта, который остался вне обсуждения. Для понимания большинства присутствующих проЭктантов обоснованы другие углы заточки. К ним отношу себя и я. Работаю с этими датчиками не один год. Ваш подход понял, резоны нет.
Спасибо.
PS. Когда помещаете код, не забывайте пожалуйста ставить крыжык в закладке дополнительно, пункт сворачивать.
1)Кароч вывод простой : каждый точит как хочет :)
Ваши углы заточки возможно оптимальны для Вашего проекта, который остался вне обсуждения. Для понимания большинства присутствующих проЭктантов обоснованы другие углы заточки. К ним отношу себя и я. Работаю с этими датчиками не один год. Ваш подход понял, резоны нет.
2)Спасибо.
3) PS. Когда помещаете код, не забывайте пожалуйста ставить крыжык в закладке дополнительно, пункт сворачивать.
1) Конечно, сколько людей столько и мнений.
2)Не знаю за что спасибо, но скажу пожалуйста.
3)Спасибо. Не знал о такой возможности.
Добавьте впереди незначащие нули и вписывайте после х, только то, что вам написал экран, точно не DS18B20. Его ID начинается с 28.
спасибо разобрался
В чем причина при использовании кода периодически теряется связь с датчиками выводит на дисплей как о("sensor error") испытываю в протеусе
В чем причина при использовании кода периодически теряется связь с датчиками выводит на дисплей как о("sensor error") испытываю в протеусе
Ошибка - error.
Потыкай датчики по индексу вместо адреса.
И еще http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
Ошибка - error.
Потыкай датчики по индексу вместо адреса.
И еще http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
по индексу изначально не известно где какой датчик
Если по индексу все датчики отвечают, то проверяй адреса. Если не отвечают, то смотри соединение. Логика работает или где?
Если по индексу все датчики отвечают, то проверяй адреса. Если не отвечают, то смотри соединение. Логика работает или где?
может протеус глючит)?
При проверке в метале код работает получается протеус не всегда есть хорошо
При проверке в метале код работает получается протеус не всегда есть хорошо
Что то вроде резиновой женщины. ИМХО.
Помогите пожалуйста -начальство уже мозг проело, не могу прописать 6 датчиков ds18b20 на sd накопитель. Пишет только один датчик на флешку,остальные не удается. Микроконтлллер Atmega 328p. Ардуино писал Си плюс иде.Помогите как прописать поавильно чтобы писались все датчики на sd карту. Выручите мужики!
Код и схему в студию. Без кода в "Ищу исполнителя".
А за каким ..... их писать на SD? Вы базу адресов наличных датчиков создаете? Родного EEPROMа 328 штук на 100 датчиков хватит. Или у вас их больше?
вот тоже понадобилось на три датчика на три входа повесить, без привязки к внутренним номерам датчиков.
для развития темы, притащил код из интернета:
http://arduino.ru/forum/programmirovanie/arduino-i-termodatchiki-ds18b20...
Тогда наберите "DS18B20 описание на русском" Чернов Геннадий.
Для развития темы скажу, что пробовал его библиотеку под контроллер PIC. После танцев с бубном все заработало. Обработка датчиков через прерывания сделана грамотно. Но код не просто перенести на другой микроконтроллер. Мне пришлось два вечера потратить на сверку регистров таймера моего микроконтроллера с тем, который использовал Геннадий, переделку кода и вылавливание ошибок. И там используется устаревший метод работы с EEPROM из-за чего библиотека занимает много места в памяти микроконтроллера. Т. е. все операции чтения/записи в EEPROM там расписаны вручную. В современных компиляторах для PIC этого не нужно, компилятор все делает сам, достаточно указать префикс eeprom при описании переменной.
А в целом именно так должа выглядеть нормальная библиотека для работы с датчиками температуры: до 16 датчиков на один провод, автоматический опрос датчиков, сохранение кодов датчиков в EEPROM, автоматическая замена кодов датчиков в EEPROM при смене датчика, работа через прерывания, что исключает задержки на ожидание ответа от датчика. В идеале ещё переделать её под ООП, чтобы можно было одновременно запускать несколько датчиков по нескольким пинам.
AlexeySh, даже и не знал про его библиотеки, именно перевод-описание работы с DS18B20 понравилось.
AlexeySh, даже и не знал про его библиотеки, именно перевод-описание работы с DS18B20 понравилось.
Добавлю ложку дегтя. Его же библиотеку для работы с LCD дисплеями на HD44780 запустить так и не удалось. Хотя она вообще не использует прерывания, только временные задержки. После пары дней развлечений с её отладкой нашел в Инете другую библиотеку, на которой сейчас и работает моё устройство на PIC16F648A.
написал тут программу поиска\замены датчиков...
думаю будет полезно для новичков, каким я и являюсь,
для понимания их работы.
> goto EndSearchPin
По рукам линейкой за такое.
профееееессор... и грубиян.
Прочитай про функции и отучайся от подобного говнокодерства.
ну я же говорю - грубиян.
Да, Си-шники не любят оператор goto. А мне вот, после ассемблера, тоже очень трудно без него обходиться. Хотя стараюсь.
по просьбе отдельных професоров ушёл от "goto",
заодно дополнив кое-что и исправив неколько описок\багов и коментариев...
вроде работает...
по просьбе отдельных професоров ушёл от "goto",
вроде работает...
1) Не обращайте внимание на "профессоров". Главное, что бы работало.
2)А вот "вроде работает" опускает Вас значительно ниже чем чем "goto".
Успехов!
по просьбе отдельных професоров ушёл от "goto",
вроде работает...
1) Не обращайте внимание на "профессоров". Главное, что бы работало.
2)А вот "вроде работает" опускает Вас значительно ниже чем чем "goto".
Успехов!
какую не прогнозируюмую реакцию может вызвать попытка выражения скромности...
но это недостаток всех форумов: больше воды, чем обсуждения по сути...
а суть в данном случае, по-моему, в следуещем:
я попытался показать способ исправления недостатка библиотеки в поиске датчиков
(на мой взгляд, если я её правильно понял; - тоже не факт)
применительно к желанию пользователей(и моему тоже) автоматически зафиксировать их
(удалять\добавлять\тасовать\заменять) путём создания временного списка их ID,
что-бы остановить в нужном месте поиск, иначе он годится только для ручного вбивания
адресов в программу(и почему это "просто" не сделано в библеотеке?).
плюс общеизвестный способ хранения ID в EEPROM,
плюс упорядочение и так доступной информации по датчикам для новичков...
а код... он зависит от времени пребывания в нём... никто не идеален,
иначе нафиг нужны форумы? для взаимного выяснения IQ?
какую не прогнозируюмую реакцию может вызвать попытка выражения скромности...
.....
иначе нафиг нужны форумы? для взаимного выяснения IQ?
Извините. Просто отделяю "мух от котлет". Думал, что и Вы такой-же. Ошибся. Еще раз извините.
не извиняйтесь... такой-же... про IQ - это не к вам...а вообще к форумам...
по просьбе отдельных професоров ушёл от "goto",
заодно дополнив кое-что и исправив неколько описок\багов и коментариев...
вроде работает...
Респект и уважуха за проделанную работу.
Теперь можно разбираться и ставить эксперементы как НАЙТИ, ПРОНУМЕРОВАТЬ и использовать несколько датчиков на одной шине.
Код я буду писать заново под свои нужды. :-) Главное с принципом работы разобрались!
В качестве замечания по форме - старайтесь объявлять переменные в начале функции, а не в процессе их применения. Так потом легче разобраться если косяк с типом переменной и вообще откуда она взялась.
И для перфекционистов (да и простым смертным помогает) - первые 1-2 символа от типа переменной, а потом имя. (int iX; char chText[10]; byte bAdress)
А в целом текст программы очень хорошо читается - спасибо! Особенно за развернутые коменты.
Всем привет, "чукча не читатель, чукча писатель" прочитал по диагонали, нужного не нашел.
ЗАДАЧА: сверить показания нескольких датчиков или вывести показания группы датчиков по одной шине с известными адресами датчиков.
СХЕМА: все датчики в параллель, подтяжка шины данных 2,2к , подключение с питанием - без паразитки.
БИБЛИАТЕКА ЭТА:
OneWire.h
OneWire.cpp
КОД РАБОЧИЙ ЭТОТ:
ПРОБЛЕМА: не могу избавиться от чтения 9 байт ОЗУ при поиске датчиков. Строки 89 - 96.
перечитал даташит - идеи не появились, может я чего не понял :( .
UP