Подключение нескольких DS18b20 на одну шину и на разные выводы

123ksn
Offline
Зарегистрирован: 24.11.2014
Всем доброго времени суток.
Выручайте, мужики. Весь мозг себе сломал.
Есть вроде бы простая задача подключить несколько датчиков 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://geektimes.ru/post/257256/  Zyxel Keenetic 4G, arduino и датчики температуры ds18b20
http://arduino.ru/forum/programmirovanie/pomogite-optimizirovat-kod-i-pa...  Помогите оптимизировать код и пару вопросов по 1-Ware
 
Решения на приведенных страницах я не нашел.
Что хочу я?
1)Решить вопрос с использованием библиотеки OneWire.h средствами ардуино
2)Понимать используемый код, т.е. какие переменные используются и как они изменяются
3)Подключенные датчики DS18B20 автоматически определяются в SETUP, что бы в LOOP использовать без потери времени.
Вот часть моего кода в части DS18B20
01#include <OneWire.h>//для работы с DS18b20(датчик температуры)
02//****************** Создаем объекты библиотечных классов **********************************
03//Если на 1-шине сидит один датчик, то его ID знать не требуется!
04OneWire ds5(5); // создаем объект ds класса OneWire с единственным параметром номер пина шины OneWire
05OneWire ds6(6);
06OneWire ds7(7);
07 
08OneWire ds(8);//!!!! на этой шине будет несколько датчиков
09 
10const byte kol_DS = 3; //количество датчиков на 1-wire шине
11byte addr[kol_DS][8];//Создал массив: строки-кол-во датчиков по 8 байт в каждой для хранения адреса(ROM, ID) датчика
12byte present = 0;
13byte data[kol_DS][12];//Создал массив: строки-ном датчика по 12 байт с температурой
14byte type_s;
15 
16 
17void setup(void)
18  {
19  Serial.begin(9600);
20Serial.println("Find"); //Find DS18хх
21  Find_DS18b20();//вызов подпрограммы
22}
23 
24void loop(void)
25 {
26//Когда данные датчиков будут в массиве, тогда понятно как получать температуру
27}
28 
29void Find_DS18b20()
30{
31  //Пример кода, когда датчиков 2шт: <a href="http://playground.arduino.cc/Learning/OneWire" title="http://playground.arduino.cc/Learning/OneWire" rel="nofollow">http://playground.arduino.cc/Learning/OneWire</a>
32 
33  // 1) Сначала проверим, а есть ли хоть какой датчик на шине
34  for (byte i = 0; i < kol_DS; i++) //начало цикла (0,1,2) определения адресов датчиков
35  {
36    Serial.println(i);
37    if ( !ds.search(addr[i])) //тогда нет. addr - у меня двумерный массив байтов, в котором будет храниться номер п.п. и адрес
38    {
39      Serial.println("NoDS");//No DS18"
40      //delay(50);
41      //break;
42            ds.reset_search(); // если не нашли, сбрасываем поиск в начало
43      return; // и возвращаемся в самое начало главного цикла void loop(void)
44 
45    }//КонецIF
46    else // что-то на шине есть
47    {
48      //*********для отладки******
49      for (int g = 0; g < 8; g++)
50      {
51        Serial.write(' ');
52        Serial.print(addr[i][g], HEX);
53      }
54      Serial.println();
55     //******конец для отладки***************
56       
57 //     ds.reset_search();//addr[k] Если разремировать, то определяется только один датчик)!!!!!!!!!!!!!!!
58//      {
59//        switch (addr[i][0]) //n_ds18xx - номер п/п датчика, 0- 1-й байт содержит тип датчика
60//        {
61//          case 0x10://Find_Chip: DS18S20
62//            type_s = 1;
63//            break;
64//          case 0x28:
65//            //Serial.println("Find_Chip: DS18B20");
66//            type_s = 0;
67//            break;
68//          case 0x22://Find_Chip: DS1822
69//            type_s = 0;
70//            break;
71//            //default:
72//            //Serial.println("Device is not a DS18x20 family device.");
73//            //     return;
74//        }//КонецSwitch
75//      }
76    }
77  }
78}

 

Вот что программа выдает при этом коде
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
 
Но мне нужен весь код. Если я разремирую, 
 
