Датчик ds18b20. Как перевести дискретность на 12 бит???

Prototipnew
Offline
Зарегистрирован: 07.02.2016

Знаю что по умолчанию должен стоять 12. Но уменя 9. Как вернуть на 12бит???? Сейчас меряет только по пол градуса.

lex2k
Offline
Зарегистрирован: 17.12.2015

Prototipnew пишет:

Знаю что по умолчанию должен стоять 12. Но уменя 9. Как вернуть на 12бит???? Сейчас меряет только по пол градуса.

в setup

sensors.setResolution(Thermometer1, 10); 

пологаю что так

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

  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Prototipnew пишет:

Знаю что по умолчанию должен стоять 12. Но уменя 9. Как вернуть на 12бит???? Сейчас меряет только по пол градуса.

Коллеги, вроде всё сказали. Хочу только добавить: вообще-то у него точность по даташиту - полградуса, так может и пусть? На меньшем разрешении быстрее измеряет.

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

ЕвгенийП пишет:

Prototipnew пишет:

Знаю что по умолчанию должен стоять 12. Но уменя 9. Как вернуть на 12бит???? Сейчас меряет только по пол градуса.

Коллеги, вроде всё сказали. Хочу только добавить: вообще-то у него точность по даташиту - полградуса, так может и пусть? На меньшем разрешении быстрее измеряет.

Евгений, не соглашусь с Вами. Точность и разрядность разные вещи. Постоянное отклонение от фактической температуры никак не препятствует производить замер с требуемым разрешением. Ведь никто не мешает произвести поверку конкретного экземпляра и вносить эту поправку в измерения. ИМХО.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bwn,

я не об этом. Я о том, что если у прибора точность 0,5 градуса, то, скажем, показывать результат на экране с более, чем одной цифрой после запятой просто не имеет смысла. Поэтому высокая там разрядность или поменьше, как бы разницы особой нет. Правда, это при условии, что точность у него не зависит от разрядности и всегда 0,5 градуса.

Кстати, по поводу фразы : "если у прибора точность 0,5 градуса, то, скажем, показывать результат на экране с более, чем одной цифрой после запятой просто не имеет смысла" - она родилась из реальной практики. Я тут не так давно делал термостат для травления плат в персульфате (нужно держать 50С). Там контроллером работала ATtiny45. Памяти у неё не густо, и когда не стало влезать я посмотрел кто её отжирает. Выяснил, что DallasTemperature непосрественно перед возвращением готового результата, преобразовывает его к double, чтобы умножить на коэффициент. Нигде больше double у меня не использовался и получалось, что из-за этого несчастного умножения у меня притягивается добрых полтора килобайта кода библиотеки работы с плавающей точкой. Переделал возвращаемый результат таким образом: всё только в целых числах, но возвращается температура, умноженная на 10. Все сравнения делаю с учётом этого (допустим целевая температура не 50С, а 500). А при выводе температуры на семисегментник, просто нагло добавляю во вторую справа цифру десятичную точку. Всё отлично работает и полтора килобайта сэкономил.

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

ЕвгенийП, надстройкой над OneWire я принципиально не пользуюсь. Не вижу в ней смысла.
Для визуального отображения, больше одного знака после запятой бессмысленно, а чаще и он лишний. А вот для математики и обработки и три не лишних. Для того же ректификатора, надо держаться в коридоре 0,2-0,3 градуса, здесь уже используется полная разрядность. А точность как раз не важна, ибо порог стабилизации даже в течении дня сдвигается, а значит эталоном является относительная замеренная температура.
В последних разработках, тоже от float-ов избавился, жрут много, толку мало.))))
И кстати декларируемые 0,5гр. это крайний случай. Проверял комплектно из разных партий, обычно разброс не более 0,2гр, а это уже медицинский термометр.))))

Prototipnew
Offline
Зарегистрирован: 07.02.2016

Как вообщем програму написать эти команды я видел в библиотеке тоже. Блин я тоже могу так ответить.

Prototipnew
Offline
Зарегистрирован: 07.02.2016

Дайте конкретную программу для его зброса.

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

