Рабочий холодильник с NoFrost
- Войдите на сайт для отправки комментариев
Выкладываю проверенный скетч холодильника с функцией 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> |
007 | LiquidCrystal_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 |
011 | OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков |
012 | DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр |
013 | DeviceAddress coolThermometer = { |
014 | 0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 }; |
015 | DeviceAddress tenThermometer = { |
016 | 0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC }; |
017 | // define variables |
018 | float tempSensor[2]; // массив куда читается температура c датчиков. |
019 | byte qty; // количество градусников на шине. |
020 |
021 | // счетчик |
022 | unsigned long prevMillis = 0; // последний момент времени, когда вкл оттайка |
023 |
024 | // таймер |
025 | long OnTimeTen = 60000; // длительность работы тэна (в миллисекундах) |
026 | long OffTimeTen = 21600000; // длительность не работы тэна (в миллисекундах) |
027 | ////////////////////////////////////////////////////////////////// |
028 | //про холодильник |
029 | int ReleCompr = 4; // реле компрессора |
030 | int ReleComprState = HIGH; |
031 | int ReleFun = 5; // реле вентилятора |
032 | // int ReleFunState = HIGH; |
033 | int ReleTen = 6; // реле оттайки |
034 | int ReleTenState = HIGH; |
035 | int LedTen = 13; // свет оттайки |
036 | // ///////////////////////////////////////////////////////////////// |
037 | void 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 | // пороговые значения температуры |
047 | float tempC; |
048 | float t1 = -10; //порог выключения компрессора |
049 | float t2 = -8; // порог включения компрессора |
050 | float t3 = -14; //порог включения оттайки |
051 | float t4 = -5.0; //порог выключения оттайки |
052 | // ///////////////////////////////////////////////////////////////// |
053 | // работа компрессора |
054 | void 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 | // //////////////////////////////////////////////////////////////////// |
083 | void 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 | // ///////////////////////////////////////////////////////////////// |
101 | void loop () { |
102 | |
103 | getTemp(); // читаем температуру с датчиков |
104 | printData(); |
105 | |
106 | unsigned long currentMillis = millis(); // текущее время в миллисекундах |
107 | lcd.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 секунд (можете уменьшить время или увеличить, регулируется опытным путем).
Подправил чуть, так лучше работает.
001
// дисплей 1602
002
#include <Wire.h>
003
#include <LiquidCrystal_I2C.h>
004
LiquidCrystal_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
010
OneWire tempWire(TEMP_WIRE_BUS);
//объявили переменную датчиков
011
DallasTemperature TempSensors(&tempWire);
//объявили структуру типа Даллас термометр
012
DeviceAddress coolThermometer = {
013
0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
014
DeviceAddress tenThermometer = {
015
0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
016
// define variables
017
float
tempSensor[2];
// массив куда читается температура c датчиков.
018
byte
qty;
// количество градусников на шине.
019
020
// счетчик
021
unsigned
long
prevMillis = 0;
// последний момент времени, когда вкл оттайка
022
023
024
// таймер
025
unsigned
long
OnTimeT = 50000;
// длительность работы тэна (в миллисекундах)
026
unsigned
long
OffTimeT = 18000000;
// длительность не работы тэна (в миллисекундах)
027
//////////////////////////////////////////////////////////////////
028
//про холодильник
029
int
ReleC = 4;
// реле компрессора
030
volatile
int
ReleCState = HIGH;
031
int
ReleF = 5;
// реле вентилятора
032
int
ReleT = 6;
// реле оттайки
033
volatile
int
ReleTState = HIGH;
034
int
LedT = 13;
// свет оттайки
035
// /////////////////////////////////////////////////////////////////
036
void
getTemp(){
// читаем температуру и заполняем массив
037
TempSensors.requestTemperatures();
//команда сенсорам заполнить свою память новыми данными
038
tempSensor[0] = TempSensors.getTempC(coolThermometer);
039
tempSensor[1] = TempSensors.getTempC(tenThermometer);
040
041
}
042
// /////////////////////////////////////////////////////////////////
043
// пороговые значения температуры
044
float
tempC;
045
float
t1 = -12;
//порог выключения компрессора
046
float
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
// режим оттайки
067
void
deFrost()
068
{
069
ReleTState = LOW ;
070
digitalWrite (ReleT, ReleTState);
071
digitalWrite (LedT, HIGH);
072
lcd.setCursor(8, 1);
073
lcd.print(
"DEFROST "
);
074
delay(OnTimeT);
075
ReleTState = HIGH ;
076
digitalWrite (ReleT, ReleTState);
077
digitalWrite (LedT, LOW);
078
lcd.clear();
079
}
080
/////// вывод инфы на экран
081
void
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
// ////////////////////////////////////////////////////////////////////
094
void
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
// /////////////////////////////////////////////////////////////////
112
void
loop
() {
113
114
getTemp();
// читаем температуру с датчиков
115
printData();
116
unsigned
long
currentMillis = millis();
// текущее время в миллисекундах
117
lcd.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
// /////////////////////////////////////////////////////////////////
вот еще шлифанул
001
// дисплей 1602
002
#include <Wire.h>
003
#include <LiquidCrystal_I2C.h>
004
LiquidCrystal_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
010
OneWire tempWire(TEMP_WIRE_BUS);
//объявили переменную датчиков
011
DallasTemperature TempSensors(&tempWire);
//объявили структуру типа Даллас термометр
012
DeviceAddress coolThermometer = {
013
0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
014
DeviceAddress tenThermometer = {
015
0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
016
// define variables
017
float
tempSensor[2];
// массив куда читается температура c датчиков.
018
byte
qty;
// количество градусников на шине.
019
020
// счетчик
021
unsigned
long
prevMillis;
// последний момент времени, когда вкл оттайка
022
unsigned
long
currentMillis;
023
// таймер
024
unsigned
long
OnTimeT = 50000;
// длительность работы тэна (в миллисекундах)
025
unsigned
long
OffTimeT = 18000000;
// длительность не работы тэна (в миллисекундах)
026
//////////////////////////////////////////////////////////////////
027
//про холодильник
028
#define ReleC 4 // реле компрессора
029
#define ReleF 5 // реле вентилятора
030
#define ReleT 6 // реле оттайки
031
#define LedT 13 // свет оттайки
032
boolean state =
false
;
033
// /////////////////////////////////////////////////////////////////
034
void
getTemp(){
// читаем температуру и заполняем массив
035
TempSensors.requestTemperatures();
//команда сенсорам заполнить свою память новыми данными
036
tempSensor[0] = TempSensors.getTempC(coolThermometer);
037
tempSensor[1] = TempSensors.getTempC(tenThermometer);
038
039
}
040
// /////////////////////////////////////////////////////////////////
041
// пороговые значения температуры
042
float
tempC;
043
int
t1 = -12;
//порог выключения компрессора
044
int
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
// режим оттайки
067
void
deFrost()
068
{
069
digitalWrite (ReleT, LOW);
070
digitalWrite (LedT, HIGH);
071
state=
true
;
072
lcd.setCursor(8, 1);
073
lcd.print(
"DEFROST "
);
074
delay(OnTimeT);
075
076
digitalWrite (ReleT, HIGH);
077
digitalWrite (LedT, LOW);
078
state=
false
;
079
lcd.clear();
080
}
081
/////// вывод инфы на экран
082
void
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
// ////////////////////////////////////////////////////////////////////
095
void
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
// /////////////////////////////////////////////////////////////////
113
void
loop
() {
114
115
getTemp();
// читаем температуру с датчиков
116
printData();
117
currentMillis = millis();
// текущее время в миллисекундах
118
lcd.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
// /////////////////////////////////////////////////////////////////
Доброго времени суток. У меня на моем холодильнтке 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 недели.
Как побороть данную проблему на данный момент не знаю. Мучаюсь с этим уже 3 недели.
блок питания не из гавна и палок.
Доброго времени суток. У меня на моем холодильнтке 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>
004
LiquidCrystal_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
010
OneWire tempWire(TEMP_WIRE_BUS);
//объявили переменную датчиков
011
DallasTemperature TempSensors(&tempWire);
//объявили структуру типа Даллас термометр
012
DeviceAddress coolThermometer = {
013
0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
014
DeviceAddress tenThermometer = {
015
0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
016
// define variables
017
float
tempSensor[2];
// массив куда читается температура c датчиков.
018
byte
qty;
// количество градусников на шине.
019
020
// счетчик
021
unsigned
long
prevMillis;
// последний момент времени, когда вкл оттайка
022
unsigned
long
currentMillis;
023
// таймер
024
unsigned
long
OnTimeT = 50000;
// длительность работы тэна (в миллисекундах)
025
unsigned
long
OffTimeT = 18000000;
// длительность не работы тэна (в миллисекундах)
026
//////////////////////////////////////////////////////////////////
027
//про холодильник
028
#define ReleC 4 // реле компрессора
029
#define ReleF 5 // реле вентилятора
030
#define ReleT 6 // реле оттайки
031
#define LedT 13 // свет оттайки
032
boolean state =
false
;
033
// /////////////////////////////////////////////////////////////////
034
void
getTemp(){
// читаем температуру и заполняем массив
035
TempSensors.requestTemperatures();
//команда сенсорам заполнить свою память новыми данными
036
tempSensor[0] = TempSensors.getTempC(coolThermometer);
037
tempSensor[1] = TempSensors.getTempC(tenThermometer);
038
039
}
040
// /////////////////////////////////////////////////////////////////
041
// пороговые значения температуры
042
float
tempC;
043
int
t1 = -13;
//порог выключения компрессора
044
int
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
// режим оттайки
061
void
deFrost()
062
{
063
digitalWrite (ReleT, LOW);
064
digitalWrite (LedT, HIGH);
065
state=
true
;
066
delay(OnTimeT);
067
068
digitalWrite (ReleT, HIGH);
069
digitalWrite (LedT, LOW);
070
state=
false
;
071
lcd.clear();
072
}
073
/////// вывод инфы на экран
074
void
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
// ////////////////////////////////////////////////////////////////////
087
void
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
// /////////////////////////////////////////////////////////////////
105
void
loop
() {
106
107
getTemp();
// читаем температуру с датчиков
108
printData();
109
currentMillis = millis();
// текущее время в миллисекундах
110
lcd.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
// /////////////////////////////////////////////////////////////////
Все этой в куче может работать день, и иногда и больше но о один прекрасный момент виснет. Причем виснет при разных режимах работы (работа компрессора, отдых компрессора, разморозка)
Как побороть данную проблему на данный момент не знаю. Мучаюсь с этим уже 3 недели.
нужно прошить загузчик optiboot, и подключить вачдог, пусть сам как завис перегужается.
01
#include <avr/wdt.h>
02
03
int
counter=0;
04
void
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
19
void
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
}
Все этой в куче может работать день, и иногда и больше но о один прекрасный момент виснет. Причем виснет при разных режимах работы (работа компрессора, отдых компрессора, разморозка)
Как побороть данную проблему на данный момент не знаю. Мучаюсь с этим уже 3 недели.
нужно прошить загузчик optiboot, и подключить вачдог, пусть сам как завис перегужается.
Можно, в качестве второй линии обороны, а начать все таки с рецепта Клапауция.
А я что то побоялся wdt использовать. У меня Pro Mini, почитал, она на очень с собакой дружит. Поэтому использовал более доступные на тот момент способы, описанные выше. Все работает, ничего не виснет.
Самое главное жена не пилит насчет холодильника.
Круто!
Можно, в качестве второй линии обороны, а начать все таки с рецепта Клапауция.
хорошо хоть он "вторую линию обороны" не запретил. :)
Можно, в качестве второй линии обороны, а начать все таки с рецепта Клапауция.
хорошо хоть он "вторую линию обороны" не запретил. :)
Согласитесь, если собака будет постоянно клацать, это не есть гуд. А там явные проблемы с питанием.
А я что то побоялся wdt использовать. У меня Pro Mini, почитал, она на очень с собакой дружит. Поэтому использовал более доступные на тот момент способы, описанные выше. Все работает, ничего не виснет.
я от сюда брал прошивку http://homes-smart.ru/index.php/oborudovanie/arduino/avr-zagruzchik
на основе optiboot занимает всего 512 байт, и с wdt дружит,и как что сделать - там доходчиво написано.
Согласитесь, если собака будет постоянно клацать, это не есть гуд. А там явные проблемы с питанием.
когда в моем самодельном инкубаторе со 150 перепелиными яйцами на 15 день температура поднялась до 52 градусов, я решил - пусть лучше щелкает, хотя в данном конкретном случае - я не спорю.
Блок питания взял от старой зарядки Samsung. Сегодня попробую еще раз все пропаять.
когда в моем самодельном инкубаторе со 150 перепелиными яйцами на 15 день температура поднялась до 52 градусов, я решил - пусть лучше щелкает, хотя в данном конкретном случае - я не спорю.
Сам wdt всегда использую, но не для таких откровенных сбоев (их надо лечить на корню).
А бульонные шарики Вы решили приготовить прямо в скорлупе?))))
я от сюда брал прошивку http://homes-smart.ru/index.php/oborudovanie/arduino/avr-zagruzchik
на основе optiboot занимает всего 512 байт, и с wdt дружит,и как что сделать - там доходчиво написано.
надо почитать, но на досуге, вроде все стабильно работает. Все-таки питание и качество контактов много на себя берет....
надо почитать, но на досуге, вроде все стабильно работает. Все-таки питание и качество контактов много на себя берет....
До поры, до времени. Собаку не на пустом месте придумали и пренебрегать ею не стоит.
А бульонные шарики Вы решили приготовить прямо в скорлупе?))))
ну с учетом того, что каждое яичко брал по 10р и через день они уже вылупиться должны были.... с перышками уже были... собакам конечно понравились :(
ну с учетом того, что каждое яичко брал по 10р и через день они уже вылупиться должны были.... с перышками уже были... собакам конечно понравились :(
Это где Вас на такую цену развели? Максимум 5р, а так по 3,5-4р. Выводились ничуть не хуже и четвертый год на этих двух линиях живу, пока не деградируют.
Для самоделки наверно поставил бы еще какой нибудь аналоговый компаратор градусов на 40, чтобы вырубал силовую цепь, если что не так. Ведь от пробитого симистора wdt не спасет.
Доброго дня.
По поводу использования «собаки» немного сомневаюсь – холодильнику необходимо через каждые 8-12 часов размораживаться, а «собака» будет сбрасывать счетчик отработанного времени.
Относительно питания – вся схема работает от старой зарядки телефона Samsung.
Все между ардуинкой и комплектующими (датчиками, дисплеем, релейным модулем) спаяно проводами.
Вчера заметил что зависание происходит в момент включения/отключения реле на модуле. При этом зависание происходит только в том случае, если к реле подключен потребитель (компрессор, ТЭН).
"вся схема работает от старой зарядки телефона Samsung."
Вот причина засора. Посмотрите здесь по форуму, темы по питанию, их здесь мульен.
"а «собака» будет сбрасывать счетчик отработанного времени"
Запись "моточасов" в EEPROM, Клапауций пока не запретил. При записи каждые полчаса ресурса одной ячейки хватит лет на 60.))
Сеголня попробую решить проблему с питанием при помощи замена ЗУ на БП с использованием DC-DC преобразователя. Завтра отпишусь о результатах.
Относительно "собаки" и EEPROM - я еще очень "зеленый" в програмировании, но буду пробовать.
Запитав всю схему от блока питания на 12 v и DC-DC преобразователя на 5 v, на данный момент, все работает.
Dimmm, vi.markevych,ребята не могли бы вы скинуть свою почту? спасибо.
Markevich1509@gmail.com
Привет,гляньте пожалуйста почту,спасибо.
Dimmm, vi.markevych,ребята не могли бы вы скинуть свою почту? спасибо.
ух ты! а я и не вижу, тут что то интересное мутится!
el-kzn@yandex.ru
ко всему выше написаному:
с моментра запуска моего холодильника на плате Pro Mini прошло уже практически полгода. После устранения дрязгов в контактах и через APC не было НИ ОДНОГО зависания. В первое время эксперементировал со временем оттайки, интервалом включения тэна, температурой морозилки. Сейчас стоит 18 млн. мл.сек. интервал между оттайками, тэн включается на 60 сек., температура камеры -14 (расстояние от испарителя до датчика 15 см.). Во второй камере холодильника датчик показывает 1-2 градуса (очень оптимально). Замерил потребление холодильником тока в сутки - 1,2 кВт (тупо по счетчику засек))). Короче полгода полет нормальный!
А! Самое главное то не сказал! Зависания прекратились не только после устранения плохого контакта, а после того как убрал индикацию режима работы. В коде была индикация на дисплей режима - если включился компрессор - COOL, в режиме ожидания - WHEITING. Так вот, убрал и все, зависания окончательно прекратились. Искал разные варианты библиотек для LCD, все равно висло. Как убрал, так проблема решилась. В #5 топике скетч.
Датчик (18В20) у меня стоит 3 шт.
1. В холодильной камере - управление заслонкой подачи холодного воздуха в холодильную камеру,для индикации температуры в холодильной камере.
2. В морозильной камере - управление работы компрессора, индикация температуры в камере.
3. Установлен в испарителе морозильной камеры - для управлением процеса разморозки.
Относительно процеса разморозки - алгоритм работы следующий:
1. при достижении указаного времени (420 минут) отключаем компрессор.
2. при прошествиии 10 минут включаем ТЭН и мониторим температуру на испарителе.
3. при достижении температуры на испарителе в +3 градуса (или пшествии 30 минут процеса разморозки) - отключаем ТЭН.
4. Ждем 5 минут для остывание ТЭНа.
5. Перезагружаем ардуинку.
Далие холодильник работает в "нормальном режиме" и считест 420 минут.
Для моего холодильника такие времменные промежуткия являются оптимальными.
ну супер! )))
Dimmm гляньте почту.
Dimmm вы бы не могли сказать для чего нужный эти адреса.Как я понял это адреса датчиков для каждого он свой? как мне узнать какой адреса мойх датчиков? спасибо.
Запускаете примеры из OneWire, там есть определение адресов (в котором точно не помню). Для DS18B20 все должны начинаться с 0х28. Ручками переносите в скетч.
Dimmm гляньте почту.
почту глянул.
если честно, лень все расписывать...
к выходным соберусь с духом и напишу как сделать.
Напиши мне марку своего LG.
Запускаете примеры из OneWire, там есть определение адресов (в котором точно не помню). Для DS18B20 все должны начинаться с 0х28. Ручками переносите в скетч.
Спасибо,с адресами разобрался.
Dimmm гляньте почту.
почту глянул.
если честно, лень все расписывать...
к выходным соберусь с духом и напишу как сделать.
Напиши мне марку своего LG.
а что в нем сломалось? Компрессор точно живой? какие симптомы?
Компрессор живой,все навесное тоже живое,сам блок управление умер сгорел МК. Таких модулей нету в продаже,а если есть то цена не реально завышена у нас.
На холдильнике (с обратной стороны) есть электросхема
Можно ее фото???
.
Ага есть такое дело.
Что из комплектующих у Вас есть? Ардуино? Реле? Датчики?
Я така понимаю что это у Вас первый опыт работы с ардуинко?
Всю дальнейшую переписку лучше вести по почте.
Есть все что нужно для этих целей,есть Реле,есть датчики,есть Ардуино,можно сказать что и первый.
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
012
LiquidCrystal_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
018
OneWire tempWire(TEMP_WIRE_BUS);
//объявили переменную датчиков
019
DallasTemperature TempSensors(&tempWire);
//объявили структуру типа Даллас термометр
020
DeviceAddress coolThermometer = {
021
0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8
022
};
023
DeviceAddress tenThermometer = {
024
0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC
025
};
026
// define variables
027
float
tempSensor[2];
// массив куда читается температура c датчиков.
028
byte
qty;
// количество градусников на шине.
029
030
// счетчик
031
unsigned
long
prevMillis;
// последний момент времени, когда вкл оттайка
032
unsigned
long
currentMillis;
033
// таймер
034
unsigned
long
OnTimeT = 90000;
// длительность работы тэна (в миллисекундах)
035
unsigned
long
OffTimeT = 15000000;
// длительность не работы тэна (в миллисекундах)
036
//////////////////////////////////////////////////////////////////
037
//про холодильник
038
#define ReleC 4 // реле компрессора
039
#define ReleF 5 // реле вентилятора
040
#define ReleT 6 // реле оттайки
041
#define LedT 13 // свет оттайки
042
boolean state =
false
;
043
// /////////////////////////////////////////////////////////////////
044
void
getTemp() {
// читаем температуру и заполняем массив
045
TempSensors.requestTemperatures();
//команда сенсорам заполнить свою память новыми данными
046
tempSensor[0] = TempSensors.getTempC(coolThermometer);
047
tempSensor[1] = TempSensors.getTempC(tenThermometer);
048
049
}
050
// /////////////////////////////////////////////////////////////////
051
// пороговые значения температуры
052
float
tempC;
053
int
t1 = -14;
//порог выключения компрессора
054
int
t2 = -11;
// порог включения компрессора
055
// /////////////////////////////////////////////////////////////////
056
// работа компрессора
057
void
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
// режим оттайки
071
void
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
/////// вывод инфы на экран
084
void
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
// ////////////////////////////////////////////////////////////////////
097
void
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
// /////////////////////////////////////////////////////////////////
115
void
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
// /////////////////////////////////////////////////////////////////
Нет предела совершенству!
Выкладываю самую последнюю версию. Работает лучше, чем задумал производитель. Теперь температура в холодильной камере тоже под контролем. С самого начала было ощущение, что что то не совсем доделано. Теперь это ощущение исчезло потому, что работает даже лучше, чем ожидал. Самое главное - экономия электроэнергии и контролируемая температура холодильной камеры. В заводском исполнении контролировалась только температура морозильной камеры. Без каких либо существенных изменений (добавил датчик температуры в холодильную камеру) и посредством програмного кода (задействовал штатный вентилятор для изменения температуры в холодильной камере) удалось выжать из холодильника дополнительные возможности.
Пользуйтесь!
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
012
LiquidCrystal_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
018
OneWire tempWire(TEMP_WIRE_BUS);
//объявили переменную датчиков
019
DallasTemperature TempSensors(&tempWire);
//объявили структуру типа Даллас термометр
020
DeviceAddress coolThermometer = {
021
0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8
//темп датчик в морозилке
022
};
023
DeviceAddress tenThermometer = {
024
0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC
// темп датчик в холодильной камере
025
};
026
// define variables
027
float
tempSensor[2];
// массив куда читается температура c датчиков.
028
byte
qty;
// количество градусников на шине.
029
030
// счетчик
031
unsigned
long
prevMillis;
// последний момент времени, когда вкл оттайка
032
unsigned
long
currentMillis;
033
// таймер
034
unsigned
long
OnTimeT = 60000;
// длительность работы тэна (в миллисекундах)
035
unsigned
long
OffTimeT = 18000000;
// длительность не работы тэна (в миллисекундах)
036
//////////////////////////////////////////////////////////////////
037
//про холодильник
038
#define ReleC 4 // реле компрессора
039
#define ReleF 5 // реле вентилятора
040
#define ReleT 6 // реле оттайки
041
#define LedT 13 // свет оттайки
042
boolean state =
false
;
043
// /////////////////////////////////////////////////////////////////
044
void
getTemp() {
// читаем температуру и заполняем массив
045
TempSensors.requestTemperatures();
//команда сенсорам заполнить свою память новыми данными
046
tempSensor[0] = TempSensors.getTempC(coolThermometer);
047
tempSensor[1] = TempSensors.getTempC(tenThermometer);
048
049
}
050
// /////////////////////////////////////////////////////////////////
051
// пороговые значения температуры
052
float
tempC;
053
int
t1 = -16;
//порог выключения компрессора
054
int
t2 = -14;
// порог включения компрессора
055
int
t3 = 1;
//порог выключения вентилятора
056
int
t4 = 3;
// порог включения вентилятора
057
// /////////////////////////////////////////////////////////////////
058
// работа компрессора
059
void
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
// работа вентилятора
074
void
fun()
075
{
076
if
(tempSensor[1] > t4) {
077
digitalWrite(ReleF, LOW);
078
}
079
if
(tempSensor[1] < t3) {
080
digitalWrite(ReleF, HIGH);
081
}
082
}
083
// режим оттайки
084
void
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
/////// вывод инфы на экран
097
void
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
// ////////////////////////////////////////////////////////////////////
110
void
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
// /////////////////////////////////////////////////////////////////
128
void
loop
() {
129
130
getTemp();
// читаем температуру с датчиков
131
printData();
132
currentMillis = millis();
// текущее время в миллисекундах
133
lcd.setCursor(0, 1);
134
lcd.print(OffTimeT / 1000 - (currentMillis / 1000 - prevMillis / 1000));
135
136
fun();
137
if
(state ==
false
&& (currentMillis - prevMillis) > OffTimeT) {
138
139
deFrost();
140
prevMillis = currentMillis;
141
}
142
else
143
144
comprFun();
145
146
}
147
// /////////////////////////////////////////////////////////////////
Доброго дня/вечера/ночи.
Добавлю и свой вариант скетча.
Этот на дисплее 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>
006
OneWire oneWire(2);
// вход датчиков 18b20
007
DallasTemperature ds(&oneWire);
008
unsigned
long
time;
009
byte
qty;
// количество градусников на шине
010
int
T;
//переменная по врмеи
011
int
T_gradus;
//переменная температуры
012
013
LiquidCrystal_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
027
boolean b_compressorOff;
// Компрессор выключен
028
boolean b_FanOff;
// вентилятор выключен
029
030
031
void
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
}
052
void
(* resetFunc) (
void
) = 0;
// объявляем функцию reset
053
054
void
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
077
void
loop
() {
078
time = millis();
079
T = time / 60000;
080
ds.requestTemperatures();
// считываем температуру с датчиков
081
T_gradus = ds.getTempCByIndex(0);
082
if
(T<440){
083
lcd.setCursor(0,0);
084
lcd.print(
"1:"
);
085
086
lcd.print(ds.getTempCByIndex(0));
087
088
lcd.print(
" 2:"
);
089
lcd.print(ds.getTempCByIndex(1));
090
091
}
092
else
{
093
lcd.backlight();
094
lcd.setCursor(0,0);
095
lcd.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
113
else
{
114
115
}
116
117
118
//*********
119
120
if
(( ds.getTempCByIndex(2) >= 7 ) && (T < 440 )) {
// если температура выше 7 градусов то запускаем вентилятор №2
121
122
digitalWrite(RELE_Fanx, LOW);
123
124
}
125
}
126
else
{
127
if
( ds.getTempCByIndex(2) <= 2 ) {
//если температура ниже 3 то отключаем вентилятор №2
128
129
digitalWrite(RELE_Fanx, HIGH);
130
131
}
132
}
133
//***********
134
if
( 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
}
141
else
{
142
if
( T_gradus < TEMP_MIN ) {
//выключение компрессора
143
digitalWrite(RELE_Kompres, HIGH);
144
digitalWrite(RELE_Fan, HIGH);
145
b_compressorOff =
true
;
146
}
147
}
148
149
delay(50);
150
151
152
153
154
}
Интересно! Почитаю. Это на два вентилятора?
Да. Один в морозильной камере.
Второй перегоняет холодный воздух с морозьльной камеры в холодильную.
Ребята привет,взял за основу код vi.markevych,чуть подогнал для себя,собрал всю схему,все подключил,питание в норме без пульсации,можно сказать все работает,но в какой то момент зависает ардуинка,посмотрите пожалуйста код возможно где то есть проблема по этому и зависает,спасибо.
001
#include <OneWire.h>
002
#include <LiquidCrystal_I2C.h>
003
#include <DallasTemperature.h>
004
OneWire oneWire(2);
// вход датчиков 18b20
005
DallasTemperature ds(&oneWire);
006
unsigned
long
time;
007
byte
qty;
// количество градусников на шине
008
int
T;
//переменная по врмеи
009
int
T_gradus;
//переменная температуры
010
int
p = 3;
//объявляем переменную с номером пина, на который подключен пьезоэлемент
011
012
LiquidCrystal_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
026
boolean b_compressorOff;
// Компрессор выключен
027
boolean b_FanOff;
// Вентилятор выключен
028
029
030
void
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
}
057
void
(* resetFunc) (
void
) = 0;
// объявляем функцию reset
058
059
void
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
081
void
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]