ساعة ميزان الحرارة اللاسلكية

اليوم أريد أن أتحدث عن تجربتي في العمل مع ميكروكنترولر AVR.

خلفية
, .

, . . DS18b20 (, , , 1$), , . , .

DS18b20, «+» «-».

( , , — ).

“ARDUINO”. «», - , - - .

“ARDUINO”. .
3-.
, + .

- RTC DS1307,
LCD 12864 .

Arduino IDE, Atmel Studio 6.0 ( USBasp_H6). , DS1307 16 ( 1 Arduino IDE ). USBasp_H6 , 5 «» Arduino.

بعد اللعب بما فيه الكفاية ، تقرر إنشاء ساعة ستعرض ، بالإضافة إلى الوقت ، درجة الحرارة من أجهزة الاستشعار التي تم تركيبها على الأرض ، والتي يتم إخراجها إلى الشارع ودرجة الحرارة داخل الغرفة.

بعد ذلك كان عذاب اختيار مكان لتثبيت الساعة. لم يكن هناك مكان مناسب بالقرب من الحوض ، جاءت الفكرة لوضعهم في الزاوية المقابلة (ولكن بعيدًا قليلاً ، أيضًا المدخل) ، وبعد ذلك لم تكن الفكرة جريئة جدًا لاستخدام طريقة لاسلكية لنقل المعلومات حتى تختفي مشكلة ضبط الساعة. من أجل البحث عن طريق الإنترنت وفي المتاجر الصينية عبر الإنترنت ، تم طلب زوج من الوحدات اللاسلكية NRF24l01. للبدء ، جمعت كل شيء على لوح توصيل وحاولت
يرسل الأرقام.


كانت المشكلة الأولى حجم شاشة LCD (64 × 128 بكسل). كما اتضح أن رسم شيء عليه - يشغل مساحة كبيرة. بعد ذلك ، اكتشفت أن 32 كيلوبايت ليست ذاكرة برنامج ، ولكن ذاكرة غير متقلبة ، وأصبحت الأمور أسهل ، صممت جميع الصور في ملف منفصل وكتبت كل شيء في EEPROM.

ونتيجة لذلك ، خرجت مثل هذا
الرمز.
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "my_OWI_ds1820.h"
#include "SPI.h"
#include "nRF24L01.h"
#include "my_i2c_watch.h"
#include "KS0107.h"
void timer_init(void)
void button_init(void)
void get_data(void)		
void show_temp 
void show_time(void)
ISR (TIMER1_OVF_vect)
void noraml_mode(void)
void set_mode(void)
int main(void)
{
	button_init();// 
	ds_init();// RTC
	KS0107_Init();//  LCD
	KS0107_Clrscr(0);// LCD
	SPI_MasterInit();// SPI  
	nRF24L01_init(0b00000011);//   
	nrf24l01_RX_TX_mode(PRX);//  
	timer_init();// 
	if((BUT_1&BUT_2)==0){ds_write(0,0);ds_write(1,0);ds_write(2,0);cond_1=0;cond_2=0;}//full reset 00:00:00
	sei();//   ,    LCD -  
	
while(1){

if(BUT_1==1){cond_1=1;}// 
if(BUT_2==1){cond_2=1;}// 	
		    
if (setmode==0){	// 
if(BUT_1==0){if(cond_1==1){cond_1=0;mode=26;}}	//  
if(BUT_2==0){if(cond_2==1){cond_2=0;mode=100;setmode=1;read_ds_data(&ds_time);convert(&ds_time);}}//     setmode=1
noraml_mode();
}  //end if (setmode==0) 
else if(setmode==1){//  
set_mode();
	}//end if(setmode==1)
	}//end while(1)
}//end main


الرمز ليس واضحًا جدًا ، ولكن هناك شيء ما.

علاوة على ذلك ، بدأت المحاولات لكتابة شيء ما للجانب المرسل. لم ينجح الأمر بسلاسة - الاستخدام المعوج لوحدات الراديو. لم يكن بإمكاني إطلاقها إلا لإرسال 8 بتات من المعلومات ، لذلك كان عليّ التغلب على البيانات
التعليمات البرمجية التالية.
//     
void mSend(char pin)
{
	int T=0;
	//int x;
	char code0,code1,code2;
	char pack[3]={0,0,0};
	
	switch (pin){
	case 4:
	T=temp_18b20_4();
	code0=0x10;
	code1=0x20;
	code2=0x30;
	break;
		
	case 3:
	T=temp_18b20_3();
	code0=0x40;
	code1=0x50;
	code2=0x60;
	break;
		
	case 2:
	T=temp_18b20_2();
	code0=0x70;
	code1=0x80;
	code2=0x90;
	break;
	}
	
pack[0]=((T>>8)&0x0F)|code0;
pack[1]=((T>>4)&0x0F)|code1;
pack[2]=(T&0x0F)|code2;
	for(char i=0;i<3;i++){
	nrf24l01_FLUSH_TX;//  
	nrf24l01_Sent_data_Ret(pack[i]);
	_delay_ms(100);
}}

