Jam Termometer Nirkabel

Hari ini saya ingin berbicara tentang pengalaman saya bekerja dengan mikrokontroler AVR.

Latar Belakang
, .

, . . 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.

Setelah bermain cukup, diputuskan untuk membuat jam itu, selain waktu, akan menunjukkan suhu dari sensor yang dipasang di lantai, dibawa ke jalan dan suhu dalam ruangan.

Selanjutnya adalah siksaan memilih tempat memasang arloji. Tidak ada tempat yang cocok di dekat bak cuci, ide datang untuk menempatkan mereka di sudut yang berlawanan (tapi agak jauh, juga pintu), setelah itu ide itu tidak terlalu berani untuk menggunakan metode nirkabel dalam mentransmisikan informasi sehingga masalah pengaturan jam akan hilang. Untuk sim menggeledah melalui Internet dan di toko online Cina sepasang modul nirkabel NRF24l01 dipesan. Untuk memulai, saya mengumpulkan semuanya di papan tempat memotong roti dan mencoba
mengirimkan nomor.


Masalah pertama adalah ukuran layar LCD (64x128 piksel). Karena ternyata menggambar sesuatu di atasnya - membutuhkan banyak ruang. Setelah itu, saya menemukan bahwa 32Kb bukan memori program, tetapi memori non-volatile, dan segalanya menjadi lebih mudah, saya merancang semua gambar dalam file terpisah dan menulis semuanya di EEPROM.

Hasilnya adalah ini
Kode.
#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


Kode ini tidak begitu jelas, tetapi ada sesuatu, yaitu.

Selanjutnya, upaya mulai menulis sesuatu untuk sisi transmisi. Itu tidak berhasil dengan lancar - penggunaan modul radio yang bengkok. Saya hanya bisa meluncurkan mereka untuk mengirimkan 8 bit informasi, jadi saya harus mengalahkan data
kode berikut
//     
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);
}}

Yaitu, dengan metode pemecahan selama transmisi, hanya 16 variabel yang dapat diperoleh yang dapat dibedakan oleh penerima.
Juga, seperti yang mungkin telah Anda perhatikan, metode polling sensor DS18b20 tidak terorganisir dengan baik, yaitu, fungsi baru untuk sensor baru (tapi karena Atmega328p digunakan dan tidak ada masalah dengan tempat itu, ini tidak menjadi masalah besar), tetapi sayangnya, untuk mengatasinya Saya tidak bisa mengatur untuk menangguhkan beberapa perangkat di satu bus, sama seperti saya tidak bisa mengubah nilai-nilai makro yang menunjukkan pin di mana sensor menggantung selama program.

Setelah menerima kode yang kurang lebih sudah jadi, saya mulai membuat papan (untuk kepentingan dewan, mereka juga mencoba mengajari kami bagaimana melakukannya sambil belajar).
Dilukis
diagram sirkuit untuk pemancar
image

di mana papan sirkuit tercetak dibuat (dengan menggunakan LUT)
image

Saat mendesain papan pemancar, ada syarat untuk membuatnya tidak terlalu besar tanpa persyaratan ukuran khusus. Setelah membuat papan, setelah menginstal semua komponen di tempat yang tepat, saya memeriksa operabilitasnya, dan anehnya itu dimulai pertama kali.
Pemancar Siap
image

Saat mendesain papan penerima, pertanyaan yang jelas adalah kasing. Karena saya tidak pernah melihat langsung printer 3D, diputuskan untuk mencari sesuatu dalam bentuk paralelepep persegi. Oleh karena itu, soket Ethernet dinding dipilih untuk peran kotak arloji (sayangnya, tidak ada foto awal). Tidak licik
manipulasi pisau
image

lubang untuk port Ethernet menjadi ukuran layar LCD. Karena struktur internal kotak ternyata spesifik, persyaratan baru muncul untuk bentuk dan ukuran papan.
Kotak pengaturan internal
image

Diagram skematik listrik dari penerima
image

Papan sirkuit penerima
image

Papan terukir
image

Proses pemasangan receiver ternyata lebih rumit karena ukurannya yang besar dan keberadaan DS1307 dalam kasing SO (saat menyolder, saya pikir jam tangan itu terbakar beberapa kali), selain itu, sebuah slip kecil dengan dimensi muncul.
Setelah membuat papan, setelah menginstal semua komponen di tempat yang tepat, saya memeriksa operabilitasnya, dan untuk beberapa alasan LCD tidak menunjukkan apa-apa. Tapi untungnya, hanya ada banyak hambatan pada resistor yang bertanggung jawab atas kontras tampilan.
Papan Penerima Rakitan
image

Seperti apa seharusnya perangkat yang sudah jadi?
image
image
image

Itu saja. Tetap hanya untuk membuat lubang untuk tombol, dan sejauh mungkin, memperbaiki semua papan di dalam kotak.
Informasi
Atmel Studio 6.0. SinaProg2.1.1. Splan70 layout 6.0 ( ). LCD LCDAssistant.

. .

GitHub


Pro:
- konfigurasi yang diperlukan dalam kasus tertentu;
- pelatihan, pengeditan tangan;

Cons:
- mahal, dibandingkan dengan stasiun cuaca Cina.
- Untuk waktu yang lama, seperti untuk orang yang tidak memiliki banyak pengetahuan dalam topik ini.
- optimalisasi kode yang buruk.

PS - jika seseorang memiliki pengalaman dalam meluncurkan NRF24l01 sepenuhnya, silakan berbagi. Perangkat Sepenuhnya Dirakit
UPD
gambar

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


All Articles