Погодозависимое управление котлом

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Здравствуйте, уважаемые!

Небольшая предыстория (можно пропустить):

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

Первый регулятор был собран на  PIC16F628A на тактовой частоте 32кГц. Микрочиповский си (возможно ввиду моей криворукости) работал криво. Писал на ассемблере. Соответственно - визуализации и управления минимум, но работал. Температурными датчиками выступали DS12b28.

Итак проект.

Познав ардуино я реализовал управление на ней:

1. Контроллер - ARDUINO UNO

2. Датчики температуры теплоносителя и наружней - DS12b28.

3. Управление и отображение - 16х2 ЖК дисплей с кнопками

4. Исполнительные устройства - блок 2 реле 5В. Одно реле перевод на автоматический режим, второе - управление горелкой.

Программно реализовано меню с выбором гетерезиса и наклона графика зависомости температур (пока прямая), запись адресов датчиков в ППЗУ.

Что хочется добавить - wifi модуль с индикацией и управлением по сети. Нет модуля и наю как реализовать это без статического IP, прямую зависимость сделать кривой 2 порядка (пока руки не дошли подогнать), ну и в корпус это все загнать :).

Ну и сам текст программы (кое что нарезал из чужих программ, оставив авторские комментарии):

#include <OneWire.h>  // on pin 2 (a 4.7K resistor is necessary)
#include <LiquidCrystal.h>
#include <EEPROM.h> // Библиотека

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

 OneWire  ds(2);// Датчик на порту 2
 // Нажатые кнопки

const int BUTTON_NONE   = 0;
const int BUTTON_RIGHT  = 1;
const int BUTTON_UP     = 2;
const int BUTTON_DOWN   = 3;
const int BUTTON_LEFT   = 4;
const int BUTTON_SELECT = 5;
const int Gorelka=11; //Порт горелки
const int Auto=3; //Порт включения автоматики
//const int Buzzer=11; //Порт бузера

int flagGeter = 0; //Флаг гетерезиса
int Geteresis = 5; //Гетерезис температуры изначально 5 градусов
int Grafik = 4; // Форма графика зависимости температуры теплоносителя от уличной температуры
byte addrOUT[8]; //={0x10,0x30,0xC5,0xC8,0x0,0x0,0x0,0xC3}; //Адрес наружнего датчика
byte addrIN[8]; //={0x10,0x31,0xC5,0xC8,0x0,0x0,0x0,0xF4}; // Адрес датчика теплоносителя


void setup(void) {
  Serial.begin(9600);
    lcd.begin(16, 2);
         lcd.clear();
    pinMode(Gorelka, OUTPUT);
    pinMode(Auto, OUTPUT);
//    pinMode(Buzzer, OUTPUT);
    digitalWrite(Gorelka, HIGH);
    digitalWrite(Auto, HIGH);
    Serial.println("Auto OFF");
    Serial.println("Gorelka OFF");
    for (byte i=0; i<8; i++) {
      addrIN[i] =  EEPROM.read(i);
      addrOUT[i] =  EEPROM.read(i+8);
    }
    lcd.print("kaida@ya.ru ");
    Serial.println("kaida@ya.ru ");
    //         BuzzerBeep();
}

