Подключение к одному каналу 8-ми и более NTC-резисторов используя PCF8574

JohnD
Offline
Зарегистрирован: 04.11.2017

Может кому полезно будет

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

и учитывая что DS18B20 стоит от 35 руб/шт. (впрок не затаришься)

Потребуется:

NTC 10к - можно купить по 2 руб/шт. оптом кучку

PCF8574 - примерно за 20 руб/шт. оптом

полевые транзисторы типа PNP с низким сопротивлением перехода встречаются нечасто, ну например A3401, можно реверсировать схему и переделать на NPN - которых полно везде, но придется переворачивать формулы, что при желании можно осуществить.

A3401 - по несколько рублей оптом кучкой

резисторы, возможно конденсаторы и стабилизаторы не считаю

Суть: поочередно подключается соответствующий NTC к одному аналоговому каналу,

подключением управляет PCF8574 с полевиками

схемка отработана на макетке на 4 канала

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

скетч

 

JohnD
Offline
Зарегистрирован: 04.11.2017
// не забываем устновить перемычки на PCF8574 A0, A1, A2 к VCC или GND и резисторы на SCL и SDA, без них работать не будет
#include <math.h>
#include <PCF8574.h>
PCF8574 expander1; // порты вывода управляют базами полевиков PNP

float led=0; //состояние светодиода для наблюдения что программа работает
unsigned long ThermoTime=0; // счетчик времени измерения темпеартуры
unsigned long PrintTime=0; // счетчик времени вывода 
int i=0; //счетчик
int temp_ch = 0; // канал опроса NTC
double temp_val; // текущая темпертаура
float PCF_out[8] = {0,1,1,1,1,1,1,1}; // начальные значения выходов, включен первый канал для PNP
double temp[8] = {-11,-11,-11,-11,-11,-11,-11,-11}; // значения температур, начальные для контроля
void setup()
{
  pinMode(13, OUTPUT);
  pinMode(0, INPUT);
  expander1.begin(0x20); // порты вывода, перемычки (GND,GND,GND)
    i=0;
    while (i<8) { 
      expander1.pinMode(i, OUTPUT); // порт задаем как вывод 
      expander1.digitalWrite(i, PCF_out[i]); // задаем текущие значения выходов
      i++;
    }   
    PCF_sw();
  Serial.begin(9600);      // открываем COM-порт
}
 
void loop()
{
      if (millis()-ThermoTime >= 200) { // выполнение с интервалом времени - указанное милисек
            PCF_sw();     
            in_temp();
            ch_sw();
            if (led==0) led=1; else led=0;
            digitalWrite(13, led);
            ThermoTime=millis();
      }
      if (millis()-PrintTime >= 5000) { // выполнение с интервалом времени - указанное милисек
            print_temp();
            PrintTime= millis();    
      }
}
           
//----------------процедуры
//-------------------------
void ch_sw(){ // переключение текущего канала вправо в массиве
     i=7;
    while (i>=0) { 
      if (PCF_out[i]==0) {
        PCF_out[i]=1;
        if (i<7) {PCF_out[i+1]=0;} else {PCF_out[0]=0;}
       }
        i=i-1;
    }  
    
}

//-------------------------
void PCF_sw(){ // переключение выхода микросхемы 8574
    i=0;
    while (i<8) { 
      expander1.digitalWrite(i, PCF_out[i]); // задаем текущие значения выходов
      i++;
    }   
}
//-------------------------
void in_temp(){ // измерение температуры текущего канала
    i=0;
    while (i<8) { 
        if (PCF_out[i]==0) {
            temp_val=analogRead(temp_ch); //пока значение резистора NTC
            temp_val = log(((10240000/temp_val) - 10000));
            temp_val = 1 / (0.001129148 + (0.000234125 * temp_val) + (0.0000000876741 * temp_val * temp_val * temp_val));
            temp_val = temp_val - 273.15;  
            temp[i] = temp_val;
        }
      i++;
    }   
}
//------------------------- 
void print_temp(){  // вывод в COM-порт
      i=0;
    while (i<8) { 
      Serial.print(i);
      Serial.print(":");
      Serial.print(PCF_out[i],0);
      Serial.print(":");
      Serial.print(temp[i]);
      Serial.print(";   ");
      i++;
    } 
    Serial.println();  
}
//------------------------- 

Выдача на COM-порт с подключенных 4-х резисторов, при их сопротивлении 10к, 5.1к, 3к, 1.6к:

чувствуются скачки стабилизатора напряжения

0:1:24.82;   1:1:39.55;   2:1:54.76;   3:0:72.73;   4:1:-273.15;   5:1:-273.15;   6:1:-273.15;   7:1:-273.15;   
0:1:24.82;   1:1:39.55;   2:1:55.21;   3:1:72.73;   4:1:-273.15;   5:1:-273.15;   6:1:-273.15;   7:0:-273.15;  

Выдача на COM-порт с подключенных 4-х NTP-резисторов, расположенных на растоянии 1 см друг от друга, номинальным сопротивлением 10к:

0:1:17.79;   1:1:17.53;   2:1:17.44;   3:1:17.53;   4:0:-273.15; 5:1:-273.15;   6:1:-273.15;   7:1:-273.15; 

 

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

ТАЛАНТИЩЕ!!!

Pyotr
Offline
Зарегистрирован: 12.03.2014

