في البداية ، تم عمل منظم الحرارة ببساطة كمقياس حراري للتحكم في درجة الحرارة خارج النافذة. ثم ، أثناء الصقيع ، بدأت البطاطس في التجمد تحت الأرض وأضيفت وظائف للتحكم في المناخ المحلي. بيانات جواز سفر التتابع - 250 فولت و 10 أمبير (2.5 كيلو واط). نظرًا لأن الحرارة في باطن الأرض ليست ضرورية ، يكفي عشرة لكل كيلووات.
المواد والأدوات اللازمة:مربع العناية بالأحذية
-شحن USB للهاتف (أي ، 0.7A على الأقل)
-
اردوينو-برو-ميني
شاشة صغيرة مكونة من سطرين مكونة من 8 أحرف (WH0802A-NGA-CT هي أكثر إحكاما)
التشفير مع زر (يمكن شراؤه في أي راديو ماج ، لا يمكن أن يكون الزر مدمجًا)
- مع مرحل 5V (اشتريت مجموعة من المرحلات الصينية دون عزل بصري في وقت واحد ، لذلك كنت بحاجة إلى Optocoupler PC817 ومقاوم 470 أوم. إذا كان لديك عزل بصري على لوحة الاسم ، فيمكنك توصيل لوحة الاسم مباشرة بمنفذ اردوينو)
موصل USB
- 2 كابل تمديد USB بطول 3 متر (واحد لسلك الطاقة ، إلى الثاني نحمي DS1820)
- DS1820 (مع أي حرف)
حام الحديد
- مسدس غراء
لوحة FTDI232
الخطوة 1: بادئ ذي بدء ، نحن بحاجة إلى وميض اردوينو ، لأن لدي Pro Mini (يذهب بدون محول USB-RS232) ، أحتاج إلى لحام مسطرة بدبابيس إلى arduino. من الجانب الذي يتم اشتقاق DTR و TXD و RXD و VCC و GND و GND. الآن قم بتوصيل FTDI232 DTR إلى DTR ، VCC إلى VCC ، GND إلى GND ، TXD إلى RXD ، RXD إلى TXD. قم بتشغيل Arduino IDE ، قم بتنزيل الرسم ومضه (رسم في النهاية).
الخطوة 2: الآن دعونا ندخل إلى الهيكل. نقوم بتمزيق الإسفنجة في "FUKS" ، ونزيل كل شيء جيدًا ، ويمكن تمرير الجزء العميق من الصندوق بقطعة قماش من الصنفرة (شيء يمكن أن يلتصق بشكل أفضل). ضع علامة على فتحة المشفر وموصل USB (الأم) والشاشة نفسها. الصق التتابع على غطاء الصندوق. يجب أن نحاول وضع الترحيل بعيدًا عن المعالج وترتيب المكونات بحيث يتم إغلاق الغطاء لاحقًا (هناك مساحة كبيرة).
الخطوة 3: الآن نأخذ كابل تمديد USB ، ونقطع مقبس الموصل (الأم). قطعنا نهاية القطع ، وحفر حفرة للكابل في الجسم ، وإدخاله ولصق المفتاح بمسدس. بالإضافة إلى ذلك ، يحتوي الكبل على أحمر ناقص أسود (أتحقق منه فقط) ، بالإضافة إلى زائد الموصل مطروحًا منه ناقص (لا أعطي دبوس الموصل - إنه موجود على الإنترنت). بين زائد الموصل و 2 متوسط (قمت بتوصيلها) ، تحتاج إلى إلغاء تثبيت المقاوم 4.7 كيلو أوم.
الخطوة 4: خذ كبلي تمديد USB ، وقطع الموصل (الأم) ، وقطع الكابل. تحسبًا فقط ، سنتحقق مما إذا كنا جميعًا ملحومين بشكل صحيح. نقوم بتوصيل كابل الطاقة بشحن USB وبالشبكة ، ووضع الكابل المقطوع في موصل USB ، وإلقاء نظرة على المختبر + على الأحمر - على الأسود. نقوم بسحب الكابل ولحام DS1820: - إلى 1 ، + إلى 3 الأسلاك المتبقية 2 إلى 2. ثم أغلف مركب الإيبوكسي (لإصلاح الخزانات ، المشعات) ، تاركًا القليل من غلاف المستشعر للخارج ، بحيث يكون هناك رد فعل أسرع لتغيرات درجة الحرارة.حسنًا ، نقوم بالتثبيت وفقًا لمخطط الدائرة (نقوم بتوصيل الطاقة والأرضية للوحة الترحيل بدوائر + و - المشتركة ، على التوالي).
الخطوة 5: يتم توصيل جميع مكونات الدائرة. نقوم بتوصيل جهاز الاستشعار الخاص بنا (بدونه ، ستظل الشاشة سوداء) ، ونطبق الطاقة. في السطر الأول - قيمة درجة الحرارة ، في 2 إذا كانت "*" قيد التشغيل - التتابع قيد التشغيل ، لا - إيقاف. الآن دعنا نحاول تعيين حدود تبديل التتابع. اضغط على عمود التشفير (أو الزر الخاص بك) تظهر قيمة الحد التي سيتم تشغيل التتابع عندها بتدوير العمود - تزيد القيمة أو تقل. من خلال النقر على العمود مرة أخرى - نحصل على الحد الأعلى (سيتم إيقاف التتابع) ، وتعيين القيمة والضغط مرة أخرى. سيقوم الجهاز بمراقبة درجة الحرارة ، ويتم الحفاظ على قيمة الحدود عند إيقاف تشغيل الطاقة. هذا كل شيء.
# تتضمن
# تشمل
# تتضمن
#define BUTTON_1_PIN 10 // رقم إخراج الزر 1 هو 12
OneWire س (12) ؛ // على السن 10 (من الضروري استخدام 4.7 كيلو)
// تهيئة المكتبة بأرقام دبابيس الواجهة
شاشات الكريستال السائل السائلة (3 ، 2 ، 4 ، 5 ، 6 ، 7) ؛
الوقت الحالي الطويل غير الموقّع ؛
const int pin_A = 8 ؛ // pin 12
const int pin_B = 9 ؛ // pin 11
حرف غير موقع enc_A ؛
enc_B غير الموقعة
char غير موقعة enc_A_prev = 0 ؛
تعويم n_pr = 24.1 ؛
تعويم b_pr = 26.2 ؛
جائزة منطقية = خطأ ؛
زر الطبقة {
عام:
زر (دبوس بايت ، وقت بايت زر) ؛ // وصف المُنشئ
علم منطقي تم الضغط على زر / الإبلاغ الآن
العلم المنطقي تم الضغط على زر // العلم (انقر)
مسح الحالة الفارغة () ؛ // طريقة لفحص حالة الإشارة
vint setPinTime (دبوس بايت ، زمن بايت بايت) ؛ // طريقة لتعيين رقم الإخراج ووقت التأكيد (رقم)
خاص:
بايت _buttonCount ؛ // عداد تأكيد حالة مستقرة
بايت _timeButton ؛ // وقت تأكيد حالة الزر
بايت _pin ؛ // رقم التعريف الشخصي
} ؛
زر الزر 1 (BUTTON_1_PIN ، 30) ؛
knopka الفراغ () {
lcd.clear () ؛
lcd.setCursor (1،0) ؛
lcd.print (n_pr) ؛
// button1.scanState () ؛
بينما (button1.flagClick == false) {
enc_A = قراءة رقمية (pin_A) ؛
enc_B = digitalRead (pin_B) ،
if ((! 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 = قراءة رقمية (pin_A) ؛
enc_B = digitalRead (pin_B) ،
if ((! 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 ؛
if (n_pr> b_pr) {
تعويم 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 (float) ؛
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 ؛
char c = EEPROM.read (addr) ؛
addr = addr + 1 ؛
if (c == 'y') {
EEPROM.get (addr، n_pr) ؛
addr + = sizeof (float) ؛
EEPROM.get (addr، b_pr) ؛
}}
// Serial.begin (9600) ؛
}}
حلقة فارغة (باطلة) {
بايت ط ؛
بايت بايت = 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 = قراءة رقمية (pin_A) ؛
enc_A_prev = enc_A ؛
currentTime = ملي () ؛
بينما ((millis () - currentTime) <2000) {
button1.scanState () ؛
if (button1.flagClick == true) {
// كان هناك نقرة زر
button1.flagClick = false ؛ // إعادة تعيين سمة النقر
كنوبكا () ؛
}}
}}
// تأخير (1000) ؛ // ربما 750 مللي ثانية كافية ، وربما لا
// قد نقوم بعمل ds.depower () هنا ، لكن إعادة الضبط ستتولى الأمر.
الحاضر = ds.reset () ؛
ds.select (addr) ؛
ds.write (0xBE) ؛ // اقرأ المسودة
for (i = 0؛ i <9؛ i ++) {// نحتاج إلى 9 بايت
البيانات [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] ؛
}}
} آخر {
byte cfg = (data [4] & 0x60) ؛
// عند دقة أقل ، تكون البتات المنخفضة غير محددة ، لذا دعنا نصفرها
if (cfg == 0x00) raw = raw & ~ 7 ؛ // دقة 9 بت ، 93.75 مللي ثانية
آخر إذا (cfg == 0x20) raw = raw & ~ 3 ؛ // 10 بت الدقة ، 187.5 مللي ثانية
آخر إذا (cfg == 0x40) raw = raw & ~ 1 ؛ // 11 بت الدقة ، 375 مللي ثانية
//// الافتراضي هو دقة 12 بت ووقت تحويل 750 مللي ثانية
}}
celsius = (float) raw / 16.0 ؛
lcd.clear () ؛
lcd.setCursor (1،0) ؛
lcd.print (celsius) ؛
if (priz) {
lcd.setCursor (0،1) ؛
lcd.print ('*') ؛
}}
if (n_pr! = b_pr) {
if (celsius b_pr) {
الكتابة الرقمية (11 ، منخفضة) ؛
priz = false ؛
}}
}}
}}
// طريقة فحص حالة الزر
// flagPress = صحيح - نقر
// flagPress = false - مضغوط
// flagClick = true - تم النقر (النقر)
زر باطل :: scanState () {
if (flagPress == (! digitalRead (_pin))) {
// حالة الإشارة تظل كما هي
_buttonCount = 0 ؛ // إعادة تعيين عداد حالة الإشارة
}}
آخر {
// حالة الإشارة تغيرت
_buttonCount ++ ؛ // +1 إلى عداد حالة الإشارة
if (_buttonCount> = _timeButton) {
// حالة الإشارة لم تغير الوقت المحدد
// حالة الإشارة أصبحت مستقرة
flagPress =! اضغط على ؛ // معكوس مؤشر الحالة
_buttonCount = 0 ؛ // إعادة تعيين عداد حالة الإشارة
if (flagPress == true) flagClick = true ؛ // علامة النقر على النقر
}}
}}
}}
// طريقة لتعيين رقم الإخراج ووقت التأكيد
زر فارغ :: setPinTime (دبوس بايت ، زمن بايت بايت) {
_pin = دبوس ؛
_timeButton = timeButton ،
pinMode (_pin، INPUT_PULLUP) ؛ // تحديد الإخراج كمدخل
}}
// وصف مُنشئ فئة الأزرار
Button :: Button (byte pin، byte timeButton) {
_pin = دبوس ؛
_timeButton = timeButton ،
pinMode (_pin، INPUT_PULLUP) ؛ // تحديد الإخراج كمدخل
}}