void loop(void) {
  byte i;
//  byte present = 0;
//  byte type_s;
//  byte data[12];
//  byte* addr;


  byte addrRead1[8];
  byte addrRead2[8];
  int n;
  int k;
  float Tout;   //Уличная температура
  float Tin;   //Температура теплоносителя
 // uint8_t raw;
  int button;
  

  float Ttn=0.; //Температура теплоносителя расчетная

  
  int intTout1;
  int intTout2;
  int intTin1;
  int intTin2;
     
// Поиск датчиков в линии и считывание их номеров
          for( i = 0; i < 8; i++) {
// Обнуляем
            addrRead1[i]=0x0;
            addrRead2[i]=0x0;
          }
   k=0;
   // Опрашиваем до 6 раз
   while (k<6){
   n=0;
   ds.reset();
    if (ds.search(addrRead1)){
      n++;
//      Serial.print("ROM1 ");
          for( i = 0; i < 8; i++) {
//            Serial.print(' ');
//            Serial.print(addrRead1[i], HEX);
          }
//  Serial.println("");
      delay(250);
   ds.reset();
                      if (ds.search(addrRead2)){
                         n++;
//                    Serial.print("ROM2 ");
                          for( i = 0; i < 8; i++) {
//                            Serial.print(' ');
//                            Serial.print(addrRead2[i], HEX);
                          };
//                   Serial.println("");
                   ds.reset();
       
                   delay(250);
       }
    }

    //Если датчиков 2 идем дальше  
    if (n == 2)break;      
     //Если прошло 6 циклов и датчиков меньше 2, то уходим на пп ошибки
    if (k == 5) {
      intTout1 = 0;
      intTout2 = 0;
      intTin1 = 0;
      intTin2 = 0;
     for (i=0; i<8; i++) {
      if (addrOUT[i]== addrRead1[i]) intTout1++;
      if (addrOUT[i]== addrRead2[i]) intTout2++;
      if (addrIN[i]== addrRead1[i]) intTin1++;
      if (addrIN[i]== addrRead2[i]) intTin2++;
    }
     lcd.clear();
     lcd.setCursor(0, 0);
    if ( (intTout1 == 8) ^ (intTout2 == 8)) {
    } else {
       lcd.print("ToutERR ");
//      Serial.println("Tout ERROR");
    }
    if ( (intTin1 == 8) | (intTin2 == 8)) {
    } else {
      lcd.print("TinERR");        
//      Serial.println("Tin ERROR");
    }


    SensorsError(); //Ошибка датчиков
        
        k=0; //    k=0 Обнуляем счетчик
    }
      k++; 

    ds.reset_search();   
    delay(2000); //Задержка 2 сек
   }
   
  ds.reset_search();   
  

// Температура снаруже

  Tout = Temperatura(&addrOUT[0]);
          lcd.setCursor(0, 0);
          lcd.print("Tout=");
          lcd.print(Tout);
          lcd.print("C     ");  
//  Serial.print("  Temperature OUT = ");
//  Serial.println(Tout);

// Температура теплоносителя

  Tin = Temperatura(&addrIN[0]);
          lcd.setCursor(0, 1);
          lcd.print("Tin=");
          lcd.print(Tin);
          lcd.print("C    ");    
//  Serial.print("  Temperature IN = ");
//  Serial.println(Tin); 

// Считывание кнопки выхода в меню

  if (getPressedButton() == BUTTON_UP) {
    // Остановка горелки, переход в меню
        digitalWrite(Gorelka, HIGH);
        Serial.println("Gorelka OFF");
    printMenu1();
    
    n=0;
    while (n < 1000) { //выдержка меню
      n++;
      button=getPressedButton();
      if (button == BUTTON_UP) n=1000; // выход из меню
      
      if (button == BUTTON_LEFT){
        // Изменение гетерезиса
          lcd.setCursor(0, 1);
          lcd.print("<-     ");
          lcd.print(Geteresis);
          lcd.print("      +>");
//          lcd.setCursor(7, 1);
          
          
        k=0;
        while (k <1000){
          button=getPressedButton();          
          if (button == BUTTON_UP) { // выход из подменю
            k=1000; 
            button=0;
            printMenu1();
          }
          if ((button == BUTTON_LEFT)&(Geteresis != 2)) {
            Geteresis--; //Если нажата кнопка влево и гетерезис не равен 2 градусам уменьшаем его
          lcd.setCursor(7, 1);
          lcd.print(Geteresis);
          k=0; // Обнуляем время
            }
          if ((button == BUTTON_RIGHT)&(Geteresis != 9)) {
            Geteresis++; //Если нажата кнопка вправо и гетерезис не равен 9 градусам увеличиваем его
          lcd.setCursor(7, 1);
          lcd.print(Geteresis);
          k=0; // Обнуляем время
            }
          delay (5);
     
          }
          printMenu1(); 
        }

        if (button == BUTTON_RIGHT){
        // Изменение графика
          lcd.setCursor(0, 1);
          lcd.print("<-     ");
          lcd.print(Grafik);
          lcd.print("      +>");
        k=0;
        while (k <1000){
          button = getPressedButton();
          if (button == BUTTON_UP){ 
            k=1000; // выход из подменю
            button=0;
            printMenu1();
          }
          if ((button == BUTTON_LEFT)&(Grafik != 0)) {
            Grafik--; //Если нажата кнопка влево и гетерезис не равен 0 уменьшаем его
            lcd.setCursor(7, 1);
            lcd.print(Grafik);
            k=0; // Обнуляем время
          }
          if ((button == BUTTON_RIGHT)&(Grafik != 7)) {
            Grafik++; //Если нажата кнопка вправо и гетерезис не равен 7 увеличиваем его
            lcd.setCursor(7, 1);
            lcd.print(Grafik);
            k=0; // Обнуляем время
          }
          delay (5);            
          }
          printMenu1();
        }
       delay (5);      
      }
    if (n == 1000) lcd.clear(); 
    }

// Управление горелкой
    digitalWrite(Auto, LOW); //Включаем автоматику
      Serial.println("AUTO");
    
  //Рассчет температуры теплоносителя линейные графики
  switch (Grafik){
    case 0:
      Ttn=57.-0.8*Tout;
      break;
    case 1:
      Ttn=50.-Tout;
      break;
    case 2:
      Ttn=43.-1.2*Tout;
      break;      
    case 4:
      Ttn=36.-1.4*Tout;
      break;
    case 5:
      Ttn=29.-1.6*Tout;
      break;
    case 6:
      Ttn=22.-1.8*Tout;
      break;
    case 7:
      Ttn=15.-2.*Tout;
      break;
  }
  if (Ttn > 85.) Ttn = 85.; //Ограничиваем 85С сверху
  if (Ttn < 25.) Ttn = 25.; //Ограничиваем 25С снизу 
//        Serial.print("Ttn=");
//             Serial.println(Ttn);
 
   // Управляем горелкой
   
    if (flagGeter == 1) {

      if (Tin >= (Ttn - (float)Geteresis)) {
          digitalWrite(Gorelka, HIGH); // Если температура теплоносителя больше т-ры с гетерезисом отключаем горелку
         Serial.println("Gorelka OFF");
        } else {
          digitalWrite(Gorelka, LOW); //Иначе Включаем горелку
          Serial.println("Gorelka ON");
          flagGeter = 0; // Снимаем флаг гетерезиса
        }
    } else {
      if (Tin <= Ttn) {
          digitalWrite(Gorelka, LOW); //Если температура теплоносителя меньше расчетной температура Включаем горелку
          Serial.println("Gorelka ON");        
      } else {
          digitalWrite(Gorelka, HIGH); // Иначе отключаем горелку
          Serial.println("Gorelka OFF");
          flagGeter = 1; // Ставим флаг гетерезиса       
      }
    }
}

//Считывание температуры по адресу датчика и проверка контрольной суммы
float Temperatura(byte* addr){
//  byte data;
  byte i;
//  byte present=0x0;
  int16_t raw;
  byte data[12];
//  float Tt;
//  float a=1.;

  for (int k=0; k<6; k++){
      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.
   
  ds.reset();
  ds.select(addr); 
  ds.write(0xBE);         // Read Scratchpad
   for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    }
  if (OneWire::crc8(data, 8) == data[8]) { // Проверка контрольной суммы
  raw = (data[1] << 8) | data[0];
//    raw = raw << 3; // 9 bit resolution default
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
     

  return (float)raw / 16.0;
  }
  delay(500);
  
  }
     lcd.clear();
     lcd.setCursor(0, 0);
     lcd.print("CRC ERROR");
     SensorsError(); 
     return 0;
  
}

