基于Arduino的显示测量环境数据设计

基于Arduino的显示测量环境数据设计

一,设计要求

Arduino+LCD1602+超声波+温度传感器+光敏电阻+BMP180气压传感器,利用Arduino实现环境数据采集及LCD显示功能。通过超声波、温度传感器、光敏电阻以及气压传感器测量环境数据并通过编程在LCD模块中显示。在这里插入图片描述

二、系统设计

Arduino模块
Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。由一个欧洲开发团队于2005年冬季开发。其成员包括Massimo Banzi、David Cuartielles、Tom Igoe、Gianluca Martino、David Mellis和Nicholas Zambetti等。
它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。主要包含两个主要的部分:硬件部分是可以用来做电路连接的Arduino电路板;另外一个则是Arduino IDE,你的计算机中的程序开发环境主要用于arduino程序的编写和开发,拥有开放源代码的电路图设计、支持ISP在线烧,同时支持Flash、Max/Msp、VVVV、PD、C、Processing等多种程序兼容的特点。
arduino
LCD1602模块
LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、 控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD16可能有所不同,但使用方法都是一样的。为了降低成本,绝大多数制造商都直接将裸片做到板子上。本设计使用16*2字符型液晶显示模块。
在这里插入图片描述
温度传感器
LM393 是双电压比较器集成电路。输出负载电阻能衔接在可允许电源电压范围内的任何电源电压上,不受 Vcc端电压值的限制。此输出能作为一个简单的对地SPS开路(当不用负载电阻没被运用),输出部分的陷电流被可能得到的驱动和器件的β值所限制。当达到极限电流(16mA)时,输出晶体管将退出而且输出电压将很快上升,输出负载电阻能衔接在可允许电源电压范围内的任何电源电压上,不受 Vcc端电压值的限制,输出部分的陷电流被可能得到的驱动和器件的β值所限制。当达到极限电流(16mA)时,输出晶体管将退出而且输出电压将很快上升。输出饱和电压被输出晶体管大约60ohm 的γSAT限制。当负载电流很小时,输出晶体管的低失调电压(约1.0mV)允许 输出箝位在零电平。
在这里插入图片描述
2.5光敏电阻
光敏电阻是用硫化隔或硒化隔等半导体材料制成的特殊电阻 器,其工作原理是基于内光电效应。光照愈强,阻值就愈低,随着光照强度的升高,电阻值迅速降低,亮电阻值可小至1KΩ以下。光敏电阻对光线十分敏感,其在无光照时,呈高阻状态,暗电阻一般可达1.5MΩ。光敏电阻的特殊性能,随着科技的发展将得到极其广泛应用通常由光敏层、玻璃基片(或树脂防潮膜)和电极等组成。光敏电阻器在电路中用字母“R”或“RL”、“RG”表示。
在这里插入图片描述
BMP180气压传感器
BMP180是一种高精度数字压力传感器,BMP180的超低功耗,低电压电子元件经过优化,适用于移动电话,PDA,GPS导航设备和户外设备。UP =压力数据(16到19位) UT =温度数据(16位)采用标准的I2C总线传输方式。
在这里插入图片描述
超声波
HC- SR04是一种超声波接近传感器,可以告诉您物体是否在它前面,并且还提供传感器和物体之间的距离 。
在这里插入图片描述
本C-SR04由触发引脚上的10微秒高信号触发。一旦它再次拉低,模块就会发出8个40kHz的声音脉冲。如果物体存在于检测范围内,则声音脉冲被该物体反射,并且模块接收回声。发送八个脉冲和接收回波之间的时间可用于计算到反射声音的物体的距离。
根据理论布线和各个引脚分分配及安排,实际连线后结果如下:
在这里插入图片描述

三、系统测试

按照电路图将各个模块连接器来,检查引脚是否接触好,误插等情况,按照逻辑编写每个模块的功能程序,引入功能所需要的相应库文件,编译好,下载烧录到开发板上。结果如下图所示。
在这里插入图片描述
经过测试证明,基于Arduino的测量环境数据系统运行稳定可靠。系统采用温度传感器、气压传感器、光敏电阻、超声波等采集感应模块来监测环境状况,方便操作,具有巨大的推广价值。

四、遇到的问题及解决方法

1.Arduino出现上传出错的问题
解决方法:
(1)检查驱动是否安装,串口、程序是否正确 
(2)负载功率过大,导致开发板下载不了程序,先单板下载程序再安装组件调试 
(3)1.确认0和1号口没有被占用 
2.LCD显示屏上没有反应
解决方法:
(1)检查各个线路的引脚,是否连接正确
(2)检查代码逻辑功能是否出现了问题,进行逻辑优化
(3)检查器件是否工作
3. 程序编译时出现错误
解决方法:
(1)安装对应模块所需要的库
(2)查看关键字是否错误
(3)查看宏定义的内容
(4)分析逻辑功能是否正确

五、心得体会

通过本次课程设计,能够完成的测量环境数据并通过LCD显示出来,同时我对Arduino硬件开发板有了更多的理解,只要在IDE中编写程序代码,将程序上传到Arduino电路板后,连接相应外部硬件,便可以实现各种各样的功能。在小组中同时又发现了的很多不足之处,将所学知识融会贯通不是想象中那么简单,其中设计了单片机、数字电子技术、模拟电子技术、传感器以及c语言编程等知识,需要更多努力与实践。在系统中肯定存在不完善的地方,还有值得改进和优化的地方。对于程序语言的掌握不够熟练。初次完成的程序十分复杂,在很多方面联系不上,我在网上查找了很多的资料,也看了一些教学视频,来不断的完善程序。对于硬件等模块的学习也有了更深刻的了解,查阅各种器件资料,对新元件从陌生到熟悉直至灵活应用,逐步形成比较完整的体系。这种自学的方法会使我终生受益。

