Скетч для холодильника

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

Клапауций 234 пишет:

(ReleTenState == LOW && currentMillis - prevMillis > OnTimeTen)

и нефиг сравнивать знаковые и беззнаковые unsigned long prevMillis long OnTimeTen

Блин, блин... так вроде все в пределах "времени"

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

Dimmm пишет:

Клапауций 234 пишет:

(ReleTenState == LOW && currentMillis - prevMillis > OnTimeTen)

и нефиг сравнивать знаковые и беззнаковые unsigned long prevMillis long OnTimeTen

Блин, блин... так вроде все в пределах "времени"

Вот вы, ребята, глазастые! Вот что значит опыт! Как нам, чайникам далеко! Ваще! Уважаю профессионалов своего дела! Прям респект и уважуха!

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

arduino328 пишет:

Оператор И имеет больший приоритет чем БОЛЬШЕ.

так, нафига скобки?

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

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

arduino328
Offline
Зарегистрирован: 01.09.2016

Dimmm пишет:

Dimmm пишет:

Клапауций 234 пишет:

(ReleTenState == LOW && currentMillis - prevMillis > OnTimeTen)

и нефиг сравнивать знаковые и беззнаковые unsigned long prevMillis long OnTimeTen

Блин, блин... так вроде все в пределах "времени"

Вот вы, ребята, глазастые! Вот что значит опыт! Как нам, чайникам далеко! Ваще! Уважаю профессионалов своего дела! Прям респект и уважуха!

Так нельзя писать, а то Клапауций зазнается и пойдёт опять всё на форуме запрещать :)

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

Dimmm пишет:

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

а, взять и проверить - нужно ли фигнёй заниматься, вместо привести переменные времени к безнаковому типу?

у меня так работает:

if (r != 0 && s == 0 && stop - start > timer_retention  ) {

 

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

Да не... хотя... Встречал на форуме "посылы" от Клапауция))) Но все таки - что думаю сказал

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

Клапауций 234 пишет:

Dimmm пишет:

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

а, взять и проверить - нужно ли фигнёй заниматься, вместо привести переменные времени к безнаковому типу?

у меня так работает:

if (r != 0 && s == 0 && stop - start > timer_retention  ) {

 

 

Бррр! даже прочитал и понял что написано. Вывод - нефиг грузить итак груженное...

Не будем. Скобки удалил.

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

Да, и, кстати, к безнаковому привел, загрузил, жду че будет.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

arduino328 пишет:

Перевод кодовой строки:

ReleTenState==LOW И (currentMillis - prevMillis) БОЛЬШЕ OnTimeTen

Оператор И имеет больший приоритет чем БОЛЬШЕ.

разве http://ru.cppreference.com/w/cpp/language/operator_precedence

arduino328
Offline
Зарегистрирован: 01.09.2016

qwone пишет:

arduino328 пишет:

Перевод кодовой строки:

ReleTenState==LOW И (currentMillis - prevMillis) БОЛЬШЕ OnTimeTen

Оператор И имеет больший приоритет чем БОЛЬШЕ.

разве http://ru.cppreference.com/w/cpp/language/operator_precedence

Признаю, был неправ. В книжке принял <<= за сдвиговые операторы.
Но скобки всё равно не помешали бы.

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

не знаю... что то вот набредил....


#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);
      }
        }
}
// /////////////////////////////////////////////////////////////////

 

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

нихрена не понял про noDELAY

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

Клапауций 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
Offline
Зарегистрирован: 24.10.2016

Dimmm пишет:

Клапауций 234   

я все про титановый велосипед, правильно применил?

откуда я могу знать, правильно ты написал или нет? - предлагаешь мне весь твой код анализировать на предмет логических и прочих ошибок?

здесь #113 ты заявил, что нихрена не понял - как ты можешь что-то сделать правильно, кроме как случайно?

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

 

здесь #113 ты заявил, что нихрена не понял - как ты можешь что-то сделать правильно, кроме как случайно?

 

Логично! 

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

Разобрался сам. Скетч абсолютно рабочий! Глюк был только из за библиотеки 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 оказывается тоже рабочий, но, видимо, что то не доделал или не додумал, при совпадении времени работы компрессора и оттайки, оттайка как положено не запускается (так должно быть), сбрасывается счетчик и оттайка не запускается после выключения компрессора, как бы пропустил ну все, в следующий раз. Если время оттайки приходит в период ожидания, то оттайка включается как положено. В моем скетче выше, оттайка ждет окончания работы компрессора и запускается после его выключения, т.е. режим не пропускает. 

Вот как то так. 

arduino328
Offline
Зарегистрирован: 01.09.2016

Dimmm пишет:

Хочу выразить благодарность за ... неподсказку, на которую я напрашивался.

Специалистов по неподсказкам на форуме полным-полно. Обращайся если что!

N360
Offline
Зарегистрирован: 25.10.2017

Привет всем. Очень извиняюсь... А где можно увидеть общую схему соеденения узлов?

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

N360 пишет:

А где можно увидеть общую схему соеденения узлов?

схему соединения узлов холодильника?

N360
Offline
Зарегистрирован: 25.10.2017

Схему соеденения узлов этого проекта (ардуино + схема)

С схемой узлов холодильника проблем нет.