无线温度计时钟

今天,我想谈谈我在使用AVR微控制器方面的经验。

背景
, .

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

经过足够的演奏,决定制作一个时钟,除了时间以外,还可以显示安装在地板上,带到街上的传感器的温度以及室内的温度。

接下来是选择安装手表的地方的痛苦。洗手池附近没有合适的地方,想法是将它们放在相对的角落(但稍远一点,也是门口),此后这个想法并不是非常大胆地使用无线传输信息的方法,从而消除了设置时钟的问题。为了通过Internet和中文在线商店进行模拟翻唱,订购了一对无线模块NRF24l01。首先,我将所有东西收集在面包板上,然后尝试
传送号码。


第一个问题是LCD显示器的尺寸(64x128像素)。事实证明,要在其上绘制某些东西-占用了大量空间。在那之后,我发现32Kb不是程序存储器,而是非易失性存储器,事情变得更容易了,我将所有图片设计在一个单独的文件中,并将所有内容记录在EEPROM中。

结果我就这样出来了
编码。
#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


代码不是很清楚,但是有一些东西。

此外,尝试开始为发送端写一些东西。运作不顺利-无线电模块的弯曲用法。我只能启动它们来传输8位信息,所以我不得不击败数据
以下代码。
//     
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);
}}

即,利用这种在传输期间的分解方法,只能获得16个可以被接收机区分的变量。
另外,您可能已经注意到,DS18b20传感器的轮询方法组织得不太好,也就是说,新传感器的新功能(但是由于使用了Atmega328p,并且该位置没有问题,所以这并不是什么大问题),但是a我无法在一条总线上挂起多个设备,就像我无法在程序中更改指示传感器挂在其上的引脚的宏的值一样。

收到或多或少现成的代码后,我开始制造电路板(为了使电路板受益,他们还试图在学习时教我们如何做)。
被涂上
变送器电路图
image

在其上创建印刷电路板(通过LUT)
image

设计发送器板时,有一个条件,即在没有特殊尺寸要求的情况下不能使其很大。制作好电路板,将所有组件安装在正确的位置之后,我检查了可操作性,奇怪的是它第一次启动。
发射器就绪
image

在设计接收板时,明显的问题是表壳。由于我从未见过3D打印机的现场直播,因此决定寻找长方体形状的东西。因此,选择了墙上的以太网插座作为手表盒的角色(不幸的是,没有初始照片)。不狡猾
刀操作
image

以太网端口的孔变成了LCD屏幕的尺寸。由于盒子的内部结构是特定的,因此对板的形状和尺寸提出了新的要求。
盒子内部布置
image

接收器电气原理图
image

接收器电路板
image

蚀刻板
image

由于大尺寸和SO外壳中DS1307的存在,组装接收器的过程变得更加复杂(在焊接时,我认为这些手表会烧坏几次),此外,还出现了尺寸小的打滑现象。
制作好电路板,将所有组件安装在正确的位置后,我检查了是否可操作,并且由于某种原因LCD没有显示任何内容。但幸运的是,只有电阻上的大量电阻才导致显示对比度。
组装接收板
image

成品设备应该是什么样?
image
image
image

就这样。剩下的只是在按钮上打孔,并尽可能将盒子中的所有板子固定。
信息
Atmel Studio 6.0. SinaProg2.1.1. Splan70 layout 6.0 ( ). LCD LCDAssistant.

. .

GitHub


优点:
-在特定情况下必要的配置;
-训练,编辑手;

缺点:
-与中国气象站相比,价格昂贵。
-很长一段时间,对于这个主题不了解的人。
-糟糕的代码优化。

PS-如果有人有全面启动NRF24l01的经验,请分享。
UPD完全组装的设备
图片

Source: https://habr.com/ru/post/zh-CN382393/


All Articles