Рабочий холодильник с NoFrost

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

Выкладываю проверенный скетч холодильника с функцией NoFrost (оттайка по времени).

Имеем:

1. двухкамерный холодильник Whirlpool arc 4020 (полетел модуль управления) с рабочим компрессором.

2. Arduino Pro Mini 5V ATMega328P

3. Один датчик температуры DS18B20 в герметичном корпусе.

4. Три реле DS 5V AC 250B 10A

5. LCD 1602A

6. Пучок проводов.

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

Термореле (pin 2) устанавливаем на штатное место в морозильной камере (вместо "родного", сделал дырочку в стенке, протянул провод и замазал потом пеной), одно реле (pin 4) подключаем к компрессору, одно реле (pin 5) к вентилятору в морозильной камере, одно реле (pin 6) к тэну оттайки. Для подключения релюшек я разобрал штатный разъем холодильника и нарастил провода. Для уверенной работы релюшек и термодатчика питание для них организовано от блока питания 5V, туда же подключена дуинка (это важно). LCD питание от дуинки и A4, A5 (стандартно).

#include <Wire.h>
#include <DallasTemperature.h>
#include <OneWire.h>

// дисплей 1602
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display

// два датчика температуры DS18B20 на пин 2
#define TEMP_WIRE_BUS 2
OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
DeviceAddress coolThermometer = {
0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
DeviceAddress tenThermometer = {
0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
// define variables
float tempSensor[2]; // массив куда читается температура c датчиков. 
byte qty; // количество градусников на шине. 

// счетчик
unsigned long prevMillis = 0; // последний момент времени, когда вкл оттайка

// таймер
long OnTimeTen = 60000; // длительность работы тэна (в миллисекундах)
long OffTimeTen = 21600000; // длительность не работы тэна (в миллисекундах)
//////////////////////////////////////////////////////////////////
//про холодильник
int ReleCompr = 4;  // реле компрессора
int ReleComprState = HIGH;
int ReleFun = 5; // реле вентилятора
// int ReleFunState = HIGH;
int ReleTen = 6; // реле оттайки
int ReleTenState = HIGH;
int LedTen = 13; // свет оттайки
// /////////////////////////////////////////////////////////////////
void getTemp(){ // читаем температуру и заполняем массив
  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
  tempSensor[0] = TempSensors.getTempC(coolThermometer);
   tempSensor[1] = TempSensors.getTempC(tenThermometer); 
  /*
   for (int i = 0; i < qty; i++) tempSensor[i] = TempSensors.getTempCByIndex(i);//в цикле заполняем массив полученными данными, уже приведенными к градусам Цельсия.
   */
}
// /////////////////////////////////////////////////////////////////
// пороговые значения температуры
float tempC;
float t1 = -10; //порог выключения компрессора
float t2 = -8; // порог включения компрессора
float t3 = -14;    //порог включения оттайки
float t4 = -5.0; //порог выключения оттайки
// /////////////////////////////////////////////////////////////////
// работа компрессора
void ComprFun() {
  if ((ReleTenState==HIGH) && (tempSensor[0] > t2)) {
    ReleComprState = LOW;
    digitalWrite(ReleCompr, ReleComprState);
    digitalWrite(ReleFun, ReleComprState);
    lcd.setCursor(8, 1);
    lcd.print("FREEZING");        }
  if ((ReleComprState==LOW) && (tempSensor[0] < t1)) {
    ReleComprState=HIGH;
   digitalWrite(ReleCompr, ReleComprState);
   digitalWrite(ReleFun, ReleComprState);
   lcd.setCursor(8, 1);
   lcd.print("WAITING ");
      }
 }
 void printData(){
  /////// вывод инфы на экран
        lcd.setCursor(0, 0);
        lcd.print("1:");
        lcd.print(tempSensor[0]);  // показываем температуру с датчика
        
        lcd.setCursor(8, 0);
        lcd.print("2:"); // число датчиков
        lcd.print(tempSensor[1]);
        
}
// /////////////////////////////////////////////////////////////////

// ////////////////////////////////////////////////////////////////////
void setup() {
  pinMode(ReleCompr, OUTPUT);
  digitalWrite(ReleCompr, ReleComprState);
  pinMode(ReleFun, OUTPUT);
  digitalWrite(ReleFun, ReleComprState);
  pinMode(ReleTen, OUTPUT);
  digitalWrite(ReleTen, ReleTenState);
  pinMode(LedTen, OUTPUT);
    
  TempSensors.begin(); //инициализируем сенсоры
  lcd.init();
  lcd.backlight();
 
   Serial.begin(9600);//инициализируем серийный порт
}
// //////////////////////////////////////////////////////////////////

// /////////////////////////////////////////////////////////////////
void loop() {
    
  getTemp(); // читаем температуру с датчиков
  printData();
   
  unsigned long currentMillis = millis(); // текущее время в миллисекундах
lcd.setCursor(0, 1);  
  lcd.print(currentMillis/60000 - prevMillis/60000);  
  
  if((ReleComprState==HIGH) && (currentMillis - prevMillis >= OffTimeTen))
   {
  ReleTenState=LOW;   
  digitalWrite(ReleTen, ReleTenState);
  digitalWrite(LedTen, HIGH);
  prevMillis = currentMillis; 
  lcd.clear();
  lcd.setCursor(7, 1);
  lcd.print("DEFROST");
}  
 if ((ReleTenState==LOW) && (currentMillis - prevMillis >= OnTimeTen)) {
   ReleTenState=HIGH;
  digitalWrite(ReleTen, ReleTenState);
  digitalWrite(LedTen, LOW);
  prevMillis = currentMillis; 
  lcd.clear();
   }
       
    else 
   ComprFun();
        
}
// //////////////////////////////////////////

Рабочая температура в морозильной камере -10С (можете понизить или повысить), оттайка включается через каждые 6 часов на 60 секунд (можете уменьшить время или увеличить, регулируется опытным путем).

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

Подправил чуть, так лучше работает.


// дисплей 1602
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display

// два датчика температуры DS18B20 на пин 2
#include <OneWire.h>
#include <DallasTemperature.h>
#define TEMP_WIRE_BUS 2
OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
DeviceAddress coolThermometer = {
0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
DeviceAddress tenThermometer = {
0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
// define variables
float tempSensor[2]; // массив куда читается температура c датчиков. 
byte qty; // количество градусников на шине. 

// счетчик
unsigned long prevMillis = 0; // последний момент времени, когда вкл оттайка


// таймер
unsigned long OnTimeT = 50000; // длительность работы тэна (в миллисекундах)
unsigned long OffTimeT = 18000000; // длительность не работы тэна (в миллисекундах)
//////////////////////////////////////////////////////////////////
//про холодильник
int ReleC = 4;  // реле компрессора
volatile int ReleCState = HIGH;
int ReleF = 5; // реле вентилятора
int ReleT = 6; // реле оттайки
volatile int ReleTState = HIGH;
int LedT = 13; // свет оттайки
// /////////////////////////////////////////////////////////////////
void getTemp(){ // читаем температуру и заполняем массив
  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
  tempSensor[0] = TempSensors.getTempC(coolThermometer);
   tempSensor[1] = TempSensors.getTempC(tenThermometer); 

}
// /////////////////////////////////////////////////////////////////
// пороговые значения температуры
float tempC;
float t1 = -12; //порог выключения компрессора
float t2 = -10; // порог включения компрессора
// /////////////////////////////////////////////////////////////////
// работа компрессора
 void comprFun()
{
  if(ReleTState==HIGH && tempSensor[0] > t2) {
   ReleCState = LOW; 
  digitalWrite(ReleC, ReleCState);
  digitalWrite(ReleF, ReleCState);
    lcd.setCursor(8, 1);
    lcd.print("FREEZING"); 
  }
  if(ReleCState==LOW && tempSensor[0] < t1) {
       ReleCState = HIGH; 
  digitalWrite(ReleC, ReleCState);
  digitalWrite(ReleF, ReleCState);
    lcd.setCursor(8, 1);
    lcd.print("WAITING "); 
  }
}
// режим оттайки
void deFrost()
{
ReleTState = LOW ;
digitalWrite (ReleT, ReleTState);
digitalWrite (LedT, HIGH);
lcd.setCursor(8, 1);
    lcd.print("DEFROST "); 
delay(OnTimeT);
ReleTState = HIGH ;
digitalWrite (ReleT, ReleTState);
digitalWrite (LedT, LOW);
lcd.clear();
}
/////// вывод инфы на экран 
void printData(){
        lcd.setCursor(0, 0);
        lcd.print("1:");
        lcd.print(tempSensor[0]);  // показываем температуру с датчика 1
        
        lcd.setCursor(8, 0);
        lcd.print("2:"); // показываем температуру с датчика 2
        lcd.print(tempSensor[1]);
    
}
// /////////////////////////////////////////////////////////////////

// ////////////////////////////////////////////////////////////////////
void setup() {
  pinMode(ReleC, OUTPUT);
  digitalWrite(ReleC, ReleCState);
  pinMode(ReleF, OUTPUT);
  digitalWrite(ReleF, ReleCState);
  pinMode(ReleT, OUTPUT);
  digitalWrite(ReleT, ReleTState);
  pinMode(LedT, OUTPUT);
    
  TempSensors.begin(); //инициализируем сенсоры
  lcd.init();
  lcd.backlight();
   
   Serial.begin(9600);//инициализируем серийный порт
}
// //////////////////////////////////////////////////////////////////

// /////////////////////////////////////////////////////////////////
void loop() {
    
  getTemp(); // читаем температуру с датчиков
  printData();
  unsigned long currentMillis = millis(); // текущее время в миллисекундах 
lcd.setCursor(0, 1);  
  lcd.print(OffTimeT/1000-(currentMillis/1000 - prevMillis/1000));

  
  if (ReleCState == HIGH && (currentMillis-prevMillis) > OffTimeT) {
  
    deFrost();
 prevMillis = currentMillis;
  }
  else
  
   comprFun();
}   
// /////////////////////////////////////////////////////////////////

 

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

вот еще шлифанул


// дисплей 1602
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display

// два датчика температуры DS18B20 на пин 2
#include <OneWire.h>
#include <DallasTemperature.h>
#define TEMP_WIRE_BUS 2
OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
DeviceAddress coolThermometer = {
0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
DeviceAddress tenThermometer = {
0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
// define variables
float tempSensor[2]; // массив куда читается температура c датчиков. 
byte qty; // количество градусников на шине. 

// счетчик
unsigned long prevMillis; // последний момент времени, когда вкл оттайка
unsigned long currentMillis;
// таймер
unsigned long OnTimeT = 50000; // длительность работы тэна (в миллисекундах)
unsigned long OffTimeT = 18000000; // длительность не работы тэна (в миллисекундах)
//////////////////////////////////////////////////////////////////
//про холодильник
#define ReleC  4  // реле компрессора
#define ReleF  5 // реле вентилятора
#define ReleT  6 // реле оттайки
#define LedT  13 // свет оттайки
boolean state = false;
// /////////////////////////////////////////////////////////////////
void getTemp(){ // читаем температуру и заполняем массив
  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
  tempSensor[0] = TempSensors.getTempC(coolThermometer);
   tempSensor[1] = TempSensors.getTempC(tenThermometer); 

}
// /////////////////////////////////////////////////////////////////
// пороговые значения температуры
float tempC;
int t1 = -12; //порог выключения компрессора
int t2 = -10; // порог включения компрессора
// /////////////////////////////////////////////////////////////////
// работа компрессора
 void comprFun()
{
  if(tempSensor[0] > t2) {
   state = true; 
  digitalWrite(ReleC, LOW);
  digitalWrite(ReleF, LOW);
  
    lcd.setCursor(8, 1);
    lcd.print("FREEZING"); 
  }
  if(tempSensor[0] < t1) {
     digitalWrite(ReleC, HIGH);
  digitalWrite(ReleF, HIGH);
  
    lcd.setCursor(8, 1);
    lcd.print("WAITING ");
   state = false; 
  }
}
// режим оттайки
void deFrost()
{
digitalWrite (ReleT, LOW);
digitalWrite (LedT, HIGH);
state=true;
lcd.setCursor(8, 1);
    lcd.print("DEFROST "); 
delay(OnTimeT);

digitalWrite (ReleT, HIGH);
digitalWrite (LedT, LOW);
state=false;
lcd.clear();
}
/////// вывод инфы на экран 
void printData(){
        lcd.setCursor(0, 0);
        lcd.print("1:");
        lcd.print(tempSensor[0]);  // показываем температуру с датчика 1
        
        lcd.setCursor(8, 0);
        lcd.print("2:"); // показываем температуру с датчика 2
        lcd.print(tempSensor[1]);
    
}
// /////////////////////////////////////////////////////////////////

// ////////////////////////////////////////////////////////////////////
void setup() {
  pinMode(ReleC, OUTPUT);
  digitalWrite(ReleC, HIGH);
  pinMode(ReleF, OUTPUT);
  digitalWrite(ReleF, HIGH);
  pinMode(ReleT, OUTPUT);
  digitalWrite(ReleT, HIGH);
  pinMode(LedT, OUTPUT);
    
  TempSensors.begin(); //инициализируем сенсоры
  lcd.init();
  lcd.backlight();
   
   Serial.begin(9600);//инициализируем серийный порт
}
// //////////////////////////////////////////////////////////////////

// /////////////////////////////////////////////////////////////////
void loop() {
    
  getTemp(); // читаем температуру с датчиков
  printData();
  currentMillis = millis(); // текущее время в миллисекундах 
lcd.setCursor(0, 1);  
  lcd.print(OffTimeT/1000-(currentMillis/1000 - prevMillis/1000));

  
  if (state == false && (currentMillis-prevMillis) > OffTimeT) {
  
    deFrost();
 prevMillis = currentMillis;
  }
  else
  
   comprFun();
}   
// /////////////////////////////////////////////////////////////////

 

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Доброго времени суток. У меня на моем холодильнтке Indesit c NoFrost была похожая проблемма.

За основу был взят пример от сюда http://arduino.ru/forum/proekty/termorele-dlya-kholodilnika-na-arduino-pro-mini-i-ds18b20  с добавлением режима разморозки и управлением вентилятором обдува испарителя морозильной камеры.

Ардуинка, релейный модуль и датчик (2 шт.) 18В20 подключены кучей от отдельного блока питания на 5 вольт.

Разморозка происходит через 8 часов по 30 минут. Если испаритель одтаил быстрее и температура на нем стала больше чем +3 градуса – режим разморозки отключается.

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

Как побороть данную проблему на данный момент не знаю. Мучаюсь с этим уже 3 недели.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

vi.markevych пишет:

Как побороть данную проблему на данный момент не знаю. Мучаюсь с этим уже 3 недели.

блок питания не из гавна и палок.

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

vi.markevych пишет:

Доброго времени суток. У меня на моем холодильнтке Indesit c NoFrost была похожая проблемма.

За основу был взят пример от сюда http://arduino.ru/forum/proekty/termorele-dlya-kholodilnika-na-arduino-pro-mini-i-ds18b20  с добавлением режима разморозки и управлением вентилятором обдува испарителя морозильной камеры.

Ардуинка, релейный модуль и датчик (2 шт.) 18В20 подключены кучей от отдельного блока питания на 5 вольт.

Разморозка происходит через 8 часов по 30 минут. Если испаритель одтаил быстрее и температура на нем стала больше чем +3 градуса – режим разморозки отключается.

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

Как побороть данную проблему на данный момент не знаю. Мучаюсь с этим уже 3 недели.

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

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

2. Скетч глчит из за библитеки LiquidCrystal_I2C.h. Не знаю, то ли это у меня глючная версия, то ли на самом деле не коннектится (искал другие варианты библиотеки, все равно глючит). Я не много упростил свой скетч, убрал индикацию режимов работы и проблема отвалилась. На данный момент холодильник работает стабильно без единного сбоя практически два месяца. Думать уже забыл на эту тему))) 

Вот то, что сейчас загружено в мою Arduino Pro mini


// дисплей 1602
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display

// два датчика температуры DS18B20 на пин 2
#include <OneWire.h>
#include <DallasTemperature.h>
#define TEMP_WIRE_BUS 2
OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
DeviceAddress coolThermometer = {
0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
DeviceAddress tenThermometer = {
0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
// define variables
float tempSensor[2]; // массив куда читается температура c датчиков. 
byte qty; // количество градусников на шине. 

// счетчик
unsigned long prevMillis; // последний момент времени, когда вкл оттайка
unsigned long currentMillis;
// таймер
unsigned long OnTimeT = 50000; // длительность работы тэна (в миллисекундах)
unsigned long OffTimeT = 18000000; // длительность не работы тэна (в миллисекундах)
//////////////////////////////////////////////////////////////////
//про холодильник
#define ReleC  4  // реле компрессора
#define ReleF  5 // реле вентилятора
#define ReleT  6 // реле оттайки
#define LedT  13 // свет оттайки
boolean state = false;
// /////////////////////////////////////////////////////////////////
void getTemp(){ // читаем температуру и заполняем массив
  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
  tempSensor[0] = TempSensors.getTempC(coolThermometer);
   tempSensor[1] = TempSensors.getTempC(tenThermometer); 

}
// /////////////////////////////////////////////////////////////////
// пороговые значения температуры
float tempC;
int t1 = -13; //порог выключения компрессора
int t2 = -10; // порог включения компрессора
// /////////////////////////////////////////////////////////////////
// работа компрессора
 void comprFun()
{
  if(tempSensor[0] > t2) {
   state = true; 
  digitalWrite(ReleC, LOW);
  digitalWrite(ReleF, LOW);
  }
  if(tempSensor[0] < t1) {
    digitalWrite(ReleC, HIGH);
    digitalWrite(ReleF, HIGH);
   state = false; 
  }
}
// режим оттайки
void deFrost()
{
digitalWrite (ReleT, LOW);
digitalWrite (LedT, HIGH);
state=true;
delay(OnTimeT);

digitalWrite (ReleT, HIGH);
digitalWrite (LedT, LOW);
state=false;
lcd.clear();
}
/////// вывод инфы на экран 
void printData(){
        lcd.setCursor(0, 0);
        lcd.print("1:");
        lcd.print(tempSensor[0]);  // показываем температуру с датчика 1
        
        lcd.setCursor(8, 0);
        lcd.print("2:"); // показываем температуру с датчика 2
        lcd.print(tempSensor[1]);
    
}
// /////////////////////////////////////////////////////////////////

// ////////////////////////////////////////////////////////////////////
void setup() {
  pinMode(ReleC, OUTPUT);
  digitalWrite(ReleC, HIGH);
  pinMode(ReleF, OUTPUT);
  digitalWrite(ReleF, HIGH);
  pinMode(ReleT, OUTPUT);
  digitalWrite(ReleT, HIGH);
  pinMode(LedT, OUTPUT);
    
  TempSensors.begin(); //инициализируем сенсоры
  lcd.begin();
  lcd.backlight();
   
   Serial.begin(9600);//инициализируем серийный порт
}
// //////////////////////////////////////////////////////////////////

// /////////////////////////////////////////////////////////////////
void loop() {
    
  getTemp(); // читаем температуру с датчиков
  printData();
  currentMillis = millis(); // текущее время в миллисекундах 
lcd.setCursor(0, 1);  
  lcd.print(OffTimeT/1000-(currentMillis/1000 - prevMillis/1000));

  
  if (state == false && (currentMillis-prevMillis) > OffTimeT) {
  
    deFrost();
 prevMillis = currentMillis;
  }
  else
  
   comprFun();
}   
// /////////////////////////////////////////////////////////////////

 

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

vi.markevych пишет:

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

Как побороть данную проблему на данный момент не знаю. Мучаюсь с этим уже 3 недели.

нужно прошить загузчик optiboot, и подключить вачдог, пусть сам как завис перегужается.

#include <avr/wdt.h>

int counter=0;
void setup(){
   wdt_disable(); // запретили как можно скорее собаку, что-бы не уйти в бесконечный ребут
   
    Serial.begin(9600);
  Serial.println("Starting...");
  delay(1000); // что-бы четче видеть рестар скетча
  
 
  wdt_enable(WDTO_8S); // активировали таймер, каждые 8-м секунд его нужно сбрасывать

  
}



void loop(){
  wdt_reset(); // говорим собаке что "В Багдаде все спокойно", начинается очередной отсчет 8-х секунд.
  
   Serial.println(counter);
   counter++;
   
   if(counter==9){
       Serial.println("visim....");

      while(true){} // создаем зависание, через 8 секунды должен произойти ресет, так как не вызывается wdt_reset();
   }
   delay(500);
  
}

 

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

lean_74 пишет:

vi.markevych пишет:

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

Как побороть данную проблему на данный момент не знаю. Мучаюсь с этим уже 3 недели.

нужно прошить загузчик optiboot, и подключить вачдог, пусть сам как завис перегужается.

Можно, в качестве второй линии обороны, а начать все таки с рецепта Клапауция.

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

А я что то побоялся wdt использовать. У меня Pro Mini, почитал, она на очень с собакой дружит. Поэтому использовал более доступные на тот момент способы, описанные выше. Все работает, ничего не виснет.

Самое главное жена не пилит насчет холодильника.

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

Круто!

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

bwn пишет:

Можно, в качестве второй линии обороны, а начать все таки с рецепта Клапауция.

хорошо хоть он "вторую линию обороны" не запретил. :)

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

lean_74 пишет:

bwn пишет:

Можно, в качестве второй линии обороны, а начать все таки с рецепта Клапауция.

хорошо хоть он "вторую линию обороны" не запретил. :)

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

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

Dimmm пишет:

А я что то побоялся wdt использовать. У меня Pro Mini, почитал, она на очень с собакой дружит. Поэтому использовал более доступные на тот момент способы, описанные выше. Все работает, ничего не виснет.

я от сюда брал прошивку http://homes-smart.ru/index.php/oborudovanie/arduino/avr-zagruzchik

на основе optiboot занимает всего 512 байт, и с wdt дружит,и как что сделать - там доходчиво написано.

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

bwn пишет:

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

когда в моем самодельном инкубаторе со 150 перепелиными яйцами на 15 день температура поднялась до 52 градусов, я решил - пусть лучше щелкает, хотя в данном конкретном случае - я не спорю. 

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Блок питания взял от старой зарядки Samsung. Сегодня попробую еще раз все пропаять.

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

lean_74 пишет:

когда в моем самодельном инкубаторе со 150 перепелиными яйцами на 15 день температура поднялась до 52 градусов, я решил - пусть лучше щелкает, хотя в данном конкретном случае - я не спорю. 

Сам wdt всегда использую, но не для таких откровенных сбоев (их надо лечить на корню).
А бульонные шарики Вы решили приготовить прямо в скорлупе?))))

 

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