// ПП ошибки датчиков с возможностью записи адресов датчиков в EEPROM
void SensorsError() {
  byte addrRead[8];
  int button;
  byte i;
  digitalWrite(Auto, HIGH); //Отключаем автоматику
    Serial.println("Auto OFF");
    lcd.setCursor(0, 1);
    lcd.print("     SETUP");
while(1){

  if (getPressedButton() == BUTTON_UP) { //Будем искать датчик и прописывать его в EEPROM
//  Serial.println("buttonUP");
         if (ds.search(addrRead)){
             lcd.clear();
             lcd.setCursor(1, 0);
             lcd.print("<-IN      OUT->");
             while(1){
             button = getPressedButton();           

             if(button == BUTTON_LEFT){
              // Записываем в EEPROM адрес наружного датчика
              for (i=0; i < 8; i++) EEPROM.write(i, addrRead[i]);
             lcd.setCursor(1, 0);
             lcd.print("<-IN   OK       ");
             delay (2000);
             break;
              }
 
             if(button == BUTTON_RIGHT){
             // Записываем в EEPROM адрес внутреннего датчика             
              for (i=0; i < 8; i++) EEPROM.write(i+8, addrRead[i]); 
             lcd.setCursor(1, 0);
             lcd.print("      OK  OUT->");
             delay (2000);
             break;             
              }
             }

         }
            lcd.setCursor(0, 1);
            lcd.print("     SETUP");
 //           Serial.println("SETUP");
    }
  }
}

  
  //ПП Считывание нажатия клавиш
  int getPressedButton() {
  int button;
  int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0) 
  if (buttonValue > 1000) {
    return BUTTON_NONE;
  }
  else if (buttonValue < 100) {
    button = BUTTON_RIGHT;  
  }
  else if (buttonValue < 200) {
    button = BUTTON_UP;
  }
  else if (buttonValue < 400){
    button = BUTTON_DOWN;
  }
  else if (buttonValue < 600){
    button = BUTTON_LEFT;
  }
  else if (buttonValue < 800){
    button = BUTTON_SELECT;
  }else {
    return BUTTON_NONE;
  }
  //         BuzzerBeep();
  while (analogRead(0)<1000);
//  Serial.println(button);

  return button;
}
//Печать меню
void printMenu1(){
    lcd.setCursor(0, 0);
    lcd.print("       EXIT     ");
    lcd.setCursor(0, 1);
    lcd.print("<-Geter Grafik->");
}

 

constantinoff
Offline
Зарегистрирован: 27.12.2015

Привет. У меня похожая ситуация. Пока работает на 3 реле sonoff. А мне хочется реализовать погодазависимый. Итого у меня есть котел газовый который может быть только включен или выключен.

constantinoff
Offline
Зарегистрирован: 27.12.2015

хочу построить погодазависимый модуль управления котлом на базе ардуино уно с 3мя датчиками температуры. 1 датчик на улице, второй в помещении, а третий в котле. У котла есть только два положения "вкл" и "выкл" необходимо собирая данные с датчиков пользуясь кривыми гестерезиса (необходимо иметь первоначальную установку коэфицента "утепленности дома") поддерживать температуру теплоносителя, для того что бы в доме была заданная температура. что бы температура в " трубе" менялась относительно температуры на улице для поддержания заданой температуры в помещении.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Здравствуйте, Я пока отказался от датчика на улице - при постоянной работе отопления он оказался не нужен. Регулирование температуры теплоносителя осуществляется по заданной температуре в помещении по PID алгоритму, хотя я использую из него только пропорциональную составляющую. Очень уж неторопливы процессы нагрева и охлаждения дома. Последняя версия программы пока обкатана только на протеусе. Посмотрите - может даст что-то к идеям. Я не использую прерываний, вместо них есть переменные, отвечающие за отсчет секунд - неторопливые процессы.

//ver. 3
#include <OneWire.h>  // on pin 2 (поставлен 4.7K)
#include <LiquidCrystal.h>
#include <EEPROM.h> 

#define NoSensors 0
#define ErrCRC 1
#define ErrSensors 2
#define BUTTON_NONE 0
#define BUTTON_RIGHT 1
#define BUTTON_UP 2
#define BUTTON_DOWN 3
#define BUTTON_LEFT 4
#define BUTTON_SELECT 5
//******************** Минимальная и максимальная задаваемая температура. Разница не может быть более 25,5 градусов (не влезет в EEPROM)
#define TinMin 5
#define TinMax 30

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

 OneWire  ds(2);// Датчик на порту 2

const int Gorelka=11; //Порт горелки используем нормально замкнутый контакт
//const int backLightPin=10; //Порт подсветки
const int Auto=3; //Порт включения автоматики
const int TimeStrobe=1000; // Время стробирования 1 секунда!!!!!!!
//const int Buzzer=10; //Порт бузера

boolean flagNagrev; //Флаг нагрева
//boolean flagAnim;
//boolean backLight;
float Geteresis = 5.; //Гетерезис температуры изначально 5 градусов
unsigned long lastMillis;
byte temperatureTnStrobe;
byte temperatureTinStrobe;
byte temperatureTnStrobeReq;
byte temperatureTinStrobeReq;
byte sensorStrobe;
//byte backLightStrobe;
float TTnset;
//byte plam;
float  Ttn;
float  Tin;
float  Tinset;
float Kp=5.; //Коэффициент к пропорциональной составляющей


byte addrIn[8]; //={0x10,0x31,0xC5,0xC8,0x0,0x0,0x0,0xF4}; // Адрес датчика в доме
byte addrTn[8]; //={0x10,0x31,0xC5,0xC8,0x0,0x0,0x0,0xF4}; // Адрес датчика теплоносителя