Если есть свободные цифровые пины и нет аналоговых, то верхние выводы NTC можно подключить к ним, и по очереди коммутировать и читать одним аналоговым входом. Учитывать выходное сопротивление пина порядка 20 Ом. 

Это к тому, что лично мне очень не нравится паять лишние детали.

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

примите немного критики: 

1) точность получается оооочень не интересная.

2) заморочки с калибровкой

3) самое главное - пайка кучи элементов на россыпи.

это справедливо для большого количества датчиков, 2-3 можно просто на ноги зацепить 

JohnD
Offline
Зарегистрирован: 04.11.2017

Гриша пишет:

примите немного критики: 

 

1) точность получается оооочень не интересная.

 

2) заморочки с калибровкой

 

3) самое главное - пайка кучи элементов на россыпи.

 

это справедливо для большого количества датчиков, 2-3 можно просто на ноги зацепить 

 

1. Точность, преимущества и недостатки NTC не тема двнного топика, кого устарвает, тот использует, во множестве бытовых термостатов они прекрасно работают и устраивают для своих задач, со всеми моими задачами NTC вполне бы справился.

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

3. Попаять - тоже дело компромиса, иногда проще попаять лишний раз, каждый решает сам

Например, у меня последний проект завис на месяц, т.к. ждал DS18B20, потом на отработке макетки часть умерла, опять чуть все не зависло, а задачи стояли вполне посильные для NTC - его не убить, если бы я тогда догадался как их в кучку подключить, то прекрасно бы NTC справлялись. для меня сотню - две NTC держать в столе не проблема, в отличие от 18b20, а кому-то и 18b20 горку дежать не проблема.

Данная схема по сути превращает цифровую PCF8574 в аналоговый приемник-измеритель или др. задействуя один аналоговый канал

JohnD
Offline
Зарегистрирован: 04.11.2017

Pyotr пишет:

Если есть свободные цифровые пины и нет аналоговых, то верхние выводы NTC можно подключить к ним, и по очереди коммутировать и читать одним аналоговым входом. Учитывать выходное сопротивление пина порядка 20 Ом. 

Это к тому, что лично мне очень не нравится паять лишние детали.

чтобы уйти от корректировок этих 20Ом целесообразнее через MOSFET комутировать, у A3401- 0.052 Ом, можно и другими полевиками с сопротивлением перехода 0.0046 Ом (они подороже) затарится для подобных задач.

a5021
Offline
Зарегистрирован: 07.07.2013

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

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

Ради чего этот головняк? Ради экономии? Так дешевле 4051 использовать. И по назначению. От подобной экономии падают ракеты , рушаться дома. Кто то вместо газовых кранов поставил водяные и весь подъезд рухнул.

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

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

Извините, а где можно затариться впрок 18B20 по 35 руб?

JohnD
Offline
Зарегистрирован: 04.11.2017

inspiritus пишет:

Извините, а где можно затариться впрок 18B20 по 35 руб?

покупал тут когда еще не было доставки, сейчас добавили

 

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

Тута еще дешевле

JohnD
Offline
Зарегистрирован: 04.11.2017

a5021 пишет:

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

Сам планирую использовать для измерения температур централизовано из одного места

например частный дом, отапливается конвекторами/теплыми полами, есть подогрев скважины, есть подогрев ливневки и прочей фигни. Есть LAN-сетка по которой можно расключить (4 жилы в ней свободны)

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

JohnD
Offline
Зарегистрирован: 04.11.2017

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

Тута еще дешевле

это же аукцион

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

Этто да, на пукционе может быть и по рублю.

Хотя нашел купить сейчас - 10шт за 400 руб. Четто ценник понизился . Давно такого не встречал.

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

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

JohnD пишет:

Сам планирую использовать для измерения температур централизовано из одного места

например частный дом, отапливается конвекторами/теплыми полами, есть подогрев скважины, есть подогрев ливневки и прочей фигни. Есть LAN-сетка по которой можно расключить (4 жилы в ней свободны)

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

Ну как раз ваше "изобретение" не для таких расстояний.

JohnD
Offline
Зарегистрирован: 04.11.2017

Подключал датчик NTC через бухту 3х1.5 - работала
подключил на подогрев скважины на растоянии примерно 25 м. при этом по жиле #3 пришлось пустить нейтраль на подогрев и параллельно идет кабель насоса - глюков не обнаружено
А с витой парой пока не пробовал подружить

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

JohnD пишет:
Подключал датчик NTC через бухту 3х1.5 - работала подключил на подогрев скважины на растоянии примерно 25 м. при этом по жиле #3 пришлось пустить нейтраль на подогрев и параллельно идет кабель насоса - глюков не обнаружено А с витой парой пока не пробовал подружить

случилось мне делать подогрев, да вот беда, как определить, что контакт нормальный (не ослаб, провод не перебили, клеммы не залиты и прочее). Поставил даллас и все стало проще: есть датчик или его нет.

Недавно переделывал мультиварку... почти во всех резистор обжат, а не припаян. Так этот контак со временем ослаб и сопротивление перехода стало значительным + закреплен на подвижной контактной площадке из-за чего сопротивление перехода рандомно менялось. Добавим воздейстие температуры на контакт и получим ...........

в общем я 100 раз подумаю где и как использовать термосопротиления против 18В20. ИМХО

однако каждый волен выбирать свой путь сам...

ribald
Offline
Зарегистрирован: 12.11.2017