lean_74 пишет:

я от сюда брал прошивку http://homes-smart.ru/index.php/oborudovanie/arduino/avr-zagruzchik

на основе optiboot занимает всего 512 байт, и с wdt дружит,и как что сделать - там доходчиво написано.

 

надо почитать, но на досуге, вроде все стабильно работает. Все-таки питание и качество контактов много на себя берет....

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

Dimmm пишет:

надо почитать, но на досуге, вроде все стабильно работает. Все-таки питание и качество контактов много на себя берет....

До поры, до времени. Собаку не на пустом месте придумали и пренебрегать ею не стоит.

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

bwn пишет:

 

А бульонные шарики Вы решили приготовить прямо в скорлупе?))))

 

ну с учетом того, что каждое яичко брал по 10р и через день они уже вылупиться должны были.... с перышками уже были... собакам конечно понравились :(

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

lean_74 пишет:

ну с учетом того, что каждое яичко брал по 10р и через день они уже вылупиться должны были.... с перышками уже были... собакам конечно понравились :(

Это где Вас на такую цену развели? Максимум 5р, а так по 3,5-4р. Выводились ничуть не хуже и четвертый год на этих двух линиях живу, пока не деградируют.
Для самоделки наверно поставил бы еще какой нибудь аналоговый компаратор градусов на 40, чтобы вырубал силовую цепь, если что не так. Ведь от пробитого симистора wdt не спасет.

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Доброго дня.

По поводу использования «собаки» немного сомневаюсь – холодильнику необходимо через каждые 8-12 часов размораживаться, а «собака» будет сбрасывать счетчик отработанного времени.  

Относительно питания – вся схема работает от старой зарядки телефона Samsung.

Все  между ардуинкой и комплектующими (датчиками, дисплеем, релейным модулем) спаяно проводами.

 

Вчера заметил что зависание происходит в момент включения/отключения реле на модуле. При этом зависание происходит только в том случае, если к реле подключен потребитель (компрессор, ТЭН).

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

"вся схема работает от старой зарядки телефона Samsung."

Вот причина засора. Посмотрите здесь по форуму, темы по питанию, их здесь мульен.

"а «собака» будет сбрасывать счетчик отработанного времени"

Запись "моточасов" в EEPROM, Клапауций пока не запретил. При записи каждые полчаса ресурса одной ячейки хватит лет на 60.))

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Сеголня попробую решить проблему с питанием при помощи замена ЗУ на БП с использованием DC-DC преобразователя. Завтра отпишусь о результатах.  

