雷竞技注册
项目

基于atmega328的数据采集系统

2015年10月18日通过Jens Christoffersen

在这篇文章中,我将向你展示如何使用ATMega 328P微控制器的内部EEPROM。我将使用一个usb到串行转换器,和一个LM35温度传感器。我也会给你一些设计PCB时的提示和技巧。

在这篇文章中,我将向你展示如何使用ATMega 328P微控制器的内部EEPROM。我将使用一个usb到串行转换器,和一个LM35温度传感器。我也会给你一些设计PCB时的提示和技巧。

需求

你可以在这个项目中使用Arduino,虽然我将自己设计和制作PCB。为我的微控制器编程,我使用上面列出的程序员。

介绍

有了这篇文章,你就可以找到LM35温度传感器所接触的表面的露点。LM35是一种线性温度传感器,有不同的封装。在本文中,我使用TO-92格式。

该电路将从两个不同的传感器测量数据,并将它们存储在内存中。当我把设备连接到计算机上时,我就可以提取数据,将其保存到一个文件中,导入LibreOffice Calc或Microsoft Excel中,并做出一个漂亮的湿度-温度图。有了这样的数据,我就能找到感兴趣的东西的露点,它恰好是一块表面像镜子一样的塑料。

本文使用的微控制器是ATMega328P-PU。它有1kbyte的EEPROM大小。EEPROM是电可擦可编程只读存储器的缩写。这是一种非易失性存储器,用于在断电时存储少量数据。数据可以全部来自配置、校准,或者在本例中是湿度和温度。的数据表ATmega48A/PA/88A/PA/168A/PA/328/P包含256/512/512/1Kbytes的数据EEPROM内存。它被组织为一个单独的数据空间,在其中可以读取和写入单个字节。EEPROM具有至少100,000个写/擦除周期的持久性。”(Pg 20。第8.4段)将存储的字节是相对湿度和温度。该微控制器有一个DHT11传感器,一个LM35和一个usb转串行适配器连接到它。

DHT11为相对温湿度传感器。湿度以百分数表示,温度以摄氏度表示。是另一篇使用DHT11传感器的文章。它的工作电压为3.5-5.5v DC。

LM35是一种精密的摄氏温度传感器。输出与摄氏温度成线性关系。10.0 mV /0C的比例因子。如果mV以10增加,则度以1增加0C.它工作在5-30v DC。

为了将电路连接到计算机,我使用了usb到串行转换器。我有一个现成的模块,基于Silabs CD2102芯片。该模块是微控制器USART RX/TX和计算机USB端口之间的链接。

硬件

首先,我会做一个框图来结构我的工作,有一个更好的理解我想要什么和我如何想要它。

我需要:

  • 一种单片机> AVR MKII ISP的编程方法
  • 一种开始日志记录的方式-> start logging
  • 一种将EEPROM数据发送到PC的方法->发送EEPROM数据
  • 一种测量摄氏温度的方法——> LM35
  • 一种测量湿度和空气温度的方法——> DHT11
  • 一种查看正在发生什么-> led的方法
  • 一种将电路连接到PC -> usb到串口的方法

原理图

当我制作一个原型时,我有一个习惯,就是把所有未使用的微控制器引脚连接到一个测试板上。这样,如果我需要添加另一个传感器,按钮或LED,我可以编辑软件和使用已经放置的pad。我不需要再做一个PCB。正确构建硬件并按预期工作是非常重要的。记住:“先有硬件,然后才有软件。”当我开始一个新的项目和一个原理图时,我总是从输入电源开始。然后我查阅了框图,并根据块的需要添加组件。随着我的工作,我使用EagleCADs ERC。电气规则检查。这将检查pad是否未连接,以及每个组件是否有有效的名称和值。 Use the ERC frequently; it is a great tool. Pay attention to pin 1 on JP7. My USB-to-serial converters pin 1 is 3.3v. That is why this is not connected to anything. I use 5 volts on the circuit. Do not forget to add mounting holes for the circuit.

部分列表

下图是Eagle的截图。

设计印刷电路板

当原理图设计好并考虑了ERC的所有误差后,就到了设计PCB的时候了。如果PCB必须有一定的尺寸,我移动PCB的轮廓在EagleCAD的板,所以尺寸是正确的。我调整轮廓的厚度为0.2毫米。当切割PCB时,这给出了一条像样的切割线。然后我将所有组件放置在矩形内,并将连接器移动到边缘。在这里,我也从输入功率开始,并通过我的方式通过组件。当所有的组件都放置好后,我点击鼠网按钮。这将重新安排未路由的轨迹,以便它们拥有连接之间的最短路径。如果我把这个分量移到这里,然后把那个分量放在这里来缩短轨迹,我这样做。所以,当组件被放置,轨迹尽可能短,我做一个新的矩形沿外缘,用多边形工具。 I name this polygon GND. When I hit the ratsnet button again, I have made a copper pour and connected it to GND. I try to have most of the traces on the bottom side of the PCB, but sometimes it cannot be done. Then I use a via and trace on the top layer, and use another via to get to the bottom side again. In this PCB, I have one wire on the top side. I have found that if I use a trace size of 0.4mm and have a 0.4mm clearance space, I can make pretty good PCBs with the toner transfer method. I think my next move is not a favorite to all, but I use the autoroute-tool. When the autoroute tool is finished, I go over each trace, and change most of the corners and elbows to 45o度。这可能需要几个小时,通常不止一个晚上。有些人认为这是一种艺术。我必须承认,一个精心设计的PCB是赏心悦目的。

在EagleCAD Board中,有一个叫做DRC(设计规则检查)的工具。此工具检查空间和组件的位置。例如,如果两个组件太接近,您将得到通知。

在我对PCB设计满意后,我打印出底层在光滑的复印纸上,并熨烫它到PCB。对结果来说非常重要的一件事是正确地清洗PCB。当我清洁我的,我首先使用一些细网格砂纸。的P500从3米是完美的。然后滴一滴护肤霜,最后用热水冲洗肥皂。

我在氯化铁中蚀刻,我没有在我的工具附近的蚀刻剂。这些烟雾对工具不好。

当PCB被蚀刻和打孔时,我会用DMM或带有额外放大镜的网络摄像头检查短裤。对于DMM,我使用连续/二极管设置,并将黑色探头放在GND上,然后我用红色探头周围的信号痕迹。如果没有短路,我焊接跳线,并检查他们与DMM。

下一步是开始输入电源,电容器和稳压器。检查是否有短路或焊点,然后接通电源。当通电时,我测量电压,并反复检查正确的电压是否在正确的位置。如果没有,我就后退两步,开始检查短裤。如果一切顺利,我将转向IC插座和其他组件。

当一切都焊接好,看起来不错,我连接程序员到isp头和电源电路。

软件

这个程序很容易理解,但是我要解释一些事情。为了使用DHT11传感器,我需要导入DHT库。你可以在下面的链接中找到它。解压并移动到Arduino库文件夹。必须重新启动Arduino IDE, IDE才能使用这个库。SPI和EEPROM库是随安装一起提供的标准库。

在setup()函数中,我有一行代码:analogReference(EXTERNAL)。这条线告诉微控制器在哪里找到LM35传感器的参考电压。我有几个选择;DEFAULT, INTERNAL, EXTERNAL INTERNAL1V1和INTERNAL2V56:

  • 默认,Arduino板上的默认模拟参考为5伏或3.3伏。
  • 内部,内置参考,等于ATmega168或ATmega328上的1.1伏和ATmega8上的2.56伏(Arduino Mega上不可用)
  • 外部,施加到AREF引脚上的电压。(0至5伏)用作参考
  • INTERNAL1V1和INTERNAL2V56只适用于Arduino Mega board

由于电压应用到AREF引脚,是5伏调节通过电容器和一个稳压器,我正在使用。

