Ban đầu, bộ điều chỉnh nhiệt được chế tạo đơn giản như một nhiệt kế để kiểm soát nhiệt độ bên ngoài cửa sổ. Sau đó, trong thời gian băng giá, khoai tây bắt đầu đóng băng dưới lòng đất và chức năng được thêm vào để kiểm soát vi khí hậu. Dữ liệu hộ chiếu của rơle chuyển mạch - 250V và 10A (2.5kW). Vì nhiệt trong lòng đất là không cần thiết, mười một kilowatt là đủ.
Vật liệu và công cụ cần thiết:hộp chăm sóc giày
-USB-sạc cho điện thoại (bất kỳ, ít nhất 0,7A)
-
Arduino-Pro-Mini
Hiển thị -2 ký tự 8 dòng (WH0802A-NGA-CT nhỏ gọn hơn)
Bộ mã hóa với một nút (có thể được mua trong bất kỳ mag radio nào, nút này không được tích hợp)
-chuyển đổi với rơle 5V (Tôi đã mua một loạt rơle Trung Quốc mà không cần cách ly quang học một lần, vì vậy tôi cần một bộ ghép nối PC817 và điện trở 470 Ohm. Nếu bạn có cách ly quang trên bảng tên, bạn có thể kết nối bảng tên trực tiếp với cổng arduino)
Đầu nối USB
-2 cáp mở rộng USB dài 3 mét (một cho dây nguồn, đến giây thứ hai chúng tôi hàn DS1820)
- DS1820 (với bất kỳ chữ cái nào)
hàn sắt
súng -glue
Tên nơi FTDI232
Bước 1: Trước hết, chúng ta cần flash arduino, vì tôi có Pro Mini (nó không có bộ chuyển đổi USB-RS232), tôi cần hàn một thước kẻ có chân vào arduino. Từ phía mà DTR, TXD, RXD, VCC, GND, GND được dẫn xuất. Bây giờ chúng tôi kết nối FTDI232 DTR với DTR, VCC với VCC, GND với GND, TXD với RXD, RXD với TXD. Chạy IDE arduino, tải xuống bản phác thảo và flash nó (bản phác thảo ở cuối).
Bước 2: Bây giờ chúng ta hãy chăm sóc thân tàu. Chúng tôi xé miếng bọt biển tại FU FUKS, làm suy yếu mọi thứ, phần sâu của hộp có thể được thông qua bằng một miếng vải nhám (một cái gì đó sẽ bị kẹt chắc chắn hơn). Đánh dấu lỗ cho bộ mã hóa, đầu nối USB (mẹ) và chính màn hình. Dán keo rơle vào nắp hộp. Chúng ta phải cố gắng đặt rơle xa hơn bộ xử lý và sắp xếp các bộ phận để nắp đóng lại sau (có nhiều không gian).
Bước 3: Bây giờ chúng tôi lấy cáp mở rộng USB, cắt ổ cắm đầu nối (mẹ). Chúng tôi cắt đầu cắt, khoan một lỗ cho cáp trong thân máy, chèn nó và dán chìa khóa bằng súng. Thêm vào đó, cáp có màu đỏ, trừ màu đen (tôi chỉ kiểm tra nó), cộng với điểm cộng của đầu nối, trừ đi điểm trừ (tôi không thể đưa ra sơ đồ chân của đầu nối - nó TẠO trên Internet). Giữa điểm cộng của đầu nối và 2 phương tiện (tôi đã kết nối chúng), một điện trở 4,7kOhm phải được hàn.
Bước 4: Chúng tôi lấy 2 cáp nối dài USB, cắt đầu nối (mẹ), cắt cáp. Chỉ trong trường hợp, chúng tôi sẽ kiểm tra xem tất cả chúng ta có hàn chính xác hay không. Chúng tôi kết nối cáp nguồn với sạc USB và với mạng, cắm cáp cắt vào đầu nối USB, nhìn vào máy kiểm tra + trên màu đỏ - đen. Chúng tôi rút cáp ra và hàn DS1820: - đến 1, + đến 3 2 dây còn lại thành 2. Tôi sau đó phủ hợp chất epoxy (để sửa chữa các bể chứa, bộ tản nhiệt), để lại một ít vỏ cảm biến ra bên ngoài, do đó sẽ có phản ứng nhanh hơn với sự thay đổi nhiệt độ.Vâng, chúng tôi thực hiện cài đặt theo sơ đồ mạch (chúng tôi kết nối nguồn và đất của tấm rơle với các mạch + và - tương ứng).
Bước 5: Tất cả các thành phần mạch được kết nối. Chúng tôi kết nối cảm biến của chúng tôi (không có nó, màn hình sẽ vẫn màu đen), cấp nguồn. Trong dòng đầu tiên - giá trị nhiệt độ, trong 2 nếu bật * * bật - rơle bật, không tắt. Bây giờ hãy thử đặt giới hạn chuyển tiếp. Nhấn trục bộ mã hóa (hoặc nút của bạn), giá trị giới hạn xuất hiện tại đó rơle sẽ bật bằng cách xoay trục - giá trị tăng hoặc giảm. Bằng cách nhấp vào trục một lần nữa - chúng tôi nhận được giới hạn trên (rơle sẽ tắt), đặt giá trị và nhấn lại. Thiết bị sẽ theo dõi nhiệt độ, giá trị của các giới hạn được duy trì khi tắt nguồn. Đó là tất cả.
#inc loại
#inc loại
#inc loại
#define BUTTON_1_PIN 10 // số đầu ra của nút 1 là 12
DS OneWire (12); // trên chân 10 (cần có điện trở 4,7K)
// khởi tạo thư viện với số lượng các chân giao diện
LCD tinh thể lỏng (3, 2, 4, 5, 6, 7);
thời gian dài không dấu;
const int pin_A = 8; // pin 12
const int pin_B = 9; // pin 11
uns uns char enc_A;
unsign char enc_B;
unsign char enc_A_prev = 0;
phao n_pr = 24,1;
phao b_pr = 26,2;
boolean prz = false;
Nút lớp {
công khai:
Nút (pin byte, byte timeButton); // mô tả hàm tạo
cờ booleanPress; // nút cờ hiện được nhấn
cờ booleanClick; // nút cờ đã được nhấn (bấm)
void scanState (); // phương thức kiểm tra trạng thái tín hiệu
void setPinTime (pin byte, byte timeButton); // phương thức thiết lập số đầu ra và thời gian xác nhận (số)
riêng tư:
byte _buttonCount; // bộ đếm xác nhận trạng thái ổn định
byte _timeButton; // thời gian xác nhận trạng thái nút
byte _pin; // số pin
};
Nút nút1 (BUTTON_1_PIN, 30);
void knopka () {
LCD.clear ();
lcd.setCoder (1,0);
LCD.print (n_pr);
// button1.scanState ();
while (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = kỹ thuật sốRead (pin_B);
if ((! enc_A) && (enc_A_prev)) {
if (enc_B) {
n_pr = n_pr-0,1;
} khác {
n_pr = n_pr + 0,1;
}
LCD.clear ();
lcd.setCoder (1,0);
LCD.print (n_pr);
}
enc_A_prev = enc_A;
nút1.scanState ();
}
nút1.flagClick = false;
LCD.clear ();
lcd.setCoder (1,0);
LCD.print (b_pr);
while (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = kỹ thuật sốRead (pin_B);
if ((! enc_A) && (enc_A_prev)) {
if (enc_B) {
b_pr = b_pr-0,1;
} khác {
b_pr = b_pr + 0,1;
}
LCD.clear ();
lcd.setCoder (1,0);
LCD.print (b_pr);
}
enc_A_prev = enc_A;
nút1.scanState ();
}
nút1.flagClick = false;
if (n_pr> b_pr) {
float wr = n_pr;
n_pr = b_pr;
b_pr = wr;
}
int addr = 0;
EEPROM.write (addr, 'y');
thêm = 1;
EEPROM.put (addr, n_pr);
addr + = sizeof (float);
EEPROM.put (addr, b_pr);
độ trễ (300);
}
void setup (void) {
pinMode (11, ĐẦU RA);
pinMode (pin_A, INPUT_PULLUP);
pinMode (pin_B, INPUT_PULLUP);
LCD.begin (8.2);
int addr = 0;
char c = EEPROM.read (addr);
addr = addr + 1;
if (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = sizeof (float);
EEPROM.get (addr, b_pr);
}
// Nối tiếp.begin (9600);
}
void loop (void) {
byte i;
byte hiện tại = 0;
kiểu byte_s;
dữ liệu byte [12];
byte bổ sung [8];
phao câu;
if (! ds.search (addr)) {
ds.reset_search ();
trì hoãn (250);
trở về
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
trở về
}
// byte ROM đầu tiên cho biết chip nào
chuyển đổi (addr [0]) {
trường hợp 0x10:
loại_s = 1;
phá vỡ;
trường hợp 0x28:
loại_s = 0;
phá vỡ;
trường hợp 0x22:
loại_s = 0;
phá vỡ;
mặc định
trở về
}
DS.reset ();
ds.select (addr);
DS.write (0x44, 1); // bắt đầu chuyển đổi, với sức mạnh ký sinh ở cuối
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
currentTime = millis ();
while ((millis () - currentTime) <2000) {
nút1.scanState ();
if (button1.flagClick == true) {
// có một nút bấm
nút1.flagClick = false; // đặt lại thuộc tính nhấp
knopka ();
}
}
// độ trễ (1000); // có thể 750ms là đủ, có thể không
// chúng ta có thể thực hiện một DS.depower () tại đây, nhưng việc thiết lập lại sẽ giải quyết nó.
hiện tại = ds.reset ();
ds.select (addr);
DS.write (0xBE); // Đọc Scratchpad
for (i = 0; i <9; i ++) {// chúng ta cần 9 byte
dữ liệu [i] = ds.read ();
}
// Chuyển đổi dữ liệu sang nhiệt độ thực tế
// vì kết quả là số nguyên có chữ ký 16 bit, nên nó
// được lưu trữ thành loại "int16_t", luôn là 16 bit
// ngay cả khi được biên dịch trên bộ xử lý 32 bit.
int16_t raw = (dữ liệu [1] << 8) | dữ liệu [0];
if (type_s) {
nguyên = thô << 3; // Độ phân giải 9 bit mặc định
if (dữ liệu [7] == 0x10) {
// "vẫn còn" cho độ phân giải 12 bit đầy đủ
raw = (raw & 0xFFF0) + 12 - dữ liệu [6];
}
} khác {
byte cfg = (dữ liệu [4] & 0x60);
// ở độ phân giải thấp hơn, các bit thấp không được xác định, vì vậy hãy để chúng không
if (cfg == 0x00) raw = raw & ~ 7; // độ phân giải 9 bit, 93,75 ms
khác if (cfg == 0x20) raw = raw & ~ 3; // độ phân giải 10 bit, 187,5 ms
khác if (cfg == 0x40) raw = raw & ~ 1; // độ phân giải 11 bit, 375 ms
//// mặc định là độ phân giải 12 bit, thời gian chuyển đổi 750 ms
}
celsius = (float) thô / 16.0;
LCD.clear ();
lcd.setCoder (1,0);
LCD.print (celsius);
if (prz) {
lcd.setCoder (0,1);
lcd.print ('*');
}
if (n_pr! = b_pr) {
if (celsius b_pr) {
kỹ thuật sốWrite (11, THẤP);
tiên tri = sai;
}
}
}
// phương thức kiểm tra trạng thái nút
// flagPress = true - đã nhấp
// flagPress = false - đã nhấn
// flagClick = true - đã được nhấp (nhấp)
Nút void :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// trạng thái tín hiệu vẫn giữ nguyên
_buttonCount = 0; // đặt lại bộ đếm trạng thái tín hiệu
}
khác {
// trạng thái tín hiệu đã thay đổi
_buttonCount ++; // +1 đến bộ đếm trạng thái tín hiệu
if (_buttonCount> = _timeButton) {
// trạng thái tín hiệu không thay đổi thời gian quy định
// trạng thái tín hiệu đã ổn định
cờPress =! cờ hiệu; // nghịch đảo của chỉ báo trạng thái
_buttonCount = 0; // đặt lại bộ đếm trạng thái tín hiệu
if (flagPress == true) flagClick = true; // dấu hiệu nhấp chuột nhấp
}
}
}
// phương thức thiết lập số đầu ra và thời gian xác nhận
void Nút :: setPinTime (pin byte, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // xác định đầu ra là đầu vào
}
// mô tả hàm tạo của lớp Nút
Nút :: Nút (pin byte, byte timeButton) {
_pin = pin;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // xác định đầu ra là đầu vào
}