Reloj termómetro inalámbrico

Hoy quiero hablar sobre mi experiencia trabajando con microcontroladores AVR.

Antecedentes
, .

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

Después de jugar lo suficiente, se decidió hacer un reloj que, además del tiempo, muestre la temperatura de los sensores instalados en el piso, llevados a la calle y la temperatura dentro de la habitación.

Lo siguiente fue el tormento de elegir un lugar para instalar el reloj. No había un lugar adecuado cerca del fregadero, surgió la idea de colocarlos en la esquina opuesta (pero un poco lejos, también en la puerta), después de lo cual la idea no era muy audaz para usar un método inalámbrico de transmisión de información para que el problema de configurar el reloj desapareciera. Para buscar en Internet y en las tiendas en línea chinas, se ordenó un par de módulos inalámbricos NRF24l01. Para comenzar, recogí todo en una placa e intenté
transmitir números


El primer problema fue el tamaño de la pantalla LCD (64x128 píxeles). Como resultó dibujar algo en él, ocupa mucho espacio. Después de eso, descubrí que 32Kb no es memoria de programa, sino memoria no volátil, y las cosas se volvieron más fáciles, diseñé todas las imágenes en un archivo separado y escribí todo en EEPROM.

Como resultado, salí así
el 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


El código no es muy claro, pero hay algo, eso es.

Además, los intentos comenzaron a escribir algo para el lado transmisor. No funcionó tan bien: el uso torcido de los módulos de radio. Solo pude lanzarlos para transmitir 8 bits de información, así que tuve que superar los datos
siguiente código
//     
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);
}}

Es decir, con este método de descomposición durante la transmisión, solo se pueden obtener 16 variables que pueden ser distinguidas por el receptor.
Además, como habrá notado, el método de sondeo del sensor DS18b20 no está muy bien organizado, es decir, una nueva función para el nuevo sensor (pero como se usó Atmega328p y no hubo problemas con el lugar, esto no se convirtió en un gran problema), pero, por desgracia, para solucionarlo No pude suspender varios dispositivos en un bus, al igual que no pude cambiar los valores de la macro que indica el pin en el que se cuelga el sensor durante el programa.

Habiendo recibido un código más o menos listo, comencé a fabricar tableros (para beneficio del tablero, también intentaron enseñarnos cómo hacerlo mientras estudiamos).
Fue pintado
diagrama de circuito para transmisor
image

en el que se creó la placa de circuito impreso (por medio de LUT)
image

Al diseñar la placa del transmisor, había una condición para que no fuera muy grande sin requisitos especiales de tamaño. Una vez que hice la placa, instalé todos los componentes en los lugares correctos, verifiqué la operabilidad y, curiosamente, comenzó la primera vez.
Transmisor listo
image

Al diseñar la placa del receptor, la pregunta obvia era la caja del reloj. Como nunca vi una impresora 3D en vivo, se decidió buscar algo en forma de paralelepípedo rectangular. Por lo tanto, se eligió el socket Ethernet de pared para el papel de la caja del reloj (desafortunadamente, no hay fotos iniciales). No astuto
manipulación de cuchillo
image

El agujero para los puertos Ethernet se convirtió en el tamaño de una pantalla LCD. Dado que la estructura interna de la caja resultó ser específica, aparecieron nuevos requisitos para la forma y el tamaño del tablero.
La estructura interna de la caja
image

Diagrama esquemático eléctrico del receptor.
image

Placa de circuito del receptor
image

Tablero grabado
image

El proceso de ensamblaje del receptor resultó ser más complicado debido al gran tamaño y la presencia del DS1307 en el caso SO (mientras soldaba, pensé que esos relojes se quemaron varias veces), además, apareció un pequeño deslizamiento con dimensiones.
Una vez que hice la placa, instalé todos los componentes en los lugares correctos, verifiqué la operabilidad y, por alguna razón, la pantalla LCD no mostró nada. Pero afortunadamente, fue solo una gran resistencia en la resistencia la responsable del contraste de la pantalla.
Junta receptora ensamblada
image

¿Cómo debería ser el dispositivo terminado?
image
image
image

Eso es todo. Solo queda hacer agujeros para los botones y, en la medida de lo posible, arreglar todos los tableros dentro de la caja.
Información
Atmel Studio 6.0. SinaProg2.1.1. Splan70 layout 6.0 ( ). LCD LCDAssistant.

. .

GitHub


Pros:
- configuración necesaria en un caso particular;
- entrenamiento, edición de manos;

Contras:
- caro, en comparación con las estaciones meteorológicas chinas.
- Durante mucho tiempo, como para una persona que no tiene mucho conocimiento en este tema.
- Mala optimización del código.

PD: si alguien tiene experiencia en el lanzamiento completo de NRF24l01, compártelo. Dispositivo completamente ensamblado
UPD
imagen

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


All Articles