أي أنه باستخدام طريقة الانهيار هذه أثناء الإرسال ، يمكن الحصول على 16 متغيرًا فقط يمكن تمييزها بواسطة جهاز الاستقبال.
أيضًا ، كما لاحظت ، فإن طريقة الاستطلاع باستخدام جهاز الاستشعار DS18b20 ليست منظمة بشكل جيد للغاية ، وهي وظيفة جديدة لجهاز الاستشعار الجديد (ولكن منذ استخدام Atmega328p ولم تكن هناك مشاكل في المكان ، لم تصبح هذه مشكلة كبيرة) ، ولكن للأسف ، لفرزها لم أتمكن من تعليق عدة أجهزة في ناقل واحد ، تمامًا كما لم أستطع تغيير قيم الماكرو التي تشير إلى الدبوس الذي يعلق فيه المستشعر أثناء البرنامج.

بعد أن تلقيت رمزًا جاهزًا إلى حد ما ، بدأت في تصنيع الألواح (لصالح اللوحة ، حاولوا أيضًا تعليمنا كيفية القيام بذلك أثناء الدراسة).
تم رسمه
رسم تخطيطي لدائرة الإرسال
image

التي تم إنشاء لوحة الدوائر المطبوعة عليها (عن طريق LUT)
image

عند تصميم لوحة الإرسال ، كان هناك شرط لجعلها ليست كبيرة جدًا بدون متطلبات حجم خاصة. بعد أن صنعت اللوحة ، وبعد تركيب جميع المكونات في الأماكن المناسبة ، تحققت من قابلية التشغيل ، ومن الغريب أنها بدأت في المرة الأولى.
جهاز الإرسال جاهز
image

عند تصميم لوحة جهاز الاستقبال ، كان السؤال الواضح هو حالة الساعة. نظرًا لأنني لم أر أبدًا طابعة ثلاثية الأبعاد على الهواء مباشرة ، فقد تقرر البحث عن شيء على شكل متوازي مستطيل الشكل. لذلك ، تم اختيار مقبس Ethernet الجداري لدور صندوق الساعة (للأسف ، لا توجد صور أولية). لا ماكرة
التلاعب بالسكين
image

أصبحت فتحة منافذ إيثرنت بحجم شاشة LCD. نظرًا لأن الهيكل الداخلي للصندوق تبين أنه محدد ، ظهرت متطلبات جديدة لشكل وحجم اللوحة.
الهيكل الداخلي للصندوق
image

رسم تخطيطي كهربائي لجهاز الاستقبال
image

لوحة دائرة الاستقبال
image

لوح محفور
image

اتضح أن عملية تجميع جهاز الاستقبال أكثر تعقيدًا بسبب الحجم الكبير ووجود DS1307 في حالة SO (أثناء اللحام ، اعتقدت أن تلك الساعات أحرقت عدة مرات) ، بالإضافة إلى ذلك ، ظهرت زلة صغيرة ذات أبعاد.
بعد أن صنعت اللوحة ، بعد تثبيت جميع المكونات في الأماكن المناسبة ، تحققت من قابلية التشغيل ، ولسبب ما لم تعرض شاشة LCD أي شيء. لكن لحسن الحظ ، كانت المقاومة فقط على المقاومة هي المسؤولة عن تباين الشاشة.
مجلس استقبال تجميعها
image

كيف يجب أن يبدو الجهاز النهائي؟
image
image
image

هذا كل شئ. يبقى فقط عمل فتحات للأزرار ، وإلى أقصى حد ممكن ، إصلاح جميع الألواح داخل الصندوق.
معلومات
Atmel Studio 6.0. SinaProg2.1.1. Splan70 layout 6.0 ( ). LCD LCDAssistant.

. .

GitHub


الإيجابيات:
- التكوين ضروري في حالة معينة ؛
- التدريب وتحرير اليدين.

سلبيات:
- باهظة الثمن ، بالمقارنة مع محطات الأرصاد الجوية الصينية.
- لفترة طويلة ، كما هو الحال بالنسبة لشخص ليس لديه الكثير من المعرفة في هذا الموضوع.
- تحسين كود ضعيف.

ملاحظة - إذا كان شخص ما لديه خبرة في إطلاق NRF24l01 بالكامل ، فيرجى المشاركة.
UPD جهاز مجمع بالكامل
صورة

Source: https://habr.com/ru/post/ar382393/


All Articles