电子说
步骤1:
要构建传感器,我创建了一个小的PCB。为此,我使用了墨粉转移方法。如何做到这一点是许多指导对象的目标。我焊接了芯片,电容和引脚头。在传感器的第五个针脚上,我放了一根从电缆绝缘层中取出的小塑料管。它的目的是将传感器引导到正确的位置并阻止其插入错误的母头孔中。在图片上可以看到它必须放置的正确方式。传感器按照使用以下Arduino引脚的方式投影:“5V”,“GNG”,“GND”,_,_,“A0”。这意味着-模拟输出电压值由ADC0采样。
步骤2:硬件
对于基于DIY温度传感器的简单温度计项目,我使用了Arduino MEGA板(也是我的DYI项目)。还需要LCD防护罩。就我而言,盾牌也是自制的。使用的LCD是带有ST9720芯片的图形128x64显示器。我在ebay上买了它。 LCD屏蔽板的PCB也来自ebay。我已经在LCD上焊接了母排针,并在原型屏蔽板上焊接了排针-现在,我可以简单地将LCD模块插入到原型板上,并且可以正常工作,并且不使用任何电缆。如果您没有任何LCD防护罩,那么当然可以使用面包屑的标准方法。对于该项目,也可以使用任何字符LCD(例如16x2),但我没有LCD,但我经历了更复杂的方式:-)。
步骤3:代码
现在是时候编写代码了。我试图使它尽可能简短。因为我使用GLCD,所以我决定将实现基于u8glib库。如果要使用字符LCD,则应使用标准的LCD Arduino库,并且必须根据它们来调整代码。
这是代码:
/*
温度计基于Maxims DS600u +芯片
*/
#include“U8glib.h”
#include
U8GLIB_ST7920_128X64_4X u8g(8,9,10,11) ,4,5,6,7,18,17,16);//8Bit Com:D0..D7:8,9,10,11,4,5,6,7 en = 18,di = 17,rw = 16
void u8g_prepare(void){
u8g。 setFont(u8g_font_6x10);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
}
void setup(void){
//翻转屏幕,如果需要的话
//u8g.setRot180();
//指定默认颜色值
if(u8g.getMode()== U8G_MODE_R3G3B2)
u8g.setColorIndex(255);//white
else if(u8g.getMode()== U8G_MODE_GRAY2BIT)
u8g.setColorIndex(3);//最大强度
否则if(u8g.getMode()== U8G_MODE_BW)
u8g.setColorIndex(1);//像素在
//u8g.setContrast(0x30);
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
u8g_prepare();
}
void draw(void){
浮动供应= 4.91 ;//必须在此处输入arduino板的测量电源电压
//读取传感器输出电压
int读数= AnalogRead(0);
float v_out =(读取*电源)/ 1.024 ;
//在液晶显示屏上显示温度
float temperature =(v_out-509)/6.45;
char temp [5];
dtostrf(temperature,5,1 ,温度);结果,u8g.drawStr(4,24, “温度:”);结果,u8g.drawStr(76,24,温度);结果,u8g.drawStr(108,24,“的 260 C“);
}
void loop(void){
//图片循环
u8g.firstPage();
do {
draw();
} while(u8g.nextPage());
//延迟一段时间后重建图片
延迟(1000);
有一些棘手的问题代码中的点。
我把它们放在粗体中。
1)因为内部Atmega ADC使用电源电压作为参考来测量模拟电压电位,这不是比率指标电源电压,但由传感器芯片固定,如果电源电压变化,可能会发生错误。粗略的计算表明,50mV的电源变化会引起1度的温度误差。提高精度的解决方案是按应使用的方式测量Arduino板上的确切电源电压-如果您打算使用USB提供的Arduino温度计,则必须测量这种情况下的板子电源电压。如果您打算将温度计用作AC/DC适配器提供的独立设备 - 那么,在这种情况下应测量电路板+屏蔽的电源电压。在我的情况下,设备由USB供电,我在“5V”Arduino引脚上测得4.91V。所以我把这个值放在草图中。
2)很高兴在LCD上你可以看到度数“°”符号。这里的问题是不同的显示器具有不同的ASCII表,并且难以说出对应于该符号的八进制数究竟是什么。有两种可能的解决方案:
A )如果有任何ASCII表,则读取LCD模块/驱动程序的数据表
B )编写草图以显示写在LCD ROM中的整个ASCII表,查看符号出现的位置并计算/查看与之对应的十进制数。进一步将此值转换为八进制数并放入草图。
我使用了第二种方法。..。..并且以最简单的方式:-) - 库中有“示例”u8glib。程序“ GraphicsTest”将打印存储在驱动器芯片ROM中的两个ASCII表。在那里,我发现所需的符号具有260个八进制等效数字。
想要在Arduino Due上实现此项目的家伙,我建议在代码中也插入以下行:
analogReadResolution(12);
在设置过程中,然后在1.024上除以4.096除。
步骤4:
整个设备组装,编程并运行:
PS该项目继续。..
步骤5:其他工作
在几周前,我决定在此防护罩中实现其他功能。这些功能必须是:LCD上显示的当前时间和日期。为此,我从ebay购买了RTC模块。 (如图所示)。该模块不是很精确,必须不时调整。另一个解决方案是尝试用更好的石英晶体进行更换。
步骤6:进行屏蔽修改
能够插入RTC我已通过以下方式修改了屏蔽:我焊接了4针母接头,并将其连接到正确的信号。
SCL RTC引脚与屏蔽/引脚21相连。 arduino
分别将SDA与#20引脚相连
别忘了连接GND和Vcc引脚。
步骤7:代码。..
以前的代码已修改为:
/*
基于Maxims DS600u +芯片+ RTC的温度计
*/
#include“ U8glib.h”
#include
#include
# include
int rtc [7];
float supply = 4.91;//这里必须输入arduino板的测量电源电压
//读取传感器输出电压
char hours [2];
char minutes [2];
char seconds [2] ;
char天[2];
char months [2];
char years [4];
U8GLIB_ST7920_128X64_4X u8g(8,9,10,11,4,5,6,7, 18、17、16);//8Bit Com:D0..D7:8,9,10,11,4,5,6,7 en = 18,di = 17,rw = 16
void u8g_prepare(void){
u8g。 setFont(u8g_font_6x10);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
}
void setup(void){
序列号。 begin(9600);
//翻转屏幕,如果需要的话
//u8g.setRot180();
//指定默认颜色值
if(u8g.getMode()== U8G_MODE_R3G3B2)
u8g.setColorIndex(255);//white
else if(u8g.getMode()== U8G_MODE_GRAY2BIT)
u8g.setColorIndex(3);//最大强度
否则if(u8g.getMode()== U8G_MODE_BW)
u8g.setColorIndex(1);//像素在
//u8g.setContrast(0x30);
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
u8g_prepare();
}
void draw(void){ u8g.drawFrame(0,0,127,63);
u8g.drawFrame(13,7,103,21);
u8g.drawBox(15,9,99,17);
RTC.get(rtc,true); u8g.setColorIndex(0);
dtostrf(rtc [2],2,0,hours);
if(rtc [2] 《10 )结果{结果u8g.drawStr(26,14, “0”);结果,},点击u8g.drawStr(26,14,小时);结果,dtostrf(RTC [1],2 ,0,minutes);
u8g.drawStr(45,14,“:”);
if(rtc [1] 《10)
{
u8g.drawStr(58,14,“ 0“ );结果,},点击u8g.drawStr(58,14,分钟);结果,dtostrf(RTC [0],2,0,秒);结果,u8g.drawStr(78,14, “:”);
if(rtc [0] 《10)
{
u8g.drawStr(91,14,“ 0”);
}
u8g.drawStr(91, 14秒);
u8g.setColorIndex(1);
switch(rtc [3])
{
情况1:u8g.drawStr(4,33,“ Sunday”);休息;
案例2:u8g.drawStr(4,33,“星期一”);休息;
案例3:u8g.drawStr(4,33,“星期二”);休息;
案例4:u8g.drawStr(4,33,“星期三”);休息;
案例5:u8g.drawStr(4,33,“星期四”);休息;
案例6:u8g.drawStr(4,33,“星期五”);休息;
案例7:u8g.drawStr(4,33,“星期六”); break;
}
dtostrf(rtc [4],2,0,days);
if(rtc [4] 《10)
{ u8g.drawStr(64,33, “0”);结果,},点击u8g.drawStr(64,33,天);结果,u8g.drawStr(75,33, “”);结果,dtostrf(RTC [5],2 ,0,months);
if(rtc [5] 《10)
{
u8g.drawStr(80,33,“ 0”);
}
u8g.drawStr(80 ,33,月);结果,u8g.drawStr(90,33, “”);结果,dtostrf(RTC [6],4,0,岁);结果,u8g.drawStr(96,33,年);
int读数= AnalogRead(0);
浮点v_out =(读数*供给)/1.024;
//在LCD上显示温度
浮点温度=(v_out-509)/6.45;
char temp [5]; dtostrf(temperature,5,1,temp);
u8g.drawStr(4,48,“ Temperature:”);
u8g.drawStr( 76,48,temp);
u8g.drawStr(108,48,“ 260C”);
void loop(void){
//图片循环
u8g.firstPage();
做{
draw();
} while(u8g.nextPage());
//延迟一段时间后重建图片
delay( 1000);
}
如您所见,此代码需要库DS1307。我已附上该库,以帮助您解决由于可用的DS1307库不同而引起的混乱。
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !