相关项目已经上传到个人博客项目中,供学习使用
代码资源链接如下:https://download.csdn.net/download/qq_41662881/12917318

关键词

  1. OLED显示
  2. RXTX、IIC通信
  3. 数据库连接存储
  4. 实时检测(1s/次)
  5. 数据分析
  6. 任意温湿度上下限报警
  7. Arduino u8glib、DHT库使用

该设计研究数字电子温度计的设计与实现,并采用javaRXTX实时传输数据到数据库中,使得数据分析成为可能,让我们的温湿度数字化更加具体可行。
采用IIC的通信方式将数据显示在OLED数码显示器上,随着技术的发展,一些环境比较恶劣的场合中也能觉得数字温度计的踪迹,在本设计中,主要从功能组合,硬件组合,软件算法等几个方面探讨温度计的设计。数字温度计在现代测温应用方面具有诸多优势,值得进一步学习和研究.

系统概述

系统的结构
本设计使用DHT11传感器作为功能实现的主要数据采集方,通过Arduino作为下位机读取转换数据并显示到OLED屏上,并通过RXTX进行串口通讯,将数据实时采集到上位机电脑数据库中,以实现数据的监测读取存储,使得后面对温湿度数据的数据分析变得方便简单。

总结构:

DHT11模块:
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。

DHT11设计原理:

DHT11由电阻式感湿元件和NTC测阻元件组成进行测量后,传输到微控制单元(MCU)进行转换(被测量转换由OTP存储器写入的固定的电阻值-电量值相应转变程序完成)然后传输到DATA口输出到单片机进行显示。
其中,电阻式感湿元件原理:电阻式湿度传感器是利用湿敏元件的电气特性,随湿度的变化而变化的原理进行湿度测量的传感器,湿敏元件一般是在绝缘物上浸渍吸湿性物质,或通过蒸发、涂覆等工艺之隔一层金属、半导体、高分子薄膜和粉末状颗粒而制作的,在湿敏元件的吸湿和脱湿过程中,水分子分解出的离子H+的传导状态发生变化, 从而使元件的电阻值随湿度而变化。
与环境相对湿度(RH)和环境温度(t)之间,呈现指数函数关系 ,公式可表示为R=Roexpα(Φ-Φ0)-Rtexpβ(t-t0) Ro为起始电阻,α为湿度常数,Rt为起始电阻,β为温度常数。
NTC测阻元件原理:NTC是Negative Temperature Coefficient 的缩写,意思是负的温度系数,泛指负温度系数很大的半导体材料或元器件,所谓NTC热敏电阻器就是负温度系数热敏电阻器。它是以锰、钴、镍和铜等金属氧化物为主要材料,采用陶瓷工艺制造而成的。这些金属氧化物材料都具有半导体性质,因为在导电方式上完全类似锗、硅等半导体材料。温度低时,这些氧化物材料的载流子(电子和孔穴)数目少,所以其电阻值较高;随着温度的升高,载流子数目增加,所以电阻值降低。
热敏电阻的电阻-温度特性可近似地用式1表示。
(式1) R=Ro exp {B(I/T-I/To)}
R : 温度T(K)时的电阻值
Ro : 温度T0(K)时的电阻值
B : B 值
*T(K)= t(ºC)+273.15为官方给出的温度-被测量转换公式。

接入系统后,因dht11为应变式传感器,故在2脚加入稳定的Vcc电源3~5V并用电阻减小电量输入已达到不干扰DATA数据输入的测量值正确性又可提供稳定电源的前提下将被传输过来的物理量转换为需要显示的数据。

串行接口 (单线双向)
DATA 用于单片机与 DHT11之间的通讯和同步
采用单总线数据格式
一次通讯时间4ms左右
数据分小数部分和整数部分,当前小数部分用于以后扩展,现读出为零。
数据传输格式:
一次完整的数据传输为40bit,高位先出。
数据格式:
8bit湿度整数数据 + 8bit湿度小数数据 + 8bit 温度整数数据 + 8bit温度小数数据 + 8bit校验和

传输方式:

总线空闲状态为高电平
需采集数据时,主机把总线拉低等待DHT11响应(须大于18毫秒,保证DHT11能检测到起始信号。)
DHT11接收到主机的开始信号后,等待主机开始信号结束。
主机发送开始信号结束后,转为输入模式(即拉高电平)延时等待20-40us。
主机读取DHT11的响应信号,若总线处于低电平,表示DHT11开始响应。
DHT11开始响应80us后拉高总线80us
然后开始传输0_1信号
接线口:

