выбор провода под датчик температуры

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 44140
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

[uquote="lecetim442",url="/forum/viewtopic.php?p=4252320#p4252320"]АлександрЛ, а мост нужно делать на стороне датчика если для него нужно 4 провода ?
СпойлерИзображение
на два активных датчика не понятно как работать с двумя ацп[/uquote]
Я бы это сделал вот так:
СпойлерИзображение
Вообще- (имхо) 10 кОм много, лучше бы 1 кОм, один из датчиков можно заменить подстроечным резистором, типа "установка нуля"
А резистор R5 "калибровка" - регулировка коэффициента усиления..

В каких пределах у вас изменяется температура? У ММТ и им подобных- какая-то дикая нелинейность.. (имхо) DS18B20 будет намного проще, дешевле и точнее, единственно, я не знаю, как он будет работать на 9-ти метровый кабель.. :dont_know:
Вложения
Датчик температуры.png
(83.53 КБ) 194 скачивания
Реклама
VNS
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1633
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Сообщение VNS »

[uquote="АлександрЛ",url="/forum/viewtopic.php?p=4252378#p4252378"]как он будет работать на 9-ти метровый кабель[/uquote]
Работает хорошо, если всё правильно сделано для защиты от помех (может работать и на более дальние расстояния).
Реклама
Друг Кота
Аватара пользователя
Сообщения: 44140
Зарегистрирован: Пн ноя 30, 2009 03:00:01
Откуда: Нерезиновая

Сообщение АлександрЛ »

Если DS18B20 подключить экранированным двухжильным (хорошим) кабелем КММ 2х0,12-
WIN_20220629_15_50_13_Pro.jpg
(75.05 КБ) 78 скачиваний
Или нужно трёхжильный кабель с экраном?
VNS
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1633
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

Сообщение VNS »

Не делал эксперименты с паразитным питанием… так как к данному способу отношусь с недоверием и считаю его ненадёжным… для малых расстояний использовать ещё можно, но экономить на жиле не считаю практичным… по этой причине трёхжильный с экраном предпочтительнее и надёжнее. Вполне можно обойтись и без экрана (на такое расстояние) при использовании витой пары (в варианте 4 пары).
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 5816
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж

Сообщение >TEHb< »

[uquote="vlasovzloy",url="/forum/viewtopic.php?p=4252270#p4252270"]Витая пара достаточно будет. На вход конденсатор запаяй и норм[/uquote]
Совершенно согласен. Никаких подстроечников и мостов не нужно, всё делается программно. В том числе и фильтр, кстати.
Усложнять просто. Упрощать сложно.
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Вт июн 28, 2022 12:31:18

Сообщение lecetim442 »

из 8 свободных пинов на есп32 работают только 4 с дс18б20
можно ли применить какойнить расширитель под них ?
там же не аналоговый сигнал вроде и CD74HC4067 не прокатит вроде

Добавлено after 3 minutes 28 seconds:
да и не цыфровой с MCP23017 не заработали
Реклама
Друг Кота
Аватара пользователя
Сообщения: 5816
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж

Сообщение >TEHb< »

На одну ногу можно повесить целую гирлянду датчиков.
Усложнять просто. Упрощать сложно.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Вт июн 28, 2022 12:31:18

Сообщение lecetim442 »

у меня автоопределение адреса датчика и гирлянда тут не прокатит с этим
Друг Кота
Аватара пользователя
Сообщения: 5816
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж

Сообщение >TEHb< »

Ну и пускай автоопределяет. Останется только запомнить в процессор где с каким номером висит датчик и дело в шляпе.
Усложнять просто. Упрощать сложно.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Вт июн 28, 2022 12:31:18

Сообщение lecetim442 »

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

Изображение

подключил так

Изображение
Спойлер

Код: Выделить всё

