ในขั้นต้นเทอร์โมสตัลถูกสร้างขึ้นมาเป็นเทอร์โมมิเตอร์เพื่อควบคุมอุณหภูมิภายนอกหน้าต่าง จากนั้นในช่วงน้ำค้างแข็งมันฝรั่งเริ่มแช่แข็งใต้ดินและเพิ่มฟังก์ชันการทำงานเพื่อควบคุมปากน้ำ ข้อมูลหนังสือเดินทางของรีเลย์สวิตชิ่ง - 250V และ 10A (2.5kW) เนื่องจากความร้อนในใต้ดินไม่ต้องการสิบต่อกิโลวัตต์จึงเพียงพอ
วัสดุและเครื่องมือที่จำเป็น:กล่องดูแลรองเท้า
- USB- ชาร์จสำหรับโทรศัพท์ (อย่างน้อย 0.7A)
-
Arduino-Pro-mini
จอแสดงผล 2 บรรทัด 8 ตัวอักษร (WH0802A-NGA-CT กะทัดรัดกว่า)
เข้ารหัสด้วยปุ่ม (สามารถซื้อในวิทยุแม็กใด ๆ ปุ่มไม่สามารถอยู่ในตัว)
- ประกอบกับรีเลย์ 5V (ฉันซื้อรีเลย์จีนจำนวนมากที่ไม่มีการแยกแสงในคราวเดียวดังนั้นฉันจึงต้องใช้ Optocoupler PC817 และตัวต้านทาน 470 โอห์มอีกตัวหนึ่งหากคุณมีตัวแยกแสงบนแผ่นป้ายคุณสามารถเชื่อมต่อแผ่นป้ายโดยตรงกับพอร์ต arduino)
ขั้วต่อ USB
-2 สายต่อ USB ยาว 3 เมตร (สายหนึ่งสำหรับสายไฟจนถึงวินาทีที่เราบัดกรี DS1820)
- DS1820 (พร้อมจดหมายใด ๆ )
หัวแร้ง
- ปืนกาว
แผ่นป้าย FTDI232
ขั้นตอนที่ 1: ก่อนอื่นเราต้องแฟลชอาร์ดิโน่เพราะฉันมี Pro Mini (มันไปได้โดยไม่ต้องมีตัวแปลง USB-RS232) ฉันต้องบัดกรีไม้บรรทัดด้วยพินกับอาร์ดิโน จากด้านที่ได้รับ DTR, TXD, RXD, VCC, GND, GND ตอนนี้เราเชื่อมต่อ FTDI232 DTR กับ DTR, VCC ถึง VCC, GND ถึง GND, TXD ถึง RXD, RXD ถึง TXD เรียกใช้ arduino IDE ดาวน์โหลดแบบร่างและแฟลช (ร่างตอนท้าย)
ขั้นตอนที่ 2: ตอนนี้มาดูแลเรือ เราฉีกฟองน้ำที่“ FUKS” ล้างทุกอย่างออกดีส่วนลึกของกล่องสามารถผ่านได้ด้วยผ้าทราย (บางสิ่งจะติดแน่นกว่า) ทำเครื่องหมายช่องสำหรับเข้ารหัส, ช่องเสียบ USB (แม่) และจอแสดงผลเอง กาวรีเลย์ไปที่ฝาปิดกล่อง เราต้องพยายามวางรีเลย์ให้ห่างจากโปรเซสเซอร์และจัดเรียงส่วนประกอบเพื่อให้ฝาปิดในภายหลัง (มีพื้นที่เหลือเฟือ)
ขั้นตอนที่ 3: ตอนนี้เราใช้สายเคเบิลขยาย USB ตัดซ็อกเก็ตเชื่อมต่อ (แม่) เราตัดปลายตัดเจาะรูสำหรับสายเคเบิลในร่างกายใส่เข้าไปและยึดกุญแจด้วยปืน นอกจากนี้สายเคเบิลมีสีแดงลบสีดำ (ฉันเพิ่งตรวจสอบ) บวกกับขั้วต่อบวกลบเครื่องหมาย (ฉันไม่ได้ให้ pinout ของตัวเชื่อมต่อ - บนอินเทอร์เน็ต) ระหว่างขั้วบวกของขั้วต่อและสื่อ 2 ตัว (ฉันเชื่อมต่อกันแล้ว) ต้องมีการบัดกรีตัวต้านทาน 4.7kOhm
ขั้นตอนที่ 4: เราใช้สายต่อ USB 2 เส้นตัดขั้วต่อ (แม่) ตัดสาย ในกรณีนี้เราจะตรวจสอบว่าเราทั้งหมดบัดกรีอย่างถูกต้องหรือไม่ เราเชื่อมต่อสายไฟกับการชาร์จ USB และเครือข่ายติดสายเคเบิลที่ตัดเข้าไปในตัวเชื่อมต่อ USB ดูที่ตัวทดสอบ + บนสีแดง - ดำ เราดึงสายเคเบิลและบัดกรี DS1820: - ถึง 1, + ถึง 3 ที่เหลืออีก 2 สายถึง 2 จากนั้นฉันก็เคลือบสารประกอบอีพ็อกซี่ (เพื่อซ่อมแซมถังหม้อน้ำ) ออกจากตัวเรือนเซ็นเซอร์เล็กน้อยเพื่อให้ปฏิกิริยาตอบสนองต่อการเปลี่ยนแปลงอุณหภูมิได้เร็วขึ้นเราทำการติดตั้งตามแผนภาพวงจร (เราเชื่อมต่อพลังงานและกราวด์ของแผ่นถ่ายทอดกับวงจรทั่วไป + และ - ตามลำดับ)
ขั้นตอนที่ 5: เชื่อมต่อส่วนประกอบวงจรทั้งหมด เราเชื่อมต่อเซ็นเซอร์ของเรา (ไม่ว่าจอแสดงผลจะยังคงเป็นสีดำ) ใช้พลังงาน ในบรรทัดแรก - ค่าอุณหภูมิใน 2 หาก“ *” เปิด - รีเลย์เปิดอยู่ไม่มีการปิด ทีนี้ลองตั้งขีด จำกัด การสลับรีเลย์ กดเพลาเข้ารหัส (หรือปุ่มของคุณ) ค่าขีด จำกัด จะปรากฏขึ้นที่รีเลย์จะเปิดโดยหมุนเพลา - ค่าจะเพิ่มหรือลดลง โดยคลิกที่เพลาอีกครั้ง - เราได้รับขีด จำกัด บน (รีเลย์จะปิด) ตั้งค่าและกดอีกครั้ง อุปกรณ์จะตรวจสอบอุณหภูมิค่าของขีด จำกัด จะถูกเก็บไว้เมื่อปิดไฟ นั่นคือทั้งหมดที่
#include
#include
#include
#define BUTTON_1_PIN 10 // จำนวนเอาต์พุตของปุ่ม 1 คือ 12
OneWire ds (12); // บนพิน 10 (จำเป็นต้องมีตัวต้านทาน 4.7K)
// เริ่มต้นไลบรารีด้วยหมายเลขของหมุดอินเทอร์เฟซ
จอแอลซีดีคริสตัลเหลว (3, 2, 4, 5, 6, 7);
ไม่ได้ลงนามยาว currentTime;
const int pin_A = 8; // pin 12
const int pin_B = 9; // pin 11
ถ่านที่ไม่ได้ลงนาม enc_A;
ถ่านที่ไม่ได้ลงนาม enc_B;
ถ่านที่ไม่ได้ลงนาม enc_A_prev = 0;
float n_pr = 24.1;
float b_pr = 26.2;
บูลีน priz = false;
ปุ่มคลาส {
ส่วนกลาง:
ปุ่ม (ขาไบต์ไบต์ timeButton); // คำอธิบายคอนสตรัค
บูลีน flagPress; กดปุ่ม // flag แล้ว
บูลีน flagClick; กดปุ่ม // ตั้งค่าสถานะแล้ว (คลิก)
เป็นโมฆะ scanState (); // วิธีการตรวจสอบสถานะสัญญาณ
เป็นโมฆะ setPinTime (ไบต์พินไบต์เวลาปุ่ม); // เมธอดสำหรับการตั้งค่าหมายเลขเอาต์พุตและเวลายืนยัน (หมายเลข)
ส่วนตัว:
ไบต์ _buttonCount; // เคาน์เตอร์ยืนยันสถานะเสถียร
ไบต์ _timeButton; // เวลายืนยันสถานะปุ่ม
ไบต์ _pin; // หมายเลขพิน
};
ปุ่ม button1 (BUTTON_1_PIN, 30);
โมฆะ knopka () {
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
ในขณะที่ (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
ถ้า ((! enc_A) && (enc_A_prev)) {
ถ้า (enc_B) {
n_pr = n_pr-0.1;
} อื่น {
n_pr = n_pr + 0.1;
}
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
}
enc_A_prev = enc_A;
button1.scanState ();
}
button1.flagClick = false;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
ในขณะที่ (button1.flagClick == false) {
enc_A = digitalRead (pin_A);
enc_B = digitalRead (pin_B);
ถ้า ((! enc_A) && (enc_A_prev)) {
ถ้า (enc_B) {
b_pr = b_pr-0.1;
} อื่น {
b_pr = b_pr + 0.1;
}
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (b_pr);
}
enc_A_prev = enc_A;
button1.scanState ();
}
button1.flagClick = false;
ถ้า (n_pr> b_pr) {
float wr = n_pr;
n_pr = b_pr;
b_pr = wr;
}
int addr = 0;
EEPROM.write (addr, 'y');
addr = 1;
EEPROM.put (addr, n_pr);
addr + = sizeof (ลอย);
EEPROM.put (addr, b_pr);
ล่าช้า (300);
}
การตั้งค่าเป็นโมฆะ (เป็นโมฆะ) {
pinMode (11, OUTPUT);
pinMode (pin_A, INPUT_PULLUP);
pinMode (pin_B, INPUT_PULLUP);
lcd.begin (8.2);
int addr = 0;
ถ่าน c = EEPROM.read (addr);
addr = addr + 1;
ถ้า (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = sizeof (ลอย);
EEPROM.get (addr, b_pr);
}
// Serial.begin (9600);
}
void loop (void) {
ไบต์ฉัน
ไบต์ปัจจุบัน = 0;
ไบต์ type_s;
ข้อมูลไบต์ [12];
ไบต์ addr [8];
เซลเซียสลอย;
if (! ds.search (addr)) {
ds.reset_search ();
ล่าช้า (250);
กลับ;
}
if (OneWire :: crc8 (addr, 7)! = addr [7]) {
กลับ;
}
// ไบต์แรกของ ROM ระบุว่าชิปตัวใด
สวิตช์ (addr [0]) {
กรณี 0x10:
type_s = 1;
ทำลาย;
กรณี 0x28:
type_s = 0;
ทำลาย;
กรณี 0x22:
type_s = 0;
ทำลาย;
เริ่มต้น:
กลับ;
}
ds.reset ();
ds.select (addr);
ds.write (0x44, 1); // เริ่มต้นการแปลงโดยเปิดการใช้งานปรสิตในตอนท้าย
enc_A = digitalRead (pin_A);
enc_A_prev = enc_A;
currentTime = millis ();
ในขณะที่ ((มิลลิวินาที () - currentTime) <2000) {
button1.scanState ();
if (button1.flagClick == จริง) {
// มีการคลิกปุ่ม
button1.flagClick = false; // รีเซ็ตแอตทริบิวต์การคลิก
knopka ();
}
}
// ล่าช้า (1,000); // บางที 750ms ก็เพียงพอแล้วอาจจะไม่
// เราอาจทำ ds.depower () ที่นี่ แต่การรีเซ็ตจะดูแล
ปัจจุบัน = ds.reset ();
ds.select (addr);
ds.write (0xBE); // อ่าน Scratchpad
สำหรับ (i = 0; i <9; i ++) {// เราต้องการ 9 ไบต์
data [i] = ds.read ();
}
// แปลงข้อมูลเป็นอุณหภูมิจริง
// เนื่องจากผลลัพธ์เป็นเลขจำนวนเต็ม 16 บิตที่ควรจะเป็น
// ถูกเก็บไว้ในประเภท "int16_t" ซึ่งเป็น 16 บิตเสมอ
// แม้ในขณะที่คอมไพล์บนโปรเซสเซอร์ 32 บิต
int16_t raw = (data [1] << 8) | ข้อมูล [0];
ถ้า (type_s) {
raw = raw << 3; // ความละเอียด 9 บิตเริ่มต้น
if (data [7] == 0x10) {
// "จำนวนที่เหลืออยู่" ให้ความละเอียดเต็ม 12 บิต
raw = (raw & 0xFFF0) + 12 - ข้อมูล [6];
}
} อื่น {
ไบต์ cfg = (ข้อมูล [4] & 0x60);
// ที่ความละเอียดต่ำบิตต่ำจะไม่ถูกกำหนดดังนั้นให้เป็นศูนย์
ถ้า (cfg == 0x00) raw = raw & ~ 7; // ความละเอียด 9 บิต 93.75 ms
อื่นถ้า (cfg == 0x20) raw = raw & ~ 3; // ความละเอียด 10 บิต 187.5 ms
อื่นถ้า (cfg == 0x40) raw = raw & ~ 1; // ความละเอียด 11 บิต, 375 ms
//// ค่าเริ่มต้นคือความละเอียด 12 บิตเวลาแปลง 750 ms
}
เซลเซียส = (ลอย) ดิบ / 16.0;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (เซลเซียส);
ถ้า (priz) {
lcd.setCursor (0,1);
lcd.print ('*');
}
if (n_pr! = b_pr) {
ถ้า (เซลเซียส b_pr) {
digitalWrite (11, ต่ำ);
priz = false;
}
}
}
// วิธีการตรวจสอบสถานะปุ่ม
// flagPress = true - คลิกแล้ว
// flagPress = false - pressed
// flagClick = true - ถูกคลิก (คลิก)
ปุ่มช่องว่าง :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// สถานะสัญญาณยังคงเหมือนเดิม
_buttonCount = 0; // รีเซ็ตตัวนับสถานะสัญญาณ
}
อื่น {
// สถานะสัญญาณเปลี่ยนไป
_buttonCount ++; // +1 ไปที่ตัวนับสถานะสัญญาณ
if (_buttonCount> = _timeButton) {
// สถานะสัญญาณไม่เปลี่ยนแปลงเวลาที่ระบุ
// สถานะสัญญาณเสถียรแล้ว
flagPress =! flagPress; // ผกผันของตัวบ่งชี้สถานะ
_buttonCount = 0; // รีเซ็ตตัวนับสถานะสัญญาณ
if (flagPress == true) flagClick = true; // สัญลักษณ์ของการคลิกที่คลิก
}
}
}
// เมธอดสำหรับการตั้งค่าหมายเลขเอาต์พุตและเวลายืนยัน
ปุ่มเป็นโมฆะ :: setPinTime (พินไบต์, ไบต์เวลาปุ่ม) {
_pin = พิน;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // กำหนดเอาท์พุทเป็นอินพุต
}
// คำอธิบายของตัวสร้างของคลาสปุ่ม
ปุ่ม :: ปุ่ม (พินไบต์, ไบต์เวลาปุ่ม) {
_pin = พิน;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // กำหนดเอาท์พุทเป็นอินพุต
}