系统硬件设计:

系统上位机设计:

系统的功能

通过DHT11采集数据到Arduino后实时显示到OLED屏上以进行实时查看,然后将数据通过RXTX上传到PC端后使用JDBC存储数据到数据库中,以通过Origin软件或者Excel做成数据表可以进行数据分析,进而对直接所处环境温湿度进行改进至自己适合的温度。
开发环境

  1. Arduino:作为下位机负责数据采集显示以及串口上传。
    (1) Arduino.U8glib:用于SSD1306 128x64 OLED屏的字符变量显示以及与屏幕间的IIC通信
    (2) Arduino.DHT:用于DHT11采集数据的通用库
  2. Eclipse(java):作为上位机负责数据收集整理存储入数据库。
    (1) Java.RXTX:RXTX.jar用于串口通讯,将Arduino的数据传输到串口中上传到java程序中。
    (2) Java.JDBC:JDBC.jar用于连接java端数据与数据库端的存储。
  3. MySql:用于存储温湿度采集数据。

传感器技术

DHT11传感器模块:
DHT11设计原理:

DHT11由电阻式感湿元件和NTC测阻元件组成进行测量后,传输到微控制单元(MCU)进行转换(被测量转换由OTP存储器写入的固定的电阻值-电量值相应转变程序完成)然后传输到DATA口输出到单片机进行显示。
电阻式感湿元件原理:电阻式湿度传感器是利用湿敏元件的电气特性,随湿度的变化而变化的原理进行湿度测量的传感器,湿敏元件一般是在绝缘物上浸渍吸湿性物质,或通过蒸发、涂覆等工艺之隔一层金属、半导体、高分子薄膜和粉末状颗粒而制作的,在湿敏元件的吸湿和脱湿过程中,水分子分解出的离子H+的传导状态发生变化, 从而使元件的电阻值随湿度而变化。
与环境相对湿度(RH)和环境温度(t)之间,呈现指数函数关系 ,公式可表示为R=Roexpα(Φ-Φ0)-Rtexpβ(t-t0) Ro为起始电阻,α为湿度常数,Rt为起始电阻,β为温度常数。
NTC测阻元件原理:NTC是Negative Temperature Coefficient 的缩写,意思是负的温度系数,泛指负温度系数很大的半导体材料或元器件,所谓NTC热敏电阻器就是负温度系数热敏电阻器。它是以锰、钴、镍和铜等金属氧化物为主要材料,采用陶瓷工艺制造而成的。这些金属氧化物材料都具有半导体性质,因为在导电方式上完全类似锗、硅等半导体材料。温度低时,这些氧化物材料的载流子(电子和孔穴)数目少,所以其电阻值较高;随着温度的升高,载流子数目增加,所以电阻值降低。
热敏电阻的电阻-温度特性可近似地用式1表示。
(式1) R=Ro exp {B(I/T-I/To)} R : 温度T(K)时的电阻值 Ro : 温度T0(K)时的电阻值 B : B 值
*T(K)= t(ºC)+273.15为官方给出的温度-被测量转换公式。

接入系统后,因dht11为应变式传感器,故在2脚加入稳定的Vcc电源3~5V并用电阻减小电量输入已达到不干扰DATA数据输入的测量值正确性又可提供稳定电源的前提下将被传输过来的物理量转换为需要显示的数据。

该段代码用于对采集到的数据进行转换以实现输出数据;

Arduino端的数据接收,用于分离转换成2个数组后的温度和湿度;最后一句用于设定蜂鸣器报警的上下限。

Arduino有内部的lCD/LED屏幕库u8glib,使用IIC/SPI通信使得数据变量能够显示在屏幕上。

用于启动IIC通信

用于点亮屏幕的128x64数码管

该函数用于数据显示的位置定位以及数据传输

使用Arduino启动OLED屏时需要do…while…函数方可进行数据显示

其它相关技术

IIC通信:

RXTX通信:

为java提供的rxtx数据连接dll文件;

调用RXTX.jar包用于打开关闭指定串口;

用于显示所有可打开的串口

用于打开指定的串口

用于设置串口通信的信息