void setup(void) {
  Serial.begin(9600);
//  ************************** Считываем предыдущую уставку температуры в доме***********************************************
    Serial.println("EEPROM");
    Tinset=((((float)EEPROM.read(0))/10.)+TinMin);
    if (Tinset>TinMax) {
      Tinset=23.;
      EEPROM.write(0,TtoByte(Tinset));
    }
// *************************** Считываем адреса датчиков ***********************************************************************
     for (byte i=0; i<8; i++) {
      addrIn[i] =  EEPROM.read(i+1);
      addrTn[i] =  EEPROM.read(i+9);
    }
// **************************** подготовка экрана    *******************
    lcd.begin(16, 2);
    lcd.clear();
// ***************************** подготовка портов   ****************
    pinMode(Gorelka, OUTPUT);
    pinMode(Auto, OUTPUT);
    digitalWrite(Gorelka, HIGH);
    digitalWrite(Auto, HIGH);
    Serial.println("Auto OFF");
    Serial.println("Gorelka OFF");

    
//**************Серьезная проверка датчиков, включая проверку адресов. Отсюда, если подключен только один датчик переходим к записи датчиков
    Serial.println("Sensors check ");
    lcd.setCursor(0,0);
    lcd.print("Sensors check ");
    byte k;
    byte i;
    byte addrTemp1[8];
    byte addrTemp2[8];
    byte sens;
    k=0;
      
   while (k<6){    // Опрашиваем до 6 раз
    sens=0;
    ds.reset();
    if (ds.search(addrTemp1)) sens++;
    delay(250);
    ds.reset();
    if (ds.search(addrTemp2)) sens++;      
    if (sens==2) break; //Если 2 датчика есть выходим 
    delay(2000); //Задержка 2 сек    
    k++; 
    ds.reset_search(); //Обнуляем опрос датчиков 
   }
    Serial.println(sens);   
  if (sens==0) SensorsError(NoSensors); //Не обнаружено ни одного датчика
  
  byte sensIn;
  byte sensTn;
  sensIn=0;
  sensTn=0;
  for (i=0; i<8; i++){  //Проверка адресов
    if ((addrIn[i]== addrTemp1[i])||(addrIn[i]== addrTemp2[i])) sensIn++;
    if ((addrTn[i]== addrTemp1[i])||(addrTn[i]== addrTemp2[i])) sensTn++;

  }
  if ((sensIn+sensTn+sens) != 18){ // 8+8+2
    if (sensIn != 8){
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("Sensor IN error");
              Serial.println("Sensor IN error");
              Serial.println(sens);
          if (sens==1){
            Serial.println("EEPROM");
            SensorToEEPROM();
          } else SensorsError(ErrSensors);
    }
    if (sensTn != 8){
          lcd.clear();
          lcd.setCursor(0,0);
          lcd.print("Sensor TN error");
          if (sens==1){
            SensorToEEPROM();
          } else SensorsError(ErrSensors);
    }
  }
  lcd.print("OK");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
    lcd.print("START....");
//************************************************************ считывание и выдача на дисплей температур
      TemperaturaReq(&addrTn[0]);
      delay(1000); //Задержка 1 сек
      Ttn = TemperaturaRead(&addrTn[0]);
      delay(200); //Задержка 0,2 сек
      TemperaturaReq(&addrIn[0]);
      delay(1000); //Задержка 1 сек
      Tin = TemperaturaRead(&addrIn[0]);

    lcd.clear();   
    lcd.setCursor(0,0);
    lcd.print("Tin =");
    lcd.print(Tin, 1);
    lcd.print("C"); 
    lcd.setCursor(0,1);
    lcd.print("Tset=");
    lcd.print(Tinset, 1);
    lcd.print("C");    
//      Serial.println(Ttn);
    lastMillis=millis();
    temperatureTnStrobe=0;
    temperatureTinStrobe=0;
    temperatureTnStrobeReq=0;
    temperatureTinStrobeReq=0;
    sensorStrobe=0;
    flagNagrev=false;


    digitalWrite(Auto, LOW); //Включаем автоматику 
    lcd.setCursor(15,1);
    lcd.print("A");
    TTnset=Ttn;
 }

void loop(void) {
// ***************Стробирование
  if ((millis()-lastMillis)>= TimeStrobe) { //стробируем раз в секунду
    lastMillis=millis();
    temperatureTnStrobe++;
    temperatureTinStrobe++;
    temperatureTnStrobeReq++;
    temperatureTinStrobeReq++;
    sensorStrobe=0; //++;
//    backLightStrobe++;
  }

// *************Считывание кнопки и установка температуры

  switch (getPressedButton()){
    case BUTTON_UP:
      Tinset+=0.1; //увеличение температуры на 0,1 градус
      if (Tinset>TinMax) Tinset=TinMax;
      lcdPrintTset(Tinset);
      EEPROM.write(0,TtoByte(Tinset));
      break;
    case BUTTON_DOWN:
      Tinset-=0.1; //уменьшение температуры на 0,1 градус
      if (Tinset<TinMin) Tinset=TinMin;
      lcdPrintTset(Tinset);
      EEPROM.write(0,TtoByte(Tinset));
      break;
    case BUTTON_RIGHT:
      Tinset++; //увеличение температуры на 1 градус
      if (Tinset>TinMax) Tinset=TinMax;
      lcdPrintTset(Tinset);
      EEPROM.write(0,TtoByte(Tinset));
      break;
    case BUTTON_LEFT:
      Tinset--; //уменьшение температуры на 1 градус
      if (Tinset<TinMin) Tinset=TinMin;
      lcdPrintTset(Tinset);
      EEPROM.write(0,TtoByte(Tinset));
      break; 
      
  }
//****************Запрос температуры теплоносителя
  if (flagNagrev){   // Если горит
    if (temperatureTnStrobeReq==4){
      temperatureTnStrobeReq=0;
      TemperaturaReq(&addrTn[0]); //деланм каждые 4 секунды
    }
 } else { // Если не горит
    if (temperatureTnStrobeReq==19){
      temperatureTnStrobeReq=0;
      TemperaturaReq(&addrTn[0]); //деланм каждые 19 секунд
    }
}
// *************Управление горелкой
  
  if (flagNagrev){   // Если горит
    if (temperatureTnStrobe==5){ //Смотрим каждые 5 секунд
      temperatureTnStrobe=0;
      temperatureTnStrobeReq=0;
                        Serial.println("GORELK ON");
      Ttn = TemperaturaRead(&addrTn[0]);
        if (Ttn>=TTnset) {
        digitalWrite(Gorelka, HIGH); //Выключаем горелку
        flagNagrev=false;

      }
    }
  } else{   //Если не горит
     if (temperatureTnStrobe==20){ //Смотрим каждые 20 секунд
                  Serial.println("GORELK OFF");
      temperatureTnStrobe=0;
      temperatureTnStrobeReq=0;
      Ttn = TemperaturaRead(&addrTn[0]);
      if ( Ttn <=(TTnset-Geteresis)) {
        digitalWrite(Gorelka, LOW); //Включаем горелку
        flagNagrev=true;
      }    
     } 
  }

//*******************Проверка наличиz датчиков
  if (sensorStrobe==240){ //Проверяем наличие датчиков каждые 240 секунд
    sensorStrobe=0;
    if(!datchikEnable()) SensorsError(ErrSensors); //проверяем наличие датчика
  }
//  ************************** Проверяем температуру в доме каждые 120 секунд и вычисляем температуру теплоносителя
     if (temperatureTinStrobeReq==119){
      temperatureTinStrobeReq=0;
      TemperaturaReq(&addrIn[0]); //Запрос температуры на 119 секунде
     }

     if (temperatureTinStrobe==120){ 
//        TinLast = Tin; //Задел на будущее
        Tin = TemperaturaRead(&addrIn[0]);
        lcd.setCursor(0,0);
        lcd.print("Tin =");
        lcd.print(Tin, 1);
        TTnset += Kp*(Tinset-Tin);
        if(TTnset>80)TTnset=80;
        temperatureTinStrobe=0;
        temperatureTinStrobeReq=0;
             Serial.print("TTnset=");     
            Serial.println(TTnset);
      }
}