01#include <OneWire.h>//для работы с DS18b20(датчик температуры)
02//****************** Создаем объекты библиотечных классов **********************************
03//Если на 1-шине сидит один датчик, то его ID знать не требуется!
04OneWire ds5(5); // создаем объект ds класса OneWire с единственным параметром номер пина шины OneWire
05OneWire ds6(6);
06OneWire ds7(7);
07 
08OneWire ds(8);//на этой шине будет несколько датчиков
09const byte kol_DS = 3; //количество датчиков на 1-wire шине
10byte addr[kol_DS][8];//Создал массив: строки-кол-во датчиков по 8 байт в каждой для хранения адреса(ROM, ID) датчика
11byte present = 0;
12byte data[kol_DS][12];//Создал массив: строки-ном датчика по 12 байт с температурой
13byte type_s;
14byte Gl_buffer_save[16];//Буфер (0-16) сбора информации
15 
16void setup(void)
17  {
18  Serial.begin(9600);
19Serial.println("Find"); //Find DS18хх
20  Find_DS18b20();//вызов подпрограммы
21}
22 
23void loop(void)
24 {
25//Когда данные датчиков будут в массиве, тогда понятно как получать температуру
26//start_termo();//начать измерение температуры
27//delay(1000);
28//get_termo();
29//Send_UART_SD();//отправка данных в UART
30}
31 
32void Find_DS18b20()
33{
34  //Пример кода, когда датчиков 2шт: <a href="http://playground.arduino.cc/Learning/OneWire" title="http://playground.arduino.cc/Learning/OneWire" rel="nofollow">http://playground.arduino.cc/Learning/OneWire</a>
35 
36  // 1) Сначала проверим, а есть ли хоть какой датчик на шине
37  for (byte i = 0; i < kol_DS; i++) //начало цикла (0,1,2) определения адресов датчиков
38  {
39    Serial.println(i);
40    if ( !ds.search(addr[i])) //тогда нет. addr - у меня двумерный массив байтов, в котором будет храниться номер п.п. и адрес
41    {
42      Serial.println("NoDS");//No DS18"
43      //delay(50);
44      //break;
45            ds.reset_search(); // если не нашли, сбрасываем поиск в начало
46      return; // и возвращаемся в самое начало главного цикла void loop(void)
47 
48    }//КонецIF
49    else // что-то на шине есть
50    {
51      //*********для отладки******
52      for (int g = 0; g < 8; g++)
53      {
54        Serial.write(' ');
55        Serial.print(addr[i][g], HEX);
56      }
57      Serial.println();
58     //******конец для отладки***************
59       
60     ds.reset_search();//addr[k] Если разремировать, то определяется только один датчик)!!!!!!!!!!!!!!!
61      {
62        switch (addr[i][0]) //n_ds18xx - номер п/п датчика, 0- 1-й байт содержит тип датчика
63        {
64          case 0x10://Find_Chip: DS18S20
65            type_s = 1;
66            break;
67          case 0x28:
68            //Serial.println("Find_Chip: DS18B20");
69            type_s = 0;
70            break;
71          case 0x22://Find_Chip: DS1822
72            type_s = 0;
73            break;
74            //default:
75            //Serial.println("Device is not a DS18x20 family device.");
76            //     return;
77        }//КонецSwitch
78      }
79    }
80  }
81}

то получу :

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 Толковый учитель по вопросам ученика видит его больше, чем по ответам. И только даун при любом вопросе видит дауна.
Очень надеюсь на помощь.
 
bwn
Offline
Зарегистрирован: 25.08.2014

Почитайте  , там весьма подробно описаны все команды и алгоритмы.

Radjah
Offline
Зарегистрирован: 06.08.2014

VCC на 3,3 В

GND на GND

Все DATA на нужный пин

Между пином DATA и VCC подключаешь резистор на 4,7 кОм.

У каждого датчика есть свой уникальный адрес типа MAC на сетевой карте. В примере из DallasTemperature для двух датчиков есть кусок для получения адремсов всех датчков на пине.

Если у тебя датчики привязаны к конкретному месту уставноки, то храни адреса в EEPROM (один адрес - 8 байт), считывай их при запуске контроллера и используй в программе.

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

123ksn
Offline
Зарегистрирован: 24.11.2014

bwn пишет:

Почитайте  , там весьма подробно описаны все команды и алгоритмы.

Спасибо, но Яндекс говорит, что такой страницы нет (404)

 

Radjah пишет:

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:

001#include <OneWire.h>//для работы с DS18b20(датчик температуры)
002//****************** Создаем объекты библиотечных классов **********************************
003//Если на 1-шине сидит один датчик, то его ID знать не требуется!
004 
005OneWire ds(8);//на этой шине будет несколько датчиков
006#define kol_DS 3
007//const byte kol_DS = 3; //количество датчиков на 1-wire шине
008byte addr[kol_DS][8];//Создал массив: строки-кол-во датчиков по 8 байт в каждой для хранения адреса(ROM, ID) датчика
009byte present = 0;
010byte data[kol_DS][12];//Создал массив: строки-ном датчика по 12 байт с температурой
011byte type_s;
012byte Gl_buffer_save[16];//Буфер (0-16) сбора информации
013 
014 
015void setup(void)
016{
017  Serial.begin(9600);
018  Serial.println("Find"); //Find DS18хх
019  Find_DS18b20();//вызов подпрограммы
020}
021 
022void loop(void)
023{
024  //Когда данные датчиков будут в массиве, тогда понятно как получать температуру
025  start_termo();//начать измерение температуры
026  delay(1000);//подождать пока DS18b20 закончит пересчитывать температуру в цифровой код
027  get_termo();//прочитать температуру из всех датчиков DS18b20
028  Send_UART_SD();//отправить данные в UART
029}
030 
031void Find_DS18b20()
032{
033  for (int i = 0; i < kol_DS; i++)
034  {
035 //   Serial.println("Initialising DS18B20...");
036    if (!ds.search(addr[i]))
037    {
038      Serial.println("ErrInit1w");//инициализация не выполнена:DS18B20 не найдены
039      return;
040    }
041    else //датчики найдены
042    {
043//**********вывести номер датчика и его ROM ******    
044//      Serial.print("Temp. Sensor ");
045//      Serial.print(i);
046//      Serial.print(": ");
047//      for (int j = 0; j < 8; j++)
048//      {
049//        Serial.print(addr[i][j], HEX);
050//        Serial.print(addr[i][j], HEX);
051//      }
052//**************вывел ROM**********
053    }//конец else
054//    Serial.println("...done!");
055    if (OneWire::crc8(addr[i], 7) != addr[i][7])
056    {
057      Serial.println("ErrCRC");//CRC Failed!
058      return;
059    }
060    if (addr[i][0] != 0x28)
061    {
062      Serial.println("notDS18B20");//"OW Device is not DS18B20!"
063    }
064  }//КонецЦикла
065}
066 
067//начало измер температуры***********************************************************************************************
068void start_termo()
069{
070 
071  //для отладки
072  //Serial.println("1000_start_termo()");
073  // Serial.println(n_ds18xx);
074  //Запускаем преобразователи во всех датчиках, найденных на этапе SETUP
075  for (byte i  = 0; i < 3; i++)
076  {
077    ds.reset();
078    ds.select(addr[i]);
079    ds.write(0x44, 1); // start conversion, with parasite power on at the end
080    /*После окончания преобразования данные сохраняются в 2-байтовом температурном регистре в
081       оперативной памяти, а DS18B20 возвращается в неактивное состояние с низким
082      энергопотреблением*/
083  }
084 
085  //установить разрешение DS18b20
086  //00011111 -9bit 0x1F
087  //00111111 -10bit
088  //01011111 -11bit
089  //01111111 -12bit 0x7F
090  //byte conf=0x7F;//
091  //НЕ РАБОТАЕТ
092  //  ds.reset();
093  //  ds.skip(); // skip ROM, что бы обратиться ко всем устройствам на шине одновременно
094  //  ds.write(0x4E); // write scratchpad Для записи данных в байты 2, 3, и 4 ОЗУ
095  //  ds.write(0); // Th
096  //  ds.write(0); // Tl
097  //  ds.write(conf); // configuration
098 
099}
100 
101//получение температуры*************************************************
102void get_termo()
103{
105  // Serial.println("1016_get_termo()");
106  //Serial.println(n_ds18xx);
107 
108  for (byte n_ds18xx = 0; n_ds18xx < kol_DS; n_ds18xx++) //начало цикла (0,1,2) определения адресов датчиков
109  {
110    present = ds.reset();//работа с датчиком всегда должна начинаться с сигнала ресета
111    ds.select(addr[n_ds18xx]);//выбирается адрес (ROM ) датчика
112    //Чтобы проверить корректность записи данных, необходимо выполнить чтение (используя команду чтения
113    //Read Scratchpad [BEh]) после того, как данные (какие) будут записаны(куда).
114    ds.write(0xBE);
115    /*(0xBE = 190)/читать содержание ПАМЯТИ. Передача данных начинается с наименьшего значащего бита байта 0 и продолжается до 9-ого байта (байт 8
116       - циклический контроль избыточности). */
117    for ( byte i = 0; i < 9; i++)
118    {
119      data[n_ds18xx][i] = ds.read();//сохраняем температуру(9 байт) в массиве соответствующего датчика
120    }
121    //проверка контрольной суммы:Старишие 8бит из 64 ROM, а не температуры!! содержат crc
122    if ( OneWire::crc8( addr[n_ds18xx], 7) != addr[n_ds18xx][7])
123    {
124      Serial.println("ErrCRC");
125      //если контрольная сумма не совпала с тем, что мы приняли – работать с такими данными нельзя.
126      //Поэтому запишем в массив с результатом такие значения, которых в нормальных условиях мы получить не сможем
127      //return;
128      Gl_buffer_save[n_ds18xx + 5] = 131;//придумать получше вариант
129    }
130    else
131    {
132      int16_t raw = (data[n_ds18xx][1] << 8) | data[n_ds18xx][0];//Тип 16-разрядных целых
133      byte cfg = (data[n_ds18xx][4] & 0x60);
134      if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
135      else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
136      else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
137 
138      byte celsius = (float)raw / 16.0; //16.0 будет 2 знака после запятой. Мне надо целое
139      //byte s = 0;
140      Gl_buffer_save[n_ds18xx + 5] = celsius;
141      //для отладки
142//      Serial.print("1051  t=");
143//      Serial.print(Gl_buffer_save[n_ds18xx + 5]);
144//      Serial.println("  ");
145    }
146  }
147}
148//******Конец Функция void get_termo() измерения температуры
149 
150 
151 
152void Send_UART_SD()
153{
154  //Serial.println("793_Send_UART_SD()");
155 
156  String dataString = "";
157  byte tt = 0;
158  for ( byte s = 0; s < 17; s++) // перебираем(0,1,2...) индексы массива Gl_buffer_save[ ]
159  {
160    tt = Gl_buffer_save[s];
161 
162    if (((s == 5) or (s == 6) or (s == 7)) and (tt > 127)) //больше 127- значит температура отрицательная
163    {
164      tt = 256 - tt;
165      Serial.print('-');
166      dataString += '-';//наполняем строку (выводимой в UART) информацией для записи на SD карты
167    }
168    Serial.print(tt);//name[7] = i%10 + '0';
169    dataString += String(tt);//наполняем строку (выводимой в UART) информацией для записи на SD карты
170    Serial.print(" ; ");
171    dataString += ";";//наполняем строку (выводимой в UART) информацией для записи на SD карты
172  }
173  Serial.println();
174 
175}//Конец Send_UART_SD()

Пользуйтесь на здоровье! И забудьте про этот дебилизм загонять ID датчиков в прошивку

Обратите внимание на одну тонкость: для хранения темпрературы я выделил байт. Т.е. можно записать число от 0 до 255, но тепература может быть отрицательной . Положительная температура будет записана числом от 0 до 127, а отрицательная от 128 (старший бит =1) до 255. Поэтому ставим знак минус перед числом. а модуль температуры получаем как (256-число)

Radjah
Offline
Зарегистрирован: 06.08.2014

> указывается в настройках #define kol_DS 3

Взоржал с тебя.

Не путай flash и eeprom, засмеют.

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

А код бибилиотеки всё же изучи. Много полезного про нее узнаешь.

bwn
Offline
Зарегистрирован: 25.08.2014

Тогда наберите "DS18B20 описание на русском" Чернов Геннадий.

На тему загоняния адресов в прошивку или EEPROM, готов сильно поспорить. После сбоя питания, откуда программа узнает местонахождение всех датчиков? Ваша попытка повесить их на отдельные пины, подозреваю связана именно с этим.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

123ksn пишет:

Похоже у Вас между мозгом и глазами стоит стена. Я не спрашиваю как мне ОБОЙТИ проблему, я спрашиваю как её РЕШИТЬ в конкретных условиях. Чувствуете разницу?

Вот бы Пухлявому так ответил)))))))

