
جعل المؤلف هذا ميزان الحرارة LED المكون من رقمين بمثابة هدية عيد ميلاد لابن صديقه. يبلغ من العمر عامين فقط ، وهو يقرأ الأرقام بالفعل ، لكن الحروف ليست كذلك. الآن يمكنه معرفة درجة الحرارة خارج النافذة بمفرده. المستشعر الموجود في ميزان الحرارة عبارة عن رقاقة DS18B20 تعمل وفقًا للبروتوكول 1 سلك ، وجهاز التحكم الدقيق من نوع ATtiny84. السبورة مربعة مع جانب 25 مم ، في الحجم يمكن مقارنتها بقطعة 50 بنس. يخطط المؤلف لوضع اللوحة في علبة مضادة للماء ووضعها خارج النافذة. يتم تشغيل المؤشر لفترة وجيزة كل 24 ثانية ، وتستمر بطاريات CR2032 لمدة عام تقريبًا.
يعمل ميزان الحرارة في المدى من -19 إلى +99 درجة مئوية. إذا لزم الأمر ، يتم عرض ناقص واحد في وقت واحد في الترتيب العالي. خارج النطاق ، يتم عرض الحروف Lo أو Hi. يمكنك "تعليم" الجهاز لعرض درجات حرارة أقل من -19 درجة مئوية باستخدام شريحة ذات نقطة ناقص.
وفقًا لهذا المخطط ، تم تجميع الجهاز مسبقًا على اللوح:

تشارك جميع مخرجات متحكم ، ويستخدم مولد الساعة 8 ميغاهيرتز المدمج. كان النموذج الأولي على النحو التالي:

استخدم النموذج الأولي DS18B20 في حزمة TO-92 ، و ATtiny84 في حزمة PDIP ومؤشر 3621AS بحجم 3.6 بوصة. ثم قام المؤلف بتطوير اللوحة في Eagle وطلبها في PCBway. هنا يوجد المتحكم الدقيق بالفعل في علبة SOIC ، ويكون المستشعر في علبة OPSOP ، والمقاومات والمكثفات والشاشة بحجم 0805. كل شيء ما عدا الشاشة يتم لحامه بواسطة مجفف شعر Youyue 858D + عند درجة حرارة 250 درجة مئوية.
كل من النموذج الأولي ولوحة الدوائر المطبوعة لديها مؤشرات مع الأنود المشترك. يتكون الجهاز في نسختين ، مع مؤشرات الألوان الأحمر والأصفر. الأحمر - على KDPV ، الأصفر - هنا:

يتم لحام حامل لخلية ليثيوم 20 مم (أي واحدة لها تسمية تبدأ بـ 20 ، أي ، 2016 ، 2025 أو 2032) على الجانب الخلفي:

البرنامج الثابت مكتوب بحيث يكون المتحكم في وضع السكون معظم الوقت ويستيقظ عند انقطاع جهاز ضبط الوقت. في تنفيذ واجهة 1 سلك ، وتشارك
هذا الوقت التشغيل للمؤلف نفسه. يستهلك عداد الموقت ذي 16 بت الخاص بالمراقب الدقيق الذي يعمل بتردد قدره 1 ميجاهرتز:
void OneWireSetup () { TCCR1A = 0<<WGM10; // Normal mode TCCR1B = 0<<WGM12 | 2<<CS10; // Normal mode, divide clock by 8 }
يوفر الروتين الفرعي DelayMicros () تأخيرًا لعدد محدد من ميكروثانية ، استنادًا إلى سجل مقارنة الإخراج OCR0A:
void DelayMicros (unsigned int micro) { TCNT1 = 0; TIFR1 = 1<<OCF1A; OCR1A = micro; while ((TIFR1 & 1<<OCF1A) == 0); }
يقرأ روتين DisplayTemperature () قيمة درجة الحرارة من المستشعر ويعرضها. نظرًا لوجود مستشعر واحد على الحافلة ، يمكنك تجاهل الرقم التسلسلي وإعطاء الأمر تخطي ROM ، وبعد ذلك يتم إرسال جميع الأوامر التالية إلى أي جهاز:
void DisplayTemperature () { cli(); // No interrupts if (OneWireReset() != 0) { sei(); DisplayError(0); // Device not found } else { OneWireWrite(SkipROM); OneWireWrite(ConvertT); while (OneWireRead() != 0xFF); OneWireReset(); OneWireWrite(SkipROM); OneWireWrite(ReadScratchpad); OneWireReadBytes(9); sei(); // Interrupts if (OneWireCRC(9) == 0) { int temp = DataWords[0]; Display((temp+8)>>4); // Round to nearest degree } else DisplayError(1); // CRC error } }
استجابة للطلب ، يقوم المستشعر بإرجاع قيمة درجة الحرارة في شكل عدد صحيح موقّع 16 بت في وحدات تساوي 1/16 درجة. يتم تقريب الرقم إلى أقرب عدد صحيح وعرضه عن طريق استدعاء روتين Display ().
يعرض الروتين الفرعي DisplayError () أخطاء في تفاعل المتحكم الدقيق مع المستشعر الموجود على ناقل سلك واحد:
void DisplayError (int no) { Buffer[0] = Error; Buffer[1] = no; }
E0 - لم يتم الكشف عن المستشعر ، خطأ E1 - CRC.
تؤخذ البيانات الخاصة بالإشارة الديناميكية من مجموعة Buffer []. على سبيل المثال ، لعرض الرقم 20 ، يجب عليك القيام بما يلي:
Buffer[0]=2; Buffer[1]=0;
يولد عداد 0 مقاطعة المقاطعات على تردد 125 هرتز ، وهو ما يكفي للقضاء على وميض. أولاً ، تم تكوين المؤقت في الإعداد () "
TCCR0A = 2<<WGM00; // CTC mode; count up to OCR0A TCCR0B = 0<<WGM02 | 4<<CS00; // Divide by 256 OCR0A = 250-1; // Compare match at 125Hz TIMSK0 = 0; // Interrupts initially off
يستدعي روتين معالجة المقاطعة المطابقة أثناء المقارنة روتين DisplayNextDigit () ثم يتم حسابه في الاتجاه المعاكس:
ISR(TIM0_COMPA_vect) { DisplayNextDigit(); Ticks--; }
يقرأ روتين فرعي DisplayNextDigit () البيانات من الخلية المقابلة في صفيف Buffer [] ويتضمن الأجزاء المطلوبة في بت العرض المقابل. يستخدم البرنامج #define للاختيار بين مؤشر مع كاثود أو أنود شائع. إذا كانت جميع القطاعات مضاءة فور بدء التشغيل ، فلن يتطابق نوع العرض مع النوع المحدد في البرنامج الثابت. بالنسبة للكاثود الشائع ، يجب استبدال الروتين الفرعي بما يلي:
void DisplayNextDigit () { PORTB = PORTB | 1<<digit; // Turn old digit off digit = digit ^ 1; // Toggle between 0 and 1 char segs = charArray[Buffer[digit]]; PORTA = segs; // Lit segments high PORTB = PORTB & ~(1<<digit); // Turn new digit on }
أخيرًا ، ينتج روتين Display () رقمًا يتكون من رقمين للكتابة إلى صفيف Buffer []:
void Display (int n) { int units = n % 10; int tens = n / 10; int temp0 = tens; int temp1 = abs(units); if (tens < -1) {temp0 = Lo; temp1 = Lo+1; } else if (tens > 9) {temp0 = Hi; temp1 = Hi+1; } else if (tens == -1) temp0 = Minus1; else if ((tens == 0) && (units >= 0)) temp0 = Blank; else if ((tens == 0) && (units < 0)) temp0 = Minus; Buffer[0] = temp0; Buffer[1] = temp1; }
كما يأخذ في الاعتبار حالات عرض الطرح مع الوحدة بالترتيب العالي ، وكذلك الرسائل حول درجة الحرارة خارج النطاق.
لتحقيق أقصى قدر من توفير الطاقة ، يتم تعطيل مولدات الساعات ADC و USI و ADC ، ويتم تمكين وضع السكون PWR_DOWN:
ADCSRA &= ~(1<<ADEN); // Disable ADC to save power PRR = 1<<PRUSI | 1<<PRADC; // Turn off clocks to USI & ADC to save power set_sleep_mode(SLEEP_MODE_PWR_DOWN);
يعرض البرنامج الرئيسي درجة حرارة لعشر ثانية ، ثم يقوم بتشغيل وضع السكون. اتضح أن هذا هو الحد الأدنى من الوقت إشارة ، مريحة للقراءة. قبل ثانيتين من عرض درجة الحرارة ، تومض النقطة لفترة وجيزة:
void loop () { Buffer[0] = DP; Buffer[1] = Blank; DisplayOn(12); WDDelay(6); // Sleep for 1 second Buffer[0] = Blank; Buffer[1] = DP; DisplayOn(12); WDDelay(6); // Sleep for 1 second DisplayTemperature(); DisplayOn(12); WDDelay(9); // Sleep for 8 seconds WDDelay(9); // Sleep for 16 seconds WDDelay(9); // Sleep for 24 seconds }
تظل الشاشة مغلقة لمدة 24 ثانية نظرًا لثلاث مكالمات مراقبة لمدة 8 ثوانٍ لكل منها. عند تشغيل المؤشر ، يبلغ الاستهلاك الحالي 6.6 مللي أمبير في وضع السكون - 4.7 μA ، ومتوسط الاستهلاك الحالي هو 1/240 * 6.6 مللي أمبير. تبلغ السعة النموذجية لخلية CR2032 225 مللي أمبير في الساعة ، وبالتالي فهي كافية (225 / 6.6) × 240/24 = 340 يومًا - أي أقل بقليل من عام.
نطاقات درجة حرارة المكونات هي كما يلي: متحكم ومؤشر - من -40 إلى + 85 درجة مئوية ، مقاومات ومكثف - من -55 إلى +125 درجة مئوية ، بطاريات - من -20 إلى +70 درجة مئوية سيعمل عنصر بمدى درجة حرارة ممتد BR2032 في المدى من -30 إلى +85 درجة مئوية.
يتكون متحكم Arduino متوافق مع
هذا التطور Spence Konde. في IDE ، حدد ATtiny24 / 44/84 في قسم ATTinyCore من قائمة اللوحة. ثم تحتاج إلى ضبط الخيارات التالية ، مع عدم الاهتمام بالباقي:
Chip: "ATtiny84" Clock: "8 MHz (internal)" BOD: "BOD Disabled" Pin Mapping: "Clockwise (like damellis core)"
تم تحميل البرنامج باستخدام مقطع اختبار Pomona ، الذي تم وضعه أعلى المتحكم ومتصل بـ SparkFun Tiny AVR Programmer. تحتاج أولاً إلى تحديد Burn Bootloader ، ثم تحميل.
الروابط:
النص الكامل للبرنامج واللوحة والبرنامج على GitHub ،
واللوحة على OSHpark .