Помогите с проектом
- Войдите на сайт для отправки комментариев
Вс, 12/04/2015 - 22:07
Помогите с проектом. Программа должна выполняет функцию термостата, в качестве датчика температуры ds18b20. При нажатии на кнопку включается нагрузка, и происходит нагрев до 110С после того как температура достигла 110С держит ее в течении 40 мин. И отключается нагрузка.
Если тен взорвётся, то я тут не причём. Кнопка запуска на втором пине, датчик на пятом, нагрузка на 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); }