123ksn
Offline
Зарегистрирован: 24.11.2014

Radjah пишет:

> указывается в настройках #define kol_DS 3

Взоржал с тебя.

1)Смех продлевает жизнь, а ржачь делает из человека животное.

Radjah пишет:

Не путай flash и eeprom, засмеют.

2) Меня это не смущает. Есть пословица: Умный промолчит, дурак не заметит. Засмеивающие, мне кажется, ближе ко второй категории. Не стоит обращать на них внимания. За информацию спасибо. Гляну.  Но код от этого не перестанет работать

Radjah пишет:

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

Открываем канал между глазами и мозгами и смотрим функцию LOOP

Я сделаю и забуду про этот проект. Некогда вникать во все библиотеки. 

bwn
Offline
Зарегистрирован: 25.08.2014

И все таки, как прога определяет местонахождение датчика? Могу предположить: датчики отсортированы по адресам и расположены последовательно. Что делать если датчик сдох? Перемещать все датчики, у которых адрес выше? Объясните, в чем преимущество вашего метода? Крику много, но не понятно.

123ksn
Offline
Зарегистрирован: 24.11.2014

bwn пишет:

1)И все таки, как прога определяет местонахождение датчика? 2)Могу предположить: датчики отсортированы по адресам и расположены последовательно. 3)Что делать если датчик сдох? 4)Перемещать все датчики, у которых адрес выше? 5)Объясните, в чем преимущество вашего метода? 6)Крику много, но не понятно.

Извините, но внес в цитаты цифры, что бы проще было отвечать.

1)датчики, подключенные к отдельным пинам будут установлены на определенные физические объекты и под это будет заточена программа. "Гирлянда"  будет крепиться по обстоятельствам. Как узнать местонашождения датчика с гирлянды? Погреть и записать на бумажку, если угодно.

2)Ничего не сортировал. Ответ в п1

3)Если датчик сдох на отдельном пине, то об этом сообщит программа. Заменю, перезагружу программу и забуду. Если на "гирлянде" - тоже самое.

4)Наши абстракции не пересекаются. Не понимаю, о чем Вы.

5)Я не знаю, что Вы подразумеваете под "моим методом".

6)Странно, я вообще-то не кричал. 

Видимо Ваши вопросы от потери контекста моего вопроса. Кратко повтою. Интесовал код для работы несколькими датчиками DS18b20 в определенных программных условиях. Другие моменты неактуальны, например, точность температуры.

123ksn
Offline
Зарегистрирован: 24.11.2014

Radjah пишет:

1)Извини чувак, я хрустальный шар вчера разбил, хотя будущее он всё равно хреново показывал.

2)А хамить не надо, хамить я и сам умею. А таких шибкоумных велосипедостроителей тут в неделю по 5 штук бывает.

3)И вот тут я ловлю тебя на слове.

4)Ты сначала говришь про неприемлимость делаев и вот уже правишь пост с delay(1000). Либо крестик сними, либо трусы надень.

А устройство с двумя датчиками и адресами в EEPROM у меня сейчас на подоконнике лежит и температуру показывает.

> И все таки, как прога определяет местонахождение датчика?

5)Да никак. Я уже имел дело с таким говнокодером. Сренькнул и в кусты.

1)Думаю моё прощение Вам не поможет.

2)При обвинениях приводят цитаты. Но "чуваки" об этом не знают.

3)Опять бы цитата не помешала.

4)Т.е. моя фраза "Вот часть моего кода в части DS18B20" Вам ничего не говорит. Ладно скажу по другому. Так как проект очень большой и нет смысла его весь выкладывать, я выложил только часть кода, которая показывает суть проблемы. А что бы этот демо-код работал я добавил задержку в 1 сек там где надо.

5)Вообще-то я сам решил свой вопрос и выложил решение в общий доступ. Но у Вас, очевидно, к таким поспупкам свое специфическое отношение. Поэтому более с Вами объясняться не желаю.

Logik
Offline
Зарегистрирован: 05.08.2014

Мальчики не сортесь по пустякам! 123ksn Ты вобще чего хотел то?! смотри стр.57 //     ds.reset_search(); заремлен. В цикле нашли 1 датчик, потом 2 и третий. Разремил  ds.reset_search(); и нашли 1 датчик сбросили контекст поиска снованашли первый датчик..  Убер      ds.reset_search(); на...

Logik
Offline
Зарегистрирован: 05.08.2014

Да, еще как с тремя датчиками на одном выводе буш работать, то конвертацию запускай по очереди, иначе питания может нехватать, если сильно надо одновременно, то надо подпитку приличную. Но токо вот зачем оно может быть надо одновременно,  не термоядерный реактор мониторить же, температура меняется не быстро. Можна и все датчики на один вывод поцепить.

А с сканированием датчиков кажется класно, типа новый датчик подключил, он автоматом обнаружился, но в реале неудобняк - ну нашли допустим ваши 3 датчика (а что если 2, или 4 обнаружилось?), а какой из них какую температуру меряет?  Нужна табличка соответствия, с сохранением адресов датчиков в энергонезависимой памяти данных ;)  Это загрузка,  и/или редактирование. Невесело получается. Подключил новый датчик - пропиши его, заменил старый - правь табличку. Если же есть табличка - нафига сканировать каждый раз?!

bwn
Offline
Зарегистрирован: 25.08.2014

Logik пишет:

А с сканированием датчиков кажется класно, типа новый датчик подключил, он автоматом обнаружился, но в реале неудобняк - ну нашли допустим ваши 3 датчика (а что если 2, или 4 обнаружилось?), а какой из них какую температуру меряет?  Нужна табличка соответствия, с сохранением адресов датчиков в энергонезависимой памяти данных ;)  Это загрузка,  и/или редактирование. Невесело получается. Подключил новый датчик - пропиши его, заменил старый - правь табличку. Если же есть табличка - нафига сканировать каждый раз?!

