Разобрался сам. Скетч абсолютно рабочий! Глюк был только из за библиотеки LiquidCrystal_I2C, скачал видимо из плюшевого ресурса. Путем проб и ошибок (методом научного тыка), анализом предыдущих действий и полученных результатов, изучением соответствующей литературы и рабочих скетчей в качестве примера, установлена истина (поменял библиотеку и все))) Хочу выразить благодарность за направление в нужное русло участников форума и неподсказку, на которую я напрашивался. До этого холодильника с программированием МК не сталкивался вообще, за корткое время узнал очень много в этой области и, самое главное, хочется идти дальше.
Сечас скетч выглядит вот так:
// дисплей 1602
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display
// два датчика температуры DS18B20 на пин 2
#include <OneWire.h>
#include <DallasTemperature.h>
#define TEMP_WIRE_BUS 2
OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков
DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
DeviceAddress coolThermometer = {
0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 };
DeviceAddress tenThermometer = {
0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC };
// define variables
float tempSensor[2]; // массив куда читается температура c датчиков.
byte qty; // количество градусников на шине.
// счетчик
unsigned long prevMillis; // последний момент времени, когда вкл оттайка
unsigned long currentMillis;
// таймер
unsigned long OnTimeT = 50000; // длительность работы тэна (в миллисекундах)
unsigned long OffTimeT = 18000000; // длительность не работы тэна (в миллисекундах)
//////////////////////////////////////////////////////////////////
//про холодильник
#define ReleC 4 // реле компрессора
#define ReleF 5 // реле вентилятора
#define ReleT 6 // реле оттайки
#define LedT 13 // свет оттайки
boolean state = false;
// /////////////////////////////////////////////////////////////////
void getTemp(){ // читаем температуру и заполняем массив
TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
tempSensor[0] = TempSensors.getTempC(coolThermometer);
tempSensor[1] = TempSensors.getTempC(tenThermometer);
}
// /////////////////////////////////////////////////////////////////
// пороговые значения температуры
float tempC;
int t1 = -12; //порог выключения компрессора
int t2 = -10; // порог включения компрессора
// /////////////////////////////////////////////////////////////////
// работа компрессора
void comprFun()
{
if(tempSensor[0] > t2) {
state = true;
digitalWrite(ReleC, LOW);
digitalWrite(ReleF, LOW);
lcd.setCursor(8, 1);
lcd.print("FREEZING");
}
if(tempSensor[0] < t1) {
digitalWrite(ReleC, HIGH);
digitalWrite(ReleF, HIGH);
lcd.setCursor(8, 1);
lcd.print("WAITING ");
state = false;
}
}
// режим оттайки
void deFrost()
{
digitalWrite (ReleT, LOW);
digitalWrite (LedT, HIGH);
state=true;
lcd.setCursor(8, 1);
lcd.print("DEFROST ");
delay(OnTimeT);
digitalWrite (ReleT, HIGH);
digitalWrite (LedT, LOW);
state=false;
lcd.clear();
}
/////// вывод инфы на экран
void printData(){
lcd.setCursor(0, 0);
lcd.print("1:");
lcd.print(tempSensor[0]); // показываем температуру с датчика 1
lcd.setCursor(8, 0);
lcd.print("2:"); // показываем температуру с датчика 2
lcd.print(tempSensor[1]);
}
// /////////////////////////////////////////////////////////////////
// ////////////////////////////////////////////////////////////////////
void setup() {
pinMode(ReleC, OUTPUT);
digitalWrite(ReleC, HIGH);
pinMode(ReleF, OUTPUT);
digitalWrite(ReleF, HIGH);
pinMode(ReleT, OUTPUT);
digitalWrite(ReleT, HIGH);
pinMode(LedT, OUTPUT);
TempSensors.begin(); //инициализируем сенсоры
lcd.init();
lcd.backlight();
Serial.begin(9600);//инициализируем серийный порт
}
// //////////////////////////////////////////////////////////////////
// /////////////////////////////////////////////////////////////////
void loop() {
getTemp(); // читаем температуру с датчиков
printData();
currentMillis = millis(); // текущее время в миллисекундах
lcd.setCursor(0, 1);
lcd.print(OffTimeT/1000-(currentMillis/1000 - prevMillis/1000));
if (state == false && (currentMillis-prevMillis) > OffTimeT) {
deFrost();
prevMillis = currentMillis;
}
else
comprFun();
}
// /////////////////////////////////////////////////////////////////
Скетч из #114 с class_noDELAY оказывается тоже рабочий, но, видимо, что то не доделал или не додумал, при совпадении времени работы компрессора и оттайки, оттайка как положено не запускается (так должно быть), сбрасывается счетчик и оттайка не запускается после выключения компрессора, как бы пропустил ну все, в следующий раз. Если время оттайки приходит в период ожидания, то оттайка включается как положено. В моем скетче выше, оттайка ждет окончания работы компрессора и запускается после его выключения, т.е. режим не пропускает.
и нефиг сравнивать знаковые и беззнаковые
unsignedlongprevMillislongOnTimeTenБлин, блин... так вроде все в пределах "времени"
и нефиг сравнивать знаковые и беззнаковые
unsignedlongprevMillislongOnTimeTenБлин, блин... так вроде все в пределах "времени"
Вот вы, ребята, глазастые! Вот что значит опыт! Как нам, чайникам далеко! Ваще! Уважаю профессионалов своего дела! Прям респект и уважуха!
Оператор И имеет больший приоритет чем БОЛЬШЕ.
так, нафига скобки?
Ну я так понял для большего разграничения, вроде как логично выглядит выделить признаки сравнения.
и нефиг сравнивать знаковые и беззнаковые
unsignedlongprevMillislongOnTimeTenБлин, блин... так вроде все в пределах "времени"
Вот вы, ребята, глазастые! Вот что значит опыт! Как нам, чайникам далеко! Ваще! Уважаю профессионалов своего дела! Прям респект и уважуха!
Так нельзя писать, а то Клапауций зазнается и пойдёт опять всё на форуме запрещать :)
Ну я так понял для большего разграничения, вроде как логично выглядит выделить признаки сравнения.
а, взять и проверить - нужно ли фигнёй заниматься, вместо привести переменные времени к безнаковому типу?
у меня так работает:
if (r != 0 && s == 0 && stop - start > timer_retention ) {Да не... хотя... Встречал на форуме "посылы" от Клапауция))) Но все таки - что думаю сказал
Ну я так понял для большего разграничения, вроде как логично выглядит выделить признаки сравнения.
а, взять и проверить - нужно ли фигнёй заниматься, вместо привести переменные времени к безнаковому типу?
у меня так работает:
if (r != 0 && s == 0 && stop - start > timer_retention ) {Бррр! даже прочитал и понял что написано. Вывод - нефиг грузить итак груженное...
Не будем. Скобки удалил.
Да, и, кстати, к безнаковому привел, загрузил, жду че будет.
Перевод кодовой строки:
ReleTenState==LOW И (currentMillis - prevMillis) БОЛЬШЕ OnTimeTen
Оператор И имеет больший приоритет чем БОЛЬШЕ.
разве http://ru.cppreference.com/w/cpp/language/operator_precedence
Перевод кодовой строки:
ReleTenState==LOW И (currentMillis - prevMillis) БОЛЬШЕ OnTimeTen
Оператор И имеет больший приоритет чем БОЛЬШЕ.
разве http://ru.cppreference.com/w/cpp/language/operator_precedence
Признаю, был неправ. В книжке принял <<= за сдвиговые операторы.
Но скобки всё равно не помешали бы.
класс титановый велосипед для delay без delay().
не знаю... что то вот набредил....
#include <Wire.h> #include <DallasTemperature.h> #include <OneWire.h> #include "class_noDELAY.h" // дисплей 1602 #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display // два датчика температуры DS18B20 на пин 2 #define TEMP_WIRE_BUS 2 OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр DeviceAddress coolThermometer = { 0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 }; DeviceAddress tenThermometer = { 0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC }; // define variables float tempSensor[2]; // массив куда читается температура c датчиков. byte qty; // количество градусников на шине. // счетчик // таймер noDELAY nD_01; // период включения оттайки. noDELAY nD_02; // время работы оттайки ////////////////////////////////////////////////////////////////// //про холодильник // ///////////////////////////////////////////////////////////////// void getTemp(){ // читаем температуру и заполняем массив TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными tempSensor[0] = TempSensors.getTempC(coolThermometer); tempSensor[1] = TempSensors.getTempC(tenThermometer); /* for (int i = 0; i < qty; i++) tempSensor[i] = TempSensors.getTempCByIndex(i);//в цикле заполняем массив полученными данными, уже приведенными к градусам Цельсия. */ } // ///////////////////////////////////////////////////////////////// // пороговые значения температуры float tempC; float t1 = -10; //порог выключения компрессора float t2 = -8; // порог включения компрессора float t3 = -14; //порог включения оттайки float t4 = -5.0; //порог выключения оттайки // ///////////////////////////////////////////////////////////////// // работа компрессора void printData(){ /////// вывод инфы на экран lcd.setCursor(0, 0); lcd.print("Temp1: "); lcd.print(tempSensor[0]); // показываем температуру с датчика lcd.print("C"); lcd.setCursor(0, 1); lcd.print("Temp2: "); // число датчиков lcd.print(tempSensor[1]); lcd.print("C"); } // ///////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////// void setup() { pinMode(4, OUTPUT); // компрессор digitalWrite(4, 0); pinMode(5, OUTPUT); // вентилятор digitalWrite(5, 0); pinMode(6, OUTPUT); // тэн оттайки digitalWrite(6, 0); TempSensors.begin(); //инициализируем сенсоры lcd.init(); lcd.backlight(); Serial.begin(9600);//инициализируем серийный порт } // ////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// void loop() { getTemp(); // читаем температуру с датчиков printData(); nD_01.read(19000000); nD_02.read(50000); if(digitalRead(4, 0) && nD_01.push_tick) { digitalWrite(6, 1); } if(nD_02.push_tick) { digitalWrite(6, 0); } else { if(tempSensor[0] > t2) { digitalWrite(4, 1); digitalWrite(5, 1); } if(tempSensor[0] < t1) { digitalWrite(4, 0); digitalWrite(5, 0); } } } // /////////////////////////////////////////////////////////////////нихрена не понял про noDELAY
Клапауций 234
я все про титановый велосипед, правильно применил?
#include "class_noDELAY.h" // дисплей 1602 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display // два датчика температуры DS18B20 на пин 2 #include <OneWire.h> #include <DallasTemperature.h> #define TEMP_WIRE_BUS 2 OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр DeviceAddress coolThermometer = { 0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 }; DeviceAddress tenThermometer = { 0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC }; // define variables float tempSensor[2]; // массив куда читается температура c датчиков. byte qty; // количество градусников на шине. // счетчик noDELAY nD_Defrost; // объявление объекта класса noDELAY с именем nD_01. // таймер unsigned long OnTimeT = 50000; // длительность работы тэна (в миллисекундах) unsigned long OffTimeT = 18000000; // длительность не работы тэна (в миллисекундах) unsigned long prevMillis = 0; // последний момент времени, когда вкл оттайка ////////////////////////////////////////////////////////////////// //про холодильник int ReleC = 4; // реле компрессора volatile int ReleCState = HIGH; int ReleF = 5; // реле вентилятора int ReleT = 6; // реле оттайки volatile int ReleTState = HIGH; int LedT = 13; // свет оттайки // ///////////////////////////////////////////////////////////////// void getTemp(){ // читаем температуру и заполняем массив TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными tempSensor[0] = TempSensors.getTempC(coolThermometer); tempSensor[1] = TempSensors.getTempC(tenThermometer); } // ///////////////////////////////////////////////////////////////// // пороговые значения температуры float tempC; float t1 = -12; //порог выключения компрессора float t2 = -10; // порог включения компрессора // ///////////////////////////////////////////////////////////////// // работа компрессора void comprFun() { if(ReleTState==HIGH && tempSensor[0] > t2) { ReleCState = LOW; digitalWrite(ReleC, ReleCState); digitalWrite(ReleF, ReleCState); lcd.setCursor(8, 1); lcd.print("FREEZING"); } if(ReleCState==LOW && tempSensor[0] < t1) { ReleCState = HIGH; digitalWrite(ReleC, ReleCState); digitalWrite(ReleF, ReleCState); lcd.setCursor(8, 1); lcd.print("WAITING "); } } // режим оттайки void deFrost() { ReleTState = LOW ; digitalWrite (ReleT, ReleTState); digitalWrite (LedT, HIGH); lcd.setCursor(8, 1); lcd.print("DEFROST "); delay(OnTimeT); ReleTState = HIGH ; digitalWrite (ReleT, ReleTState); digitalWrite (LedT, LOW); lcd.clear(); } /////// вывод инфы на экран void printData(){ lcd.setCursor(0, 0); lcd.print("1:"); lcd.print(tempSensor[0]); // показываем температуру с датчика 1 lcd.setCursor(8, 0); lcd.print("2:"); // показываем температуру с датчика 2 lcd.print(tempSensor[1]); } // ///////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////// void setup() { pinMode(ReleC, OUTPUT); digitalWrite(ReleC, ReleCState); pinMode(ReleF, OUTPUT); digitalWrite(ReleF, ReleCState); pinMode(ReleT, OUTPUT); digitalWrite(ReleT, ReleTState); pinMode(LedT, OUTPUT); TempSensors.begin(); //инициализируем сенсоры lcd.init(); lcd.backlight(); nD_Defrost.start(); Serial.begin(9600);//инициализируем серийный порт } // ////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// void loop() { getTemp(); // читаем температуру с датчиков printData(); unsigned long currentMillis = millis(); // текущее время в миллисекундах lcd.setCursor(0, 1); lcd.print(OffTimeT/1000-(currentMillis/1000 - prevMillis/1000)); nD_Defrost.read(OffTimeT); if (ReleCState == HIGH && nD_Defrost.tick) { deFrost(); prevMillis = currentMillis; } else comprFun(); } // /////////////////////////////////////////////////////////////////Клапауций 234
я все про титановый велосипед, правильно применил?
откуда я могу знать, правильно ты написал или нет? - предлагаешь мне весь твой код анализировать на предмет логических и прочих ошибок?
здесь #113 ты заявил, что нихрена не понял - как ты можешь что-то сделать правильно, кроме как случайно?
здесь #113 ты заявил, что нихрена не понял - как ты можешь что-то сделать правильно, кроме как случайно?
Логично!
Разобрался сам. Скетч абсолютно рабочий! Глюк был только из за библиотеки LiquidCrystal_I2C, скачал видимо из плюшевого ресурса. Путем проб и ошибок (методом научного тыка), анализом предыдущих действий и полученных результатов, изучением соответствующей литературы и рабочих скетчей в качестве примера, установлена истина (поменял библиотеку и все))) Хочу выразить благодарность за направление в нужное русло участников форума и неподсказку, на которую я напрашивался. До этого холодильника с программированием МК не сталкивался вообще, за корткое время узнал очень много в этой области и, самое главное, хочется идти дальше.
Сечас скетч выглядит вот так:
// дисплей 1602 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2);// set the LCD address to 0x27 for a 16 chars and 2 line display // два датчика температуры DS18B20 на пин 2 #include <OneWire.h> #include <DallasTemperature.h> #define TEMP_WIRE_BUS 2 OneWire tempWire(TEMP_WIRE_BUS); //объявили переменную датчиков DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр DeviceAddress coolThermometer = { 0x28, 0xFF, 0xC0, 0xC6, 0x43, 0x16, 0x04, 0xA8 }; DeviceAddress tenThermometer = { 0x28, 0xFF, 0x23, 0xFC, 0x43, 0x16, 0x03, 0xEC }; // define variables float tempSensor[2]; // массив куда читается температура c датчиков. byte qty; // количество градусников на шине. // счетчик unsigned long prevMillis; // последний момент времени, когда вкл оттайка unsigned long currentMillis; // таймер unsigned long OnTimeT = 50000; // длительность работы тэна (в миллисекундах) unsigned long OffTimeT = 18000000; // длительность не работы тэна (в миллисекундах) ////////////////////////////////////////////////////////////////// //про холодильник #define ReleC 4 // реле компрессора #define ReleF 5 // реле вентилятора #define ReleT 6 // реле оттайки #define LedT 13 // свет оттайки boolean state = false; // ///////////////////////////////////////////////////////////////// void getTemp(){ // читаем температуру и заполняем массив TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными tempSensor[0] = TempSensors.getTempC(coolThermometer); tempSensor[1] = TempSensors.getTempC(tenThermometer); } // ///////////////////////////////////////////////////////////////// // пороговые значения температуры float tempC; int t1 = -12; //порог выключения компрессора int t2 = -10; // порог включения компрессора // ///////////////////////////////////////////////////////////////// // работа компрессора void comprFun() { if(tempSensor[0] > t2) { state = true; digitalWrite(ReleC, LOW); digitalWrite(ReleF, LOW); lcd.setCursor(8, 1); lcd.print("FREEZING"); } if(tempSensor[0] < t1) { digitalWrite(ReleC, HIGH); digitalWrite(ReleF, HIGH); lcd.setCursor(8, 1); lcd.print("WAITING "); state = false; } } // режим оттайки void deFrost() { digitalWrite (ReleT, LOW); digitalWrite (LedT, HIGH); state=true; lcd.setCursor(8, 1); lcd.print("DEFROST "); delay(OnTimeT); digitalWrite (ReleT, HIGH); digitalWrite (LedT, LOW); state=false; lcd.clear(); } /////// вывод инфы на экран void printData(){ lcd.setCursor(0, 0); lcd.print("1:"); lcd.print(tempSensor[0]); // показываем температуру с датчика 1 lcd.setCursor(8, 0); lcd.print("2:"); // показываем температуру с датчика 2 lcd.print(tempSensor[1]); } // ///////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////// void setup() { pinMode(ReleC, OUTPUT); digitalWrite(ReleC, HIGH); pinMode(ReleF, OUTPUT); digitalWrite(ReleF, HIGH); pinMode(ReleT, OUTPUT); digitalWrite(ReleT, HIGH); pinMode(LedT, OUTPUT); TempSensors.begin(); //инициализируем сенсоры lcd.init(); lcd.backlight(); Serial.begin(9600);//инициализируем серийный порт } // ////////////////////////////////////////////////////////////////// // ///////////////////////////////////////////////////////////////// void loop() { getTemp(); // читаем температуру с датчиков printData(); currentMillis = millis(); // текущее время в миллисекундах lcd.setCursor(0, 1); lcd.print(OffTimeT/1000-(currentMillis/1000 - prevMillis/1000)); if (state == false && (currentMillis-prevMillis) > OffTimeT) { deFrost(); prevMillis = currentMillis; } else comprFun(); } // /////////////////////////////////////////////////////////////////Скетч из #114 с class_noDELAY оказывается тоже рабочий, но, видимо, что то не доделал или не додумал, при совпадении времени работы компрессора и оттайки, оттайка как положено не запускается (так должно быть), сбрасывается счетчик и оттайка не запускается после выключения компрессора, как бы пропустил ну все, в следующий раз. Если время оттайки приходит в период ожидания, то оттайка включается как положено. В моем скетче выше, оттайка ждет окончания работы компрессора и запускается после его выключения, т.е. режим не пропускает.
Вот как то так.
Хочу выразить благодарность за ... неподсказку, на которую я напрашивался.
Специалистов по неподсказкам на форуме полным-полно. Обращайся если что!
Привет всем. Очень извиняюсь... А где можно увидеть общую схему соеденения узлов?
А где можно увидеть общую схему соеденения узлов?
схему соединения узлов холодильника?
Схему соеденения узлов этого проекта (ардуино + схема)
С схемой узлов холодильника проблем нет.