Помогите с проектом

liga
Offline
Зарегистрирован: 12.04.2015

Помогите с проектом. Программа должна выполняет функцию термостата, в качестве датчика температуры ds18b20. При нажатии на кнопку включается нагрузка, и происходит нагрев до 110С после того как температура достигла 110С держит ее в течении 40 мин. И отключается нагрузка.

Kolchugin
Offline
Зарегистрирован: 15.12.2013

Если тен взорвётся, то я тут не причём. Кнопка запуска на втором пине, датчик на пятом, нагрузка на 13.
Нагревается до 110 градусов, поддерживает температуру (выше 110 отключается, ниже включается).
Ну и через 40 минут полностью отключается.  Я сам новичёк и не совсем понимаю, как работает программа.
А! Чуть не забыл, в скетч адрес датчика нужно прописать (у вас он скорее всего будет другой, не такой как в скетче)



#include <OneWire.h>
byte _d18x2x1Addr[8] = {0x28, 0xFF, 0x11, 0x94, 0x3C, 0x4, 0x0, 0x48};
OneWire  _ow5(5);
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
bool _comp1 = 0;
bool _kp1 = 0;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _ktim1 = 0;
bool _kp2 = 0;
bool _bounseInput2S = 0;
bool _bounseInput2O = 0;
unsigned long _bounseInput2P = 0UL;
void setup()
{
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
  pinMode(13, OUTPUT);

  _bounseInput2O =  digitalRead(2);
}
void loop()
{
  bool  _bounceTmp2 =  (digitalRead (2));

  if (_bounseInput2S)
  {
    if (millis() >= (_bounseInput2P + 40))
    {
      _bounseInput2O = _bounceTmp2;
      _bounseInput2S = 0;
    }
  }
  else
  {
    if (_bounceTmp2 != _bounseInput2O )
    {
      _bounseInput2S = 1;
      _bounseInput2P = millis();
    }
  }

  if (_isTimer(_d18x2x1Tti, 1000)) {
    _d18x2x1Tti = millis();
    _d18x2x1O =  _readDS18_ow5(_d18x2x1Addr, 0);
  }
  if ((!_bounseInput2O) && (!(_ktim1))) {
    _kp1 = 1;
  }
  if (_ktim1 && (!((!_bounseInput2O)))) {
    _kp1 = 0;
  }
  if (((int((_d18x2x1O)))) <= (110))
  {
    _comp1 = 1;
  }
  else
  {
    _comp1 = 0;
  }
  digitalWrite (13, ((_kp1) && (_comp1)));
  if ((!_comp1) && (!((!_kp1)))) {
    _kp2 = 1;
  }
  if ((!_kp1) && (!((!_comp1)))) {
    _kp2 = 0;
  }
  if (_kp2)
  {
    if (_tim1I) {
      if (_isTimer(_tim1P, 2400000)) {
        _tim1O = 1;
      }
    } else {
      _tim1I = 1;
      _tim1P = millis();
    }
  } else {
    _tim1O = 0;
    _tim1I = 0;
  }
  if (_tim1O)
  {
    _ktim1 = 1;
  }
  else
  {
    _ktim1 = 0;
  }

}
bool _isTimer(unsigned long startTime, unsigned long period )
{
  unsigned long currentTime;
  currentTime = millis();
  if (currentTime >= startTime) {
    return (currentTime >= (startTime + period));
  } else {
    return (currentTime >= (4294967295 - startTime + period));
  }
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s)
  {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;   else if (cfg == 0x20) raw = raw & ~3;  else if (cfg == 0x40) raw = raw & ~1;
  }
  return  (float)raw / 16.0;
}
float _readDS18_ow5(byte addr[8], byte type_s)
{ byte data[12];
  byte i;
  _ow5.reset();
  _ow5.select(addr);
  _ow5.write(0xBE);
  for ( i = 0; i < 9; i++) {
    data[i] = _ow5.read();
  }
  _ow5.reset();
  _ow5.select(addr);
  _ow5.write(0x44, 1);
  return _convertDS18x2xData(type_s, data);
}