Дай, на той неделе хером подавился. Вставляешь в Setup, что я написал, и будет счастье. Адрес не забудь прописать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Prototipnew пишет:

Дайте конкретную программу для его зброса.

Конкретные программы дают в разделе "ищу исполнителя".

MacSim
Offline
Зарегистрирован: 28.11.2012

Что-ж жадные все такие...людям библиотеки подавай, без #инклюд готовая программа      не работает

#include <OneWire.h>

#include <DallasTemperature.h>

void setup(void)
{

sensors.setResolution(insideThermometer, 12);

}

void loop(void)
{}

ззззззззбрасывайте

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

 

 

MacSim
Offline
Зарегистрирован: 28.11.2012

.ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

 думаю что это у него не заработает. ну не напечатает он одинпровод.АШ

и спросит где аддр брать...

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

 

Я вставлял и что? Вытягиваеш с юсб ардуино вставляеш еще раз и снова все збилось. 

Prototipnew
Offline
Зарегистрирован: 07.02.2016

Я уже делал так спасибо к вам претензий нет. Сам допер

Prototipnew
Offline
Зарегистрирован: 07.02.2016

MacSim пишет:

Что-ж жадные все такие...людям библиотеки подавай, без #инклюд готовая программа      не работает

#include <OneWire.h>

#include <DallasTemperature.h>

void setup(void)
{

sensors.setResolution(insideThermometer, 12);

}

void loop(void)
{}

ззззззззбрасывайте

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

 

 

 

Я уже делал так спасибо к вам претензий нет. Сам допер

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Prototipnew пишет:

bwn пишет:

  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

 

Я вставлял и что? Вытягиваеш с юсб ардуино вставляеш еще раз и снова все збилось. 

смотря куда вставить....

MacSim
Offline
Зарегистрирован: 28.11.2012

Prototipnew пишет:

Я вставлял и что? Вытягиваеш с юсб ардуино вставляеш еще раз и снова все збилось. 

возможно у вас в коде настройка на 9 стоит, ее "выкинуть надо"

какуой код используете, бибилиотеку?

  возможно вы используете подсчет температуры от 9 бит, в то время как датчик дает 12.( raw считается от 9 бит, остальные выкидываются). и от флоат уюти надо к инт, быстрее работать будет.

в библиотеке <DallasTemperature.h> есть пример, на сериал кидается на какую разрядность запрограмирован датчик. или можете спросить его BEh и почитать ответ, послушать все 9 не прерывая, он все сам раззззззкажет.

https://yandex.ru/search/?text=18b20%20datasheet&lr=213 первая ссылка, даже по русски

и не надо ззззбрасывать, надо бит 5 и 6 регистра конфигурации установить в 11 и меньше юзать чужие проги, не разобравшийсь в них. попробуйте с нуля написать его опрос(я не говорю ванваре.Х выкинуть, с ее использованием) поймете, что где лежит у 1820 и как это что-то доставать и куда что-то класть.

даташит вам в помощь, да прибудет с вами СИ

 

 

 

Prototipnew
Offline
Зарегистрирован: 07.02.2016

SU-27-16 пишет:

Prototipnew пишет:

bwn пишет:

  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

 

Я вставлял и что? Вытягиваеш с юсб ардуино вставляеш еще раз и снова все збилось. 

смотря куда вставить....

Ну куда вставить скажи слушаю? В сетаб вставлял в цыкл вставлял куда еще бля.

Prototipnew
Offline
Зарегистрирован: 07.02.2016

SU-27-16 пишет:

Prototipnew пишет:

bwn пишет:

  ds.reset();
  ds.select(addr);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);

 

Я вставлял и что? Вытягиваеш с юсб ардуино вставляеш еще раз и снова все збилось. 

смотря куда вставить....

Ну куда вставить скажи слушаю? В сетаб вставлял в цыкл вставлял куда еще бля.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

вставить в сетап , один раз прошить прогу ( датчик запомнит разрядность преобразования ) , убрать это из сетапа...
да , датчики с конвейра идут под разрешение 12 , что-то у тибя в другом проблема , мне кажется....

код покажи уж :)

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

