Horloge thermomètre sans fil

Aujourd'hui, je veux parler de mon expérience de travail avec les microcontrôleurs AVR.

Contexte
, .

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

Ayant suffisamment joué, il a été décidé de fabriquer une horloge qui, en plus du temps, affichera la température des capteurs installés au sol, amenés dans la rue et la température intérieure.

Vient ensuite le tourment de choisir un endroit pour installer la montre. Il n'y avait pas d'endroit approprié près de l'évier, l'idée est venue de les placer dans le coin opposé (mais légèrement loin, également la porte), après quoi l'idée n'était pas très audacieuse d'utiliser une méthode sans fil pour transmettre des informations afin que le problème de réglage de l'horloge disparaisse. Pour fouiller la carte SIM sur Internet et dans les magasins en ligne chinois, une paire de modules sans fil NRF24l01 a été commandée. Pour commencer, j'ai tout rassemblé sur une planche à pain et essayé
transmettre des nombres.


Le premier problème était la taille de l'écran LCD (64x128 pixels). Comme il s'est avéré dessiner quelque chose dessus - prend beaucoup de place. Après cela, j'ai découvert que 32 Ko n'était pas de la mémoire programme, mais de la mémoire non volatile, et les choses sont devenues plus faciles, j'ai conçu toutes les images dans un fichier séparé et j'ai tout noté dans l'EEPROM.

En conséquence, je suis sorti comme ça
le code.
#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


Le code n'est pas très clair, mais il y a quelque chose, c'est.

De plus, des tentatives ont commencé à écrire quelque chose pour le côté émetteur. Cela n'a pas fonctionné aussi bien - l'utilisation tordue des modules radio. Je n'ai pu les lancer que pour transmettre 8 bits d'informations, j'ai donc dû battre les données
code suivant.
//     
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);
}}

Autrement dit, avec cette méthode de ventilation pendant la transmission, seules 16 variables peuvent être obtenues qui peuvent être distinguées par le récepteur.
De plus, comme vous l'avez peut-être remarqué, la méthode d'interrogation du capteur DS18b20 n'est pas très bien organisée, à savoir une nouvelle fonction pour le nouveau capteur (mais comme Atmega328p a été utilisé et qu'il n'y a pas eu de problème avec l'endroit, cela n'est pas devenu un gros problème), mais hélas, pour le trier Je ne pouvais pas réussir à suspendre plusieurs appareils sur un bus, tout comme je ne pouvais pas changer les valeurs de la macro indiquant la broche sur laquelle le capteur se bloque pendant le programme.

Ayant reçu un code plus ou moins prêt à l'emploi, j'ai commencé à fabriquer des planches (au profit de la planche, elles ont aussi essayé de nous apprendre à le faire en étudiant).
A été peint
schéma électrique de l'émetteur
image

sur lequel la carte de circuit imprimé a été créée (au moyen de LUT)
image

Lors de la conception de la carte de l'émetteur, il était nécessaire de la rendre pas très grande sans exigences de taille spéciales. Après avoir fabriqué la carte, avoir installé tous les composants aux bons endroits, j'ai vérifié l'opérabilité et, étrangement, elle a commencé la première fois.
Prêt pour l'émetteur
image

Lors de la conception de la carte du récepteur, la question évidente était le boîtier de la montre. Comme je n'ai jamais vu d'imprimante 3D en direct, il a été décidé de chercher quelque chose en forme de parallélépipède rectangle. Par conséquent, la prise Ethernet murale a été choisie pour le rôle de boîtier de montre (malheureusement, il n'y a pas de photos initiales). Pas rusé
manipulation de couteau
image

le trou pour les ports Ethernet est devenu la taille d'un écran LCD. Étant donné que la structure interne de la boîte s'est avérée spécifique, de nouvelles exigences sont apparues pour la forme et la taille de la planche.
La structure interne de la boîte
image

Schéma électrique du récepteur
image

Circuit imprimé du récepteur
image

Planche gravée
image

Le processus d'assemblage du récepteur s'est avéré plus compliqué en raison de la grande taille et de la présence du DS1307 dans le boîtier SO (pendant la soudure, je pensais que ces montres avaient brûlé plusieurs fois), en plus, un petit glissement avec des dimensions est apparu.
Après avoir fait la carte, avoir installé tous les composants aux bons endroits, j'ai vérifié l'opérabilité, et pour une raison quelconque, l'écran LCD n'affichait rien. Mais heureusement, ce n'était que beaucoup de résistance sur la résistance qui était responsable du contraste de l'écran.
Carte réceptrice assemblée
image

À quoi devrait ressembler l'appareil fini?
image
image
image

C'est tout. Il ne reste plus qu'à faire des trous pour les boutons, et dans la mesure du possible, fixer toutes les planches à l'intérieur de la boîte.
Information
Atmel Studio 6.0. SinaProg2.1.1. Splan70 layout 6.0 ( ). LCD LCDAssistant.

. .

GitHub


Avantages:
- configuration nécessaire dans un cas particulier;
- formation, édition des mains;

Inconvénients:
- cher, par rapport aux stations météorologiques chinoises.
- Pendant longtemps, comme pour une personne qui n'a pas beaucoup de connaissances sur ce sujet.
- mauvaise optimisation du code.

PS - si quelqu'un a de l'expérience dans le lancement complet de NRF24l01, merci de partager. Dispositif
UPD entièrement assemblé
image

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


All Articles