//*****************************************Запрос температуры по адресу датчика
float TemperaturaReq(byte* addr){
      ds.reset();
      ds.select(addr);      //Выбор датчика
      ds.write(0x44);        // Запуск преобразования температуры
}   

//*****************************************Чтение температуры по адресу датчика и проверка контрольной суммы
 float TemperaturaRead(byte* addr){ 
  //  byte data;
  byte i;
//  byte present=0x0;
  int16_t raw;
  byte data[12];
//  float Tt;
//  float a=1.;

  for (int k=0; k<6; k++){   
  ds.reset();
  ds.select(addr); 
  ds.write(0xBE);         // Чтение 9 байт с датчика
   for ( i = 0; i < 9; i++) {           // 0 и 1 температура, 8 - контрольная сумма
    data[i] = ds.read();
    }
  if (OneWire::crc8(data, 8) == data[8]) { // Проверка контрольной суммы
  raw = (data[1] << 8) | data[0];

     

  return (float)(raw / 16.0);
  }
  delay(500);
  
  }

     SensorsError(ErrCRC);
     return 0;
  
}
// ***********************ПП ошибки датчиков **************************
void SensorsError(byte err) {
  
    digitalWrite(Auto, HIGH); //Отключаем автоматику
    lcd.setCursor(15,1);
    lcd.print(" ");
    switch (err) {
      case NoSensors:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("No sensors");
        break; 
      case ErrCRC:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("CRC error");  
        break;   
      case ErrSensors:
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Error sensors");  
        break;              
    }
    Serial.println("ERROR");
    while (true); //затыкаемся здесь
       
}

  
  //**********************************ПП Считывание нажатия клавиш************************************
  int getPressedButton() {
  int button;
  int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0) 
//  Serial.println(buttonValue);
  if (buttonValue > 1000) {
    return BUTTON_NONE;
  }
  else if (buttonValue < 100) {
    button = BUTTON_RIGHT;  
  }
  else if (buttonValue < 200) {
    button = BUTTON_UP;
  }
  else if (buttonValue < 400){
    button = BUTTON_DOWN;
  }
  else if (buttonValue < 600){
    button = BUTTON_LEFT;
  }
  else if (buttonValue < 800){
    button = BUTTON_SELECT;
  }else {
    return BUTTON_NONE;
  }
  //         BuzzerBeep();
  while (analogRead(0)<1000);
  Serial.println(button);

  return button;
}

//*******************************пп проверки наличая датчика********************************************

boolean datchikEnable(){
    int k;
    byte i;
    byte addrTemp[8];
    k=0;
      
   while (k<6){    // Опрашиваем до 6 раз
    i=0;
    ds.reset();
    if (ds.search(addrTemp)) i++;
    delay(250);
    ds.reset();
    if (ds.search(addrTemp)) i++;      
    if (i==2) break; //Если 2 датчика есть выходим 
    delay(500); //Задержка 2 сек    
    k++; 
    ds.reset_search(); //Обнуляем опрос датчиков 
   }
  if (k >= 5){
    return false; //отсутствует датчик
  } else {
    return true;
  }

}

//****************************** Вывод на экран Tset*******************
void lcdPrintTset(float Tt){
  lcd.setCursor(0,1);
  lcd.print("Tset=");
  lcd.print(Tt);
  lcd.print("C");       
}

//*********************** Запись адреса датчика в EEPROM
void SensorToEEPROM(){
    int k;
    byte i;
    int n; //Начальный адрес EEPROM
    byte addrTemp[8];
    k=0;
   
   while (k<6){    // Опрашиваем до 6 раз
    i=0;
    ds.reset();
    if (ds.search(addrTemp)) i++;
    delay(250);
    ds.reset();
    if (ds.search(addrTemp)) i++;      
    if (i==1) break; //Если 1 датчик есть выходим 
    delay(500); //Задержка 0,5 сек    
    k++; 
    ds.reset_search(); //Обнуляем опрос датчиков 
   }
   if((i!=1)||(k>5)){ //Если датчик не один или отсутствует или кончилось кол-во попыток опроса - зависаем
    lcd.setCursor(0,1);
    lcd.print("ERROR");
    while(1);
   }
   lcd.setCursor(0,1);
   lcd.print("<-IN SELECT TN->");
   byte button=0;
   do{
    button=getPressedButton();
   switch (button){
    case BUTTON_RIGHT:
      n=9;
      break;
    case BUTTON_LEFT:
      n=1;
      break; 
   }
   }while((button!=BUTTON_RIGHT)&&(button!=BUTTON_LEFT));
   for (i=0; i<8;i++) EEPROM.write((n+i),addrTemp[i]);
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Connect sensors");
   lcd.setCursor(0,1);
   lcd.print("and restart...");
   while(1);
}

//*********************Преобразование температуры для записи в EEPROM
byte TtoByte(float T){
  return (byte)((T-TinMin)*10.);
}

 

constantinoff
Offline
Зарегистрирован: 27.12.2015

Объясните логику работы? Не совсем понял. У вас система работает как простой термостат? То есть подогрев включен до наступления заданной температуры, а потом отключается?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

constantinoff пишет:
Привет. У меня похожая ситуация. Пока работает на 3 реле sonoff. А мне хочется реализовать погодазависимый. Итого у меня есть котел газовый который может быть только включен или выключен.

Делал похожее соседу.
Юнкерс Евролайн.
Разрывом перемычки комнатного термостата.
После разрыва котел через 3 минуты отключал насос.
Приходилось при этом раз в 2.5 минуты
включать перемычку на пару секунд.
Чтобы он успел включить насос на очередные 3 минуты, но не успел поджечь горелку.

По поводу погодозависимости....
Датчик внутри не нужен.
Регулировка температуры подачи идёт по уличной температуре.
У меня самого Cerapur со встроенным погодником,
график настроил лет 10 назад и забыл
Подхожу к котлу раз в два года для чистки конденсационного блока от серы.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

constantinoff пишет:
Объясните логику работы? Не совсем понял. У вас система работает как простой термостат? То есть подогрев включен до наступления заданной температуры, а потом отключается?

От 258 по 276 строку идет чтение внутренней температуры и в зависимости от ее разницы с заданной температурой вычисляется температура теплоносителя по пропорциональной формуле с Kp. В остальном работает как термостат по температуре теплоносителя. Циркуляционный насос работает всегда, так что температура батарей достаточно ровная. От наружней температуры отказался в связи с тем, что на график сильно влияет ветер на улице. Вводить лишние замеры счел ненужным. Тем более, что мне интереснее комфортная температура в доме. Формула расчета теплоносителя: Ттеплоносителя=Ттеплоносителя+Кр*(Тв_доме_замерянная - Тв_доме_заданная)

PavelTLT
PavelTLT аватар
Offline
Зарегистрирован: 09.02.2019

mykaida пишет:
Формула расчета теплоносителя: Ттеплоносителя=Ттеплоносителя+Кр*(Тв_доме_замерянная - Тв_доме_заданная)

Наверное, перепутали местами (Тв_доме_замерянная - Тв_доме_заданная)?

В целом - очень интересно! Уже сделал управление трехходовым клапаном смесительного узла через Arduino. Сейчас только подбираюсь к созданию алгоритма по расчету Ттеплоносителя, уже сутки собираю показания датчиков температуры (четыре в доме, один на улице, один на подаче в тёплый пол).

Какая у вас система отопления? Радиаторы? Тёплый пол? Комбинированная?

Система уже реально работает? Есть ли графики температур улица-дом?

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

PavelTLT пишет:

Наверное, перепутали местами (Тв_доме_замерянная - Тв_доме_заданная)?

Спасибо, и правда перепутал.

PavelTLT пишет:

В целом - очень интересно! Уже сделал управление трехходовым клапаном смесительного узла через Arduino. Сейчас только подбираюсь к созданию алгоритма по расчету Ттеплоносителя, уже сутки собираю показания датчиков температуры (четыре в доме, один на улице, один на подаче в тёплый пол).

Смотрел, у Вас задача, как я понял значительно глобальнее. У меня речь идет о доме с постоянным проживанием. Соответственно изменения температуры в доме не требуется. Один раз установив комфортную температуру надо только ее поддерживать. Резких бросков температуры быть не может, соответственно и наружняя температура мне без надобности - отрегулирую ситуационно по внутренней температуре. Другое дело, если Вы хотите выровнять температуру по дому, но и тогда можно найти наиболее холодное помещение, по нему считать температуру теплоносителя, а остальные помещения регулировать клапанами, опять же вычисляя для них температуру теплоносителя.

PavelTLT пишет:

Какая у вас система отопления? Радиаторы? Тёплый пол? Комбинированная?

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

PavelTLT пишет:

Система уже реально работает? Есть ли графики температур улица-дом?

Система пока не работает - ловлю блох в протеусе. График строить не буду по указанным выше причинам. Интересно будет посмотреть Вашу реализацию проекта. Кстати - а зачем Вы датчики раскидали на разные порты?

PavelTLT
PavelTLT аватар
Offline
Зарегистрирован: 09.02.2019

mykaida пишет:
У меня речь идет о доме с постоянным проживанием. Соответственно изменения температуры в доме не требуется. Один раз установив комфортную температуру надо только ее поддерживать. Резких бросков температуры быть не может, соответственно и наружняя температура мне без надобности - отрегулирую ситуационно по внутренней температуре.

У меня тоже ПМЖ. Но у меня основное отопление - тёплый пол. Есть только один радиатор под окнами "второго света", там тёплый пол не справляется (потолок в этой комнате около 4-5 метров).

Я пока наблюдаю за графиками температур. Хочу понять как дом реагирует на изменение погоды.

Но предварительно думаю, что при похолодании (особенно резком) дом будет очень медленно реагировать (у меня каменные стены, крыша, много бетона на полу). Допустим, упала температура на десятую долю градуса - контроллер чуть прибавит подачу отопительной воды. А дом уже реально остывает, ему нужно было заранее прибавлять t° подачи (при похолодании или даже раньше, например, по прогнозу погоды).