Не, ну это мелочи, пришел такой крутой чувак, рассказал всем, что можно адреса в массив считать. Потом для его удобства и нежелания подумать, вместо одного шлейфа использовать три. Открыл истину, как хранить отрицательные числа в байте. В итоге получил высокотехнологичную х-ню на дорогом цифровом датчике, с которой вполне может справиться любой p-n переход.
 

123ksn
Offline
Зарегистрирован: 24.11.2014

Logik пишет:

1) Да, еще как с тремя датчиками на одном выводе буш работать, то конвертацию запускай по очереди, иначе питания может нехватать, если сильно надо одновременно, то надо подпитку приличную. Но токо вот зачем оно может быть надо одновременно,  не термоядерный реактор мониторить же, температура меняется не быстро. Можна и все датчики на один вывод поцепить.

2)А с сканированием датчиков кажется класно, типа новый датчик подключил, он автоматом обнаружился, но в реале неудобняк - ну нашли допустим ваши 3 датчика (а что если 2, или 4 обнаружилось?), а какой из них какую температуру меряет?  Нужна табличка соответствия, с сохранением адресов датчиков в энергонезависимой памяти данных ;)  Это загрузка,  и/или редактирование. Невесело получается. Подключил новый датчик - пропиши его, заменил старый - правь табличку. Если же есть табличка - нафига сканировать каждый раз?!

1)Я датчики DS18b20 давно использую и с тонкостями знаком. Вот на ардуине впервый раз. Но спасибо за добрый совет. 

2)Logik, не придумывайте сложности. Пусть каждый  делает как ему лучше, а я буду делать как мне лучше. Как говорится на вкус и цвет... DS18b20 можно подключить квазизвездой. Пользователь может даже не знать, что перед ним не звезда. Переключил вилку в нужную розетку и готово (Я использую провода и коннекторы от телефона)

Да, извините, строку 57 нет смысла обсуждать, так как я опубликовал пример рабочего кода

inspiritus
Offline
Зарегистрирован: 17.12.2012

Кароч вывод простой : каждый точит как хочет :)

Ваши углы заточки возможно оптимальны для Вашего проекта, который остался вне обсуждения. Для понимания большинства присутствующих проЭктантов обоснованы другие углы заточки. К ним отношу себя и я. Работаю с этими датчиками не один год. Ваш подход понял, резоны нет.

Спасибо.

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

123ksn
Offline
Зарегистрирован: 24.11.2014

inspiritus пишет:

1)Кароч вывод простой : каждый точит как хочет :)

Ваши углы заточки возможно оптимальны для Вашего проекта, который остался вне обсуждения. Для понимания большинства присутствующих проЭктантов обоснованы другие углы заточки. К ним отношу себя и я. Работаю с этими датчиками не один год. Ваш подход понял, резоны нет.

2)Спасибо.

3) PS. Когда помещаете код, не забывайте пожалуйста ставить крыжык в закладке дополнительно, пункт сворачивать.

1) Конечно, сколько людей столько и мнений. 

2)Не знаю за что спасибо, но скажу пожалуйста.

3)Спасибо. Не знал о такой возможности.

alex1608
Offline
Зарегистрирован: 01.09.2015
Здраствуйте как серийный номер DS18b20 ( Data = 1 0 0 FF FF 7F FF C 10 D4  CRC=AF)с экрана монитора 
 привести к такому виду 
DeviceAddress sensor1 = {0x28, 0xA8, 0x3E, 0xF9, 0x05, 0x0, 0x0, 0x12} для вставки  В код?
bwn
Offline
Зарегистрирован: 25.08.2014

Добавьте впереди незначащие нули и вписывайте после х, только то, что вам написал экран, точно не DS18B20. Его ID начинается с 28.

alex1608
Offline
Зарегистрирован: 01.09.2015

спасибо разобрался

 

alex1608
Offline
Зарегистрирован: 01.09.2015

В чем причина при использовании кода периодически теряется связь с датчиками выводит на дисплей как о("sensor error") испытываю в протеусе 

#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>
 #define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature ds(&oneWire);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
const byte OUT[5] = {13, 12, 11, 3, 2}; // номера выходов 
byte pos;
byte tempOUTon[5];  // массив с температурой включения выхода
float tempSensor[5]; // массив куда читается температура
 
 byte qty; // количество градусников на шине.
 
// адреса градусников.
DeviceAddress sensor1 = {0x28, 0x31, 0xC5, 0xB8, 0x0, 0x0, 0x0, 0xB9};
DeviceAddress sensor2 = {0x28, 0x30, 0xC5, 0xB8, 0x0, 0x0, 0x0, 0x8E};
DeviceAddress sensor3 = {0x28, 0x34, 0xC5, 0xB8, 0x0, 0x0, 0x0, 0x52};
DeviceAddress sensor4 = {0x28, 0x33, 0xC5, 0xB8, 0x0, 0x0, 0x0, 0xD7};
DeviceAddress sensor5 = {0x28, 0x29, 0xC5, 0xB8, 0x0, 0x0, 0x0, 0x43};
 
void readSet(){}
void outOff(){ // выключает выходы
  for (byte i = 0; i < qty; i++) digitalWrite(OUT[i], LOW);}
 
void erorr(){ // останавливает работу программы и сигнализирует ошибку
  outOff(); // выключаем выходы    
  lcd.clear();
  lcd.print("sensor error");
   while(1){ // крутим бесконечный цикл
      analogWrite(10, 100);
      delay(500);
      analogWrite(10, 255);
      delay(500);
  }}