Действительно, прогу показывай. Этот кусок из работающего кода. Там при запуске, для автоопределения датчиков у меня два раза разрядность изменяется сперва на 9, потом на 12 бит. Все работает. Покажи как кодил для изменения и свою программу в которой на 9 бит возвращается.

Prototipnew
Offline
Зарегистрирован: 07.02.2016

SU-27-16 пишет:

вставить в сетап , один раз прошить прогу ( датчик запомнит разрядность преобразования ) , убрать это из сетапа...
да , датчики с конвейра идут под разрешение 12 , что-то у тибя в другом проблема , мне кажется....

код покажи уж :)

#include <OneWire.h>
OneWire ds(2);
byte addr1[8];
 
void setup() {
  ds.reset();
  ds.select(addr1);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}
bwn
Offline
Зарегистрирован: 25.08.2014

Супер, а что значит byte addr1[8]; ? Где в него адрес заносится?

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

Действительно, прогу показывай. Этот кусок из работающего кода. Там при запуске, для автоопределения датчиков у меня два раза разрядность изменяется сперва на 9, потом на 12 бит. Все работает. Покажи как кодил для изменения и свою программу в которой на 9 бит возвращается.

В этом варианте все работает но я хочу уйти от библиотеки далас. Мне надо место сэкономить и она тормозит систему.

#include <OneWire.h>

#include <DallasTemperature.h>

void setup(void)
{

sensors.setResolution(insideThermometer, 12);

}

void loop(void)
{}

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

То, что я дал это OneWire, надстройкой вообще не пользуюсь.

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

Супер, а что значит byte addr1[8]; ? Где в него адрес заносится?

Если один датчик используется то его можно описать так. Она ищет все датчики которые есть, независимо от адреса.

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

OneWire сама не ищет, либо делать поиск с занесением в массив, либо ручками прописывать.

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

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

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

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

Я вкурсе. А он меняется прикинь? Пока не вставиш эту строку: sensors.setResolution(insideThermometer, 12);

Я ж не зря это все говорю может.

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

OneWire сама не ищет, либо делать поиск с занесением в массив, либо ручками прописывать.

#include <OneWire.h>
OneWire ds(2);
byte addr1[8] = {0x28, 0xFF, 0x9D, 0x9D, 0x83, 0x15, 0x02, 0x46};
 
void setup() {
  ds.reset();
  ds.select(addr1);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);
}
 
void loop() {
  // put your main code here, to run repeatedly:
}
 
Пожалуйста зделал так тоже поменяло вытянул питания вставил снова сбилось на 9. Незнаю вроде то ж делаю.
bwn
Offline
Зарегистрирован: 25.08.2014

Там где у тебя byte addr1[8] пропиши код датчика руками. Потом запусти обычный пример, без твоей проги и посмотри, изменится или нет. В Далласовской библиотке не знаю, переписывает в EEPROM датчика или нет. В моем куске записывает.

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

Prototipnew пишет:

bwn пишет:

OneWire сама не ищет, либо делать поиск с занесением в массив, либо ручками прописывать.

#include <OneWire.h>
OneWire ds(2);
byte addr1[8] = {0x28, 0xFF, 0x9D, 0x9D, 0x83, 0x15, 0x02, 0x46};
 
void setup() {
  ds.reset();
  ds.select(addr1);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);
}
 
void loop() {
  // put your main code here, to run repeatedly:
}
 
Пожалуйста зделал так тоже поменяло вытянул питания вставил снова сбилось на 9. Незнаю вроде то ж делаю.

Так ты потом где температуру смотришь? Если в своей программе, то посмотри в чем нибудь другом.

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

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

Пока ипользую Далас и ту строку все нормально она походу сразу конвертирует через библу. Но я хочу избавится от библы Далас.

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

Prototipnew пишет:

bwn пишет:

OneWire сама не ищет, либо делать поиск с занесением в массив, либо ручками прописывать.

#include <OneWire.h>
OneWire ds(2);
byte addr1[8] = {0x28, 0xFF, 0x9D, 0x9D, 0x83, 0x15, 0x02, 0x46};
 
void setup() {
  ds.reset();
  ds.select(addr1);
  ds.write(0x4E);
  ds.write(0x7F); // верх и низ для аварийных температур
  ds.write(0xFF);
  ds.write(0x60); // это разрядность конвертации
  ds.write(0x48);
}
 
