Разобрался сам. Скетч абсолютно рабочий! Глюк был только из за библиотеки 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 оказывается тоже рабочий, но, видимо, что то не доделал или не додумал, при совпадении времени работы компрессора и оттайки, оттайка как положено не запускается (так должно быть), сбрасывается счетчик и оттайка не запускается после выключения компрессора, как бы пропустил ну все, в следующий раз. Если время оттайки приходит в период ожидания, то оттайка включается как положено. В моем скетче выше, оттайка ждет окончания работы компрессора и запускается после его выключения, т.е. режим не пропускает.
и нефиг сравнивать знаковые и беззнаковые
unsigned
long
prevMillis
long
OnTimeTen
Блин, блин... так вроде все в пределах "времени"
и нефиг сравнивать знаковые и беззнаковые
unsigned
long
prevMillis
long
OnTimeTen
Блин, блин... так вроде все в пределах "времени"
Вот вы, ребята, глазастые! Вот что значит опыт! Как нам, чайникам далеко! Ваще! Уважаю профессионалов своего дела! Прям респект и уважуха!
Оператор И имеет больший приоритет чем БОЛЬШЕ.
так, нафига скобки?
Ну я так понял для большего разграничения, вроде как логично выглядит выделить признаки сравнения.
и нефиг сравнивать знаковые и беззнаковые
unsigned
long
prevMillis
long
OnTimeTen
Блин, блин... так вроде все в пределах "времени"
Вот вы, ребята, глазастые! Вот что значит опыт! Как нам, чайникам далеко! Ваще! Уважаю профессионалов своего дела! Прям респект и уважуха!
Так нельзя писать, а то Клапауций зазнается и пойдёт опять всё на форуме запрещать :)
Ну я так понял для большего разграничения, вроде как логично выглядит выделить признаки сравнения.
а, взять и проверить - нужно ли фигнёй заниматься, вместо привести переменные времени к безнаковому типу?
у меня так работает:
Да не... хотя... Встречал на форуме "посылы" от Клапауция))) Но все таки - что думаю сказал
Ну я так понял для большего разграничения, вроде как логично выглядит выделить признаки сравнения.
а, взять и проверить - нужно ли фигнёй заниматься, вместо привести переменные времени к безнаковому типу?
у меня так работает:
Бррр! даже прочитал и понял что написано. Вывод - нефиг грузить итак груженное...
Не будем. Скобки удалил.
Да, и, кстати, к безнаковому привел, загрузил, жду че будет.
Перевод кодовой строки:
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().
не знаю... что то вот набредил....
нихрена не понял про noDELAY
Клапауций 234
я все про титановый велосипед, правильно применил?
Клапауций 234
я все про титановый велосипед, правильно применил?
откуда я могу знать, правильно ты написал или нет? - предлагаешь мне весь твой код анализировать на предмет логических и прочих ошибок?
здесь #113 ты заявил, что нихрена не понял - как ты можешь что-то сделать правильно, кроме как случайно?
здесь #113 ты заявил, что нихрена не понял - как ты можешь что-то сделать правильно, кроме как случайно?
Логично!
Разобрался сам. Скетч абсолютно рабочий! Глюк был только из за библиотеки LiquidCrystal_I2C, скачал видимо из плюшевого ресурса. Путем проб и ошибок (методом научного тыка), анализом предыдущих действий и полученных результатов, изучением соответствующей литературы и рабочих скетчей в качестве примера, установлена истина (поменял библиотеку и все))) Хочу выразить благодарность за направление в нужное русло участников форума и неподсказку, на которую я напрашивался. До этого холодильника с программированием МК не сталкивался вообще, за корткое время узнал очень много в этой области и, самое главное, хочется идти дальше.
Сечас скетч выглядит вот так:
Скетч из #114 с class_noDELAY оказывается тоже рабочий, но, видимо, что то не доделал или не додумал, при совпадении времени работы компрессора и оттайки, оттайка как положено не запускается (так должно быть), сбрасывается счетчик и оттайка не запускается после выключения компрессора, как бы пропустил ну все, в следующий раз. Если время оттайки приходит в период ожидания, то оттайка включается как положено. В моем скетче выше, оттайка ждет окончания работы компрессора и запускается после его выключения, т.е. режим не пропускает.
Вот как то так.
Хочу выразить благодарность за ... неподсказку, на которую я напрашивался.
Специалистов по неподсказкам на форуме полным-полно. Обращайся если что!
Привет всем. Очень извиняюсь... А где можно увидеть общую схему соеденения узлов?
А где можно увидеть общую схему соеденения узлов?
схему соединения узлов холодильника?
Схему соеденения узлов этого проекта (ардуино + схема)
С схемой узлов холодильника проблем нет.