בתחילה, התרמוסטט נוצר פשוט כמדחום לבקרת הטמפרטורה מחוץ לחלון. ואז, במהלך הכפור, תפוחי האדמה החלו להקפיא מתחת לאדמה ונוספה פונקציונליות לשליטה במיקרו אקלים. נתוני דרכון של ממסר המיתוג - 250 וולט ו 10 א '(2.5 קילוואט). מכיוון שאין צורך בחום במחתרת, מספיק עשרה לקילו-וואט.
חומרים וכלים נחוצים:תיבת טיפוח נעליים
-USB טעינה עבור הטלפון (כל, לפחות 0.7A)
-
ארדואינו-פרו מיני
צג תווים בן 8 שורות (WH0802A-NGA-CT קומפקטי יותר)
מקודד עם כפתור
-סניף עם ממסר 5 וולט (רכשתי חבורה של ממסרים סיניים ללא בידוד אופטי בפעם אחת, אז הייתי זקוק לעוד Optocoupler PC817 ונגד 470 אוהם. אם יש לך בידוד אופטי על לוחית השידור, אתה יכול לחבר את לוחית השלט ישירות לנמל ארדואינו)
מחבר 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. הרץ את ה- IDE של ארדואינו, הורד את הסקיצה והבהב אותה (סקיצה בסוף).
שלב 2: עכשיו בואו נדאג לגוף. אנו קורעים את הספוג ב" FUKS ", משמנים את הכל היטב, את החלק העמוק של הקופסה ניתן לעבור עם מטלית אמרית (משהו יתקע טוב יותר). סמן את החור לקודד, למחבר USB (אם) ולתצוגה עצמה. הדבק את הממסר לכיסוי התיבה. עלינו לנסות למקם את המסר מהמעבד ולסדר את הרכיבים כך שהמכסה ייסגר אחר כך (יש הרבה מקום).
שלב 3: כעת אנו לוקחים את כבל ההארכה USB, מנתק את שקע המחבר (אם). אנו חותכים את הקצה החתוך, מקדחים חור לכבל בגוף, מכניסים אותו ומדביקים את המפתח באקדח. בנוסף, לכבל יש אדום, מינוס שחור (אני פשוט בודק אותו), פלוס הפלוס של המחבר, מינוס מינוס (אני לא נותן את הפינים של המחבר - זה באינטרנט). בין פלוס המחבר ל -2 בינוני (יש לי אותם מחוברים), יש להלחם נגן של 4.7kOhm.
שלב 4: אנו לוקחים 2 כבלי הארכה USB, מנתקים את המחבר (האם), חותכים את הכבל. למקרה שנבדוק אם כולנו הלחמה נכונה. אנו מחברים את כבל החשמל באמצעות טעינת USB ולרשת, מכניסים את הכבל החתוך למחבר ה- USB, מסתכלים על הבוחן + בצבע אדום - על שחור. אנו שולפים את הכבל ומלחמים את ה- DS1820: - ל -1, + ל -3 את 2 החוטים הנותרים ל -2. ואז אני מצפה את מתחם האפוקסי (לתיקון הטנקים, הרדיאטורים), ומשאיר מעט מחוסן החיישן כלפי חוץ, כך שתתקבל תגובה מהירה יותר לשינויי טמפרטורה.ובכן, אנו מבצעים את ההתקנה על פי דיאגרמת המעגל (אנו מחברים את הכוח והקרקע של לוח הממסר עם המעגלים הנפוצים + ו- - בהתאמה).
שלב 5: כל רכיבי המעגל מחוברים. אנו מחברים את החיישן שלנו (בלעדיו, הצג יישאר שחור), מפעילים כוח. בשורה הראשונה - ערך הטמפרטורה, ב 2 אם "*" פועל - הממסר פועל, לא - כבוי. כעת ננסה לקבוע את גבולות מעבר הממסרים. לחץ על ציר המקודד (או על כפתורך), ערך הגבול מופיע בו הממסר יופעל על ידי סיבוב הפיר - הערך עולה או יורד. בלחיצה נוספת על הפיר - נקבל את הגבול העליון (המסר נכבה), נקבע את הערך ולחץ שוב. המכשיר יפקח על הטמפרטורה, ערך המגבלות נשמר בעת כיבוי החשמל. זה הכל.
#include
# כלול
# כלול
#define BUTTON_1_PIN 10 // מספר הפלט של כפתור 1 הוא 12
OneWire DS (12); // על סיכה 10 (יש צורך בהתנגדות 4.7K)
// לאתחל את הספרייה עם מספרי סיכות הממשק
Lcd גביש נוזלי (3, 2, 4, 5, 6, 7);
זמן לא ארוך חתום;
const int pin_A = 8; // סיכה 12
const int pin_B = 9; // סיכה 11
char לא חתום enc_A;
char לא חתום enc_B;
char לא חתום enc_A_prev = 0;
צף n_pr = 24.1;
צף b_pr = 26.2;
מחיר בוליאני = שקר;
כפתור כיתה {
ציבורי:
כפתור (סיכת בייט, זמן בייט כפתור); // תיאור בנאי
הדגל הבוליאני; // לחץ על כפתור הדגל כעת
דגל בוליאני לחץ; // לחצו על כפתור הדגל (לחץ)
void scanState (); // שיטה לבדיקת מצב האות
setPinTime בטל (סיכת בתים, זמן בייט כפתור); // שיטה להגדרת מספר הפלט וזמן האישור (מספר)
פרטי:
byte _buttonCount; // דלפק אישור מצב יציב
byte _time כפתור; // זמן אישור מצב הכפתור
בתים _pin; // מספר סיכה
};
לחצן כפתור 1 (BUTTON_1_PIN, 30);
void knopka () {
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (n_pr);
// button1.scanState ();
while (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);
while (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) {
לצוף 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, פלט);
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;
אם (c == 'y') {
EEPROM.get (addr, n_pr);
addr + = sizeof (לצוף);
EEPROM.get (addr, b_pr);
}
// Serial.begin (9600);
}
void loop (void) {
byte i;
הווה בתים = 0;
סוג בתים_s;
נתוני בתים [12];
בתים addr [8];
צלזיוס צף;
אם (! ds.search (addr)) {
ds.reset_search ();
עיכוב (250);
לחזור
}
אם (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 = מילי ();
בעוד ((מיליס () - נוכחי זמן) <2000) {
button1.scanState ();
אם (button1.flagClick == true) {
// היה לחיצה על כפתור
button1.flagClick = false; // לאפס מאפיין לחיצה
knopka ();
}
}
// עיכוב (1000); // אולי מספיק 750 מטר, אולי לא
// אנו עשויים לעשות כאן כוח ds.depd (), אך האיפוס ידאג לכך.
הווה = ds.reset ();
ds.select (addr);
ds.write (0xBE); // קרא את משטח השריטה
עבור (i = 0; i <9; i ++) {// אנו זקוקים ל 9 בתים
נתונים [i] = ds.read ();
}
// המר את הנתונים לטמפרטורה בפועל
// מכיוון שהתוצאה היא מספר שלם חתום על 16 סיביות, עליה
// להיות מאוחסן בסוג "int16_t", שהוא תמיד 16 סיביות
// גם כאשר נערך במעבד 32 סיביות.
int16_t raw = (נתונים [1] << 8) | נתונים [0];
אם (type_s) {
raw = raw << 3; ברירת מחדל של רזולוציית 9 סיביות
אם (נתונים [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 סיביות res, 187.5 ms
אחרת אם (cfg == 0x40) raw = raw & ~ 1; // רזולוציה של 11 סיביות, 375 ms
// // ברירת המחדל היא רזולוציה של 12 סיביות, זמן המרה של 750 מילישניות
}
צלזיוס = (צף) גולמי / 16.0;
lcd.clear ();
lcd.setCursor (1,0);
lcd.print (צלזיוס);
אם (מחיר) {
lcd.setCursor (0,1);
lcd.print ('*');
}
אם (n_pr! = b_pr) {
אם (צלזיוס b_pr) {
digitalWrite (11, נמוך);
priz = שקר;
}
}
}
// שיטת בדיקת מצב כפתור
// flagPress = נכון - לחצו
// flagPress = שקר - לחוץ
// flagClick = true - לחצו (לחץ)
לחצן void :: scanState () {
אם (flagPress == (! digitalRead (_pin))) {
// מצב האות נשאר זהה
_buttonCount = 0; // לאפס את מונה מצב האות
}
אחרת {
// מצב האות השתנה
_buttonCount ++; // +1 לדלפק מצב האות
if (_buttonCount> = _timeButton) {
// מצב האות לא שינה את השעה שצוינה
// מצב האות הפך יציב
flagPress =! flagPress; // הפוך מחוון המצב
_buttonCount = 0; // לאפס את מונה מצב האות
אם (flagPress == true) flagClick = true; // סימן לחיצה על לחיצה
}
}
}
// שיטה להגדרת מספר הפלט וזמן האישור
לחצן void :: setPinTime (סיכת בייט, זמן בייט כפתור) {
_pin = סיכה;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // הגדר את הפלט כקלט
}
// תיאור הקונסטרוקטור של כיתת הכפתור
לחצן :: לחצן (סיכת בייט, זמן בייט לחצן) {
_pin = סיכה;
_timeButton = timeButton;
pinMode (_pin, INPUT_PULLUP); // הגדר את הפלט כקלט
}