用于进行通信,将串口得到的数据进行转换为可识别的GBK基本显示标准后读取显示于上层软件端。

用于事件触发监听打开串口

用于转码显示串口读到的信息并转化成字符串赋值给t显示出来

用于获取数据采集时候的系统时间并计入数据库中,以达到实时计入效果

JDBC通信:
DBUtil.java用于JDBC编程调用MySql数据库增删改查数据

用于设定基础的数据库连接信息,调用驱动

用于查询操作

用于增删查改操作

该系统中使用 语句将数据传输入数据库,其中使用 将传输过来的温度湿度

使用split函数分离成2个数组后分别存放。

硬件实现

OLED接线:A5SCL
A4SDA
VCC3.3V
GNDReset/GND

DHT11接线:DATD2
GNDGND
VCC3.3V
蜂鸣器接线:SD6
GNDGND
VCC3.3V

Arduino代码实现

#include <dht11.h>
#include <U8glib.h>U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);  // I2C / TWI
//U8GLIB_SSD1306_128X64 u8g(10, 9);
dht11 DHT11;
#define DHT11PIN 2//float temp=0;//温度显示void setup() {//tempSerial.begin(9600);//Serial.println("begin!");//!pinMode(6,OUTPUT);//oled显示if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {u8g.setColorIndex(255);     // white}else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {u8g.setColorIndex(3);         // max intensity}else if ( u8g.getMode() == U8G_MODE_BW ) {u8g.setColorIndex(1);         // pixel on}else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {u8g.setHiColorByRGB(255,255,255);}}void draw(void) {u8g.setFont(u8g_font_8x13);u8g.setPrintPos(0,20);u8g.print("HUMI(%):");u8g.setPrintPos(73,20);u8g.print((float)DHT11.humidity);u8g.setPrintPos(0,40);u8g.print("TEMP(℃):");u8g.setPrintPos(73,40);u8g.print((float)DHT11.temperature);
}void sound(){for(int i=500;i<600;i++){digitalWrite(6,HIGH);delay(5);}digitalWrite(6,LOW);
}void loop() {//temp//Serial.println("\n");int chk=DHT11.read(DHT11PIN);//Serial.print("Humidity (%): ");Serial.print((float)DHT11.humidity, 2);Serial.print("\t");//Serial.print("Temperature (oC): ");Serial.print((float)DHT11.temperature, 2);if(((float)DHT11.humidity>=94)&&((float)DHT11.temperature>=30)){sound();}//oledu8g.firstPage();  do {draw();} while( u8g.nextPage() );delay(1000); }

JAVA软件代码

//OpenerAndCloser.java
package com.serialPort.writer;import java.util.Enumeration;import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;/*** 该类实现3个功能* 1.列举出本地所有的串口;* 2.打开所有串口(但是未向串口中写数据);* 3.关闭打开的串口。*/
public class OpenerAndCloser {public static void main(String[] args){//1.获取本地所有的端口并输出其名称://1.1.用于标识端口的变量CommPortIdentifier portIdentifier = null;//1.2.记录所有端口的变量Enumeration<?> allPorts = CommPortIdentifier.getPortIdentifiers();//1.3.输出每一个端口while(allPorts.hasMoreElements()){portIdentifier = (CommPortIdentifier) allPorts.nextElement();System.out.println("串口:" + portIdentifier.getName());}//2.打开COM3和COM21端口//2.1.获取两个端口CommPortIdentifier com3 = null;try {com3 = CommPortIdentifier.getPortIdentifier("COM3");} catch (NoSuchPortException e) {// TODO Auto-generated catch blocke.printStackTrace();}//2.2.打开两个端口,但是什么都没干SerialPort serialCom3 = null;try {//open方法的第1个参数表示串口被打开后的所有者名称,//第2个参数表示如果串口被占用的时候本程序的最长等待时间,以毫秒为单位。serialCom3 = (SerialPort)com3.open("OpenerAndCloser", 1000);} catch (PortInUseException e) {//要打开的端口被占用时抛出该异常e.printStackTrace();}//2.3.设置两个端口的参数try {serialCom3.setSerialPortParams(9600, //波特率SerialPort.DATABITS_8,//数据位数SerialPort.STOPBITS_1,//停止位SerialPort.PARITY_NONE//奇偶位);} catch (UnsupportedCommOperationException e) {e.printStackTrace();}//3.关闭COM3和COM21端口//关闭端口的方法在SerialPort类中serialCom3.close();}
}
//Com3EventListener.java
package com.serialPort.writer;
import java.awt.HeadlessException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TooManyListenersException;import javax.swing.JOptionPane;import db.DBUtil;
import src.a;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
@SuppressWarnings("unused")
public class Com3EventListener implements SerialPortEventListener {public static String t0;public static String t1;//1.定义变量CommPortIdentifier com3 = null;//未打卡的端口SerialPort serialCom3 = null;//打开的端口InputStream inputStream = null;//输入流//2.构造函数://实现初始化动作:获取串口COM3、打开串口、获取串口输入流对象、为串口添加事件监听对象public Com3EventListener(){try {//获取串口、打开窗串口、获取串口的输入流。com3 = CommPortIdentifier.getPortIdentifier("COM3");serialCom3 = (SerialPort) com3.open("Com3EventListener", 1000);inputStream = serialCom3.getInputStream();//向串口添加事件监听对象。serialCom3.addEventListener(this);//设置当端口有可用数据时触发事件,此设置必不可少。serialCom3.notifyOnDataAvailable(true);} catch (NoSuchPortException e) {e.printStackTrace();} catch (PortInUseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (TooManyListenersException e) {e.printStackTrace();}}//重写继承的监听器方法@Overridepublic void serialEvent(SerialPortEvent event) {//定义用于缓存读入数据的数组byte[] cache = new byte[1023];//记录已经到达串口COM3且未被读取的数据的字节(Byte)数。int availableBytes = 0;//如果是数据可用的时间发送,则进行数据的读写if(event.getEventType() == SerialPortEvent.DATA_AVAILABLE){try {availableBytes = inputStream.available();while(availableBytes > 0){inputStream.read(cache);String t="";for(int i = 0; i < cache.length && i < availableBytes; i++){//解码并输出数据t=t+String.valueOf((char)cache[i]);t = t.replaceAll("\r|\n", "");//  GUI.txtUser.setText("1");}//System.out.print(t);DBUtil db=new DBUtil();Connection conn=null;try {conn=db.getConnection();} catch (ClassNotFoundException e3) {// TODO 自动生成的 catch 块e3.printStackTrace();} catch (SQLException e3) {// TODO 自动生成的 catch 块e3.printStackTrace();} catch (InstantiationException e3) {// TODO 自动生成的 catch 块e3.printStackTrace();} catch (IllegalAccessException e3) {// TODO 自动生成的 catch 块e3.printStackTrace();}Statement stmt = null;try {stmt = conn.createStatement();} catch (SQLException e2) {// TODO 自动生成的 catch 块e2.printStackTrace();}SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式//*************************储存数据库***************************String [] temp;temp=t.split("\t");t0=temp[0];t1=temp[1];System.out.println(t0);System.out.println(df.format(new Date()));// new Date()为获取当前系统时间String tempsql="insert into t(humi,temp,time) values('"+t0+"','"+t1+"','"+df.format(new Date())+"')";System.out.println("SQL:"+tempsql);int addtest=0;try {addtest=stmt.executeUpdate(tempsql);} catch (SQLException e1) {// TODO 自动生成的 catch 块e1.printStackTrace();} a.timeshow.setText(df.format(new Date()));a.ttext.setText(temp[1]);a.htext.setText(temp[0]);availableBytes = inputStream.available();}System.out.println();} catch (IOException e) {e.printStackTrace();}}}//在main方法中创建类的实例public static void main(String[] args) {new Com3EventListener();}
}

功能使用



Arduino通过RXTX联通JAVA实现数字温度计案例相关推荐

  1. 基于单片机的数字温度计设计

    文末下载完整资料                   基于单片机的数字温度计 摘要:本文介绍一种基于AT89C2051单片机的一种温度测量及报警电路,该电路采用DS18B20作为温度监测元件,测量范围 ...

  2. 二进制、八进制、十六进制和十进制的相互转换,原码反码补码计算以及Java中数字的存储

    1. Java中数字默认是十进制,二进制.八进制以及十六进制的表示如下 2. 二进制.八进制.十六进制和十进制的相互转换 2.1 为了不累赘描述,本文以百度的二进制小数转换为十进制小数为例,如下图 2 ...

  3. java 分裂数字_分裂的补充:超越数字,打印物理可视化

    java 分裂数字 As noted in my earlier Nightingale writings, color harmony is the process of choosing colo ...

  4. 【51单片机快速入门指南】6.3:DS18B20 单总线数字温度计的多路读取

    目录 硬知识 DS18B20介绍 时序 初始化时序 写时序 读时序 命令 ROM 操作命令 ROM 搜索举例 存贮器操作命令 示例程序 DS18B20.c DS18B20.h 测试程序 定时器中断服务 ...

  5. 猜物品游戏java编程_小猿圈Java初学者练习小案例:猜数字游戏

    对于Java初学者,如果没有好的引导,可能会觉得自己学什么都不好,学什么都不会,这个时候就要给他们一下小的案例,让他们去实践一下,让他们知道自己学的东西是可以用到的,小猿圈java讲师为你准备了Jav ...

  6. 51单片机c语言教程温度计,单片机课程设计-数字温度计.doc

    武 夷 学 院 课程设计报告 课程名称: 单片机及嵌入式技术 设计题目: 数字温度计 学生班级: 13计算机科学与技术(1)班 学生姓名: 陈圣盛.周鹏飞.刘犇 指导教师: 焦金涛 完成日期: 201 ...

  7. java 后台跳出提示_小猿圈Java初学者练习小案例:猜数字游戏

    对于Java初学者,如果没有好的引导,可能会觉得自己学什么都不好,学什么都不会,这个时候就要给他们一下小的案例,让他们去实践一下,让他们知道自己学的东西是可以用到的,小猿圈java讲师为你准备了Jav ...

  8. 单总线和i2c总线结合实现数字温度计的设计c语言程序,1《单片机原理应用》课程设计指导书2010-6-8.doc...

    1<单片机原理应用>课程设计指导书2010-6-8 <单片机原理与应用>课程设计指导书 一.课程设计的基本任务 本课程设计的基本要求是使学生熟悉掌握MCS-51系列单片机的编程 ...

  9. java 判断数字_如何在java中判断一个字符串是否是数字

    前言 数字在某些领域经常用字符串来进行表示和传递.那么我们如何判断一个字符串是否是数字呢?今天我们来探讨一下这个话题. 空字符和null 首先我们可以很清晰的知道空字符""和nul ...

最新文章

  1. go语言的iota是什么意思_关于Golang中的iota
  2. python xlsxwriter合并单元格_Python使用xlsxwriter导出表格并合并单元格
  3. 前端学习(2860):简单秒杀系统学习之前端优化
  4. 【转】CT基本概念(必须掌握)!!!!!!!!!!!!!!
  5. 【HihoCoder - 1851】D级上司 (树形图,dfs)
  6. 一个数的二进制中有多少个1
  7. cactiez v11使用配置mysql_cactiez应用监控部署手册.doc
  8. 计算机组成原理—cpu于主存的连接(例题)
  9. 移动通信matlab实现,现代移动通信中的调制技术研究及Matlab实现
  10. c#求三角形面积周长公式_c# 求三角形周长 面积详细程序
  11. Python程序设计(第三版)约翰·策勒 编程练习课后答案(第二章)
  12. java 163邮箱发邮件_Java实现163邮箱发送邮件到QQ邮箱
  13. 带有富文本数据如何导出word文档(使用mht模板)
  14. BP神经网络及其在教学质量评价中 的应用
  15. 手把手教你搭建gitlab服务器
  16. 全差分运算放大器ADA4930的分析(1)
  17. 苹果为富士康员工加薪?
  18. spring 配置 一个类在 tomcat启动的时候调用
  19. JSP 酒店管理系统 软件工程设计 网络编程 myeclipse 编辑 mysql数据库
  20. 解决RTL8168网卡在ubuntu上网慢的问题

热门文章

  1. [二] X 名称空间
  2. 【往届四个月检索,EI会议】第二届通讯技术与信息科技国际学术会议(ICCTIT 2022)
  3. 分子动力学开源分析软件MDAnalysis安装介绍及使用
  4. 编写电话号码查询系统
  5. 人工智能导论(5)——搜索策略(Search Strategy)
  6. 无法运行rc.exe(已解决)
  7. 初级信息处理技术员access教程_初级信息处理技术员如何备考?
  8. C/C++基于朋友圈的商品推荐系统
  9. docker安装apollo
  10. #644 (Div. 3)F. Spy-string(暴力枚举)