Почистил скетч примера работы с DS18B20 из библы OneWire..

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

AlexZR пишет:

да, вы верно заметили, очень не уверенно, но все что я находил для этого датчика, используют delay, что меня абсолютно не устраивает, так как объем обрабатываемых данных большой, температура только маленькая часть проекта, и остановка кода не приемлема..

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

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

ua6em пишет:

Евгений Петрович, Вы правы идеологически, а конкретный код исключение, компилятор его обрабатывает как надо, то-есть зная что приёмником данных есть переменная типа int  он и создаёт код работая с байтами во временных переменных типа int другого объяснения у меня нет

ПРо сдвиги, если хотите, может отдельно поговорить (там результат всегда int) А по моему пункту №1 у Вас есть объяснение? Про печать при каждом проходе, а считывание температуры только при нечётном?

AlexZR
Offline
Зарегистрирован: 08.02.2016

и все таки, кто нибудь, может предложить рабочий код для esp32 без задержек ? готов оплатить! нет времени вникать в тонкости этого долбаного датчика!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

ua6em пишет:

Евгений Петрович, Вы правы идеологически, а конкретный код исключение, компилятор его обрабатывает как надо, то-есть зная что приёмником данных есть переменная типа int  он и создаёт код работая с байтами во временных переменных типа int другого объяснения у меня нет

ПРо сдвиги, если хотите, может отдельно поговорить (там результат всегда int) А по моему пункту №1 у Вас есть объяснение? Про печать при каждом проходе, а считывание температуры только при нечётном?

если ТС желает получать значение температуры раз в секунду, то почему бы нет, переменная волатильная, температура будет такая жеж )))

код в принципе рабочий, без задержек, если еще убрать вывод в сериал будет еще быстрее

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexZR пишет:

и все таки, кто нибудь, может предложить рабочий код для esp32 без задержек ? готов оплатить! нет времени вникать в тонкости этого долбаного датчика!

а дальше что с температурой делаешь?

AlexZR
Offline
Зарегистрирован: 08.02.2016

ua6em пишет:
а дальше что с температурой делаешь?

вывод на индикатор, и при превышении определенного градуса включение сигнала..

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

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

ua6em пишет:
Nano всё работает...

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

Там температура хранится в глобальной переменной, потому при четных обращениях просто считывается предыдущее значение, а при нечетных оно обновляется

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

ЗЫ: процедуру getTemperatue я AlexZR  из своего рабочего проекта выдрал ))

а вот зачем он temperature объявил как uint8_t - я не знаю. Хотя, может быть у него отрицательных температур не будет в принципе... )))

AlexZR
Offline
Зарегистрирован: 08.02.2016

v258 пишет:
ЗЫ: процедуру getTemperatue я AlexZR  из своего рабочего проекта выдрал ))

а вот зачем он temperature объявил как uint8_t - я не знаю. Хотя, может быть у него отрицательных температур не будет в принципе... )))

минуса не будет, но меня еще волнует вопрос, почему этот код в Proteus не работает ?

а так, меня ваш код вполне устраивает, спасибо!

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

ua6em пишет:

если ТС желает получать значение температуры раз в секунду,

Так в том-то и дело, что в том коде он получает температуру якобы раз в две секунды, но на самом деле - раз в четыре секунды, а через раз (по чётным вызовам) просто печатает старое значение, которое в прошлый раз было.

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

AlexZR
Offline
Зарегистрирован: 08.02.2016

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

Так в том-то и дело, что в том коде он получает температуру якобы раз в две секунды, но на самом деле - раз в четыре секунды, а через раз (по чётным вызовам) просто печатает старое значение, которое в прошлый раз было.

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

ну так покажите как нужно! что ж вы как партизан то.. )))

sadman41
Offline
Зарегистрирован: 19.10.2016

AlexZR, см.email

AlexZR
Offline
Зарегистрирован: 08.02.2016

sadman41 пишет:
AlexZR, см.email

ничего нет, рз1зр английскими на майл.ру

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

AlexZR пишет:

ну так покажите как нужно! что ж вы как партизан то.. )))

Простите, я Вам что-то задолжал? Не припоминаю.

Писать код специально для Вас я не буду, т.к. Вам это на самом деле не нужно, Вы сами это написали

AlexZR пишет:

и все таки, кто нибудь, может предложить рабочий код ... нет времени вникать в тонкости этого долбаного датчика!

т.е. Вам не нужно научиться работать с датчиком и освоить программирование, на это у Вас "нет времени". Ну, а у меня нет времени что-то писать для людей, которым не нужно научиться писать, а нужно просто работающее устройство. Нужно - покупайте.

Вы написали код - я его покритиковал. Считаю это помощью Вам. Писать же код вместо Вас на том основании, что у Вас нет времени вникать ... извините, Вы не являетесь моим работодателем.

AlexZR
Offline
Зарегистрирован: 08.02.2016

ЕвгенийП пишет:
Вы написали код - я его покритиковал. Считаю это помощью Вам. Писать же код вместо Вас на том основании, что у Вас нет времени вникать ... извините, Вы не являетесь моим работодателем.

другого ответа и не ожидал! один пустой треп.. )))

но порядочные профи есть! помогли! за что и будут вознаграждены !

и проблему с двумя градусами решили )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

AlexZR пишет:

да, вы верно заметили, очень не уверенно, но все что я находил для этого датчика, используют delay, что меня абсолютно не устраивает, так как объем обрабатываемых данных большой, температура только маленькая часть проекта, и остановка кода не приемлема..

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

проблем нет, но если немножко код поправить, то получим задержку в 10 миллисекунд, против 44 в Далласовской

// определение адреса датчика в сетапе, установка битности датчика

