Модераторы: healix, Модераторы форума
BIS писал(а):Завидую белой завистью![]()
людям, которые могут наступить на горло своей жабе и потратить какое-то количество денег на хорошую вещь, не взирая на экономическую целесообразность и сроки окупаемости.
ROM = 28
Chip = DS18B20
Data = 1 7A 1 4B 46 7F FF C 10 EC CRC=EC
Temperature = 23.62 Celsius,
ROM = 28
Chip = DS18B20
Data = 1 7B 1 4B 46 7F FF C 10 AF CRC=AF
Temperature = 23.69 Celsius,
BIS писал(а):С учетом еще проводов и разъемчиков думаю контроллер в две сотни гривен уложится. Можно купить еще дисплейчик, но то понты за 100 грн.![]()
Для работы котроллера дисплейчик собственно не нужен.
Sysopaty писал(а):А есть более подробная схема/инструкция по которой делаешь?
BIS писал(а):пока не придумал что бы такого интересного для ребенка сотворить
healix писал(а):А сколько ребёнку?
#include <OneWire.h>
// Контроллер солнечного коллектора.
// OneWire DS18S20, DS18B20, DS1822
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
OneWire ds(2); // on pin D2 (a 4.7K resistor is necessary) Провод к датчикам накопителя
OneWire ds_col(3); // on pin D3 (a 4.7K resistor is necessary) Провод к датчикам коллектора
int t_dif_max = 10; // разница температур для включения насоса
int t_dif_min = 2; // разница температур для выключения насоса
int pump_pin = 5; // вывод управления реле насоса
boolean pump_state = false; // состояние насоса вкл/выкл
void setup(void) {
Serial.begin(9600);
pinMode(pump_pin, OUTPUT);
digitalWrite(pump_pin, HIGH);//релюшка включается низким уровнем
}
void loop(void) {
byte i, j;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius;
float t_col_max, t_boiler_max, difference;
for ( j = 0; j < 3; j++) { // делаем чтение датчиков на линии накопителя и находим максимальную температуру
if ( !ds.search(addr)) {
ds.reset_search();
delay(1000);
break;
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
// Convert the data to actual temperature
// because the result is a 16 bit signed integer, it should
// be stored to an "int16_t" type, which is always 16 bits
// even when compiled on a 32 bit processor.
int16_t raw = (data[1] <<| data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
Serial.print(" TB");
Serial.print(j);
Serial.print(" = ");
Serial.println(celsius);
if (t_boiler_max < celsius) {
t_boiler_max = celsius;
}
}
for ( j = 0; j < 3; j++) { // делаем чтение датчиков на линии коллектора и находим максимальную температуру
if ( !ds_col.search(addr)) {
ds_col.reset_search();
delay(1000);
break;
}
if (OneWire::crc8(addr, 7) != addr[7]) {
Serial.println("CRC is not valid!");
return;
}
ds_col.reset();
ds_col.select(addr);
ds_col.write(0x44); // start conversion, with parasite power on at the end
delay(1000); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds_col.reset();
ds_col.select(addr);
ds_col.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds_col.read();
}
int16_t raw = (data[1] <<| data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// "count remain" gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
// at lower res, the low bits are undefined, so let's zero them
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
//// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
Serial.print(" TC");
Serial.print(j);
Serial.print(" = ");
Serial.println(celsius);
if (t_col_max < celsius) {
t_col_max = celsius;
}
}
difference = t_col_max - t_boiler_max ;
Serial.print(" t_boiler_max = ");
Serial.print(t_boiler_max);
Serial.print(" t_col_max = ");
Serial.print(t_col_max);
Serial.print(" Diff = ");
Serial.print(difference);
Serial.println(" ");
if ( t_boiler_max == 0 || t_col_max == 0 ) { // не прочитаны датчики на одной из линий
return;
}
if (difference > t_dif_max & pump_state == false) {
digitalWrite(pump_pin, LOW);
Serial.println(" Pump On ");
pump_state = true;
}
else if (difference < t_dif_min & pump_state == true) {
digitalWrite(pump_pin, HIGH);
Serial.println(" Pump OFF ");
pump_state = false;
}
delay(5000);
}
TB0 = 22.12
TB1 = 21.44
TC0 = 21.69
t_boiler_max = 22.12 t_col_max = 21.69 Diff = -0.44
TB0 = 22.19
TB1 = 21.44
TC0 = 21.81
t_boiler_max = 22.19 t_col_max = 21.81 Diff = -0.37
TB0 = 22.19
TB1 = 21.50
TC0 = 27.87
t_boiler_max = 22.19 t_col_max = 27.87 Diff = 5.69
TB0 = 22.19
TB1 = 21.50
TC0 = 30.06
t_boiler_max = 22.19 t_col_max = 30.06 Diff = 7.88
TB0 = 22.19
TB1 = 21.50
TC0 = 30.87
t_boiler_max = 22.19 t_col_max = 30.87 Diff = 8.69
Pump On
TB0 = 22.19
TB1 = 21.50
TC0 = 31.37
t_boiler_max = 22.19 t_col_max = 31.37 Diff = 9.19
TB0 = 22.25
TB1 = 21.50
TC0 = 29.81
t_boiler_max = 22.25 t_col_max = 29.81 Diff = 7.56
TB0 = 28.44
TB1 = 21.56
TC0 = 28.56
t_boiler_max = 28.44 t_col_max = 28.56 Diff = 0.12
Pump OFF
TB0 = 29.81
TB1 = 21.56
TC0 = 27.62
t_boiler_max = 29.81 t_col_max = 27.62 Diff = -2.19
healix писал(а):По сути, температура в градусах Цельсия не нужна... Ты же не показываешь её человеку?
Выбросив код конвертации, можно сократить и размер и время выполнения программы... Хотя, в этом проекте речь о нехватке ресурсов у Ардуины не идёт
Кстати, если уж температура в градусах не нужна, то датчики можно заменить терморезисторами - ещё дешевле будет
Зарегистрированные пользователи: Google [Bot]