Разве у вас не ожидается такого явления? Будет всё как в статьях по ПИД-регулированию - температура дома начнёт "качаться" по синусоиде. К этому времени уже придёт день с солнышком и потеплением, потом еще как-нибудь сменится погода. Пока не уверен, что П-алгоритмом можно управлять отоплением тёплого пола без резких перепадов температуры поверхности пола.

mykaida пишет:
Другое дело, если Вы хотите выровнять температуру по дому

Такой задачи пока не стоит. Несколько датчиков чисто для наблюдения пока. В процессе решу, как усреднить показания этих датчиков для получения итоговой t°дома.

mykaida пишет:
Интересно будет посмотреть Вашу реализацию проекта.

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

mykaida пишет:
Кстати - а зачем Вы датчики раскидали на разные порты?

Кабель (использую хорошую 4-х парную UTP) уже приходит с разных сторон и сходится в одно место, у щита. Можно было бы с перерасходом кабеля соединить линии, но зачем?

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

PavelTLT пишет:

Но предварительно думаю, что при похолодании (особенно резком) дом будет очень медленно реагировать (у меня каменные стены, крыша, много бетона на полу). Допустим, упала температура на десятую долю градуса - контроллер чуть прибавит подачу отопительной воды. А дом уже реально остывает, ему нужно было заранее прибавлять t° подачи (при похолодании или даже раньше, например, по прогнозу погоды).

Разве у вас не ожидается такого явления? Будет всё как в статьях по ПИД-регулированию - температура дома начнёт "качаться" по синусоиде. К этому времени уже придёт день с солнышком и потеплением, потом еще как-нибудь сменится погода. Пока не уверен, что П-алгоритмом можно управлять отоплением тёплого пола без резких перепадов температуры поверхности пола.

По поводу "качания" Вы говорите об эффекте перерегулирования. Если такое будет - буду вводить интегральную и дифференциальные составляющие и играться с коэффициентами.

Соглашусь по поводу инерционности Вашей системы - но как раз она и может стать буфером от автоколебаний. Хотя, ИМХО, неплохо бы ввести "быстрый" элемент типа радиатора. У меня обратная ситуация - бревенчатый дом и отопление радиаторами. Теплый пол - только граница перед жилыми помещениями. Тем более, что держу его на постоянной температуре.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вспомните как работает гистерезис. достигло до опред температуры выкл нагрев, упал до другой температуры включился. И для этого нужен датчик в комнате. Для чего нужен датчик  на улице ? Здесь еще интересней. Понятно , чем ниже температура на улице тем быстрее скорость остывания. И датчик на улице регулирует ШИМ нагрева. А ШИМ нагрева должен не сильно больше скорости остывания дома , что в свою очередь зависит от температуры на улице . Для инерционых тепловых систем длятельнось цикла ШИМ должна порядка 0,1-10 минутам. А вот ШИМ нагревателя определяет датчик на улице. Датчик внутри определяет момент когда надо включить и выключить.

PavelTLT
PavelTLT аватар
Offline
Зарегистрирован: 09.02.2019

qwone пишет:
Для чего нужен датчик  на улице ?

Чтобы при похолодании заранее увеличивать нагрев (на определенное значение)

Еще ДО ТОГО, как температура дома вообще хоть как-то отреагировала.

У меня дом с отключенным отоплением может меньше градуса за ночь потерять. На небольшое изменение температуры на улице он может вообще завтра отреагировать. А слегка подогревать нужно уже сегодня.

Поэтому я не уверен, что ПИД-регулирование может вообще помочь с хорошо утепленным инерционным домом. Если нужно включать отопление ДО ТОГО, как температура в доме хоть как-то изменилась (на улице похолодало, а дома еще нет) - ПИД-регулирование по комнатным датчикам не в состоянии будет это предугадать.

И если нужно отключать отопление ДО ТОГО, как температура в доме выросла (на улице потеплело, а дома станет жарко только через полдня, например) - тоже проблема.

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

lean_74
Offline
Зарегистрирован: 22.12.2015

PavelTLT пишет:

qwone пишет:
Для чего нужен датчик  на улице ?

Поэтому я не уверен, что ПИД-регулирование может вообще помочь с хорошо утепленным инерционным домом. Если нужно включать отопление ДО ТОГО, как температура в доме хоть как-то изменилась (на улице похолодало, а дома еще нет) - ПИД-регулирование по комнатным датчикам не в состоянии будет это предугадать.

И если нужно отключать отопление ДО ТОГО, как температура в доме выросла (на улице потеплело, а дома станет жарко только через полдня, например) - тоже проблема.

погуглить то не судьба? все давно придумали и посчитали до вас. и если поискать получше можно найти достаточно информации даже хотя бы для понимания о чем пишешь.

PavelTLT
PavelTLT аватар
Offline
Зарегистрирован: 09.02.2019

lean_74 пишет:
погуглить то не судьба? все давно придумали и посчитали до вас. и если поискать получше можно найти достаточно информации даже хотя бы для понимания о чем пишешь.

Теплорасчет, температурный график - так я управлял вручную отоплением 4 зимы.

Теперь хочу пойти немного другим путём. Через понимание реакции дома на внешние воздействия автоматизировать поддержание температуры в переходные периоды (потепление или похолодание).

Просто забить свою таблицу "t° улица - t° подачи" в ардуино много ума не нужно. Мне сейчас это не интересно.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

lean_74 пишет:
погуглить то не судьба? все давно придумали и посчитали до вас. и если поискать получше можно найти достаточно информации даже хотя бы для понимания о чем пишешь.

Гениально! Датчик температуры на улице что бы мерять температуру на улице. А все остальное что там приведено это "умный туман без объяснений".

lean_74
Offline
Зарегистрирован: 22.12.2015