#include <OneWire.h>
OneWire  ds(4);  // D2 (ESP8266)
byte addr[8];    // = {0x28, 0xEC, 0xF0, 0xD5, 0x04, 0x00, 0x00, 0xF2};

volatile float temperature;
unsigned long timing;
unsigned long t1;
unsigned long t2;

void setup(void)
{
  Serial.begin(115200);

label:
  ds.reset();      // сброс шины
  ds.search(addr); // определение адреса датчика
  if (OneWire::crc8(addr, 7) != addr[7])
  { //проверка массива адреса на срц
    Serial.println F("CRC ADRESS DS18B20 is not valid!");
    goto label;
  }
  ds.reset();      // сброс шины
  ds.select(addr); // выставить адрес
  ds.write(0x4E);  // разрешение записать конфиг
  ds.write(0x7F);  // Th контроль температуры макс 128грд
  ds.write(0xFF);  // Tl контроль температуры мин -128грд
  ds.write(0x60);  // 0x60 12-бит разрешение, 0x00 -9бит разрешение
  ds.write(0x7F);  // точность 0,5гр = 1F; 0,25гр = 3F; 0,125гр = 5F; 0,0625гр = 7F;

  // запросим температуру, считывать будем по таймеру
  ds.reset();
  ds.write(0xCC); // Обращение ко всем датчикам
  ds.write(0x44); // Команда на конвертацию
  timing = millis();
}

void loop(void) {

  if (millis() - timing > 1000)
  {
    timing = millis();
    getTemperature();
    Serial.print("  Temperature = ");
    Serial.print(temperature, 3);
    Serial.print(" Задержка в микросекундах - ");
    Serial.println(t2 - t1);
  }
}

void getTemperature()
{
  int temp;
  t1 = micros();
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);                       // Считывание значения с датчика
  temp = (ds.read() | ds.read() << 8);  // Принимаем два байта температуры
  temperature = (float)temp / 16.0;     // round((float)temp / 16.0);
  ds.reset();
  ds.write(0xCC);                       // Обращение ко всем датчикам
  ds.write(0x44);                       // Команда на конвертацию
  t2 = micros();
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexZR пишет:
и проблему с двумя градусами решили )))


Александр, интересно, что там за проблема была, проверил на трёх разных ардуинах (ESP32,ESP8266, NANO (Optiboot), на твоём коде, у меня не проявилась

AlexZR
Offline
Зарегистрирован: 08.02.2016

ua6em пишет:
AlexZR пишет:
и проблему с двумя градусами решили )))

Александр, интересно, что там за проблема была, проверил на трёх разных ардуинах (ESP32,ESP8266, NANO (Optiboot), на твоём коде, у меня не проявилась

ну скажем так, почти решили ))) сейчас разница 0.5 градуса, прошивка другая, а вот почему, пока сам не въехал )))

сейчас буду пробовать твою последнею...

проверил, разница 0.7 градуса, считаю уже нормально )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexZR пишет:

ua6em пишет:
AlexZR пишет:
и проблему с двумя градусами решили )))

Александр, интересно, что там за проблема была, проверил на трёх разных ардуинах (ESP32,ESP8266, NANO (Optiboot), на твоём коде, у меня не проявилась

ну скажем так, почти решили ))) сейчас разница 0.5 градуса, прошивка другая, а вот почему, пока сам не въехал )))

сейчас буду пробовать твою последнею...

проверил, разница 0.7 градуса, считаю уже нормально )))

у тебя видимо датчик близко к ESP, я тут немножко сенситив рукой чую  с расстояния 10 сантиметров, греет ESP не кисло, прибор есть но отдал сыну, можно было бы и посмотреть насколько, nano, та градусов 30-35, а ESP видимо под 50, у меня даллас в 20 сантиметрах ниже платы висит

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

AlexZR
Offline
Зарегистрирован: 08.02.2016

ua6em пишет:
у тебя видимо датчик близко к ESP, я тут немножко сенситив рукой чую  с расстояния 10 сантиметров, греет ESP не кисло, прибор есть но отдал сыну, можно было бы и посмотреть насколько, nano, та градусов 30-35, а ESP видимо под 50, у меня даллас в 20 сантиметрах ниже платы висит

да, скорее всего, датчик паяю на плату, и она чуть теплее ардуино, все, вопрос решен )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexZR пишет:

ua6em пишет:
у тебя видимо датчик близко к ESP, я тут немножко сенситив рукой чую  с расстояния 10 сантиметров, греет ESP не кисло, прибор есть но отдал сыну, можно было бы и посмотреть насколько, nano, та градусов 30-35, а ESP видимо под 50, у меня даллас в 20 сантиметрах ниже платы висит

да, скорее всего, датчик паяю на плату, и она чуть теплее ардуино, все, вопрос решен )))

а я дальше поковыряю на предмет отказа датчика, код из #222

 

AlexZR
Offline
Зарегистрирован: 08.02.2016

ua6em пишет:
а я дальше поковыряю на предмет отказа датчика, код из #222

да, мне эта функция бы тоже не помешала )))

sadman41
Offline
Зарегистрирован: 19.10.2016

DallasTemperature возвращает -127, если датчик отклячился. 

Я тоже тест провел с термоизоляцией сенсора и перебросом на ходу между ESP32 и Nano. Никаких отклонений не вижу, все эквивалентно - и скречпад и температура вычисленная. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Частое измерение температуры разогревает датчик. Где то в даташите написано. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

Частое измерение температуры разогревает датчик. Где то в даташите написано. 

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

DallasTemperature возвращает -127, если датчик отклячился. 