Относительно "собаки" и EEPROM - я еще очень "зеленый" в програмировании, но буду пробовать.

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Запитав всю схему от блока питания на 12 v и DC-DC преобразователя на 5 v, на данный момент, все работает.

Lachin
Offline
Зарегистрирован: 02.10.2016

Dimmm, vi.markevych,ребята не могли бы вы скинуть свою почту? спасибо.

vi.markevych
Offline
Зарегистрирован: 28.09.2016
Lachin
Offline
Зарегистрирован: 02.10.2016

vi.markevych пишет:
Markevich1509@gmail.com

Привет,гляньте пожалуйста почту,спасибо.

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

Lachin пишет:

Dimmm, vi.markevych,ребята не могли бы вы скинуть свою почту? спасибо.

 

ух ты! а я и не вижу, тут что то интересное мутится!  

el-kzn@yandex.ru

ко всему выше написаному:

с моментра запуска моего холодильника на плате Pro Mini прошло уже практически полгода. После устранения дрязгов в контактах и через APC не было НИ ОДНОГО зависания. В первое время эксперементировал со временем оттайки, интервалом включения тэна, температурой морозилки. Сейчас стоит 18 млн. мл.сек. интервал между оттайками, тэн включается на 60 сек., температура камеры -14 (расстояние от испарителя до датчика 15 см.). Во второй камере холодильника датчик показывает 1-2 градуса (очень оптимально). Замерил потребление холодильником тока в сутки - 1,2 кВт (тупо по счетчику засек))). Короче полгода полет нормальный!

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

