Relógio sem fio do termômetro

Hoje eu quero falar sobre minha experiência em trabalhar com microcontroladores AVR.

fundo
, .

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

Tendo jogado o suficiente, decidiu-se fazer um relógio que, além do tempo, mostrasse a temperatura dos sensores que foram instalados no chão, trazidos para a rua e a temperatura interna.

Em seguida, foi o tormento de escolher um local para instalar o relógio. Não havia lugar adequado perto da pia, a idéia veio para colocá-los no canto oposto (mas um pouco distante, também a porta), após o que a idéia não era muito ousada em usar um método sem fio de transmissão de informações para que o problema de acertar o relógio desaparecesse. Para remexer na Internet e nas lojas online chinesas, foi solicitado um par de módulos sem fio NRF24l01. Para começar, coletei tudo em uma tábua de pão e tentei
transmitir números.


O primeiro problema foi o tamanho da tela LCD (64x128 pixels). Como se viu para desenhar algo nele - ocupa muito espaço. Depois disso, descobri que 32Kb não é memória de programa, mas memória não volátil, e as coisas ficaram mais fáceis. Projetei todas as imagens em um arquivo separado e escrevi tudo na EEPROM.

Como resultado, saí assim
o código.
#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


O código não é muito claro, mas há algo, é isso.

Além disso, tentativas começaram a escrever algo para o lado transmissor. Não funcionou tão bem - o uso incorreto de módulos de rádio. Eu só podia lançá-los para transmitir 8 bits de informação, então tive que bater os dados
código a seguir.
//     
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);
}}

Ou seja, com esse método de detalhamento durante a transmissão, apenas 16 variáveis ​​podem ser obtidas que podem ser distinguidas pelo receptor.
Além disso, como você deve ter notado, o método de pesquisa do sensor DS18b20 não é muito bem organizado, ou seja, uma nova função para o novo sensor (mas desde que o Atmega328p foi usado e não houve problemas com o local, isso não se tornou um grande problema), mas, infelizmente, para resolver o problema Não consegui suspender vários dispositivos em um barramento, assim como não consegui alterar os valores da macro indicando o pino no qual o sensor está pendurado durante o programa.

Tendo recebido um código mais ou menos pronto, comecei a fabricar placas (para o benefício da placa, elas também tentaram nos ensinar como fazê-lo enquanto estudava).
Foi pintado
diagrama de circuito do transmissor
image

na qual a placa de circuito impresso foi criada (por meio de LUT)
image

Ao projetar a placa do transmissor, havia uma condição para torná-la não muito grande sem requisitos especiais de tamanho. Depois de montar a placa, instalar todos os componentes nos lugares certos, verifiquei a operacionalidade e, estranhamente, tudo começou da primeira vez.
Pronto para transmissor
image

Ao projetar a placa receptora, a pergunta óbvia era o caso do relógio. Como nunca vi uma impressora 3D ao vivo, foi decidido procurar algo na forma de um paralelepípedo retangular. Portanto, a tomada Ethernet de parede foi escolhida para o papel da caixa de observação (infelizmente, não há fotos iniciais). Não é astuto
manipulação de facas
image

o orifício para as portas Ethernet tornou-se do tamanho de uma tela LCD. Como a estrutura interna da caixa mostrou-se específica, surgiram novos requisitos para o formato e tamanho da placa.
A estrutura interna da caixa
image

Diagrama esquemático elétrico do receptor
image

Placa de circuito do receptor
image

Placa gravada
image

O processo de montagem do receptor acabou sendo mais complicado devido ao grande tamanho e à presença do DS1307 no gabinete SO (durante a soldagem, pensei que esses relógios tivessem queimado várias vezes), além disso, apareceu um pequeno deslize com dimensões.
Depois de montar a placa, instalar todos os componentes nos lugares certos, verifiquei a operabilidade e, por algum motivo, o LCD não mostrou nada. Felizmente, porém, foi apenas muita resistência no resistor que foi responsável pelo contraste da tela.
Placa Receptora Montada
image

Como deve ser o dispositivo acabado?
image
image
image

Isso é tudo. Resta apenas fazer orifícios para os botões e, na medida do possível, consertar todas as placas dentro da caixa.
Em formação
Atmel Studio 6.0. SinaProg2.1.1. Splan70 layout 6.0 ( ). LCD LCDAssistant.

. .

GitHub


Prós:
- configuração necessária em um caso específico;
- treinamento, edição de mãos;

Contras:
- caro, em comparação com as estações meteorológicas chinesas.
- Durante muito tempo, como para uma pessoa que não tem muito conhecimento neste tópico.
- má otimização de código.

PS - se alguém tiver experiência no lançamento completo do NRF24l01, compartilhe. Dispositivo
UPD totalmente montado
imagem

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


All Articles