Я тоже тест провел с термоизоляцией сенсора и перебросом на ходу между ESP32 и Nano. Никаких отклонений не вижу, все эквивалентно - и скречпад и температура вычисленная. 

найти бы как LOGIС обошёл CRC 0 сейчас с оборванным датчиком температура ==0

sadman41
Offline
Зарегистрирован: 19.10.2016

Вопрос с all zeros тоже меня постоянно мучает. В DallasTemperature такая ситуация считается аварийной, а в даташите все нули - 0 градусов. CRC8 далласовский от всех нулей
скрэчпада вроде как тоже 0.

Проблема на шине по "onewire.reset() == 0" отслеживается.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:
Вопрос с all zeros тоже меня постоянно мучает. В DallasTemperature такая ситуация считается аварийной, а в даташите все нули - 0 градусов. CRC8 далласовский от всех нулей скрэчпада вроде как тоже 0. Проблема на шине по "onewire.reset() == 0" отслеживается.

отслеживают стойкий 0?

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

Не. Он отслеживает ответ датчика на сброс шины. И это верно. Оборванный датчик не отвечает обычно. Ещё когда от датчика приезжает значение температуры, то там целых девять байт, ну по которым мы crc проверяем. Среди них есть FF. В даташите пишут что он всегда такое. Его тоже проверяю, тем самым исключаю проблемму 'все нули'

sadman41
Offline
Зарегистрирован: 19.10.2016

А, ну точно: 

SCRATCHPAD (POWER-UP STATE)

BYTE 5 - RESERVED (FFh)
BYTE 7 - RESERVED (10h)

Т.е. если весь скрэчпад в нулях приехал, значит шина упала на землю.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

А, ну точно: 

SCRATCHPAD (POWER-UP STATE)

BYTE 5 - RESERVED (FFh)
BYTE 7 - RESERVED (10h)

Т.е. если весь скрэчпад в нулях приехал, значит шина упала на землю.

расчёт температуры из поста #222

    temp = (data[1] << 8) | data[0]; // Переводим в температуру
    if (data[7] == 0x10) temp = (temp & 0xFFF0) + 12 - data[6];

 

AlexZR
Offline
Зарегистрирован: 08.02.2016

после долгих мучений, остановился на таком варианте..

#include <OneWire.h>
OneWire  ds(4);
byte addr[8];
volatile int celsius;
unsigned long timing;

void setup(void)
{
  Serial.begin(57600);
  ds.reset();      // сброс шины
  ds.write(0x1F);  // точность 0,5гр = 1F; 0,25гр = 3F; 0,125гр = 5F; 0,0625гр = 7F;
  ds.search(addr); // определение адреса датчика
}

void loop(void) {
  if (millis() - timing > 2000)
  {
    timing = millis();
    getTemperature();
    Serial.print("Temperature = ");
    Serial.println(celsius / 16.0);
  }
}

