Drahtlose Thermometeruhr

Heute möchte ich über meine Erfahrungen in der Arbeit mit AVR-Mikrocontrollern sprechen.

Hintergrund
, .

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

Nachdem genug gespielt wurde, wurde beschlossen, eine Uhr zu bauen, die zusätzlich zur Zeit die Temperatur der auf dem Boden installierten Sensoren, die auf die Straße gebracht wurden, und die Temperatur im Raum anzeigt.

Als nächstes kam die Qual, einen Ort für die Installation der Uhr zu wählen. Es gab keinen geeigneten Ort in der Nähe des Waschbeckens. Die Idee kam, sie in die gegenüberliegende Ecke (aber etwas weit entfernt, auch in die Tür) zu stellen. Danach war die Idee nicht sehr mutig, eine drahtlose Methode zur Informationsübertragung zu verwenden, damit das Problem des Einstellens der Uhr verschwindet. Für das Sim-Stöbern im Internet und in chinesischen Online-Shops wurde ein Paar Funkmodule NRF24l01 bestellt. Zu Beginn sammelte ich alles auf einem Steckbrett und versuchte es
Nummern senden.


Das erste Problem war die Größe des LCD-Displays (64 x 128 Pixel). Wie sich herausstellte, nimmt es viel Platz ein. Danach fand ich heraus, dass 32 KB kein Programmspeicher, sondern ein nichtflüchtiger Speicher ist, und es wurde einfacher. Ich entwarf alle Bilder in einer separaten Datei und schrieb alles in das EEPROM.

Infolgedessen kam ich so heraus
der 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


Der Code ist nicht sehr klar, aber es gibt etwas, das heißt.

Ferner begannen Versuche, etwas für die sendende Seite zu schreiben. Es hat nicht so reibungslos geklappt - die krumme Verwendung von Funkmodulen. Ich konnte sie nur starten, um 8 Informationsbits zu übertragen, also musste ich die Daten schlagen
folgenden Code.
//     
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);
}}

Das heißt, mit dieser Aufschlüsselungsmethode während der Übertragung können nur 16 Variablen erhalten werden, die vom Empfänger unterschieden werden können.
Wie Sie vielleicht bemerkt haben, ist die DS18b20-Sensorabfragemethode nicht sehr gut organisiert, nämlich eine neue Funktion für den neuen Sensor (aber da Atmega328p verwendet wurde und es keine Probleme mit dem Ort gab, wurde dies kein großes Problem), aber leider, um es zu klären Ich konnte nicht mehrere Geräte an einem Bus aussetzen, genauso wie ich die Werte des Makros nicht ändern konnte, das den Pin angibt, an dem der Sensor während des Programms hängt.

Nachdem ich einen mehr oder weniger vorgefertigten Code erhalten hatte, begann ich mit der Herstellung von Boards (zum Wohle des Boards versuchten sie auch, uns zu lehren, wie man das während des Studiums macht).
War bemalt
Schaltplan für Sender
image

auf dem die Leiterplatte erstellt wurde (mittels LUT)
image

Bei der Konstruktion der Senderplatine wurde die Bedingung erfüllt, dass sie ohne besondere Größenanforderungen nicht sehr groß wird. Nachdem ich das Board hergestellt und alle Komponenten an den richtigen Stellen installiert hatte, überprüfte ich die Funktionsfähigkeit und seltsamerweise startete es beim ersten Mal.
Sender bereit
image

Bei der Gestaltung der Empfängerplatine war die offensichtliche Frage das Gehäuse der Uhr. Da ich noch nie einen 3D-Drucker live gesehen habe, wurde beschlossen, nach etwas in Form eines rechteckigen Parallelepipeds zu suchen. Daher wurde die Wand-Ethernet-Buchse für die Rolle der Watchbox ausgewählt (leider gibt es keine ersten Fotos). Nicht gerissen
Messermanipulation
image

Das Loch für die Ethernet-Anschlüsse hatte die Größe eines LCD-Bildschirms. Da sich die interne Struktur der Box als spezifisch herausstellte, stellten sich neue Anforderungen an die Form und Größe der Platte.
Die interne Struktur der Box
image

Schaltplan des Empfängers
image

Empfängerplatine
image

Geätztes Brett
image

Der Zusammenbau des Empfängers erwies sich aufgrund der Größe und des Vorhandenseins des DS1307 im SO-Gehäuse als komplizierter (beim Löten dachte ich, dass diese Uhren mehrmals durchgebrannt sind). Außerdem erschien ein kleiner Schlupf mit Abmessungen.
Nachdem ich die Platine hergestellt und alle Komponenten an den richtigen Stellen installiert hatte, überprüfte ich die Funktionsfähigkeit, und aus irgendeinem Grund zeigte das LCD nichts an. Glücklicherweise war nur ein großer Widerstand am Widerstand für den Kontrast des Displays verantwortlich.
Zusammengebaute Empfängerplatine
image

Wie soll das fertige Gerät aussehen?
image
image
image

Das ist alles. Es bleibt nur, Löcher für die Knöpfe zu bohren und so weit wie möglich alle Bretter in der Box zu befestigen.
Information
Atmel Studio 6.0. SinaProg2.1.1. Splan70 layout 6.0 ( ). LCD LCDAssistant.

. .

GitHub


Vorteile:
- Konfiguration im Einzelfall erforderlich;
- Training, Hände bearbeiten;

Nachteile:
- teuer im Vergleich zu chinesischen Wetterstationen.
- Für eine lange Zeit, wie für eine Person, die nicht viel Wissen in diesem Thema hat.
- schlechte Codeoptimierung.

PS - Wenn jemand Erfahrung mit der vollständigen Einführung von NRF24l01 hat, teilen Sie diese bitte mit.
UPD vollständig zusammengebautes Gerät
Bild

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


All Articles