А! Самое главное то не сказал! Зависания прекратились не только после устранения плохого контакта, а после того как убрал индикацию режима работы. В коде была индикация на дисплей режима - если включился компрессор - COOL, в режиме ожидания - WHEITING. Так вот, убрал и все, зависания окончательно прекратились. Искал разные варианты библиотек для LCD, все равно висло. Как убрал, так проблема решилась. В #5 топике скетч.

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Датчик (18В20) у меня стоит 3 шт.

1. В холодильной камере - управление заслонкой подачи холодного воздуха в холодильную камеру,для индикации температуры в холодильной камере.

2. В морозильной камере - управление работы компрессора, индикация температуры в камере.

3. Установлен в испарителе морозильной камеры - для управлением процеса разморозки.

 

Относительно процеса разморозки - алгоритм работы следующий:

1. при достижении указаного времени (420 минут) отключаем компрессор.

2. при прошествиии 10 минут включаем ТЭН и мониторим температуру на испарителе.

3. при достижении температуры на испарителе в +3 градуса (или пшествии 30 минут процеса разморозки) - отключаем ТЭН.

4. Ждем 5 минут для остывание ТЭНа.

5. Перезагружаем ардуинку.

Далие холодильник работает в "нормальном режиме" и считест 420 минут.

Для моего холодильника такие времменные промежуткия являются оптимальными.

 

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