void getTemperature()
{
  static boolean n = 0; // флаг работы: запрос температуры или её чтение
  n = !n;
  if (n) {
    ds.reset();      // сброс шины
    ds.select(addr); // выбор адреса
    ds.write(0x44);  // начать преобразование (без паразитного питания)
  }
  else   {
    ds.reset();
    ds.select(addr);
    ds.write(0xBE);  // Read Scratchpad (чтение регистров)
    celsius =  ds.read() | (ds.read() << 8); //прочитаны 2 байта
  }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexZR пишет:

после долгих мучений, остановился на таком варианте..

Александр!
Где положительные эмоции?
Я жеж выкладывал скетч в котором замечания Евгения Петровича были устранены, время между опросами датчика, чтобы не разогревался надо ставить 1.5 секунды, время опроса порядка 14 миллисекунд, если надо меньшее время, то этот датчик не годится (это минимум) с обходом косяков при использовании Далласовской библиотеки - 44 миллисекунды, то-есть напрямую получается в три раза лучше

Если температура в 0.25 градуса не критична то частоту опроса можно уменьшить до 750 миллисекунд

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

AlexZR
Offline
Зарегистрирован: 08.02.2016

Виктор, это который в посте 365 ?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexZR пишет:

Виктор, это который в посте 365 ?

я вечером поправлю с учётом вновь открывшихся обстоятельств (по неисправности датчика) и выложу

AlexZR
Offline
Зарегистрирован: 08.02.2016

ua6em пишет:
я вечером поправлю с учётом вновь открывшихся обстоятельств (по неисправности датчика) и выложу

спасибо! ожидаю...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexZR пишет:

ua6em пишет:
я вечером поправлю с учётом вновь открывшихся обстоятельств (по неисправности датчика) и выложу

спасибо! ожидаю...

с этим думаю уже можно работать, прогони по температуре феном, код обработки температуры взят из #222

#include <OneWire.h>
OneWire  ds(4);  // D2 (ESP8266)
byte addr[8];
byte addr1[8];
byte data[12];
byte zero = 0;

volatile float temperature;
unsigned long timing;
unsigned long t1;
unsigned long t2;
uint16_t t_convert = 1500; // врененной цикл запроса температуры, мин. 750



void setup() {
  Serial.begin(115200);
  int ii = 0;

label:
  if (ii < 6)
  {
    if ( !ds.search(addr))
    { // пока возвращаемый адрес == 0
      Serial.println F("No more addresses.");
      Serial.println(addr[8]);
      ds.reset_search();
      delay(250);
      ++ii;
      goto label;
    }

    if (OneWire::crc8(addr, 7) != addr[7])
    { //проверка массива адреса на CRC-8
      Serial.println F("CRC is not valid!");
      ++ii; goto label;
    }
  }
  ds.reset();      // сброс шины
  ds.select(addr); // выставить адрес
  ds.write(0x4E);  // разрешение записать конфиг
  ds.write(0x7F);  // Th контроль температуры макс 128грд
  ds.write(0xFF);  // Tl контроль температуры мин -128грд
  ds.write(0x60);  // 0x60 12-бит разрешение, 0x00 -9бит разрешение
  ds.write(0x7F);  // точность 0,5гр = 1F; 0,25гр = 3F; 0,125гр = 5F; 0,0625гр = 7F;

  // запросим температуру, считывать будем по таймеру
  ds.reset();
  ds.write(0xCC); // Обращение ко всем датчикам
  ds.write(0x44); // Команда на конвертацию
  timing = millis();
}

void loop()
{
  if (millis() - timing >= t_convert)
  {
    timing = millis();
    getTemperature();
    Serial.print("  Temperature = ");
    Serial.print(temperature, 3);
    Serial.print(" Задержка в микросекундах - ");
    Serial.println(t2 - t1);
    if(zero >= 1){ Serial.println("  *** Датчик оборван или замкнут *** "); zero = 0;}
  }
 }


void getTemperature()
{ // возвращает температуру с датчика
  int temp;
  t1 = micros();
  ds.reset();
  ds.select(addr);
  ds.write(0xBE);
  for (int i = 0; i < 9; i++) data[i] = ds.read();

  if (OneWire::crc8(data, 8) != data[8])
  { // проверка CRC считанной температуры.
    Serial.println F("Data CRC is not valid!");
  } else {

    temp = (data[1] << 8) | data[0]; // Переводим в температуру
    if (data[7] == 0x10) temp = (temp & 0xFFF0) + 12 - data[6];
    if((temp == 0) && (data[5] <0xFF)) zero++;
    temperature = (float)temp / 16.0;

    ds.reset();
    ds.write(0xCC);                       // Обращение ко всем датчикам
    ds.write(0x44);                       // Команда на конвертацию
    t2 = micros();
  }
}

Сам проверил перегрел немного датчик:
 

 Temperature = 25.437 Задержка в микросекундах - 13680
  Temperature = 25.437 Задержка в микросекундах - 13679
  Temperature = 25.437 Задержка в микросекундах - 13676
  Temperature = 25.437 Задержка в микросекундах - 13676
  Temperature = 25.437 Задержка в микросекундах - 13680
  Temperature = 25.437 Задержка в микросекундах - 13676
  Temperature = 25.437 Задержка в микросекундах - 13679
  Temperature = 25.437 Задержка в микросекундах - 13680
  Temperature = 25.437 Задержка в микросекундах - 13676
  Temperature = 25.437 Задержка в микросекундах - 13679
  Temperature = 25.437 Задержка в микросекундах - 13675
  Temperature = 25.437 Задержка в микросекундах - 13683
  Temperature = 25.437 Задержка в микросекундах - 13675
  Temperature = 25.437 Задержка в микросекундах - 13678
  Temperature = 25.437 Задержка в микросекундах - 13679
  Temperature = 25.437 Задержка в микросекундах - 13676
  Temperature = 25.437 Задержка в микросекундах - 13679
  Temperature = 25.375 Задержка в микросекундах - 13679
  Temperature = 25.437 Задержка в микросекундах - 13679
  Temperature = 25.375 Задержка в микросекундах - 13679
  Temperature = 25.375 Задержка в микросекундах - 13679
  Temperature = 25.375 Задержка в микросекундах - 13683
  Temperature = 25.375 Задержка в микросекундах - 13679
  Temperature = 25.375 Задержка в микросекундах - 13679
  Temperature = 25.375 Задержка в микросекундах - 13683
  Temperature = 25.375 Задержка в микросекундах - 13679
  Temperature = 25.375 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13681
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13683
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13680
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13676
  Temperature = 25.312 Задержка в микросекундах - 13680
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13676
  Temperature = 25.312 Задержка в микросекундах - 13681
  Temperature = 25.312 Задержка в микросекундах - 13675
  Temperature = 25.312 Задержка в микросекундах - 13676
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.312 Задержка в микросекундах - 13683
  Temperature = 25.312 Задержка в микросекундах - 13676
  Temperature = 25.312 Задержка в микросекундах - 13677
  Temperature = 25.312 Задержка в микросекундах - 13679
  Temperature = 25.250 Задержка в микросекундах - 13683
  Temperature = 25.250 Задержка в микросекундах - 13679
  Temperature = 25.250 Задержка в микросекундах - 13679
  Temperature = 25.250 Задержка в микросекундах - 13683
  Temperature = 25.312 Задержка в микросекундах - 13676
  Temperature = 25.437 Задержка в микросекундах - 13679
  Temperature = 34.563 Задержка в микросекундах - 13679
  Temperature = 39.188 Задержка в микросекундах - 13683
  Temperature = 42.500 Задержка в микросекундах - 13679
  Temperature = 54.875 Задержка в микросекундах - 13677
  Temperature = 57.875 Задержка в микросекундах - 13683
  Temperature = 57.688 Задержка в микросекундах - 13676
  Temperature = 64.000 Задержка в микросекундах - 13675
  Temperature = 71.000 Задержка в микросекундах - 13679
  Temperature = 77.938 Задержка в микросекундах - 13683
  Temperature = 83.375 Задержка в микросекундах - 13676
  Temperature = 88.000 Задержка в микросекундах - 13676
  Temperature = 89.000 Задержка в микросекундах - 13680
  Temperature = 84.938 Задержка в микросекундах - 13676
  Temperature = 87.938 Задержка в микросекундах - 13679
  Temperature = 91.250 Задержка в микросекундах - 13680
  Temperature = 93.813 Задержка в микросекундах - 13676
  Temperature = 95.938 Задержка в микросекундах - 13676
  Temperature = 97.625 Задержка в микросекундах - 13676
  Temperature = 98.938 Задержка в микросекундах - 13680
  Temperature = 99.875 Задержка в микросекундах - 13675
  Temperature = 100.313 Задержка в микросекундах - 13675
  Temperature = 100.250 Задержка в микросекундах - 13680
  Temperature = 96.375 Задержка в микросекундах - 13676
  Temperature = 94.375 Задержка в микросекундах - 13676
  Temperature = 94.875 Задержка в микросекундах - 13676
  Temperature = 98.875 Задержка в микросекундах - 13679
  Temperature = 102.750 Задержка в микросекундах - 13679
  Temperature = 104.938 Задержка в микросекундах - 13699
  Temperature = 105.875 Задержка в микросекундах - 13684
  Temperature = 107.688 Задержка в микросекундах - 13680
  Temperature = 109.688 Задержка в микросекундах - 13676
  Temperature = 109.500 Задержка в микросекундах - 13676
  Temperature = 106.750 Задержка в микросекундах - 13679
  Temperature = 106.438 Задержка в микросекундах - 13676
  Temperature = 104.875 Задержка в микросекундах - 13675
  Temperature = 101.625 Задержка в микросекундах - 13683
  Temperature = 98.125 Задержка в микросекундах - 13676
  Temperature = 93.188 Задержка в микросекундах - 13676
  Temperature = 87.438 Задержка в микросекундах - 13684
  Temperature = 82.625 Задержка в микросекундах - 13680
  Temperature = 78.438 Задержка в микросекундах - 13684
  Temperature = 74.813 Задержка в микросекундах - 13683
  Temperature = 71.625 Задержка в микросекундах - 13680
  Temperature = 68.750 Задержка в микросекундах - 13676
  Temperature = 66.000 Задержка в микросекундах - 13678
  Temperature = 67.875 Задержка в микросекундах - 13680
  Temperature = 77.750 Задержка в микросекундах - 13676
  Temperature = 88.938 Задержка в микросекундах - 13676
  Temperature = 98.563 Задержка в микросекундах - 13676
  Temperature = 105.188 Задержка в микросекундах - 13680
  Temperature = 111.938 Задержка в микросекундах - 13676
  Temperature = 117.500 Задержка в микросекундах - 13676
  Temperature = 120.313 Задержка в микросекундах - 13679
  Temperature = 124.438 Задержка в микросекундах - 13679
  Temperature = 126.438 Задержка в микросекундах - 13676
  Temperature = 123.438 Задержка в микросекундах - 13676
  Temperature = 122.438 Задержка в микросекундах - 13683
  Temperature = 120.625 Задержка в микросекундах - 13676
  Temperature = 119.813 Задержка в микросекундах - 13676
  Temperature = 121.750 Задержка в микросекундах - 13683
  Temperature = 122.625 Задержка в микросекундах - 13676
  Temperature = 124.688 Задержка в микросекундах - 13676
  Temperature = 127.375 Задержка в микросекундах - 13679
  Temperature = 127.688 Задержка в микросекундах - 13680
  Temperature = 127.688 Задержка в микросекундах - 13676
  Temperature = 127.688 Задержка в микросекундах - 13676
  Temperature = 122.313 Задержка в микросекундах - 13679
  Temperature = 115.625 Задержка в микросекундах - 13676
  Temperature = 109.563 Задержка в микросекундах - 13676
  Temperature = 103.813 Задержка в микросекундах - 13679
  Temperature = 98.750 Задержка в микросекундах - 13676
  Temperature = 94.188 Задержка в микросекундах - 13676
  Temperature = 90.188 Задержка в микросекундах - 13676
  Temperature = 86.375 Задержка в микросекундах - 13680
  Temperature = 82.938 Задержка в микросекундах - 13676
  Temperature = 79.813 Задержка в микросекундах - 13676
  Temperature = 77.000 Задержка в микросекундах - 13680
  Temperature = 74.250 Задержка в микросекундах - 13676
  Temperature = 71.875 Задержка в микросекундах - 13680
  Temperature = 69.688 Задержка в микросекундах - 13675
  Temperature = 67.438 Задержка в микросекундах - 13680
  Temperature = 65.438 Задержка в микросекундах - 13676
  Temperature = 63.563 Задержка в микросекундах - 13676
  Temperature = 61.750 Задержка в микросекундах - 13680
  Temperature = 59.875 Задержка в микросекундах - 13676
  Temperature = 58.375 Задержка в микросекундах - 13675
  Temperature = 56.938 Задержка в микросекундах - 13676
  Temperature = 55.625 Задержка в микросекундах - 13679
  Temperature = 54.313 Задержка в микросекундах - 13676
  Temperature = 53.125 Задержка в микросекундах - 13676
  Temperature = 52.000 Задержка в микросекундах - 13680
  Temperature = 51.125 Задержка в микросекундах - 13676
  Temperature = 50.250 Задержка в микросекундах - 13679
  Temperature = 49.438 Задержка в микросекундах - 13680
  Temperature = 48.688 Задержка в микросекундах - 13676
  Temperature = 47.938 Задержка в микросекундах - 13680
  Temperature = 47.250 Задержка в микросекундах - 13676
  Temperature = 46.500 Задержка в микросекундах - 13680
Data CRC is not valid!
  Temperature = 46.500 Задержка в микросекундах - 4293480972
  Temperature = 85.000 Задержка в микросекундах - 13675
  Temperature = 85.000 Задержка в микросекундах - 13680
  Temperature = 85.000 Задержка в микросекундах - 13679
  Temperature = 43.063 Задержка в микросекундах - 13676
  Temperature = 42.500 Задержка в микросекундах - 13676
  Temperature = 0.000 Задержка в микросекундах - 12456
  *** Датчик оборван или замкнут *** 
  Temperature = 0.000 Задержка в микросекундах - 12450
  *** Датчик оборван или замкнут *** 
  Temperature = 0.000 Задержка в микросекундах - 12450
  *** Датчик оборван или замкнут *** 
  Temperature = 0.000 Задержка в микросекундах - 12453
  *** Датчик оборван или замкнут *** 
  Temperature = 85.000 Задержка в микросекундах - 13675
  Temperature = 39.938 Задержка в микросекундах - 13675
  Temperature = 39.563 Задержка в микросекундах - 13676
  Temperature = 39.188 Задержка в микросекундах - 13680
  Temperature = 38.875 Задержка в микросекундах - 13676
  Temperature = 38.563 Задержка в микросекундах - 13676
  Temperature = 38.188 Задержка в микросекундах - 13679
  Temperature = 37.938 Задержка в микросекундах - 13675
  Temperature = 37.625 Задержка в микросекундах - 13676
  Temperature = 37.313 Задержка в микросекундах - 13680
  Temperature = 37.000 Задержка в микросекундах - 13679
  Temperature = 36.750 Задержка в микросекундах - 13675
  Temperature = 36.500 Задержка в микросекундах - 13676
  Temperature = 36.188 Задержка в микросекундах - 13680
  Temperature = 35.938 Задержка в микросекундах - 13676
  Temperature = 35.688 Задержка в микросекундах - 13676
  Temperature = 35.375 Задержка в микросекундах - 13680
  Temperature = 35.125 Задержка в микросекундах - 13679
  Temperature = 34.813 Задержка в микросекундах - 13676
  Temperature = 34.625 Задержка в микросекундах - 13675
  Temperature = 34.375 Задержка в микросекундах - 13680
  Temperature = 34.125 Задержка в микросекундах - 13676
  Temperature = 33.938 Задержка в микросекундах - 13676
  Temperature = 33.750 Задержка в микросекундах - 13676
  Temperature = 33.563 Задержка в микросекундах - 13676
  Temperature = 33.375 Задержка в микросекундах - 13675
  Temperature = 33.188 Задержка в микросекундах - 13676
  Temperature = 32.938 Задержка в микросекундах - 13680
  Temperature = 32.750 Задержка в микросекундах - 13675
  Temperature = 32.500 Задержка в микросекундах - 13676
  Temperature = 32.313 Задержка в микросекундах - 13683
  Temperature = 32.188 Задержка в микросекундах - 13679
  Temperature = 32.000 Задержка в микросекундах - 13676
  Temperature = 31.875 Задержка в микросекундах - 13683
  Temperature = 31.750 Задержка в микросекундах - 13683
  Temperature = 31.625 Задержка в микросекундах - 13676
  Temperature = 31.500 Задержка в микросекундах - 13679
  Temperature = 31.375 Задержка в микросекундах - 13682
  Temperature = 31.312 Задержка в микросекундах - 13676
  Temperature = 31.125 Задержка в микросекундах - 13679
  Temperature = 31.062 Задержка в микросекундах - 13680
  Temperature = 30.875 Задержка в микросекундах - 13676
  Temperature = 30.750 Задержка в микросекундах - 13676
  Temperature = 30.625 Задержка в микросекундах - 13676
  Temperature = 30.500 Задержка в микросекундах - 13680
  Temperature = 30.375 Задержка в микросекундах - 13676
  Temperature = 30.250 Задержка в микросекундах - 13676
  Temperature = 30.125 Задержка в микросекундах - 13680
  Temperature = 30.062 Задержка в микросекундах - 13676
  Temperature = 30.000 Задержка в микросекундах - 13675
  Temperature = 29.875 Задержка в микросекундах - 13679
  Temperature = 29.750 Задержка в микросекундах - 13680
  Temperature = 29.687 Задержка в микросекундах - 13676
  Temperature = 29.625 Задержка в микросекундах - 13676
  Temperature = 29.500 Задержка в микросекундах - 13679
  Temperature = 29.437 Задержка в микросекундах - 13679
  Temperature = 29.312 Задержка в микросекундах - 13675
  Temperature = 29.250 Задержка в микросекундах - 13676
  Temperature = 29.187 Задержка в микросекундах - 13682
  Temperature = 29.062 Задержка в микросекундах - 13675
  Temperature = 29.000 Задержка в микросекундах - 13676
  Temperature = 28.937 Задержка в микросекундах - 13680
  Temperature = 28.812 Задержка в микросекундах - 13676
  Temperature = 28.750 Задержка в микросекундах - 13679
  Temperature = 28.687 Задержка в микросекундах - 13680
  Temperature = 28.562 Задержка в микросекундах - 13679
  Temperature = 28.500 Задержка в микросекундах - 13676
  Temperature = 28.437 Задержка в микросекундах - 13676
  Temperature = 28.375 Задержка в микросекундах - 13683
  Temperature = 28.312 Задержка в микросекундах - 13676
  Temperature = 28.250 Задержка в микросекундах - 13676
  Temperature = 28.187 Задержка в микросекундах - 13680
  Temperature = 28.125 Задержка в микросекундах - 13676
  Temperature = 28.125 Задержка в микросекундах - 13679
  Temperature = 28.062 Задержка в микросекундах - 13676
  Temperature = 28.000 Задержка в микросекундах - 13679
  Temperature = 27.937 Задержка в микросекундах - 13679
  Temperature = 27.937 Задержка в микросекундах - 13676
  Temperature = 27.875 Задержка в микросекундах - 13683
  Temperature = 27.812 Задержка в микросекундах - 13676
  Temperature = 27.750 Задержка в микросекундах - 13676
  Temperature = 27.687 Задержка в микросекундах - 13679
  Temperature = 27.687 Задержка в микросекундах - 13680
  Temperature = 27.562 Задержка в микросекундах - 13676
  Temperature = 27.562 Задержка в микросекундах - 13676
  Temperature = 27.500 Задержка в микросекундах - 13679
  Temperature = 27.500 Задержка в микросекундах - 13679
  Temperature = 27.437 Задержка в микросекундах - 13675
  Temperature = 27.375 Задержка в микросекундах - 13683
  Temperature = 27.312 Задержка в микросекундах - 13680
  Temperature = 27.312 Задержка в микросекундах - 13675
  Temperature = 27.250 Задержка в микросекундах - 13679
  Temperature = 27.250 Задержка в микросекундах - 13680
  Temperature = 27.187 Задержка в микросекундах - 13676
  Temperature = 27.187 Задержка в микросекундах - 13676
  Temperature = 27.187 Задержка в микросекундах - 13680
  Temperature = 27.125 Задержка в микросекундах - 13679
  Temperature = 27.125 Задержка в микросекундах - 13676
  Temperature = 27.062 Задержка в микросекундах - 13676
  Temperature = 27.000 Задержка в микросекундах - 13681
  Temperature = 27.000 Задержка в микросекундах - 13676
  Temperature = 26.937 Задержка в микросекундах - 13676
  Temperature = 26.875 Задержка в микросекундах - 13679
  Temperature = 26.875 Задержка в микросекундах - 13679
  Temperature = 26.812 Задержка в микросекундах - 13679
  Temperature = 26.812 Задержка в микросекундах - 13676
  Temperature = 26.812 Задержка в микросекундах - 13683
  Temperature = 26.750 Задержка в микросекундах - 13679
  Temperature = 26.687 Задержка в микросекундах - 13676
  Temperature = 26.687 Задержка в микросекундах - 13683
  Temperature = 26.687 Задержка в микросекундах - 13676
  Temperature = 26.687 Задержка в микросекундах - 13679
  Temperature = 26.625 Задержка в микросекундах - 13680
  Temperature = 26.562 Задержка в микросекундах - 13683
  Temperature = 26.562 Задержка в микросекундах - 13679
  Temperature = 26.562 Задержка в микросекундах - 13679
  Temperature = 26.562 Задержка в микросекундах - 13680
  Temperature = 26.500 Задержка в микросекундах - 13679
  Temperature = 26.500 Задержка в микросекундах - 13679
  Temperature = 26.500 Задержка в микросекундах - 13683
  Temperature = 26.437 Задержка в микросекундах - 13679
  Temperature = 26.437 Задержка в микросекундах - 13679
  Temperature = 26.437 Задержка в микросекундах - 13679
  Temperature = 26.437 Задержка в микросекундах - 13682
  Temperature = 26.375 Задержка в микросекундах - 13679
  Temperature = 26.375 Задержка в микросекундах - 13679
  Temperature = 26.375 Задержка в микросекундах - 13683
  Temperature = 26.375 Задержка в микросекундах - 13676
  Temperature = 26.312 Задержка в микросекундах - 13702
  Temperature = 26.312 Задержка в микросекундах - 13683
  Temperature = 26.250 Задержка в микросекундах - 13683
  Temperature = 26.250 Задержка в микросекундах - 13683
  Temperature = 26.250 Задержка в микросекундах - 13679
  Temperature = 26.250 Задержка в микросекундах - 13683
  Temperature = 26.250 Задержка в микросекундах - 13675
  Temperature = 26.187 Задержка в микросекундах - 13679
  Temperature = 26.187 Задержка в микросекундах - 13680
  Temperature = 26.187 Задержка в микросекундах - 13683
  Temperature = 26.187 Задержка в микросекундах - 13676
  Temperature = 26.125 Задержка в микросекундах - 13676
  Temperature = 26.125 Задержка в микросекундах - 13681
  Temperature = 26.125 Задержка в микросекундах - 13679
  Temperature = 26.125 Задержка в микросекундах - 13679
  Temperature = 26.062 Задержка в микросекундах - 13680
  Temperature = 26.062 Задержка в микросекундах - 13676
  Temperature = 26.062 Задержка в микросекундах - 13679
  Temperature = 26.062 Задержка в микросекундах - 13676
  Temperature = 26.062 Задержка в микросекундах - 13679
  Temperature = 26.000 Задержка в микросекундах - 13679
  Temperature = 26.000 Задержка в микросекундах - 13679
  Temperature = 26.000 Задержка в микросекундах - 13683
  Temperature = 26.000 Задержка в микросекундах - 13679
  Temperature = 26.000 Задержка в микросекундах - 13675
  Temperature = 26.000 Задержка в микросекундах - 13679
  Temperature = 25.937 Задержка в микросекундах - 13683
  Temperature = 25.937 Задержка в микросекундах - 13679
  Temperature = 25.937 Задержка в микросекундах - 13679
  Temperature = 25.937 Задержка в микросекундах - 13680
  Temperature = 25.937 Задержка в микросекундах - 13679
  Temperature = 25.937 Задержка в микросекундах - 13678
  Temperature = 25.875 Задержка в микросекундах - 13676
  Temperature = 25.875 Задержка в микросекундах - 13680
  Temperature = 25.937 Задержка в микросекундах - 13676

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

эффект по температуре  40-42 градуса имеет место быть, как в букваре сказано )))