void getTemp(){ // читаем температуру и заполняем массив
   ds.requestTemperatures();    
   
   tempSensor[0] = ds.getTempC(sensor1); // немного китайского кода
   tempSensor[1] = ds.getTempC(sensor2); 
   tempSensor[2] = ds.getTempC(sensor3);
   tempSensor[3] = ds.getTempC(sensor4);
   tempSensor[4] = ds.getTempC(sensor5);
   }
 
void sensorTest(){  // ищим датчики на шине, если количество изменилось, останавливаем работу
   ds.begin();
   if(ds.getDeviceCount() != qty) erorr();
}
void setup() {
 //  Serial.begin(9600); 
  ds.begin();   
  qty = ds.getDeviceCount(); // при включении, сохраняем количество градусников, 
                             // можно и лучше количество указать руками. 
  
  for (int i = 0; i < qty; i++) pinMode(OUT[i], OUTPUT);  
  for (int i = 0; i < qty; i++) digitalWrite(OUT[i], LOW);
  
 
 
  lcd.begin(16, 2);
  lcd.clear();
  
  }
void loop() {   
  
 
  sensorTest(); // тест наличия градусников на шине
  getTemp(); // читаем температуру с датчиков  
 
 
  
  /////// вывод инфы на экран
  lcd.setCursor(0, 0); 
  lcd.print(tempSensor[0]); 
  lcd.print("C ");
  lcd.setCursor(0, 1);
  lcd.print(tempSensor[1]); 
  lcd.print("C ") ;
   lcd.setCursor(7, 0);
  lcd.print(tempSensor[3]); 
  lcd.print("C ") ;
    lcd.setCursor(7, 1);
  lcd.print(tempSensor[4]); 
  lcd.print("C ") ;
delay(300); 
  
  }
 
 
123ksn
Offline
Зарегистрирован: 24.11.2014

alex1608 пишет:

В чем причина при использовании кода периодически теряется связь с датчиками выводит на дисплей как о("sensor error") испытываю в протеусе 

Не задумывались почему примеры в IDE только для одной функции (термометр/индикатор/часы)?
Разработчики не гарантируют работу двух устройств (библиотек) в одном проекте. Как пример, DallasTemperature использует внутри себя задержки. Нет гарантии, что библиотека LiquidCrystal или другая не перенастраивает под себя конфигурацию МК. В ардуино нельзя весь функционал сразу лепить в кучу. Только мелкими шагами. Тогда будете знать где возникает конфликт "интересов". Или используйте чужой проверенный код, благо такого здесь хватает.
Radjah
Offline
Зарегистрирован: 06.08.2014

Ошибка - error.

Потыкай датчики по индексу вместо адреса.

И еще http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

alex1608
Offline
Зарегистрирован: 01.09.2015

Radjah пишет:

Ошибка - error.

Потыкай датчики по индексу вместо адреса.

И еще http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

по индексу изначально не известно где какой датчик

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Если по индексу все датчики отвечают, то проверяй адреса. Если не отвечают, то смотри соединение. Логика работает или где?

alex1608
Offline
Зарегистрирован: 01.09.2015

Radjah пишет:

Если по индексу все датчики отвечают, то проверяй адреса. Если не отвечают, то смотри соединение. Логика работает или где?

 Я согласен в реальной схеме соединения контакт не надежен но не в протеусе ( хотя Хрен его  Знает

может протеус глючит)?  

alex1608
Offline
Зарегистрирован: 01.09.2015

При проверке в метале  код работает  получается протеус не всегда есть хорошо

bwn
Offline
Зарегистрирован: 25.08.2014

alex1608 пишет:

При проверке в метале  код работает  получается протеус не всегда есть хорошо

Что то вроде резиновой женщины. ИМХО.

Allex 78
Offline
Зарегистрирован: 02.03.2016

Помогите пожалуйста -начальство уже мозг проело, не могу прописать 6 датчиков ds18b20 на sd накопитель. Пишет только один датчик на флешку,остальные не удается. Микроконтлллер Atmega 328p. Ардуино писал Си плюс иде.Помогите как прописать поавильно чтобы писались все датчики на sd карту. Выручите мужики!

Radjah
Offline
Зарегистрирован: 06.08.2014

Код и схему в студию. Без кода в "Ищу исполнителя".

bwn
Offline
Зарегистрирован: 25.08.2014

Allex 78 пишет:
Помогите пожалуйста -начальство уже мозг проело, не могу прописать 6 датчиков ds18b20 на sd накопитель. Пишет только один датчик на флешку,остальные не удается. Микроконтлллер Atmega 328p. Ардуино писал Си плюс иде.Помогите как прописать поавильно чтобы писались все датчики на sd карту. Выручите мужики!

А за каким ..... их писать на SD? Вы базу адресов наличных датчиков создаете? Родного EEPROMа 328 штук на 100 датчиков хватит. Или у вас их больше?