#include <OneWire.h>
bool EN_82749380_1;
unsigned long period_82749380_1;
float temp_82749380_1;
bool error_82749380_1;
OneWire ds_82749380_1(3);
byte data_82749380_1[9];
byte count_82749380_1;
bool brake_82749380_1;
bool crcOK_82749380_1;
unsigned long time_82749380_1;
unsigned long time_old_82749380_1;
bool EN_82749380_2;
unsigned long period_82749380_2;
float temp_82749380_2;
bool error_82749380_2;
OneWire ds_82749380_2(3);
byte data_82749380_2[9];
byte count_82749380_2;
bool brake_82749380_2;
bool crcOK_82749380_2;
unsigned long time_82749380_2;
unsigned long time_old_82749380_2;
unsigned long _stou1 = 0UL;
void setup()
{
    _startUart0();
    _stou1 = millis();
}
void loop()
{
    //Плата:1
    EN_82749380_1 = !(0);
    period_82749380_1 = 1000UL;
    if(EN_82749380_1)
    {
        if(error_82749380_1)  
        {
             period_82749380_1 = 750;
        }
         // если ошибка - частый опрос
        time_82749380_1 = millis() - time_old_82749380_1; // таймер опросов
        if (time_82749380_1>period_82749380_1)
        {
            // таймер опросов
            time_old_82749380_1 = millis(); // таймер опросов
            ds_82749380_1.reset(); //сброс шины
             ds_82749380_1.write(0xCC); //пропуск ROM
             ds_82749380_1.write(0xBE); // прочитать 9 байт из датчика
             for (byte i = 0; i < 9; i++) 
            {
                   // прочитать 9 байт из датчика
                 data_82749380_1[i] = ds_82749380_1.read();
            }
              // прочитать 9 байт из датчика
             int16_t raw = (data_82749380_1[1] << 8) | data_82749380_1[0]; // прочитать 9 байт из датчика
             temp_82749380_1 = (float)raw / 16.0; //посчитать температуру
            if (OneWire::crc8(data_82749380_1, 8) == data_82749380_1[8]) 
            {
                crcOK_82749380_1=1;
            }
             //сверка контрольной суммы
                  else 
            {
                crcOK_82749380_1=0;
                count_82749380_1=0;
            }
            ds_82749380_1.reset(); //сброс шины
             ds_82749380_1.write(0xCC); //пропуск ROM
             ds_82749380_1.write(0x44, 1); //запуск измерения
            if (((data_82749380_1[0] == 255) && (data_82749380_1[1] == 255) && (data_82749380_1[2] == 255) && (data_82749380_1[3] == 255) && (data_82749380_1[4] == 255) && (data_82749380_1[5] == 255) && (data_82749380_1[6] == 255) && (data_82749380_1[7] == 255) && (data_82749380_1[8] == 255))  ||   ((data_82749380_1[0] == 0) && (data_82749380_1[1] == 0) && (data_82749380_1[2] == 0) && (data_82749380_1[3] == 0) && (data_82749380_1[4] == 0) && (data_82749380_1[5] == 0) && (data_82749380_1[6] == 0) && (data_82749380_1[7] == 0) && (data_82749380_1[8] == 0)))
            {
                brake_82749380_1 = 1;
                count_82749380_1 = 0;
            }
            	else
            {
                brake_82749380_1 = 0;
            }
            if (count_82749380_1 < 4 && !brake_82749380_1 && crcOK_82749380_1) 
            {
                // если нет обрыва и контрольная сумма правильная и меньше 3х замеров увеличить счётчик на 1
                	count_82749380_1++;
                	
            }
        }
         //конец __(time_82749380_1>period_82749380_1)__
    }
// конец EN_82749380_1
    error_82749380_1 = (brake_82749380_1 || (count_82749380_1 < 3) || !crcOK_82749380_1);
    EN_82749380_2 = !(0);
    period_82749380_2 = 1000UL;
    if(EN_82749380_2)
    {
        if(error_82749380_2)  
        {
             period_82749380_2 = 750;
        }
         // если ошибка - частый опрос
        time_82749380_2 = millis() - time_old_82749380_2; // таймер опросов
        if (time_82749380_2>period_82749380_2)
        {
            // таймер опросов
            time_old_82749380_2 = millis(); // таймер опросов
            ds_82749380_2.reset(); //сброс шины
             ds_82749380_2.write(0xCC); //пропуск ROM
             ds_82749380_2.write(0xBE); // прочитать 9 байт из датчика
             for (byte i = 0; i < 9; i++) 
            {
                   // прочитать 9 байт из датчика
                 data_82749380_2[i] = ds_82749380_2.read();
            }
              // прочитать 9 байт из датчика
             int16_t raw = (data_82749380_2[1] << 8) | data_82749380_2[0]; // прочитать 9 байт из датчика
             temp_82749380_2 = (float)raw / 16.0; //посчитать температуру
            if (OneWire::crc8(data_82749380_2, 8) == data_82749380_2[8]) 
            {
                crcOK_82749380_2=1;
            }
             //сверка контрольной суммы
                  else 
            {
                crcOK_82749380_2=0;
                count_82749380_2=0;
            }
            ds_82749380_2.reset(); //сброс шины
             ds_82749380_2.write(0xCC); //пропуск ROM
             ds_82749380_2.write(0x44, 1); //запуск измерения
            if (((data_82749380_2[0] == 255) && (data_82749380_2[1] == 255) && (data_82749380_2[2] == 255) && (data_82749380_2[3] == 255) && (data_82749380_2[4] == 255) && (data_82749380_2[5] == 255) && (data_82749380_2[6] == 255) && (data_82749380_2[7] == 255) && (data_82749380_2[8] == 255))  ||   ((data_82749380_2[0] == 0) && (data_82749380_2[1] == 0) && (data_82749380_2[2] == 0) && (data_82749380_2[3] == 0) && (data_82749380_2[4] == 0) && (data_82749380_2[5] == 0) && (data_82749380_2[6] == 0) && (data_82749380_2[7] == 0) && (data_82749380_2[8] == 0)))
            {
                brake_82749380_2 = 1;
                count_82749380_2 = 0;
            }
            	else
            {
                brake_82749380_2 = 0;
            }
            if (count_82749380_2 < 4 && !brake_82749380_2 && crcOK_82749380_2) 
            {
                // если нет обрыва и контрольная сумма правильная и меньше 3х замеров увеличить счётчик на 1
                	count_82749380_2++;
                	
            }
        }
         //конец __(time_82749380_2>period_82749380_2)__
    }
// конец EN_82749380_2
    error_82749380_2 = (brake_82749380_2 || (count_82749380_2 < 3) || !crcOK_82749380_2);
    if (!(0))
    {
         if (_isTimer(_stou1, 1000)) 
        {
            Serial.println((((_floatToStringWitRaz(temp_82749380_1,2))) + (String(" // ")) + ((_floatToStringWitRaz(temp_82749380_2,2)))));
            _stou1 = millis();
        }
    }
     else 
    {
        _stou1 = millis();
    }
}
String  _floatToStringWitRaz(float value, int raz)
{
    return String(value,raz);
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
    unsigned long currentTime;
    currentTime = millis();
    if (currentTime>= startTime) 
    {
        return (currentTime>=(startTime + period));
    }
     else 
    {
        return (currentTime >=(4294967295-startTime+period));
    }
}
void _startUart0()
{
    int code= 6;
    Serial.begin(9600, (_serialModeFromInt(code)));
}
int  _serialModeFromInt(int code)
{
    switch (code) 
    {
        case 0x00: return SERIAL_5N1;
        break;
        case 0x02: return SERIAL_6N1;
        break;
        case 0x04: return SERIAL_7N1;
        break;
        case 0x06: return SERIAL_8N1;
        break;
        case 0x08: return SERIAL_5N2;
        break;
        case 0x0A: return SERIAL_6N2;
        break;
        case 0x0C: return SERIAL_7N2 ;
        break;
        case 0x0E: return SERIAL_8N2;
        break;
        case 0x20: return SERIAL_5E1;
        break;
        case 0x22: return SERIAL_6E1;
        break;
        case 0x24: return SERIAL_7E1 ;
        break;
        case 0x26: return SERIAL_8E1;
        break;
        case 0x28: return SERIAL_5E2 ;
        break;
        case 0x2A: return SERIAL_6E2;
        break;
        case 0x2C: return SERIAL_7E2;
        break;
        case 0x2E: return SERIAL_8E2;
        break;
        case 0x30: return SERIAL_5O1;
        break;
        case 0x32: return SERIAL_6O1;
        break;
        case 0x34: return SERIAL_7O1;
        break;
        case 0x36: return SERIAL_8O1;
        break;
        case 0x38: return SERIAL_5O2;
        break;
        case 0x3A: return SERIAL_6O2 ;
        break;
        case 0x3C: return SERIAL_7O2;
        break;
        case 0x3E: return SERIAL_8O2;
        break;
    }
    return SERIAL_8N1;
}
Поставщик валерьянки для Кота
Сообщения: 1925
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