Со всем уважением к qwone, но измерение температуры на улице, с построением температурного графика позволяет экономить на отоплении процентов 10-15, вот суть того "тумана".

Тут есть пример расчета теплопотерь для одноэтажного дома. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

lean_74,прошу прощения за резкие слова. Но в приведеных вами ссылках предлагается рецепт - купить газовый котел и датчик измерения температуры и экономить 10-15 процентов. Но дальше принципа работы кроме как купить я не обнаружил. 

lean_74
Offline
Зарегистрирован: 22.12.2015

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Это хорошо что вы процитировали. Отличная мошеническая схема. Вы платите нам ваши деньги. И теперь нет у заботится о своих деньгах. Мы сэкономили 100% ваши времени, потраченых на сохраниения ваших денег.

  То есть по факту берется обычный котел без внешнего датчика и делается подключение внешнего датчика. Можно даже показание вывести на экран. Дальше пишутся такие статьи. Новый котел- новая цена . Зарабатывание денег на пустом месте. Пользователь никак не сможет проверить нужны ли были траты на этот апгрейд.

lean_74
Offline
Зарегистрирован: 22.12.2015

Уважаемый qwone, видит бог, не хочу я тебе никакой котел продавать :)  

PavelTLT
PavelTLT аватар
Offline
Зарегистрирован: 09.02.2019

@mykaida, как ваши успехи?

У меня уже пару недель стабильно работает система, отоплением больше не управляю вручную.

Вот создал тему как обещал

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

PavelTLT пишет:

@mykaida, как ваши успехи?

У меня уже пару недель стабильно работает система, отоплением больше не управляю вручную.

Вот создал тему как обещал

 

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

E845bh
Offline
Зарегистрирован: 24.04.2019

Датчик температуры нужен для того чтобы определить температуру батареи, она будет меняться от температуры на улице и батарея всегда будет теплой. В мороз -25 где то +65 а при 0 гдето 38 градусов. Но все можно подкорректировать относительно теплопо ерь вашего дома. Поэтому на ардуино подается 4 температуры: улицу (описал уже), на батарее (регулировать вычисленную температуру по формуле), на котле (для потдержания температуры котла), и комнатная температура (для коррекции расчетной температуры для батареи)

А ардуино открывает или закрывает 3-х ходовой кран для удержания температуры батареи Вот как то так

Machaeon
Offline
Зарегистрирован: 04.01.2018

Имеется котел Beretta CIAO 24 с возможностью подключения датчика наружной температуры (артикул 20049748 если что).

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Machaeon пишет:

Имеется котел Beretta CIAO 24 с возможностью подключения датчика наружной температуры (артикул 20049748 если что).

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

Да, похоже что просто термодатчик типа pt100. На станице 7 инструкци это видно. Скорее всего он такой же как и датчик S.R. со страницы 8. Это задаст температуру теплоносителя.

Но также неплохо использовать термостат с ПИД. В Вашем котле он подключается к CN5 со страницы 7. Это позволит держать стабильную температуру в доме.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Не знаю как у вас, а в Юнкерсах датчик температуры обычно NTC 10 kOhms

Machaeon
Offline
Зарегистрирован: 04.01.2018

mykaida пишет:

Да, похоже что просто термодатчик типа pt100. На станице 7 инструкци это видно. Скорее всего он такой же как и датчик S.R. со страницы 8. Это задаст температуру теплоносителя.

Но также неплохо использовать термостат с ПИД. В Вашем котле он подключается к CN5 со страницы 7. Это позволит держать стабильную температуру в доме.

Спасибо за наводку! Закажу для экспериментов pt100.

Касательно ПИД - разве эта модель поддерживает его? Смотрел список совместимости, для моей модели указан только on/off.

https://new.besmart-home.com/files/compatibility_Beretta.pdf

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Machaeon пишет:

Спасибо за наводку! Закажу для экспериментов pt100.

Касательно ПИД - разве эта модель поддерживает его? Смотрел список совместимости, для моей модели указан только on/off.

https://new.besmart-home.com/files/compatibility_Beretta.pdf

Дык ПИД только это и делает. Включает, выключает и измеряет интегрально-дифференциальные характеристики. В соответствии с этим "включает и выключает".

Machaeon
Offline
Зарегистрирован: 04.01.2018

trembo пишет:

Не знаю как у вас, а в Юнкерсах датчик температуры обычно NTC 10 kOhms

Значит, возможны варианты... Измерив сопротивление датчика, можно определить его тип? Или возможны варианты датчиков с одинаковым сопротивлением но разным видом кривой?

Machaeon
Offline
Зарегистрирован: 04.01.2018

mykaida пишет:

Дык ПИД только это и делает. Включает, выключает и измеряет интегрально-дифференциальные характеристики. В соответствии с этим "включает и выключает".

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Machaeon пишет:

trembo пишет:

Не знаю как у вас, а в Юнкерсах датчик температуры обычно NTC 10 kOhms

Значит, возможны варианты... Измерив сопротивление датчика, можно определить его тип? Или возможны варианты датчиков с одинаковым сопротивлением но разным видом кривой?

Вряд ли.
Еслb при комнатной температуре будет примерно 10 кОм
и при небольшом нагреве (даже в руке) сопротивление падает- это NTC.

Хотя иногда параллельно-последовательно NTC терморезистору подключают
резисторы для линеаризации.

https://www.rlocman.ru/shem/schematics.html?di=157741

https://aterlux.ru/article/ntcresistor

Machaeon
Offline
Зарегистрирован: 04.01.2018

trembo пишет:

Еслb при комнатной температуре будет примерно 10 кОм
и при небольшом нагреве (даже в руке) сопротивление падает- это NTC.

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

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Machaeon пишет:

trembo пишет:

Еслb при комнатной температуре будет примерно 10 кОм
и при небольшом нагреве (даже в руке) сопротивление падает- это NTC.

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


Это я описал как определить там NTC 10 кОм или PT100.
А уж кривая какая будет - такая и будет.