valiktom
Offline
Зарегистрирован: 19.12.2016
01двумя руками поддерживаю "123ksn"!!!
02вот моя мини-переписка с другого сайта:
03 
04>>>>>>>>>>>>>>>>>>>>>>
05valiktom
06кто-нибудь может разобраться со скетчем ?
071.что делает "12" в byte data[12]; ,если собираем значения до девяти
08"for ( i = 0; i < 9; i++) { // нам необходимо 9 байт" ?
092.что делает параметр "present" в "present = ds.reset();"и почему без него нельзя как выше "ds.reset();"?
103.как берутся и меняются значения в "addr[8];" для "if ( !ds.search(addr)) {" ?
114.какие значения сбрасывает "ds.reset_search();" ?
125.для чего нужен "delay(250);"?
13заранее спасибо...
14 
15Е. > valiktom
161. мне тоже не понятно. У меня с data[9] всё как надо работает.
172. без present тоже всё работает прекрасно. А present - видимо, можно использовать, например, для вывода сообщения об ошибке: if (!present) {....}
183. Что касается ds.reset_search(), вот кусок из OneWire.cpp:
19// You need to use this function to start a search again from the beginning.
20// You do not need to do it for the first search, though you could.
21//
22void OneWire::reset_search()
23{
24// reset the search state
25LastDiscrepancy = 0;
26LastDeviceFlag = FALSE;
27LastFamilyDiscrepancy = 0;
28for(int i = 7; ; i--) {
29ROM_NO[i] = 0;
30if ( i == 0) break;
31}
32 
33valiktom > Е.
34по поводу "addr[8];" для "if ( !ds.search(addr)) {" поставлю вопрос по-другому:
35 
36...если ds.search(addr) прочёсывает все адреса от минимального до максимального,
37натыкается на существующий, выдаёт единицу и дальше по коду,
38то почему он до этого не ушёл в "No more addresses." и "loop"...
39...а если код библиотеки (может я не разобрался) не даёт выйти из прочёсывания адресов,
40то как мы видим два и больше сенсора за раз цикла...
41..а если это разные циклы,
42то откуда известно с какого адреса продолжать, ведь он объявляется по-новому каждый цикл
43и нигде не запоминается...
44где собака зарыта?
45<<<<<<<<<<<<<<<<<<<<<<<<
46 
47в конечном счёте всё сводится к тому,<strong>что</strong> происходит в цикле?
48while (ds.search(addr) == 1) {
49Serial.println(addr);
50}
51 
52виден аналогичный взгляд на вещи...

 

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

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

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

для развития темы, притащил код из интернета:

 

01/ подключение нескольких датчиков на разніе пині ардуино.
02/*
03Стандартная библиотека DallasTemperature несколько модернизирована и позволяет подключить несколько датчиков к одному пину Ардуино
04и обращаться к ним по уникальным адресам, что удобно, если надо провести датчики температуры  на большие расстояния от Ардуино к
05местам измерения температур, так как количество проводов уменьшается до трёх или  даже двух с паразитным подключением, и толщина
06проводов может передать сигнал напряжением в 5 вольт на большие расстояния.  Но что делать, если датчик испортился, например из-за
07перегрева, при замене цифрового датчика на шине с другими датчиками нужно заново прописывать в программе новый уникальный номер
08датчика DS18b20  и заново прошивать Ардуино.
09Одно из решений подключить цифровые датчики, как аналоговые каждый на свой вывод и считывать температуру с привязкой к
10выводу, а не к уникальному адресу или к номеру в последовательности определения на шине.
11Если требуется подключить несколько цифровых датчиков DS18b20 на разные выводы по шине onewire  воспользуётесь примером скетча:
12* два цифровых датчика DS18B20 на отдельные пины  для быстрой замены с разрешениями для быстроты срабатывания (менее 2 секунд) и проверкой на отсутствие
13*/
14#include <OneWire.h>
15#include <DallasTemperature.h>
16// пин 10 датчик температуры 1
17OneWire oW_podacha(10);
18// пин 11 датчик температуры 2
19OneWire oW_Obratka(11);
20DallasTemperature podacha(&oW_podacha);
21DallasTemperature Obratka(&oW_Obratka);
22DeviceAddress podachaAddress, ObratkaAddress;
23int Obrat;
24int podach;
25int raznost;
26// float floatObrat;
27// float floatpodach;
28void setup(void)
29{
30Serial.begin(9600);
31podacha.begin();
32Obratka.begin();
33podacha.setResolution(11);
34Obratka.setResolution(11);
35<p>// при максимальной точности время срабатывания 2 секунды если не указана точность
36// 12  точность 0.06
37// 11 точность 0.12
38// 10 точность 0.25
39// 9 точность 0.5
40// 6 точность 0.5
41}
42void loop(void)
43{
44Serial.println("Datchiki temperaturi:");
45Obratka.requestTemperatures();
46delay(40);
47podacha.requestTemperatures();
48delay(40);
49Serial.print("Podacha:");
50Serial.println(podacha.getTempCByIndex(0));
51Serial.print("Obratka:");
52Serial.println(Obratka.getTempCByIndex(0));
53int Obrat = Obratka.getTempCByIndex(0);
54int podach = podacha.getTempCByIndex(0);
55int raznost = podach - Obrat;
56Serial.print("RaZnost:");
57Serial.println(raznost);
58delay(100);
59oW_podacha.reset_search();
60oW_Obratka.reset_search();
61if (  !podacha.getAddress(podachaAddress, 0) ) { Serial.print("datchika Podachi net");}
62if (  !Obratka.getAddress(ObratkaAddress, 0) ) { Serial.print("datchika Obratki net");}
63}
64//Также часто требуется проверка на наличие  датчика в случае плохого контакта.
65//Для ускорения работы цифровых датчиков следует установить разрешение  (точность ) снятия измерений, если не указывать разрешение ,
66//по умолчанию оно будет максимальным, а значит процесс замера температуры займёт 2 секунды.

 

gena
Offline
Зарегистрирован: 04.11.2012
AlexeySh
Offline
Зарегистрирован: 16.01.2017

bwn пишет:

Тогда наберите "DS18B20 описание на русском" Чернов Геннадий.

Для развития темы скажу, что пробовал его библиотеку под контроллер PIC. После танцев с бубном все заработало. Обработка датчиков через прерывания сделана грамотно. Но код не просто перенести на другой микроконтроллер. Мне пришлось два вечера потратить на сверку регистров таймера моего микроконтроллера с тем, который использовал Геннадий, переделку кода и вылавливание ошибок. И там используется устаревший метод работы с EEPROM из-за чего библиотека занимает много места в памяти микроконтроллера. Т. е. все операции чтения/записи в EEPROM там расписаны вручную. В современных компиляторах для PIC этого не нужно, компилятор все делает сам, достаточно указать префикс eeprom при описании переменной.

А в целом именно так должа выглядеть нормальная библиотека для работы с датчиками температуры: до 16 датчиков на один провод, автоматический опрос датчиков, сохранение кодов датчиков в EEPROM, автоматическая замена кодов датчиков в EEPROM при смене датчика, работа через прерывания, что исключает задержки на ожидание ответа от датчика. В идеале ещё переделать её под ООП, чтобы можно было одновременно запускать несколько датчиков по нескольким пинам.

bwn
Offline
Зарегистрирован: 25.08.2014

AlexeySh, даже и не знал про его библиотеки, именно перевод-описание работы с DS18B20 понравилось.

AlexeySh
Offline
Зарегистрирован: 16.01.2017

bwn пишет:

AlexeySh, даже и не знал про его библиотеки, именно перевод-описание работы с DS18B20 понравилось.

Добавлю ложку дегтя. Его же библиотеку для работы с LCD дисплеями на HD44780 запустить так и не удалось. Хотя она вообще не использует прерывания, только временные задержки. После пары дней развлечений с её отладкой нашел в Инете другую библиотеку, на которой сейчас и работает моё устройство на PIC16F648A.

valiktom
Offline
Зарегистрирован: 19.12.2016

написал тут программу поиска\замены датчиков...

думаю будет полезно для новичков, каким я и являюсь,

для понимания их работы.

Radjah
Offline
Зарегистрирован: 06.08.2014

> goto EndSearchPin

По рукам линейкой за такое.

valiktom
Offline
Зарегистрирован: 19.12.2016

профееееессор... и грубиян.

Radjah
Offline
Зарегистрирован: 06.08.2014

Прочитай про функции и отучайся от подобного говнокодерства.

valiktom
Offline
Зарегистрирован: 19.12.2016

ну я же говорю - грубиян.

gena
Offline
Зарегистрирован: 04.11.2012

   Да, Си-шники не любят оператор goto. А мне вот, после ассемблера, тоже очень трудно без него обходиться. Хотя стараюсь.

valiktom
Offline
Зарегистрирован: 19.12.2016

по просьбе отдельных професоров ушёл от "goto",

заодно дополнив кое-что и исправив неколько описок\багов и коментариев...

вроде работает...

123ksn
Offline
Зарегистрирован: 24.11.2014

valiktom пишет:

вроде работает...

1) Не обращайте внимание на "профессоров". Главное, что бы работало.