AlexZR
Offline
Зарегистрирован: 08.02.2016

ua6em пишет:
эффект по температуре  40-42 градуса имеет место быть, как в букваре сказано )))

не знал такого, у меня контроль температуры в основном 25-55 градусов, больше 60 отключение, радиатор транзистора, т.е. опять что то не так, или как быть ?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexZR пишет:

ua6em пишет:
эффект по температуре  40-42 градуса имеет место быть, как в букваре сказано )))

не знал такого, у меня контроль температуры в основном 25-55 градусов, больше 60 отключение, радиатор транзистора, т.е. опять что то не так, или как быть ?

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

у тебя есть возможность потестировать и выложить результаты тестов )))

AlexZR
Offline
Зарегистрирован: 08.02.2016

ua6em пишет:
так я его перегрел, там в выводе видно, компьютеры как испытывают после сборки, в термокамеру на сутки, то, что диагностика показывает, что посыпалось - меняют и тестируют далее, 40-42 это особенная температура, если не перегревать думаю должен работать нормально...

у тебя есть возможность потестировать и выложить результаты тестов )))

хорошо, я понял, спасибо!

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

ua6em пишет:

sadman41 пишет:

А, ну точно: 

SCRATCHPAD (POWER-UP STATE)

BYTE 5 - RESERVED (FFh)
BYTE 7 - RESERVED (10h)

Т.е. если весь скрэчпад в нулях приехал, значит шина упала на землю.

расчёт температуры из поста #222

    temp = (data[1] << 8) | data[0]; // Переводим в температуру
    if (data[7] == 0x10) temp = (temp & 0xFFF0) + 12 - data[6];

 

Это типа 'Спакойно, проверка конечно есть' ? И шо, помогает?

Спасибо, поржал. 

AlexZR
Offline
Зарегистрирован: 08.02.2016

упростил до минимума, наверное, работает )))

#include <OneWire.h>
OneWire ds(4);
int16_t temperature;
unsigned long lastUpdateTime;
unsigned long timing;

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

void loop() {
  if (millis() - timing > 2000) {
    timing = millis();
    detectTemperature();
    Serial.println(temperature);
  }
}

int detectTemperature() {
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  if (millis() - lastUpdateTime > 1500) {
    lastUpdateTime = millis();
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    data[0] = ds.read();
    data[1] = ds.read();
    temperature = (data[1] << 8) + data[0]; temperature = temperature >> 4;
  }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

temperature обьяви как int8_t, тогда вместо всего, что науеверчено в 31 строке можно написать

temperature = (data[1] << 4) | (data[0] >> 4);

Ну и, хорошо бы читать весь scrachpad, и считать контрольную сумму, для достоверности, тем более, что для этого даже напрягацца не надо, у OneWire есть для этого спицальная static функция

	bool ReadData(void) {

		FOneWire->reset();
		FOneWire->write(CMD_SKIP_ROM);
		FOneWire->write(CMD_READ_RAM);
		FOneWire->read_bytes(FDallasMemory, DALLAS_MEMORY_SIZE); // читаем ВСЮ память даччика
		FOneWire->reset();
		startConversion(); // после сразу запускаем конверсию для след. считывания

		uint8_t crc = OneWire::crc8(FDallasMemory, DALLAS_MEMORY_SIZE - 1); // CRC вычисленная

		return (crc == FDallasMemory[DALLAS_MEMORY_SIZE - 1]); // сравнивается с прочитанной
	}

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Дет, црц - это заибок, а есть ли там фича, шо даччик апосля ресета или инита ответил на шину?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

-NMi- пишет:

Дет, црц - это заибок, а есть ли там фича, шо даччик апосля ресета или инита ответил на шину?

Столь далеко мои компетенции не простираюца. 

AlexZR
Offline
Зарегистрирован: 08.02.2016

DetSimen пишет:
temperature обьяви как int8_t, тогда вместо всего, что науеверчено в 31 строке можно написать

temperature = (data[1] << 4) | (data[0] >> 4);

благодарю! изменил, переменную объявил как uint8_t, код уменьшился до 2 кб! не критично, но приятно ))) а вот код для проверки контрольной суммы куда вставить, мне не понятно, не программист я (((

-NMi-
Offline
Зарегистрирован: 20.08.2018

DetSimen пишет:

Столь далеко мои компетенции не простираюца. 

Вот в этом то и весь прикол, шо если нога отвалицца и будут нули - будет ноль. Можешь сам проверить, есть жеж даччики с дунькой)))    А вот ежли пользоваццо правилом шины адын_провад , то после каждого инита устройство ОБЯЗАНО прижать шину на NNN времени. Можш папробовать, если_ниверишш)))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

-NMi- пишет:

Вот в этом то и весь прикол, шо если нога отвалицца и будут нули - будет ноль. Можешь сам проверить

Проверяю я наличие даччика только 1 раз, при старте

	bool CheckDevicePresent(void) {
		if (FOneWire == NULL) return false;

		FOneWire->reset();
		FOneWire->write(CMD_READ_ID);

		uint8_t id = FOneWire->read();
		
		FOneWire->reset();
		
		return (id == ID_DS18B20);
	}

	void init(void) override {
		FSensorState = enSensorState::Normal;
		
		if (CheckDevicePresent()) {
			SetResolution(T18B20Resolution::Res12bit);
			startConversion();
		}
		else {	
			Error(err_DeviceNotFound);
			FSensorState = enSensorState::Error;
		}
	}

Что будет, если ему во время работы ногу оторвать, проверю вечером (если протрезвею к тому времени). Ненавижу НГ, после него обмен веществ без олкаголя вапще не идёт. :(

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

AlexZR пишет:

не программист я (((

Я тоже.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

-NMi- пишет:

Дет, црц - это заибок, а есть ли там фича, шо даччик апосля ресета или инита ответил на шину?

Столь далеко мои компетенции не простираюца. 

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