Используйте другое управление. Работает. (Библиотека DS18 оч. старая).
(Вход такой же, как у вашей схемы (11). Два датчика).

Код: Выделить всё

ROM = 28 41 1D 98 A 0 0 5B
  Chip = DS18B20
  Data = 1 B4 1 4B 46 7F FF C 10 8E  CRC=8E
  Temperature = 27.25 Celsius, 81.05 Fahrenheit
------------------------------------------------
ROM = 28 3B 3A 98 A 0 0 A5
  Chip = DS18B20
  Data = 1 B5 1 4B 46 7F FF B 10 A3  CRC=A3
  Temperature = 27.31 Celsius, 81.16 Fahrenheit
------------------------------------------------
No more addresses.
Вложения
serial.jpg
(141.72 КБ) 70 скачиваний
DS18x20_Temperature.zip
(121.28 КБ) 82 скачивания
Контактная информация:
Грызет канифоль
Сообщения: 297
Зарегистрирован: Ср дек 30, 2009 09:55:39

Сообщение kolobok0 »

[uquote="VNS",url="/forum/viewtopic.php?p=4252362#p4252362"]...По поводу DS18B20… однопроводная шина, как и кабель терморезистора, одинаково "боятся" наводок… ....[/uquote]

это НЕ правда. Вы тупо не умете их готовить...

(круглый)
ЗЫ
Готовлю любой DS18xx (не паразитным питаловом) по пром зоне десятки метров В ЛЁГКУЮ... Дорого :)))
Ответить

Вернуться в «Периферия»