为了存储从DHT11和LM35接收到的字节,我使用EEPROM.write()命令。这个命令有两个变量。要存储的EEPROM地址和字节。第一次运行getDHTValues()时,addr被设置为0(零)。在第一个EEPROM.write()之后,addr增加1:这告诉程序,下一次调用EEPROM.write()时,它将把数据写入下一个地址位置。您可以将EEPROM看作是一个范围从0到1023的表。

该程序每15次读取传感器。分钟。

…一个要带走的盒子……

现在,当我有PCB制造,并成功编程它,是时候找到一些东西把它周围。我用这个FreeCAD和一台3D打印机。FreeCAD就是这样;免费的CAD工具。FreeCAD有一个陡峭的学习曲线,但是当你开始理解它是如何工作的,你可以用它构造几乎任何东西,包括将你的模型导出到STL。

这些是盒子的墙。顶部和底部是扁平的正方形。

对我的新设计很满意,我将模型导出为一个STL文件,并将其导入看台。Cura是我最喜欢的切片程序。

我要对盒子的顶部和底部做同样的事情。

现在怎么办呢?

硬件在工作,软件在工作,电路在一个漂亮的盒子里。现在是时候使用它了。电源开关为拨动开关。红色按钮擦除EEPROM,并开始记录和存储数据。绿色按钮将EEPROM中的数据发送到计算机。当我按下红色按钮开始记录时,EEPROM首先被擦除,然后开始记录。如果在我关闭EEPROM之前,EEPROM已满,则绿色LED将被关闭。然后是将数据传输到计算机的时候了。为此,您需要一个串行程序,如Putty、hyperTerm或gtk-Term,就像我在这里使用的一样。

当logger连接到PC上时,使用9600-8-N-1作为设置,按下绿色按钮。不要按红色按钮,这会擦除EEPROM并开始记录,记得吗?您将看到一些数据在屏幕上运行。这是存储在EEPROM中的数据。保存为一个文件,我使用file ->保存RAW文件。在hyperTerm中,它是Transfer ->捕获文本。现在我的电脑里有一个文件,里面有这些数据。这个文件是分号分隔的,很容易导入到Excel或LibreOffice Calc。我保存它的CSV文件扩展名。当我在LibreOffice Calc中打开文件时,导入向导会自动启动。

当数据被导入时,它看起来像这样:

你有一个标题;时间,嗡嗡声,温度和可选。“时间”列为空。在这里,我输入日志记录开始的时间,并在最后一行增加15分钟。如果日志记录在21:00开始。我在A2单元格中写上21:00,在A3单元格中写上21:15,然后用鼠标选择A2:A3,点击并按住右下角的小方块,然后向下拖动。然后时间列将以15分钟的步骤填充时间。

使用LibreOffice Calc中的工具,根据列中的数据插入一个条形图:

有了这个数据,我就可以找到连接在LM35温度传感器上的物体的露点。为了看看这个物体是否在露点附近,我用这个表格。首先我在左边一列找到合适的温度。把手指放在上面,我找到了最接近的湿度值。然后我把第一个手指移到左边,另一个向下。当它们相遇时,我已经发现了物体的露点。如果该值接近我的条形图或表格中的值,对象是在露的危险。

下载

DHT11库,源代码,EagleCAD文件和STL文件用于3D打印的一个附件。

结论

这是一篇很长的文章,也是一个完整的项目。这个项目的主要目标是制造一种能够记录湿度和温度的设备。然后该设备将数据存储在内部的EEPROM中,并使数据可被计算机检索。通过将数据导入到LibreOffice Calc或Microsoft Excel中,我可以看到一个对象是否有被露水覆盖的危险。

LM35线和电源线只连接焊锡。您必须小心操作设备,或机械地固定电线。在盒子里面打一个结,打得松一点。

该设备的下一个版本可能包括RTC模块。

图片和视频

自己试试这个项目吧!BOM。