2)А вот "вроде работает" опускает Вас значительно ниже чем чем "goto". 

Успехов!

valiktom
Offline
Зарегистрирован: 19.12.2016

123ksn пишет:

valiktom пишет:

вроде работает...

1) Не обращайте внимание на "профессоров". Главное, что бы работало.

2)А вот "вроде работает" опускает Вас значительно ниже чем чем "goto". 

Успехов!

какую не прогнозируюмую реакцию может вызвать попытка выражения скромности...

но это недостаток всех форумов: больше воды, чем обсуждения по сути...

а суть в данном случае, по-моему, в следуещем:

я попытался показать способ исправления недостатка библиотеки в поиске датчиков

(на мой взгляд, если я её правильно понял; - тоже не факт)

применительно к желанию пользователей(и моему тоже) автоматически зафиксировать их

(удалять\добавлять\тасовать\заменять) путём создания временного списка их ID,

что-бы остановить в нужном месте поиск, иначе он годится только для ручного вбивания

адресов в программу(и почему это "просто" не сделано в библеотеке?).

плюс общеизвестный способ хранения ID в EEPROM,

плюс упорядочение и так доступной информации по датчикам для новичков...

а код...  он зависит от времени пребывания в нём... никто не идеален,

иначе нафиг нужны форумы? для взаимного выяснения IQ?

 

123ksn
Offline
Зарегистрирован: 24.11.2014

valiktom пишет:

какую не прогнозируюмую реакцию может вызвать попытка выражения скромности...

.....

иначе нафиг нужны форумы? для взаимного выяснения IQ?

Извините. Просто отделяю "мух от котлет". Думал, что и Вы такой-же. Ошибся. Еще раз извините.

valiktom
Offline
Зарегистрирован: 19.12.2016

не извиняйтесь... такой-же... про IQ - это не к вам...а вообще к форумам...

sva_khv
Offline
Зарегистрирован: 19.12.2016

valiktom пишет:

по просьбе отдельных професоров ушёл от "goto",

заодно дополнив кое-что и исправив неколько описок\багов и коментариев...

вроде работает...

Респект и уважуха за проделанную работу. 

Теперь можно разбираться и ставить эксперементы как НАЙТИ, ПРОНУМЕРОВАТЬ и использовать несколько датчиков на одной шине.

Код я буду писать заново под свои нужды. :-)  Главное с принципом работы разобрались!

В качестве замечания по форме - старайтесь объявлять переменные в начале функции, а не в процессе их применения. Так потом легче разобраться если косяк с типом переменной и вообще откуда она взялась.

И для перфекционистов (да и простым смертным помогает) - первые 1-2 символа от типа переменной, а потом имя. (int iX; char chText[10]; byte bAdress)

А в целом текст программы очень хорошо читается - спасибо! Особенно за развернутые коменты.

 

Гриша
Offline
Зарегистрирован: 27.04.2014

Всем привет, "чукча не читатель, чукча писатель" прочитал по диагонали, нужного не нашел.

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

СХЕМА:  все датчики в параллель, подтяжка шины данных 2,2к  , подключение с питанием - без паразитки.

БИБЛИАТЕКА ЭТА:

OneWire.h

OneWire.cpp

КОД  РАБОЧИЙ ЭТОТ:

ПРОБЛЕМА:  не могу избавиться от чтения   9 байт ОЗУ при поиске датчиков. Строки  89 - 96.

перечитал даташит - идеи не появились,  может я чего не понял :( .

UP