простое термореле

Metalluga
Offline
Зарегистрирован: 21.04.2016

требуется создать просто ТР на датчике 18B20(но это не принципиально) интересует как правильнее сделать гистерезис по температуре. то есть включение например при 20гр выключение при 10гр. часть кода взял из статьи(не помню какой) но строчки гистерезиса дописал сам. код на данный момент работает. просто охота услышать мнение спецов о возможном неправильном коде. весь текст не пишу. он стандартный . тольки строчки гистерезиса. 

if (T<10)digitalWrite(13, LOW);
if (T>20) digitalWrite(13, HIGH );

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*
датчик DS18B20             -> 2    (One_wire_bas_pin)
реле                       -> 3    (relay_pin) 1 вкл реле / 0 откл реле
      (high_temp)= 20  реле откл
      (low_temp)= 10  реле вкл
*/
//#1
#include <OneWire.h>
const int One_wire_bas_pin = 2 ; // нога на шину OneWire
OneWire oneWire(One_wire_bas_pin);

#include <DallasTemperature.h>
DallasTemperature sensors(&oneWire); // подключаем  датчик DS18B20 на шину OneWire
float Temperature_value;;//обьявляем переменную температуры (t)

const int relay_pin = 3; // нога реле
uint8_t relay;//состояние реле
const int high_temp = 20; // температура откл
const int low_temp = 10; // температура вкл

void setup() {
  //#1
  sensors.begin();
  sensors.requestTemperatures(); // послать команду измерить температуру
  pinMode(relay_pin, OUTPUT);// подключить реле
  digitalWrite(relay_pin, relay = 0); // и выключить
}

void loop() {
  //#1
  static uint32_t past_1 = 0 ;
  if (millis() - past_1 >= 1000) { // если прошло 1000 миллисек
    past_1 = millis() ;
    Temperature_value = sensors.getTempCByIndex(0);// получить температуру с 1 датчика(0)
    sensors.requestTemperatures(); // послать команду измерить температуру
    if (relay && (Temperature_value >= high_temp))  // если реле включено и больше нужного
      digitalWrite(relay_pin, relay = 0); // то реле выключить
    if (!relay && (Temperature_value <= low_temp))  // если реле выключено и меньше нужного
      digitalWrite(relay_pin, relay = 1); // то реле включить
  }
}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что Вам собственно нужно? Чьё-то мнение про эти две строчки?

Metalluga пишет:

if (T<10)digitalWrite(13, LOW);
if (T>20) digitalWrite(13, HIGH );

Не, знаю, зачем Вам это, но, пожулйста ...

Код выглядит неаккуратным. Допустим, в строке 1 проверка дала true. У Вас выполняется digitalWrite, а после этого, зачем-то, выполнается проверка в строке 2. Зачем выполнять проверку. которая заведомо ложна?  Не то, что бы это приводило к взрыву Чернобыля, но выглядит неаккуратно.

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

Metalluga
Offline
Зарегистрирован: 21.04.2016

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

То, что если первая проверка оказалось истной (т.е. T<10), программа не будет выполнять вторую проверку (нахрена проверять T>20, если Т итак уже меньше 10?)

Metalluga
Offline
Зарегистрирован: 21.04.2016

понял. хотя по моим представлениям так и получается гистерезис

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, так и получается, но зачем переменную, которая с прошлого сравнения не поменялась с чем-то противоположным сравнивать? ВТорое сравнение сработае тогда, когда первое окажется ложным. А когда первое истина нафига сравнивать?

Metalluga
Offline
Зарегистрирован: 21.04.2016

в голове это понимаю а как в коде выразить пока не знаю.  как было бы грамотнее написать? что код был не громоздким?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Metalluga пишет:

в голове это понимаю а как в коде выразить пока не знаю.  как было бы грамотнее написать? что код был не громоздким?

Читайте последнию строчку в #2 до тех пор, пока не наступит просветление :)

Metalluga
Offline
Зарегистрирован: 21.04.2016

добавление else приведет к проверке обеих if? а без else возможна некорректная работа термореле?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Metalluga пишет:

добавление else приведет к проверке обеих if? а без else возможна некорректная работа термореле?

Тогда читайте вот это, опять же до полного просветления