Рабочий холодильник с 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 (стандартно).

001#include <Wire.h>
002#include <DallasTemperature.h>
003#include <OneWire.h>
004 
005// дисплей 1602
006#include <LiquidCrystal_I2C.h>
007LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display
008 
009// два датчика температуры DS18B20 на пин 2
010#define TEMP_WIRE_BUS 2
011OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
012DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
013DeviceAddress coolThermometer = {
0140x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
015DeviceAddress tenThermometer = {
0160x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
017// define variables
018float tempSensor[2]; // массив куда читается температура c датчиков.
019byte qty; // количество градусников на шине.
020 
021// счетчик
022unsigned long prevMillis = 0; // последний момент времени, когда вкл оттайка
023 
024// таймер
025long OnTimeTen = 60000; // длительность работы тэна (в миллисекундах)
026long OffTimeTen = 21600000; // длительность не работы тэна (в миллисекундах)
027//////////////////////////////////////////////////////////////////
028//про холодильник
029int ReleCompr = 4;  // реле компрессора
030int ReleComprState = HIGH;
031int ReleFun = 5; // реле вентилятора
032// int ReleFunState = HIGH;
033int ReleTen = 6; // реле оттайки
034int ReleTenState = HIGH;
035int LedTen = 13; // свет оттайки
036// /////////////////////////////////////////////////////////////////
037void getTemp(){ // читаем температуру и заполняем массив
038  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
039  tempSensor[0] = TempSensors.getTempC(coolThermometer);
040   tempSensor[1] = TempSensors.getTempC(tenThermometer);
041  /*
042   for (int i = 0; i < qty; i++) tempSensor[i] = TempSensors.getTempCByIndex(i);//в цикле заполняем массив полученными данными, уже приведенными к градусам Цельсия.
043   */
044}
045// /////////////////////////////////////////////////////////////////
046// пороговые значения температуры
047float tempC;
048float t1 = -10; //порог выключения компрессора
049float t2 = -8; // порог включения компрессора
050float t3 = -14;    //порог включения оттайки
051float t4 = -5.0; //порог выключения оттайки
052// /////////////////////////////////////////////////////////////////
053// работа компрессора
054void ComprFun() {
055  if ((ReleTenState==HIGH) && (tempSensor[0] > t2)) {
056    ReleComprState = LOW;
057    digitalWrite(ReleCompr, ReleComprState);
058    digitalWrite(ReleFun, ReleComprState);
059    lcd.setCursor(8, 1);
060    lcd.print("FREEZING");        }
061  if ((ReleComprState==LOW) && (tempSensor[0] < t1)) {
062    ReleComprState=HIGH;
063   digitalWrite(ReleCompr, ReleComprState);
064   digitalWrite(ReleFun, ReleComprState);
065   lcd.setCursor(8, 1);
066   lcd.print("WAITING ");
067      }
068 }
069 void printData(){
070  /////// вывод инфы на экран
071        lcd.setCursor(0, 0);
072        lcd.print("1:");
073        lcd.print(tempSensor[0]);  // показываем температуру с датчика
074         
075        lcd.setCursor(8, 0);
076        lcd.print("2:"); // число датчиков
077        lcd.print(tempSensor[1]);
078         
079}
080// /////////////////////////////////////////////////////////////////
081 
082// ////////////////////////////////////////////////////////////////////
083void setup() {
084  pinMode(ReleCompr, OUTPUT);
085  digitalWrite(ReleCompr, ReleComprState);
086  pinMode(ReleFun, OUTPUT);
087  digitalWrite(ReleFun, ReleComprState);
088  pinMode(ReleTen, OUTPUT);
089  digitalWrite(ReleTen, ReleTenState);
090  pinMode(LedTen, OUTPUT);
091     
092  TempSensors.begin(); //инициализируем сенсоры
093  lcd.init();
094  lcd.backlight();
095  
096   Serial.begin(9600);//инициализируем серийный порт
097}
098// //////////////////////////////////////////////////////////////////
099 
100// /////////////////////////////////////////////////////////////////
101void loop() {
102     
103  getTemp(); // читаем температуру с датчиков
104  printData();
105    
106  unsigned long currentMillis = millis(); // текущее время в миллисекундах
107lcd.setCursor(0, 1); 
108  lcd.print(currentMillis/60000 - prevMillis/60000); 
109   
110  if((ReleComprState==HIGH) && (currentMillis - prevMillis >= OffTimeTen))
111   {
112  ReleTenState=LOW;  
113  digitalWrite(ReleTen, ReleTenState);
114  digitalWrite(LedTen, HIGH);
115  prevMillis = currentMillis;
116  lcd.clear();
117  lcd.setCursor(7, 1);
118  lcd.print("DEFROST");
119
120 if ((ReleTenState==LOW) && (currentMillis - prevMillis >= OnTimeTen)) {
121   ReleTenState=HIGH;
122  digitalWrite(ReleTen, ReleTenState);
123  digitalWrite(LedTen, LOW);
124  prevMillis = currentMillis;
125  lcd.clear();
126   }
127        
128    else
129   ComprFun();
130         
131}
132// //////////////////////////////////////////

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

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

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

001// дисплей 1602
002#include <Wire.h>
003#include <LiquidCrystal_I2C.h>
004LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display
005 
006// два датчика температуры DS18B20 на пин 2
007#include <OneWire.h>
008#include <DallasTemperature.h>
009#define TEMP_WIRE_BUS 2
010OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
011DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
012DeviceAddress coolThermometer = {
0130x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
014DeviceAddress tenThermometer = {
0150x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
016// define variables
017float tempSensor[2]; // массив куда читается температура c датчиков.
018byte qty; // количество градусников на шине.
019 
020// счетчик
021unsigned long prevMillis = 0; // последний момент времени, когда вкл оттайка
022 
023 
024// таймер
025unsigned long OnTimeT = 50000; // длительность работы тэна (в миллисекундах)
026unsigned long OffTimeT = 18000000; // длительность не работы тэна (в миллисекундах)
027//////////////////////////////////////////////////////////////////
028//про холодильник
029int ReleC = 4;  // реле компрессора
030volatile int ReleCState = HIGH;
031int ReleF = 5; // реле вентилятора
032int ReleT = 6; // реле оттайки
033volatile int ReleTState = HIGH;
034int LedT = 13; // свет оттайки
035// /////////////////////////////////////////////////////////////////
036void getTemp(){ // читаем температуру и заполняем массив
037  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
038  tempSensor[0] = TempSensors.getTempC(coolThermometer);
039   tempSensor[1] = TempSensors.getTempC(tenThermometer);
040 
041}
042// /////////////////////////////////////////////////////////////////
043// пороговые значения температуры
044float tempC;
045float t1 = -12; //порог выключения компрессора
046float t2 = -10; // порог включения компрессора
047// /////////////////////////////////////////////////////////////////
048// работа компрессора
049 void comprFun()
050{
051  if(ReleTState==HIGH && tempSensor[0] > t2) {
052   ReleCState = LOW;
053  digitalWrite(ReleC, ReleCState);
054  digitalWrite(ReleF, ReleCState);
055    lcd.setCursor(8, 1);
056    lcd.print("FREEZING");
057  }
058  if(ReleCState==LOW && tempSensor[0] < t1) {
059       ReleCState = HIGH;
060  digitalWrite(ReleC, ReleCState);
061  digitalWrite(ReleF, ReleCState);
062    lcd.setCursor(8, 1);
063    lcd.print("WAITING ");
064  }
065}
066// режим оттайки
067void deFrost()
068{
069ReleTState = LOW ;
070digitalWrite (ReleT, ReleTState);
071digitalWrite (LedT, HIGH);
072lcd.setCursor(8, 1);
073    lcd.print("DEFROST ");
074delay(OnTimeT);
075ReleTState = HIGH ;
076digitalWrite (ReleT, ReleTState);
077digitalWrite (LedT, LOW);
078lcd.clear();
079}
080/////// вывод инфы на экран
081void printData(){
082        lcd.setCursor(0, 0);
083        lcd.print("1:");
084        lcd.print(tempSensor[0]);  // показываем температуру с датчика 1
085         
086        lcd.setCursor(8, 0);
087        lcd.print("2:"); // показываем температуру с датчика 2
088        lcd.print(tempSensor[1]);
089     
090}
091// /////////////////////////////////////////////////////////////////
092 
093// ////////////////////////////////////////////////////////////////////
094void setup() {
095  pinMode(ReleC, OUTPUT);
096  digitalWrite(ReleC, ReleCState);
097  pinMode(ReleF, OUTPUT);
098  digitalWrite(ReleF, ReleCState);
099  pinMode(ReleT, OUTPUT);
100  digitalWrite(ReleT, ReleTState);
101  pinMode(LedT, OUTPUT);
102     
103  TempSensors.begin(); //инициализируем сенсоры
104  lcd.init();
105  lcd.backlight();
106    
107   Serial.begin(9600);//инициализируем серийный порт
108}
109// //////////////////////////////////////////////////////////////////
110 
111// /////////////////////////////////////////////////////////////////
112void loop() {
113     
114  getTemp(); // читаем температуру с датчиков
115  printData();
116  unsigned long currentMillis = millis(); // текущее время в миллисекундах
117lcd.setCursor(0, 1); 
118  lcd.print(OffTimeT/1000-(currentMillis/1000 - prevMillis/1000));
119 
120   
121  if (ReleCState == HIGH && (currentMillis-prevMillis) > OffTimeT) {
122   
123    deFrost();
124 prevMillis = currentMillis;
125  }
126  else
127   
128   comprFun();
129}  
130// /////////////////////////////////////////////////////////////////

 

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

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

001// дисплей 1602
002#include <Wire.h>
003#include <LiquidCrystal_I2C.h>
004LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display
005 
006// два датчика температуры DS18B20 на пин 2
007#include <OneWire.h>
008#include <DallasTemperature.h>
009#define TEMP_WIRE_BUS 2
010OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
011DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
012DeviceAddress coolThermometer = {
0130x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
014DeviceAddress tenThermometer = {
0150x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
016// define variables
017float tempSensor[2]; // массив куда читается температура c датчиков.
018byte qty; // количество градусников на шине.
019 
020// счетчик
021unsigned long prevMillis; // последний момент времени, когда вкл оттайка
022unsigned long currentMillis;
023// таймер
024unsigned long OnTimeT = 50000; // длительность работы тэна (в миллисекундах)
025unsigned long OffTimeT = 18000000; // длительность не работы тэна (в миллисекундах)
026//////////////////////////////////////////////////////////////////
027//про холодильник
028#define ReleC  4  // реле компрессора
029#define ReleF  5 // реле вентилятора
030#define ReleT  6 // реле оттайки
031#define LedT  13 // свет оттайки
032boolean state = false;
033// /////////////////////////////////////////////////////////////////
034void getTemp(){ // читаем температуру и заполняем массив
035  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
036  tempSensor[0] = TempSensors.getTempC(coolThermometer);
037   tempSensor[1] = TempSensors.getTempC(tenThermometer);
038 
039}
040// /////////////////////////////////////////////////////////////////
041// пороговые значения температуры
042float tempC;
043int t1 = -12; //порог выключения компрессора
044int t2 = -10; // порог включения компрессора
045// /////////////////////////////////////////////////////////////////
046// работа компрессора
047 void comprFun()
048{
049  if(tempSensor[0] > t2) {
050   state = true;
051  digitalWrite(ReleC, LOW);
052  digitalWrite(ReleF, LOW);
053   
054    lcd.setCursor(8, 1);
055    lcd.print("FREEZING");
056  }
057  if(tempSensor[0] < t1) {
058     digitalWrite(ReleC, HIGH);
059  digitalWrite(ReleF, HIGH);
060   
061    lcd.setCursor(8, 1);
062    lcd.print("WAITING ");
063   state = false;
064  }
065}
066// режим оттайки
067void deFrost()
068{
069digitalWrite (ReleT, LOW);
070digitalWrite (LedT, HIGH);
071state=true;
072lcd.setCursor(8, 1);
073    lcd.print("DEFROST ");
074delay(OnTimeT);
075 
076digitalWrite (ReleT, HIGH);
077digitalWrite (LedT, LOW);
078state=false;
079lcd.clear();
080}
081/////// вывод инфы на экран
082void printData(){
083        lcd.setCursor(0, 0);
084        lcd.print("1:");
085        lcd.print(tempSensor[0]);  // показываем температуру с датчика 1
086         
087        lcd.setCursor(8, 0);
088        lcd.print("2:"); // показываем температуру с датчика 2
089        lcd.print(tempSensor[1]);
090     
091}
092// /////////////////////////////////////////////////////////////////
093 
094// ////////////////////////////////////////////////////////////////////
095void setup() {
096  pinMode(ReleC, OUTPUT);
097  digitalWrite(ReleC, HIGH);
098  pinMode(ReleF, OUTPUT);
099  digitalWrite(ReleF, HIGH);
100  pinMode(ReleT, OUTPUT);
101  digitalWrite(ReleT, HIGH);
102  pinMode(LedT, OUTPUT);
103     
104  TempSensors.begin(); //инициализируем сенсоры
105  lcd.init();
106  lcd.backlight();
107    
108   Serial.begin(9600);//инициализируем серийный порт
109}
110// //////////////////////////////////////////////////////////////////
111 
112// /////////////////////////////////////////////////////////////////
113void loop() {
114     
115  getTemp(); // читаем температуру с датчиков
116  printData();
117  currentMillis = millis(); // текущее время в миллисекундах
118lcd.setCursor(0, 1); 
119  lcd.print(OffTimeT/1000-(currentMillis/1000 - prevMillis/1000));
120 
121   
122  if (state == false && (currentMillis-prevMillis) > OffTimeT) {
123   
124    deFrost();
125 prevMillis = currentMillis;
126  }
127  else
128   
129   comprFun();
130}  
131// /////////////////////////////////////////////////////////////////

 

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

001// дисплей 1602
002#include <Wire.h>
003#include <LiquidCrystal_I2C.h>
004LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display
005 
006// два датчика температуры DS18B20 на пин 2
007#include <OneWire.h>
008#include <DallasTemperature.h>
009#define TEMP_WIRE_BUS 2
010OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
011DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
012DeviceAddress coolThermometer = {
0130x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
014DeviceAddress tenThermometer = {
0150x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
016// define variables
017float tempSensor[2]; // массив куда читается температура c датчиков.
018byte qty; // количество градусников на шине.
019 
020// счетчик
021unsigned long prevMillis; // последний момент времени, когда вкл оттайка
022unsigned long currentMillis;
023// таймер
024unsigned long OnTimeT = 50000; // длительность работы тэна (в миллисекундах)
025unsigned long OffTimeT = 18000000; // длительность не работы тэна (в миллисекундах)
026//////////////////////////////////////////////////////////////////
027//про холодильник
028#define ReleC  4  // реле компрессора
029#define ReleF  5 // реле вентилятора
030#define ReleT  6 // реле оттайки
031#define LedT  13 // свет оттайки
032boolean state = false;
033// /////////////////////////////////////////////////////////////////
034void getTemp(){ // читаем температуру и заполняем массив
035  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
036  tempSensor[0] = TempSensors.getTempC(coolThermometer);
037   tempSensor[1] = TempSensors.getTempC(tenThermometer);
038 
039}
040// /////////////////////////////////////////////////////////////////
041// пороговые значения температуры
042float tempC;
043int t1 = -13; //порог выключения компрессора
044int t2 = -10; // порог включения компрессора
045// /////////////////////////////////////////////////////////////////
046// работа компрессора
047 void comprFun()
048{
049  if(tempSensor[0] > t2) {
050   state = true;
051  digitalWrite(ReleC, LOW);
052  digitalWrite(ReleF, LOW);
053  }
054  if(tempSensor[0] < t1) {
055    digitalWrite(ReleC, HIGH);
056    digitalWrite(ReleF, HIGH);
057   state = false;
058  }
059}
060// режим оттайки
061void deFrost()
062{
063digitalWrite (ReleT, LOW);
064digitalWrite (LedT, HIGH);
065state=true;
066delay(OnTimeT);
067 
068digitalWrite (ReleT, HIGH);
069digitalWrite (LedT, LOW);
070state=false;
071lcd.clear();
072}
073/////// вывод инфы на экран
074void printData(){
075        lcd.setCursor(0, 0);
076        lcd.print("1:");
077        lcd.print(tempSensor[0]);  // показываем температуру с датчика 1
078         
079        lcd.setCursor(8, 0);
080        lcd.print("2:"); // показываем температуру с датчика 2
081        lcd.print(tempSensor[1]);
082     
083}
084// /////////////////////////////////////////////////////////////////
085 
086// ////////////////////////////////////////////////////////////////////
087void setup() {
088  pinMode(ReleC, OUTPUT);
089  digitalWrite(ReleC, HIGH);
090  pinMode(ReleF, OUTPUT);
091  digitalWrite(ReleF, HIGH);
092  pinMode(ReleT, OUTPUT);
093  digitalWrite(ReleT, HIGH);
094  pinMode(LedT, OUTPUT);
095     
096  TempSensors.begin(); //инициализируем сенсоры
097  lcd.begin();
098  lcd.backlight();
099    
100   Serial.begin(9600);//инициализируем серийный порт
101}
102// //////////////////////////////////////////////////////////////////
103 
104// /////////////////////////////////////////////////////////////////
105void loop() {
106     
107  getTemp(); // читаем температуру с датчиков
108  printData();
109  currentMillis = millis(); // текущее время в миллисекундах
110lcd.setCursor(0, 1); 
111  lcd.print(OffTimeT/1000-(currentMillis/1000 - prevMillis/1000));
112 
113   
114  if (state == false && (currentMillis-prevMillis) > OffTimeT) {
115   
116    deFrost();
117 prevMillis = currentMillis;
118  }
119  else
120   
121   comprFun();
122}  
123// /////////////////////////////////////////////////////////////////

 

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

vi.markevych пишет:

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

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

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

01#include <avr/wdt.h>
02 
03int counter=0;
04void setup(){
05   wdt_disable(); // запретили как можно скорее собаку, что-бы не уйти в бесконечный ребут
06    
07    Serial.begin(9600);
08  Serial.println("Starting...");
09  delay(1000); // что-бы четче видеть рестар скетча
10   
11  
12  wdt_enable(WDTO_8S); // активировали таймер, каждые 8-м секунд его нужно сбрасывать
13 
14   
15}
16 
17 
18 
19void loop(){
20  wdt_reset(); // говорим собаке что "В Багдаде все спокойно", начинается очередной отсчет 8-х секунд.
21   
22   Serial.println(counter);
23   counter++;
24    
25   if(counter==9){
26       Serial.println("visim....");
27 
28      while(true){} // создаем зависание, через 8 секунды должен произойти ресет, так как не вызывается wdt_reset();
29   }
30   delay(500);
31   
32}

 

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
001#include <Wire.h>
002 
003#include <OneWire.h>
004 
005#include <DallasTemperature.h>
006 
007#include <LiquidCrystal_I2C.h>
008 
009 
010// дисплей 1602
011 
012LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display
013 
014// два датчика температуры DS18B20 на пин 2
015 
016 
017#define TEMP_WIRE_BUS 2
018OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
019DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
020DeviceAddress coolThermometer = {
021  0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8
022};
023DeviceAddress tenThermometer = {
024  0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC
025};
026// define variables
027float tempSensor[2]; // массив куда читается температура c датчиков.
028byte qty; // количество градусников на шине.
029 
030// счетчик
031unsigned long prevMillis; // последний момент времени, когда вкл оттайка
032unsigned long currentMillis;
033// таймер
034unsigned long OnTimeT = 90000; // длительность работы тэна (в миллисекундах)
035unsigned long OffTimeT = 15000000; // длительность не работы тэна (в миллисекундах)
036//////////////////////////////////////////////////////////////////
037//про холодильник
038#define ReleC  4  // реле компрессора
039#define ReleF  5 // реле вентилятора
040#define ReleT  6 // реле оттайки
041#define LedT  13 // свет оттайки
042boolean state = false;
043// /////////////////////////////////////////////////////////////////
044void getTemp() { // читаем температуру и заполняем массив
045  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
046  tempSensor[0] = TempSensors.getTempC(coolThermometer);
047  tempSensor[1] = TempSensors.getTempC(tenThermometer);
048 
049}
050// /////////////////////////////////////////////////////////////////
051// пороговые значения температуры
052float tempC;
053int t1 = -14; //порог выключения компрессора
054int t2 = -11; // порог включения компрессора
055// /////////////////////////////////////////////////////////////////
056// работа компрессора
057void comprFun()
058{
059  if (tempSensor[0] > t2) {
060    state = true;
061    digitalWrite(ReleC, LOW);
062    digitalWrite(ReleF, LOW);
063  }
064  if (tempSensor[0] < t1) {
065    digitalWrite(ReleC, HIGH);
066    digitalWrite(ReleF, HIGH);
067    state = false;
068  }
069}
070// режим оттайки
071void deFrost()
072{
073  digitalWrite (ReleT, LOW);
074  digitalWrite (LedT, HIGH);
075  state = true;
076  delay(OnTimeT);
077 
078  digitalWrite (ReleT, HIGH);
079  digitalWrite (LedT, LOW);
080  state = false;
081  lcd.clear();
082}
083/////// вывод инфы на экран
084void printData() {
085  lcd.setCursor(0, 0);
086  lcd.print("1:");
087  lcd.print(tempSensor[0]);  // показываем температуру с датчика 1
088 
089  lcd.setCursor(8, 0);
090  lcd.print("2:"); // показываем температуру с датчика 2
091  lcd.print(tempSensor[1]);
092 
093}
094// /////////////////////////////////////////////////////////////////
095 
096// ////////////////////////////////////////////////////////////////////
097void setup() {
098  pinMode(ReleC, OUTPUT);
099  digitalWrite(ReleC, HIGH);
100  pinMode(ReleF, OUTPUT);
101  digitalWrite(ReleF, HIGH);
102  pinMode(ReleT, OUTPUT);
103  digitalWrite(ReleT, HIGH);
104  pinMode(LedT, OUTPUT);
105 
106  TempSensors.begin(); //инициализируем сенсоры
107  lcd.begin();
108  lcd.backlight();
109 
110  Serial.begin(9600);//инициализируем серийный порт
111}
112// //////////////////////////////////////////////////////////////////
113 
114// /////////////////////////////////////////////////////////////////
115void loop() {
116 
117  getTemp(); // читаем температуру с датчиков
118  printData();
119  currentMillis = millis(); // текущее время в миллисекундах
120  lcd.setCursor(0, 1);
121  lcd.print(OffTimeT / 1000 - (currentMillis / 1000 - prevMillis / 1000));
122 
123 
124  if (state == false && (currentMillis - prevMillis) > OffTimeT) {
125 
126    deFrost();
127    prevMillis = currentMillis;
128  }
129  else
130 
131    comprFun();
132}
133// /////////////////////////////////////////////////////////////////

 

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

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

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

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

001#include <Wire.h>
002 
003#include <OneWire.h>
004 
005#include <DallasTemperature.h>
006 
007#include <LiquidCrystal_I2C.h>
008 
009 
010// дисплей 1602
011 
012LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display
013 
014// два датчика температуры DS18B20 на пин 2
015 
016 
017#define TEMP_WIRE_BUS 2
018OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
019DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
020DeviceAddress coolThermometer = {
021  0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8  //темп датчик в морозилке
022};
023DeviceAddress tenThermometer = {
024  0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC  // темп датчик в холодильной камере
025};
026// define variables
027float tempSensor[2]; // массив куда читается температура c датчиков.
028byte qty; // количество градусников на шине.
029 
030// счетчик
031unsigned long prevMillis; // последний момент времени, когда вкл оттайка
032unsigned long currentMillis;
033// таймер
034unsigned long OnTimeT = 60000; // длительность работы тэна (в миллисекундах)
035unsigned long OffTimeT = 18000000; // длительность не работы тэна (в миллисекундах)
036//////////////////////////////////////////////////////////////////
037//про холодильник
038#define ReleC  4  // реле компрессора
039#define ReleF  5 // реле вентилятора
040#define ReleT  6 // реле оттайки
041#define LedT  13 // свет оттайки
042boolean state = false;
043// /////////////////////////////////////////////////////////////////
044void getTemp() { // читаем температуру и заполняем массив
045  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
046  tempSensor[0] = TempSensors.getTempC(coolThermometer);
047  tempSensor[1] = TempSensors.getTempC(tenThermometer);
048 
049}
050// /////////////////////////////////////////////////////////////////
051// пороговые значения температуры
052float tempC;
053int t1 = -16; //порог выключения компрессора
054int t2 = -14; // порог включения компрессора
055int t3 = 1; //порог выключения вентилятора
056int t4 = 3; // порог включения вентилятора
057// /////////////////////////////////////////////////////////////////
058// работа компрессора
059void comprFun()
060{
061  if (tempSensor[0] > t2) {
062    state = true;
063    digitalWrite(ReleC, LOW);
064    
065  }
066  if (tempSensor[0] < t1) {
067    digitalWrite(ReleC, HIGH);
068     
069    state = false;
070  }
071}
072 
073// работа вентилятора
074void fun()
075{
076  if (tempSensor[1] > t4) {
077    digitalWrite(ReleF, LOW);
078  }
079  if (tempSensor[1] < t3) {
080    digitalWrite(ReleF, HIGH);
081   }
082}
083// режим оттайки
084void deFrost()
085{
086  digitalWrite (ReleT, LOW);
087  digitalWrite (LedT, HIGH);
088  state = true;
089  delay(OnTimeT);
090 
091  digitalWrite (ReleT, HIGH);
092  digitalWrite (LedT, LOW);
093  state = false;
094  lcd.clear();
095}
096/////// вывод инфы на экран
097void printData() {
098  lcd.setCursor(0, 0);
099  lcd.print("1:");
100  lcd.print(tempSensor[0]);  // показываем температуру с датчика 1
101 
102  lcd.setCursor(8, 0);
103  lcd.print("2:"); // показываем температуру с датчика 2
104  lcd.print(tempSensor[1]);
105 
106}
107// /////////////////////////////////////////////////////////////////
108 
109// ////////////////////////////////////////////////////////////////////
110void setup() {
111  pinMode(ReleC, OUTPUT);
112  digitalWrite(ReleC, HIGH);
113  pinMode(ReleF, OUTPUT);
114  digitalWrite(ReleF, HIGH);
115  pinMode(ReleT, OUTPUT);
116  digitalWrite(ReleT, HIGH);
117  pinMode(LedT, OUTPUT);
118 
119  TempSensors.begin(); //инициализируем сенсоры
120  lcd.begin();
121  lcd.backlight();
122 
123  Serial.begin(9600);//инициализируем серийный порт
124}
125// //////////////////////////////////////////////////////////////////
126 
127// /////////////////////////////////////////////////////////////////
128void loop() {
129 
130  getTemp(); // читаем температуру с датчиков
131  printData();
132  currentMillis = millis(); // текущее время в миллисекундах
133  lcd.setCursor(0, 1);
134  lcd.print(OffTimeT / 1000 - (currentMillis / 1000 - prevMillis / 1000));
135 
136fun();
137  if (state == false && (currentMillis - prevMillis) > OffTimeT) {
138 
139    deFrost();
140    prevMillis = currentMillis;
141  }
142  else
143 
144    comprFun();
145 
146 }
147// /////////////////////////////////////////////////////////////////

 

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

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

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

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

001//termostat_indesit test-2.9_16_2 (1)
002 
003#include <OneWire.h>
004#include <LiquidCrystal_I2C.h>
005#include <DallasTemperature.h>
006OneWire oneWire(2);// вход датчиков 18b20
007DallasTemperature ds(&oneWire);
008unsigned long time;
009byte qty; // количество градусников на шине
010int T;//переменная по врмеи
011int T_gradus; //переменная температуры
012 
013LiquidCrystal_I2C lcd(0x3F, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
014 
015// Температура включения компрессора
016#define TEMP_MAX -18.0
017// Температура отключения компрессора
018#define TEMP_MIN -16.0
019// Реле подключено к 4 пину
020#define RELE_Kompres 4
021// Реле подключено к 5 пину
022#define RELE_Defrost 5
023// Реле подключено к 7 пину
024#define RELE_Fan 7
025// Реле подключено к 8 пину
026#define RELE_Fanx 8
027boolean b_compressorOff;          // Компрессор выключен
028boolean b_FanOff;               // вентилятор выключен
029 
030 
031void setup() {
032  lcd.init();
033  lcd.backlight();
034  ds.begin();
035 
036  pinMode(RELE_Kompres, OUTPUT);  // назначаем выходы
037  pinMode(RELE_Defrost, OUTPUT);
038  pinMode(RELE_Fan, OUTPUT);
039  pinMode(RELE_Fanx, OUTPUT);
040 
041  digitalWrite(RELE_Kompres, HIGH);             // При загрузке компрессор отключён
042  digitalWrite(RELE_Defrost, HIGH);             // При загрузке ТЭН разморозки отключён
043  digitalWrite(RELE_Fan, HIGH);
044  digitalWrite(RELE_Fanx, HIGH);
045 
046  qty = ds.getDeviceCount();
047  b_compressorOff = true;
048 
049 
050  delay (1000);
051}
052void(* resetFunc) (void) = 0; // объявляем функцию reset
053 
054void razmorozka()
055{
056  digitalWrite(RELE_Kompres, HIGH);
057  digitalWrite(RELE_Fan, HIGH);
058  digitalWrite(RELE_Fanx, HIGH);
059 
060  if (T > 455) {
061    if (ds.getTempCByIndex(1) < -10) { //Условие при которой оттайка включится
062 
063      digitalWrite(RELE_Defrost, LOW);
064    }
065 
066    if (ds.getTempCByIndex(1) > 4) { //температура выхода из оттайк
067 
068      digitalWrite(RELE_Defrost, HIGH);
069      resetFunc();
070    }
071  }
072  if (T > 485)resetFunc(); //веремя выхода из оттайки принудительно
073 
074 
075}
076 
077void loop() {
078  time = millis();
079  T = time / 60000;
080  ds.requestTemperatures(); // считываем температуру с датчиков
081  T_gradus = ds.getTempCByIndex(0);
082if (T<440){
083  lcd.setCursor(0,0); 
084  lcd.print("1:");
085 
086  lcd.print(ds.getTempCByIndex(0));
087  
088  lcd.print(" 2:");
089lcd.print(ds.getTempCByIndex(1));
090 
091 }
092else {
093  lcd.backlight();
094  lcd.setCursor(0,0);
095lcd.print("    DEFROST      ");
096 
097}
098 
099  lcd.setCursor(0, 1);
100 
101  lcd.print("D:");
102  lcd.print(ds.getTempCByIndex(1));
103 
104  lcd.print(" Time");
105 
106  lcd.print(T);
107 
108  if (T > 440) {   // запуск разморозки
109    razmorozka();
110 
111  }
112 
113else {
114 
115}
116 
117 
118//*********
119 
120if  (( ds.getTempCByIndex(2) >= 7 ) && (T < 440 )) {   // если температура выше 7 градусов то запускаем вентилятор №2
121 
122  digitalWrite(RELE_Fanx, LOW);
123 
124 }
125}
126else {
127  if ( ds.getTempCByIndex(2) <= 2 ) { //если температура ниже 3 то отключаем вентилятор №2
128 
129    digitalWrite(RELE_Fanx, HIGH);
130 
131  }
132}
133//***********
134if ( b_compressorOff ) {         //включение компрессора
135  if (( T_gradus > TEMP_MAX) && (T > 9    ) && (T < 440 )) {
136    digitalWrite(RELE_Kompres, LOW);
137    digitalWrite(RELE_Fan, LOW);
138    b_compressorOff = false;
139  }
140}
141else {
142  if ( T_gradus < TEMP_MIN ) {   //выключение компрессора
143    digitalWrite(RELE_Kompres, HIGH);
144    digitalWrite(RELE_Fan, HIGH);
145    b_compressorOff = true;
146  }
147}
148 
149delay(50);
150 
151 
152 
153 
154}

 

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

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

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

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

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

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

001#include <OneWire.h>
002#include <LiquidCrystal_I2C.h>
003#include <DallasTemperature.h>
004OneWire oneWire(2);// вход датчиков 18b20
005DallasTemperature ds(&oneWire);
006unsigned long time;
007byte qty; // количество градусников на шине
008int T;//переменная по врмеи
009int T_gradus; //переменная температуры
010int p = 3; //объявляем переменную с номером пина, на который подключен пьезоэлемент
011 
012LiquidCrystal_I2C lcd(0x3F, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
013 
014// Температура включения компрессора
015#define TEMP_MAX -15.0
016// Температура отключения компрессора
017#define TEMP_MIN -18.0
018// Реле подключено к 4 пину
019#define RELE_Kompres 4
020// Реле подключено к 5 пину
021#define RELE_Defrost 5
022// Реле подключено к 7 пину
023#define RELE_Fan 7
024// Реле подключено к 8 пину
025#define RELE_Fanx 8
026boolean b_compressorOff;  // Компрессор выключен
027boolean b_FanOff; // Вентилятор выключен
028 
029 
030void setup() {
031 
032  tone (p, 4000); //включаем на 4000 Гц
033  delay(2000);  //ждем 2000 Мс
034  noTone(p ); // отключаем
035 
036  lcd.init();
037  lcd.backlight();
038  ds.begin();
039 
040  pinMode(RELE_Kompres, OUTPUT);  // назначаем выходы
041  pinMode(RELE_Defrost, OUTPUT);
042  pinMode(RELE_Fan, OUTPUT);
043  pinMode(RELE_Fanx, OUTPUT);
044 
045 
046  digitalWrite(RELE_Kompres, HIGH);    // При загрузке компрессор отключён
047  digitalWrite(RELE_Defrost, HIGH);   // При загрузке ТЭН разморозки отключён
048  digitalWrite(RELE_Fan, HIGH);
049  digitalWrite(RELE_Fanx, HIGH);
050 
051  qty = ds.getDeviceCount();
052  b_compressorOff = true;
053 
054 
055  delay (1000);
056}
057void(* resetFunc) (void) = 0;  // объявляем функцию reset
058 
059void razmorozka()
060{
061 
062  digitalWrite(RELE_Kompres, HIGH);
063  digitalWrite(RELE_Fan, HIGH);
064  digitalWrite(RELE_Fanx, HIGH);
065 
066  if (T > 455) {
067    if (ds.getTempCByIndex(1) < -10) {  //Условие при которой оттайка включится
068 
069      digitalWrite(RELE_Defrost, LOW);
070    }
071 
072    if (ds.getTempCByIndex(1) > 4) {  //температура выхода из оттайк
073 
074      digitalWrite(RELE_Defrost, HIGH);
075      resetFunc();
076    }
077  }
078  if (T > 485)resetFunc();  //веремя выхода из оттайки принудительно
079}
080 
081void loop() {
082  time = millis();
083  T = time / 60000;
084  ds.requestTemperatures();  // считываем температуру с датчиков
085  T_gradus = ds.getTempCByIndex(0);
086 
087 
088 
089  if (T < 440) {
090    lcd.setCursor(0, 0);
091    lcd.print("F:"); //вывод информации о датчике морозильной камере
092    lcd.print(ds.getTempCByIndex(0));
093    lcd.print(" C:"); //вывод информации о датчике в холодильной камере
094    lcd.print(ds.getTempCByIndex(2));
095    lcd.setCursor(0, 1);
096    lcd.print("D:"); //вывод информации о датчике DEFROST
097    lcd.print(ds.getTempCByIndex(1));
098    lcd.print(" Time"); //вывод времени на дисплей
099    lcd.print(T);
100 
101  }
102  else
103  {
104    lcd.backlight();
105    lcd.setCursor(0, 0);
106    lcd.print("     DEFROST      "); //вывод информации об оттайки DEFROST
107    lcd.setCursor(0, 1);
108    lcd.print("D:"); //вывод информации о датчике DEFROST
109    lcd.print(ds.getTempCByIndex(1));
110    lcd.print(" Time"); //вывод времени на дисплей
111    lcd.print(T);
112  }
113 
114  if (T > 440) {   // запуск разморозки
115    razmorozka();
116 
117  }
118 
119  else {
120 
121  }
122 
123  //*********
124  if  (( ds.getTempCByIndex(2) >= 8 ) && (T < 440 )) {   // если температура выше 8 градусов то запускаем вентилятор №2
125    digitalWrite(RELE_Fanx, LOW);
126 
127  }
128 
129  else
130 
131  {
132 
133    if ( ds.getTempCByIndex(2) <= 5 ) {  //если температура ниже 5 то отключаем вентилятор №2
134      digitalWrite(RELE_Fanx, HIGH);
135 
136    }
137  }
138 
139  //***********
140  if ( b_compressorOff ) {  //включение компрессора
141    if (( T_gradus > TEMP_MAX) && (T > 9    ) && (T < 440 )) {
142      digitalWrite(RELE_Kompres, LOW);
143      digitalWrite(RELE_Fan, LOW);
144      b_compressorOff = false;
145    }
146  }
147  else {
148    if ( T_gradus < TEMP_MIN ) {  //выключение компрессора
149      digitalWrite(RELE_Kompres, HIGH);
150      digitalWrite(RELE_Fan, HIGH);
151      b_compressorOff = true;
152    }
153  }
154 
155  delay(50);
156}
157[/code]