ну супер! )))

Lachin
Offline
Зарегистрирован: 02.10.2016

Dimmm гляньте почту.

Lachin
Offline
Зарегистрирован: 02.10.2016

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

DeviceAddress coolThermometer = {
0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
DeviceAddress tenThermometer = {
0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
 
 
bwn
Offline
Зарегистрирован: 25.08.2014

Запускаете примеры из OneWire, там есть определение адресов (в котором точно не помню). Для DS18B20 все должны начинаться с 0х28. Ручками переносите в скетч.

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

Lachin пишет:

Dimmm гляньте почту.

почту глянул.

если честно, лень все расписывать...

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

Напиши мне марку своего LG.

Lachin
Offline
Зарегистрирован: 02.10.2016

bwn пишет:

Запускаете примеры из OneWire, там есть определение адресов (в котором точно не помню). Для DS18B20 все должны начинаться с 0х28. Ручками переносите в скетч.

Спасибо,с адресами разобрался.

Lachin
Offline
Зарегистрирован: 02.10.2016

Dimmm пишет:

Lachin пишет:

Dimmm гляньте почту.

почту глянул.

если честно, лень все расписывать...

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

Напиши мне марку своего LG.

Спасибо буду очень благодарен вам.
 
Модель холодильника видна на шильдике.
 
В морозильной камере один вентилятор,два датчика один датчик дефроста а другой термофьюз,в плюсовой камере холодильника есть еще один вентилятор и там же стоит еще один датчик температуру. Принципе так больше нет не чего.
 
 
Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

а что в нем сломалось? Компрессор точно живой? какие симптомы?

Lachin
Offline
Зарегистрирован: 02.10.2016

Компрессор живой,все навесное тоже живое,сам блок управление умер сгорел МК. Таких модулей нету в продаже,а если есть то цена не реально завышена у нас.

vi.markevych
Offline
Зарегистрирован: 28.09.2016

На холдильнике (с обратной стороны) есть электросхема

Можно ее фото???

Lachin
Offline
Зарегистрирован: 02.10.2016

.

Ага есть такое дело.

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Что из комплектующих у Вас есть? Ардуино? Реле? Датчики?

Я така понимаю что это у Вас первый опыт работы с ардуинко?

Всю дальнейшую переписку лучше вести по почте.

Lachin
Offline
Зарегистрирован: 02.10.2016

Есть все что нужно для этих целей,есть Реле,есть датчики,есть Ардуино,можно сказать что и первый.

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016
#include <Wire.h>

#include <OneWire.h>

#include <DallasTemperature.h>

#include <LiquidCrystal_I2C.h>


// дисплей 1602

LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display

// два датчика температуры DS18B20 на пин 2


#define TEMP_WIRE_BUS 2
OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
DeviceAddress coolThermometer = {
  0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8
};
DeviceAddress tenThermometer = {
  0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC
};
// define variables
float tempSensor[2]; // массив куда читается температура c датчиков.
byte qty; // количество градусников на шине.

// счетчик
unsigned long prevMillis; // последний момент времени, когда вкл оттайка
unsigned long currentMillis;
// таймер
unsigned long OnTimeT = 90000; // длительность работы тэна (в миллисекундах)
unsigned long OffTimeT = 15000000; // длительность не работы тэна (в миллисекундах)
//////////////////////////////////////////////////////////////////
//про холодильник
#define ReleC  4  // реле компрессора
#define ReleF  5 // реле вентилятора
#define ReleT  6 // реле оттайки
#define LedT  13 // свет оттайки
boolean state = false;
// /////////////////////////////////////////////////////////////////
void getTemp() { // читаем температуру и заполняем массив
  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
  tempSensor[0] = TempSensors.getTempC(coolThermometer);
  tempSensor[1] = TempSensors.getTempC(tenThermometer);

}
// /////////////////////////////////////////////////////////////////
// пороговые значения температуры
float tempC;
int t1 = -14; //порог выключения компрессора
int t2 = -11; // порог включения компрессора
// /////////////////////////////////////////////////////////////////
// работа компрессора
void comprFun()
{
  if (tempSensor[0] > t2) {
    state = true;
    digitalWrite(ReleC, LOW);
    digitalWrite(ReleF, LOW);
  }
  if (tempSensor[0] < t1) {
    digitalWrite(ReleC, HIGH);
    digitalWrite(ReleF, HIGH);
    state = false;
  }
}
// режим оттайки
void deFrost()
{
  digitalWrite (ReleT, LOW);
  digitalWrite (LedT, HIGH);
  state = true;
  delay(OnTimeT);

  digitalWrite (ReleT, HIGH);
  digitalWrite (LedT, LOW);
  state = false;
  lcd.clear();
}
/////// вывод инфы на экран
void printData() {
  lcd.setCursor(0, 0);
  lcd.print("1:");
  lcd.print(tempSensor[0]);  // показываем температуру с датчика 1

  lcd.setCursor(8, 0);
  lcd.print("2:"); // показываем температуру с датчика 2
  lcd.print(tempSensor[1]);

}
// /////////////////////////////////////////////////////////////////

// ////////////////////////////////////////////////////////////////////
void setup() {
  pinMode(ReleC, OUTPUT);
  digitalWrite(ReleC, HIGH);
  pinMode(ReleF, OUTPUT);
  digitalWrite(ReleF, HIGH);
  pinMode(ReleT, OUTPUT);
  digitalWrite(ReleT, HIGH);
  pinMode(LedT, OUTPUT);

  TempSensors.begin(); //инициализируем сенсоры
  lcd.begin();
  lcd.backlight();

  Serial.begin(9600);//инициализируем серийный порт
}
// //////////////////////////////////////////////////////////////////

// /////////////////////////////////////////////////////////////////
void loop() {

  getTemp(); // читаем температуру с датчиков
  printData();
  currentMillis = millis(); // текущее время в миллисекундах
  lcd.setCursor(0, 1);
  lcd.print(OffTimeT / 1000 - (currentMillis / 1000 - prevMillis / 1000));


  if (state == false && (currentMillis - prevMillis) > OffTimeT) {

    deFrost();
    prevMillis = currentMillis;
  }
  else

    comprFun();
}
// /////////////////////////////////////////////////////////////////

 

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

Нет предела совершенству!

Выкладываю самую последнюю версию. Работает лучше, чем задумал производитель. Теперь температура в холодильной камере тоже под контролем. С самого начала было ощущение, что что то не совсем доделано. Теперь это ощущение исчезло потому, что работает даже лучше, чем ожидал. Самое главное - экономия электроэнергии и контролируемая температура холодильной камеры. В заводском исполнении контролировалась только температура морозильной камеры. Без каких либо существенных изменений (добавил датчик температуры в холодильную камеру) и посредством програмного кода (задействовал штатный вентилятор для изменения температуры в холодильной камере) удалось выжать из холодильника дополнительные возможности. 

Пользуйтесь!

#include <Wire.h>

#include <OneWire.h>

#include <DallasTemperature.h>

#include <LiquidCrystal_I2C.h>


// дисплей 1602

LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display

// два датчика температуры DS18B20 на пин 2


#define TEMP_WIRE_BUS 2
OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
DeviceAddress coolThermometer = {
  0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8  //темп датчик в морозилке
};
DeviceAddress tenThermometer = {
  0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC  // темп датчик в холодильной камере
};
// define variables
float tempSensor[2]; // массив куда читается температура c датчиков.
byte qty; // количество градусников на шине.

// счетчик
unsigned long prevMillis; // последний момент времени, когда вкл оттайка
unsigned long currentMillis;
// таймер
unsigned long OnTimeT = 60000; // длительность работы тэна (в миллисекундах)
unsigned long OffTimeT = 18000000; // длительность не работы тэна (в миллисекундах)
//////////////////////////////////////////////////////////////////
//про холодильник
#define ReleC  4  // реле компрессора
#define ReleF  5 // реле вентилятора
#define ReleT  6 // реле оттайки
#define LedT  13 // свет оттайки
boolean state = false;
// /////////////////////////////////////////////////////////////////
void getTemp() { // читаем температуру и заполняем массив
  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
  tempSensor[0] = TempSensors.getTempC(coolThermometer);
  tempSensor[1] = TempSensors.getTempC(tenThermometer);

}
// /////////////////////////////////////////////////////////////////
// пороговые значения температуры
float tempC;
int t1 = -16; //порог выключения компрессора
int t2 = -14; // порог включения компрессора
int t3 = 1; //порог выключения вентилятора 
int t4 = 3; // порог включения вентилятора 
// /////////////////////////////////////////////////////////////////
// работа компрессора
void comprFun()
{
  if (tempSensor[0] > t2) {
    state = true;
    digitalWrite(ReleC, LOW);
   
  }
  if (tempSensor[0] < t1) {
    digitalWrite(ReleC, HIGH);
    
    state = false;
  }
}

// работа вентилятора 
void fun()
{
  if (tempSensor[1] > t4) {
    digitalWrite(ReleF, LOW);
  }
  if (tempSensor[1] < t3) {
    digitalWrite(ReleF, HIGH);
   }
}
// режим оттайки
void deFrost()
{
  digitalWrite (ReleT, LOW);
  digitalWrite (LedT, HIGH);
  state = true;
  delay(OnTimeT);

  digitalWrite (ReleT, HIGH);
  digitalWrite (LedT, LOW);
  state = false;
  lcd.clear();
}
/////// вывод инфы на экран
void printData() {
  lcd.setCursor(0, 0);
  lcd.print("1:");
  lcd.print(tempSensor[0]);  // показываем температуру с датчика 1

  lcd.setCursor(8, 0);
  lcd.print("2:"); // показываем температуру с датчика 2
  lcd.print(tempSensor[1]);

}
// /////////////////////////////////////////////////////////////////

// ////////////////////////////////////////////////////////////////////
void setup() {
  pinMode(ReleC, OUTPUT);
  digitalWrite(ReleC, HIGH);
  pinMode(ReleF, OUTPUT);
  digitalWrite(ReleF, HIGH);
  pinMode(ReleT, OUTPUT);
  digitalWrite(ReleT, HIGH);
  pinMode(LedT, OUTPUT);

  TempSensors.begin(); //инициализируем сенсоры
  lcd.begin();
  lcd.backlight();

  Serial.begin(9600);//инициализируем серийный порт
}
// //////////////////////////////////////////////////////////////////

// /////////////////////////////////////////////////////////////////
void loop() {

  getTemp(); // читаем температуру с датчиков
  printData();
  currentMillis = millis(); // текущее время в миллисекундах
  lcd.setCursor(0, 1);
  lcd.print(OffTimeT / 1000 - (currentMillis / 1000 - prevMillis / 1000));

fun();
  if (state == false && (currentMillis - prevMillis) > OffTimeT) {

    deFrost();
    prevMillis = currentMillis;
  }
  else

    comprFun();

 }
// /////////////////////////////////////////////////////////////////

 

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Доброго дня/вечера/ночи.

Добавлю и свой вариант скетча.

Этот на дисплее 16*2

//termostat_indesit test-2.9_16_2 (1)

#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>
OneWire oneWire(2);// вход датчиков 18b20
DallasTemperature ds(&oneWire);
unsigned long time;
byte qty; // количество градусников на шине
int T;//переменная по врмеи
int T_gradus; //переменная температуры

LiquidCrystal_I2C lcd(0x3F, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

// Температура включения компрессора
#define TEMP_MAX -18.0
// Температура отключения компрессора
#define TEMP_MIN -16.0
// Реле подключено к 4 пину
#define RELE_Kompres 4
// Реле подключено к 5 пину
#define RELE_Defrost 5
// Реле подключено к 7 пину
#define RELE_Fan 7
// Реле подключено к 8 пину
#define RELE_Fanx 8
boolean b_compressorOff;          // Компрессор выключен
boolean b_FanOff;               // вентилятор выключен


void setup() {
  lcd.init();
  lcd.backlight();
  ds.begin();

  pinMode(RELE_Kompres, OUTPUT);  // назначаем выходы
  pinMode(RELE_Defrost, OUTPUT);
  pinMode(RELE_Fan, OUTPUT);
  pinMode(RELE_Fanx, OUTPUT);

  digitalWrite(RELE_Kompres, HIGH);             // При загрузке компрессор отключён
  digitalWrite(RELE_Defrost, HIGH);             // При загрузке ТЭН разморозки отключён
  digitalWrite(RELE_Fan, HIGH);
  digitalWrite(RELE_Fanx, HIGH);

  qty = ds.getDeviceCount();
  b_compressorOff = true;


  delay (1000);
}
void(* resetFunc) (void) = 0; // объявляем функцию reset

void razmorozka()
{
  digitalWrite(RELE_Kompres, HIGH);
  digitalWrite(RELE_Fan, HIGH);
  digitalWrite(RELE_Fanx, HIGH);

  if (T > 455) {
    if (ds.getTempCByIndex(1) < -10) { //Условие при которой оттайка включится

      digitalWrite(RELE_Defrost, LOW);
    }

    if (ds.getTempCByIndex(1) > 4) { //температура выхода из оттайк

      digitalWrite(RELE_Defrost, HIGH);
      resetFunc();
    }
  }
  if (T > 485)resetFunc(); //веремя выхода из оттайки принудительно


}

void loop() {
  time = millis();
  T = time / 60000;
  ds.requestTemperatures(); // считываем температуру с датчиков
  T_gradus = ds.getTempCByIndex(0);
if (T<440){
  lcd.setCursor(0,0);  
  lcd.print("1:");

  lcd.print(ds.getTempCByIndex(0));
 
  lcd.print(" 2:");
lcd.print(ds.getTempCByIndex(1));

 }
else { 
  lcd.backlight();
  lcd.setCursor(0,0);
lcd.print("    DEFROST      ");

}

  lcd.setCursor(0, 1);

  lcd.print("D:");
  lcd.print(ds.getTempCByIndex(1));

  lcd.print(" Time");

  lcd.print(T);

  if (T > 440) {   // запуск разморозки
    razmorozka();

  }

else {

}


//*********

if  (( ds.getTempCByIndex(2) >= 7 ) && (T < 440 )) {   // если температура выше 7 градусов то запускаем вентилятор №2

  digitalWrite(RELE_Fanx, LOW);

 }
}
else {
  if ( ds.getTempCByIndex(2) <= 2 ) { //если температура ниже 3 то отключаем вентилятор №2

    digitalWrite(RELE_Fanx, HIGH);

  }
}
//***********
if ( b_compressorOff ) {         //включение компрессора
  if (( T_gradus > TEMP_MAX) && (T > 9    ) && (T < 440 )) {
    digitalWrite(RELE_Kompres, LOW);
    digitalWrite(RELE_Fan, LOW);
    b_compressorOff = false;
  }
}
else {
  if ( T_gradus < TEMP_MIN ) {   //выключение компрессора
    digitalWrite(RELE_Kompres, HIGH);
    digitalWrite(RELE_Fan, HIGH);
    b_compressorOff = true;
  }
}

delay(50);




}

 

Dimmm
Dimmm аватар
Offline
Зарегистрирован: 07.11.2016

Интересно! Почитаю. Это на два вентилятора? 

vi.markevych
Offline
Зарегистрирован: 28.09.2016

Да. Один в морозильной камере.
Второй перегоняет холодный воздух с морозьльной камеры в холодильную.

Lachin
Offline
Зарегистрирован: 02.10.2016

Ребята привет,взял за основу код vi.markevych,чуть подогнал для себя,собрал всю схему,все подключил,питание в норме без пульсации,можно сказать все работает,но в какой то момент зависает ардуинка,посмотрите пожалуйста код возможно где то есть проблема по этому и зависает,спасибо.


#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>
OneWire oneWire(2);// вход датчиков 18b20
DallasTemperature ds(&oneWire);
unsigned long time;
byte qty; // количество градусников на шине
int T;//переменная по врмеи
int T_gradus; //переменная температуры
int p = 3; //объявляем переменную с номером пина, на который подключен пьезоэлемент

LiquidCrystal_I2C lcd(0x3F, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

// Температура включения компрессора
#define TEMP_MAX -15.0
// Температура отключения компрессора
#define TEMP_MIN -18.0
// Реле подключено к 4 пину
#define RELE_Kompres 4
// Реле подключено к 5 пину
#define RELE_Defrost 5
// Реле подключено к 7 пину
#define RELE_Fan 7
// Реле подключено к 8 пину
#define RELE_Fanx 8
boolean b_compressorOff;  // Компрессор выключен
boolean b_FanOff; // Вентилятор выключен


void setup() {

  tone (p, 4000); //включаем на 4000 Гц
  delay(2000);  //ждем 2000 Мс
  noTone(p ); // отключаем

  lcd.init();
  lcd.backlight();
  ds.begin();

  pinMode(RELE_Kompres, OUTPUT);  // назначаем выходы
  pinMode(RELE_Defrost, OUTPUT);
  pinMode(RELE_Fan, OUTPUT);
  pinMode(RELE_Fanx, OUTPUT);


  digitalWrite(RELE_Kompres, HIGH);    // При загрузке компрессор отключён
  digitalWrite(RELE_Defrost, HIGH);   // При загрузке ТЭН разморозки отключён
  digitalWrite(RELE_Fan, HIGH);
  digitalWrite(RELE_Fanx, HIGH);

  qty = ds.getDeviceCount();
  b_compressorOff = true;


  delay (1000);
}
void(* resetFunc) (void) = 0;  // объявляем функцию reset

void razmorozka()
{

  digitalWrite(RELE_Kompres, HIGH);
  digitalWrite(RELE_Fan, HIGH);
  digitalWrite(RELE_Fanx, HIGH);

  if (T > 455) {
    if (ds.getTempCByIndex(1) < -10) {  //Условие при которой оттайка включится

      digitalWrite(RELE_Defrost, LOW);
    }

    if (ds.getTempCByIndex(1) > 4) {  //температура выхода из оттайк

      digitalWrite(RELE_Defrost, HIGH);
      resetFunc();
    }
  }
  if (T > 485)resetFunc();  //веремя выхода из оттайки принудительно
}

void loop() {
  time = millis();
  T = time / 60000;
  ds.requestTemperatures();  // считываем температуру с датчиков
  T_gradus = ds.getTempCByIndex(0);



  if (T < 440) {
    lcd.setCursor(0, 0);
    lcd.print("F:"); //вывод информации о датчике морозильной камере
    lcd.print(ds.getTempCByIndex(0));
    lcd.print(" C:"); //вывод информации о датчике в холодильной камере
    lcd.print(ds.getTempCByIndex(2));
    lcd.setCursor(0, 1);
    lcd.print("D:"); //вывод информации о датчике DEFROST
    lcd.print(ds.getTempCByIndex(1));
    lcd.print(" Time"); //вывод времени на дисплей
    lcd.print(T);

  }
  else
  {
    lcd.backlight();
    lcd.setCursor(0, 0);
    lcd.print("     DEFROST      "); //вывод информации об оттайки DEFROST
    lcd.setCursor(0, 1);
    lcd.print("D:"); //вывод информации о датчике DEFROST
    lcd.print(ds.getTempCByIndex(1));
    lcd.print(" Time"); //вывод времени на дисплей
    lcd.print(T);
  }

  if (T > 440) {   // запуск разморозки
    razmorozka();

  }

  else {

  }

  //*********
  if  (( ds.getTempCByIndex(2) >= 8 ) && (T < 440 )) {   // если температура выше 8 градусов то запускаем вентилятор №2
    digitalWrite(RELE_Fanx, LOW);

  }

  else

  {

    if ( ds.getTempCByIndex(2) <= 5 ) {  //если температура ниже 5 то отключаем вентилятор №2
      digitalWrite(RELE_Fanx, HIGH);

    }
  }

  //***********
  if ( b_compressorOff ) {  //включение компрессора
    if (( T_gradus > TEMP_MAX) && (T > 9    ) && (T < 440 )) {
      digitalWrite(RELE_Kompres, LOW);
      digitalWrite(RELE_Fan, LOW);
      b_compressorOff = false;
    }
  }
  else {
    if ( T_gradus < TEMP_MIN ) {  //выключение компрессора
      digitalWrite(RELE_Kompres, HIGH);
      digitalWrite(RELE_Fan, HIGH);
      b_compressorOff = true;
    }
  }

  delay(50);
}
[/code]