void loop() {
  // put your main code here, to run repeatedly:
}
 
Пожалуйста зделал так тоже поменяло вытянул питания вставил снова сбилось на 9. Незнаю вроде то ж делаю.

Так ты потом где температуру смотришь? Если в своей программе, то посмотри в чем нибудь другом.

В другом

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

Попробуй после изменения этот код запустить.

#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);
  
}

Для Атмеги328

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

Попробуй после изменения этот код запустить.


Для Атмеги328

Сначала все работает. Только выключаю с юсб и включаю снова, снова только по половинке показывает.

Prototipnew
Offline
Зарегистрирован: 07.02.2016

Prototipnew пишет:

bwn пишет:

Попробуй после изменения этот код запустить.



Для Атмеги328

Сначала все работает. Только выключаю с юсб и включаю снова, снова только по половинке показывает.

Я уже думаю может часы реального времени нужно поставить?

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

А часы то здесь при чем? Оставь этот код преобразования в сетапе, он при каждом перезапуске будет по новой настраивать. Не сталкивался с такой х-ней. Может датчик глючный попался.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

может быть в датчике "блокнот" убитый , ничо не запоминает ? другой есть ? третий , четвёртый....
ЧРВ - не нужны они датчику

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

А часы то здесь при чем? Оставь этот код преобразования в сетапе, он при каждом перезапуске будет по новой настраивать. Не сталкивался с такой х-ней. Может датчик глючный попался.

Ну да часы непричем...Понятно ну ладно спасибо. Куплю другой датчик.

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

Prototipnew пишет:

bwn пишет:

А часы то здесь при чем? Оставь этот код преобразования в сетапе, он при каждом перезапуске будет по новой настраивать. Не сталкивался с такой х-ней. Может датчик глючный попался.

Ну да часы непричем...Понятно ну ладно спасибо. Куплю другой датчик.

Так когда умрет совсем, тогда и купишь. Чем тебя эти пять строчек напрягают?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Prototipnew  , можешь код из #30 доделать чтобы в Сериал выводился весь блокнот датчика ?
что-то здеся не так.....

и уйди с пина 2 ( и 3 ) - если выкладываешь не весь код то может быть прерывания тибе , коду :) мешают ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}

этот пример что в Сериал выдаёт ?
покажи....

Prototipnew
Offline
Зарегистрирован: 07.02.2016

bwn пишет:

Prototipnew пишет:

bwn пишет:

А часы то здесь при чем? Оставь этот код преобразования в сетапе, он при каждом перезапуске будет по новой настраивать. Не сталкивался с такой х-ней. Может датчик глючный попался.

Ну да часы непричем...Понятно ну ладно спасибо. Куплю другой датчик.

Так когда умрет совсем, тогда и купишь. Чем тебя эти пять строчек напрягают?

Ты не поверишь))))))))) То же самое строки не помогли)) Бля...ахаха

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

 Мож ну его этот датчик , к чертовой матери. Мож лучше с блинком  поиграться топикстартеру, а потом и с блинком без делей.Если бы датчик читать умел - уже бы и сам поменял разрядность и без загрузки скетчей...Не умея менять разрядность датчика , имеем желание иметь температуру с тысячными градуса. .

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

SU-27-16 пишет:


этот пример что в Сериал выдаёт ?
покажи....

А что -такое СЕРИАЛ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Ctrl + Shift + M
пардон , просто я так его называю :)

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

Штирлиц пишет:

 Мож ну его этот датчик , к чертовой матери. Мож лучше с блинком  поиграться топикстартеру, а потом и с блинком без делей.Если бы датчик читать умел - уже бы и сам поменял разрядность и без загрузки скетчей...Не умея менять разрядность датчика , имеем желание иметь температуру с тысячными градуса. .

После тех пяти строчек проблема на 9 будет вернуться. Но возвращается, если только ТС ничего не умалчивает. Ощущение, что у него в EEPROM датчика не пишется.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

аха , #39 :)
и #43....

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Зайди сюда почитай , и возми там библиотеку.Там явно указано как менять разрешение датчика..