六,代码附录

#include <Wire.h> 
#include <LiquidCrystal_I2C.h> //引用I2C库
#include <Adafruit_BMP085.h>  
#define LM35 A0
#define Trig 8 //引脚Tring 连接 IO D8
#define Echo 9 //引脚Echo 连接 IO D9
int cm;       //距离变量float 
int val = 0;    //存放AD变量值
float temp = 0; //存放温度值的10倍

char PRESSURESHOW[4];// 初始化大小为4的字符以显示压力结果char TEMPERATURESHOW[4];// initializing a character of size 4 to display temperature result  
Adafruit_BMP085 bmp;  
//设置LCD1602设备地址,这里的地址是0x3F,一般是0x20,或者0x27, 
LiquidCrystal_I2C lcd(0x27,16,2);  
void setup()
{
  lcd.init();                  // 初始化LCD
  lcd.backlight();             //设置LCD背景等亮
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT); 
}
 void loop()
{
 // put your main code here, to run repeatedly:
// 读出当前光线强度,并输出到串口显示
int sensorValue = analogRead(A1);//温度
float volt = sensorValue * (5.0 / 1024.0);
float res=(10.0 * volt) / (5.0 - volt);
int temp = TempGet(res);//温度
int light=analogRead(A0);//光敏电阻
if(temp == -1)
{
  Serial.println(" the temperature out of range!");
}
else 
{
Serial.print(temp);
Serial.println("C");
Serial.println("light:");
Serial.println(light);
}
delay(1000);
  lcd.setCursor(0,0);              
  lcd.print("T:");    
  lcd.setCursor(2,0);                //设置显示指针
  lcd.print(temp);                  //输出字符到LCD1602上
  lcd.setCursor(4,0);
  lcd.print("C");
  lcd.setCursor(7,0);
  lcd.print("light:");
  lcd.setCursor(13,0);
  lcd.print(light);
  //delay(1000);
  //给Trig发送一个低高低的短时间脉冲,触发测距
  digitalWrite(Trig, LOW); //给Trig发送一个低电平
  delayMicroseconds(2);    //等待 2微妙
  digitalWrite(Trig,HIGH); //给Trig发送一个高电平
  delayMicroseconds(10);    //等待 10微妙
  digitalWrite(Trig, LOW); //给Trig发送一个低电平
  temp = float(pulseIn(Echo, HIGH)); //存储回波等待时间,///超声波测距
  //pulseIn函数会等待引脚变为HIGH,开始计算时间,再等待变为LOW并停止计时
  //返回脉冲的长度
  //声速是:340m/1s 换算成 34000cm / 1000000μs => 34 / 1000
  //因为发送到接收,实际是相同距离走了2回,所以要除以2
  //距离(厘米)  =  (回波时间 * (34 / 1000)) / 2
  //简化后的计算公式为 (回波时间 * 17)/ 1000
  cm = (temp * 17 )/1000; //把回波时间换算成cm
  lcd.setCursor(0,1);       //设置液晶开始显示的指针位置
  lcd.print("D:"); //液晶显示“LM35 temp =”
  lcd.setCursor(2,1);       //设置液晶开始显示的指针位置,在下一行显示
  lcd.print(cm);              //液晶显示距离
   delay(1000);              //延时1000ms
  lcd.setCursor(7, 1);
  lcd.print("P:"); // print pressure  
  String PRESSUREVALUE = String(bmp.readPressure());  
  // convert pressure reading to a char array  
   lcd.setCursor(9,1);  //PRESSUREVALUE.toCharArray(PRESSURESHOW, 4);  
   PRESSUREVALUE.toCharArray(PRESSURESHOW, 4); 
   lcd.print(PRESSURESHOW);
 lcd.setCursor(13, 1); 
  lcd.print("hPa");  
 // lcd.print("Temperature=");// print temperature  
  //String TEMPERATUREVALUE = String(bmp.readTemperature());  
   convert the reading to a char array  
  //TEMPERATUREVALUE.toCharArray(TEMPERATURESHOW, 4);  
  //lcd.print(TEMPERATURESHOW);  
  //lcd.print("C ");  
  //lcd.setCursor(0,0);/t the cursor to row and column 0, line1  
  delay(500);  
}
 温度
const float mf52_10kj[] = 
{
32.8142, 30.9966, 29.4688, 28.0251, 26.6606,
25.3704, 24.1501, 22.9955, 21.9028, 20.8682,
19.8884, 18.9602, 18.0806, 17.2467, 16.4561,
15.7061, 14.9945, 14.3191, 13.6779, 13.0690,
12.4905,11.9409, 11.4184, 10.9217, 10.4494,
10.0000,9.4724,9.1654,8.7779,8.4089,
8.0574,7.7225,7.4033,7.0990,6.8088,
6.5321,6.2680,6.0160,5.7755,5.5459,
5.3266,5.1171,4.9169,4.7257,4.5428,
4.3680,4.2008,4.0409,3.8878,3.7414,
};
int TempGet(float res) 
{
int i;
if((res > mf52_10kj[0]) || (res < mf52_10kj[49]))
return -1;
for (i=0; i<50; i++)
{
if ((res < mf52_10kj[i]) && (res > mf52_10kj[i+1]))
return i;
}
}
  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值