交流群号:245022761(IT项目交流群)

要求:设计一个小型的气象监测站,检测温湿度、大气压力、空气质量等参数,并显示在1602液晶显示屏上。

设计方案:

1、使用温湿度传感器检测温度和湿度,并在显示屏第一行上显示。

2、使用大气压传感器测量大气压,并在显示屏第二行上显示。

3、使用激光颗粒物传感器检测空气中PM2.5含量,并在显示屏第二行上显示。

设备选型:

主控中心:Arduino Mega 2560

        Arduino Mega 2560是基于ATmega2560的微控制板,有54路数字输入/输出端口(其中15个可以作为PWM输出),16路模拟输入端口,4路UART串口,16MHz的晶振,USB连接口,电池接口,ICSP头和复位按钮。简单地用USB连接电脑或者用交直流变压器就能使用。

温湿度传感器:DHT11

DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有枀高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。

引脚说明

1、VDD 供电 3.3~5.5V DC

2、DATA 串行数据,单总线

3、NC 空脚

4、GND 接地,电源负极

大气压传感器:BMP085

BMP085是德国BOSCH公司生产的一款低功耗、高精度的MEMS数字气压传感器。BMP085的供电电压为1.8 V~3.6 V,典型值为2.5 V。它由电阻式压力传感器、A/D转换器和带有E2PROM的控制单元组成,控制单元通过I2C总线与移动设备的微处理器连接。E2PROM中存储了11个校准参数,这11个校准参数涉及到参考温度下的零点漂移、零点漂移的温度系数以及灵敏度的温度系数等,用于对气压值进行温度补偿。

BMP085的气压测量范围为300hPa~1100hPa(海拔高度-500 m~9000 m),温度测量范围为-40 ℃~+85 ℃。在低功耗模式下,BMP085精度为0.06 hPa(0.5 m),在高精度模式下其精度可以达到0.03 hPa(0.25 m),转换速率可以达到128次/s,能够满足系统对速度和精度的要求。

激光颗粒物传感器:GP2Y1051AUOF

GP2Y1010AU0F是日本夏普公司开发的一款光学灰尘浓度检测传感器。此传感器内部成对脚分布的红外发光管和光电晶体管,利用光敏原理来工作。用于检测特别细微的颗粒,如香烟颗粒、细微灰尘。依靠输出脉冲的高度来判断颗粒浓度。

系统连接图:

撰写代码:

ino 文件

n#include "DHT11.h"
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,A4,A5,A6,A7);//1602
DHT11 myDHT11(2);//温湿度输出引脚
//气压传感器-------------------------
#define BMP180ADD 0x77  // I2C address of BMP180  //write is (0xEE)     read is (0xEF)
unsigned char OSS;
/**********************MSB      LSB******/
int ac1;           // 0xAA     0xAB
int ac2;           // 0xAC     0xAD
int ac3;           // 0xAE     0xAE
unsigned int ac4;  // 0xB0     0xB1
unsigned int ac5;  // 0xB2     0xB3
unsigned int ac6;  // 0xB4     0xB5
int b1;            // 0xB6     0xB7
int b2;            // 0xB8     0xB9
int mb;            // 0xBA     0xBB
int mc;            // 0xBC     0xBD
int md;            // 0xBE     0xBF
float temperature;
double pressure;
double pressure2;
long b5;
double altitude;  //PM2.5---------------------------------------------------------
#define    COV_RATIO                0.2            //ug/mmm / mv
#define    NO_DUST_VOLTAGE          400            //mv
#define    SYS_VOLTAGE              5000           //ADC参考电压
const int vout = 5;        //pm2.5输出引脚
float density, voltage;
int   adcvalue;
int Filter(int m)
{static int flag_first = 0, _buff[10], sum;const int _buff_max = 10;int i;if(flag_first == 0){flag_first = 1;for(i = 0, sum = 0; i < _buff_max; i++){_buff[i] = m;sum += _buff[i];}return m;}else{sum -= _buff[0];for(i = 0; i < (_buff_max - 1); i++){_buff[i] = _buff[i + 1];}_buff[9] = m;sum += _buff[9];i = sum / 10.0;return i;}
}
//-----------------------------------void setup(void)
{lcd.begin(16,2);    //初始化LCD1602lcd.print("Welcome to use!"); //液晶显示Welcome to use!delay(1000);      //延时1000mslcd.clear();      //液晶清屏Serial.begin(9600);   //send and receive at 9600 baudWire.begin();OSS = 2;  // Oversampling Setting           0: single    1: 2 times    2: 4 times   3: 8 times BMP180start();
}void loop(void)
{//lcd.clear();      //液晶清屏Serial.print("---------\n");delayMicroseconds(280);adcvalue = analogRead(vout); adcvalue = Filter(adcvalue);//电压voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;if(voltage >= NO_DUST_VOLTAGE){voltage -= NO_DUST_VOLTAGE;density = voltage * COV_RATIO;}elsedensity = 0;Serial.print("PM: ");Serial.print(3*density/100);Serial.print(" ug/m3\n");  lcd.setCursor(8,1);    //设置液晶开始显示的指针位置,1列,2行lcd.print("PM:"); //液晶显示lcd.print(3*density/100);delay(500);Serial.print("---------\n");myDHT11.DHT11_Read();                               //读取温湿度值Serial.print("HUMI = ");Serial.print(myDHT11.HUMI_Buffer_Int);Serial.println(" %RH");Serial.print("TMEP = ");Serial.print(myDHT11.TEM_Buffer_Int);Serial.println(" C");lcd.setCursor(0,0);    //设置液晶开始显示的指针位置,1列,2行lcd.print("T:"); //液晶显示lcd.print(myDHT11.HUMI_Buffer_Int);lcd.print((char)223);    //液晶显示“°”lcd.print("C");   //液晶显示“C”delay(500);lcd.setCursor(7,0);    //设置液晶开始显示的指针位置,1列,2行lcd.print("H:"); //液晶显示lcd.print(myDHT11.TEM_Buffer_Int);lcd.print(" %RH");   //液晶显示“C”delay(500);           //延时1sSerial.print("---------\n");calculate();show();delay(500);
}
//大气压
/** calculate centure **/
void calculate()
{temperature = bmp180GetTemperature(bmp180ReadUT());temperature = temperature*0.1;pressure = bmp180GetPressure(bmp180ReadUP());pressure2 = pressure/101325;pressure2 = pow(pressure2,0.19029496);altitude = 44330*(1-pressure2);                            //altitude = 44330*(1-(pressure/101325)^0.19029496);
}/** print reslut **/
void show()
{Serial.print("Temp: ");Serial.print(temperature, 1);                            //10 hexadecimalSerial.println(" C");Serial.print("Pressure: ");Serial.print(pressure, 0);                               //10 hexadecimalSerial.println(" Pa");Serial.print("altitude:");Serial.print(altitude);Serial.println("m");lcd.setCursor(0,1);    //设置液晶开始显示的指针位置,1列,2行lcd.print("P:"); //液晶显示lcd.print(pressure/1000.0);
}/**BMP180 satrt program**/
void BMP180start()
{                     /*MSB*/ac1 = bmp180ReadDate(0xAA);                      //get full dataac2 = bmp180ReadDate(0xAC);  ac3 = bmp180ReadDate(0xAE);  ac4 = bmp180ReadDate(0xB0);  ac5 = bmp180ReadDate(0xB2);  ac6 = bmp180ReadDate(0xB4);  b1  = bmp180ReadDate(0xB6);  b2  = bmp180ReadDate(0xB8);  mb  = bmp180ReadDate(0xBA);  mc  = bmp180ReadDate(0xBC);  md  = bmp180ReadDate(0xBE);
}/***BMP180 temperature Calculate***/
short bmp180GetTemperature(unsigned int ut)
{long x1, x2;x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;  //x1=((ut-ac6)*ac5)/(2^15)x2 = ((long)mc << 11)/(x1 + md);                //x2=(mc*2^11)/(x1+md)b5 = x1 + x2;                                   //b5=x1+x2return ((b5 + 8)>>4);                           //t=(b5+8)/(2^4)
}/***BMP180 pressure Calculate***/long bmp180GetPressure(unsigned long up)
{long x1, x2, x3, b3, b6, p;unsigned long b4, b7;b6 = b5 - 4000;x1 = (b2 * (b6 * b6)>>12)>>11;x2 = (ac2 * b6)>>11;x3 = x1 + x2;b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;x1 = (ac3 * b6)>>13;x2 = (b1 * ((b6 * b6)>>12))>>16;x3 = ((x1 + x2) + 2)>>2;b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;b7 = ((unsigned long)(up - b3) * (50000>>OSS));if (b7 < 0x80000000)p = (b7<<1)/b4;elsep = (b7/b4)<<1;x1 = (p>>8) * (p>>8);x1 = (x1 * 3038)>>16;x2 = (-7357 * p)>>16;p += (x1 + x2 + 3791)>>4;return p;
}/*** Read 1 bytes from the BMP180  ***/int bmp180Read(unsigned char address)
{unsigned char data;Wire.beginTransmission(BMP180ADD);Wire.write(address);Wire.endTransmission();Wire.requestFrom(BMP180ADD, 1);while(!Wire.available());return Wire.read();
}/*** Read 2 bytes from the BMP180 ***/
int bmp180ReadDate(unsigned char address)
{unsigned char msb, lsb;Wire.beginTransmission(BMP180ADD);Wire.write(address);Wire.endTransmission();Wire.requestFrom(BMP180ADD, 2);while(Wire.available()<2);msb = Wire.read();lsb = Wire.read();return (int) msb<<8 | lsb;
}/*** read uncompensated temperature value ***/
unsigned int bmp180ReadUT()
{unsigned int ut;Wire.beginTransmission(BMP180ADD);Wire.write(0xF4);                       // Write 0x2E into Register 0xF4Wire.write(0x2E);                       // This requests a temperature readingWire.endTransmission();  delay(5);                               // Wait at least 4.5msut = bmp180ReadDate(0xF6);               // read MSB from 0xF6 read LSB from (16 bit)return ut;
}/*** Read uncompensated pressure value from BMP180 ***/
unsigned long bmp180ReadUP()
{unsigned char msb, lsb, xlsb;unsigned long up = 0;Wire.beginTransmission(BMP180ADD);Wire.write(0xF4);                        // Write 0x34+(OSS<<6) into register 0xF4Wire.write(0x34 + (OSS<<6));             // 0x34+oss*64Wire.endTransmission(); delay(2 + (3<<OSS));                     // Wait for conversion, delay time dependent on OSSWire.beginTransmission(BMP180ADD);Wire.write(0xF6);                        // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)Wire.endTransmission();Wire.requestFrom(BMP180ADD, 3); while(Wire.available() < 3);             // Wait for data to become availablemsb = Wire.read();lsb = Wire.read();xlsb = Wire.read();up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);//16 to 19 bitreturn up;
}

DHT11.CPP

#include "DHT11.h"//定义变量
unsigned char HUMI_Buffer_Int = 0;
unsigned char TEM_Buffer_Int = 0;DHT11::DHT11(int pin)
{DHT11_DQ = pin;
}//****************************************************
//初始化DHT11
//****************************************************
void DHT11::DHT11_Init()
{pinMode(DHT11_DQ,OUTPUT);digitalWrite(DHT11_DQ,LOW);  //拉低总线,发开始信号;delay(30);  //延时要大于 18ms,以便 DHT11 能检测到开始信号;digitalWrite(DHT11_DQ,HIGH);delayMicroseconds(40);  //等待 DHT11 响应;pinMode(DHT11_DQ,INPUT_PULLUP);while(digitalRead(DHT11_DQ) == HIGH);delayMicroseconds(80);   //DHT11 发出响应,拉低总线 80us;if(digitalRead(DHT11_DQ) == LOW);delayMicroseconds(80);   //DHT11 拉高总线 80us 后开始发送数据;
}//****************************************************
//读一个字节DHT11数据
//****************************************************
unsigned char DHT11::DHT11_Read_Byte()
{unsigned char i,dat = 0;unsigned int j;pinMode(DHT11_DQ,INPUT_PULLUP);delayMicroseconds(2);for( i=0; i<8; i++){while(digitalRead(DHT11_DQ) == LOW);   //等待 50us;delayMicroseconds(40);   //判断高电平的持续时间,以判定数据是‘0’还是‘1’;if(digitalRead(DHT11_DQ) == HIGH)dat |= (1<<(7-i));   //高位在前,低位在后;while(digitalRead(DHT11_DQ) == HIGH);   //数据‘1’,等待下一位的接收;}return dat;
}//****************************************************
//读取温湿度值,存放在TEM_Buffer和HUMI_Buffer
//****************************************************
void DHT11::DHT11_Read()
{DHT11_Init();HUMI_Buffer_Int = DHT11_Read_Byte();         //读取湿度的整数值DHT11_Read_Byte();                            //读取湿度的小数值TEM_Buffer_Int = DHT11_Read_Byte();          //读取温度的整数值DHT11_Read_Byte();                            //读取温度的小数值DHT11_Read_Byte();                            //读取校验和delayMicroseconds(50);                       //DHT11拉低总线50uspinMode(DHT11_DQ,OUTPUT);digitalWrite(DHT11_DQ,HIGH);                //释放总线  }

测试结果:

1602显示

串口数据

【Arduino】基于Arduino单片机的小型气象站设计相关推荐

  1. 基于AT89C51单片机的小型气象站

    目录 小型气象站 问题咨询及项目源码下载请加群: 群名:IT项目交流群 群号:245022761 一.实验目的 1. 了解温湿度传感器工作原理 2. 了解大气压力传感器工作原理 3. 了解激光颗粒物传 ...

  2. 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc

    基于51单片机的实时时钟设计报告 PAGE PAGE 24 课程设计(论文)任务书 信息工程 学 院 信息工程 专 业 (2) 班 一.课程设计(论文)题目 嵌入式课程设计 二.课程设计(论文)工作自 ...

  3. matlab ds18b20 单片机,基于51单片机ds18b20温度检测————设计报告.doc

    基于51单片机ds18b20温度检测----设计报告 课程名称: 微机原理课程设计 题 目: 温度检测课程设计 摘要 随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为 ...

  4. 基于51单片机的简易减法器设计制作

    基于C51单片机的简易减法器设计制作 51单片机可实现很多功能,今天笔者介绍一种使用C51编写程序,通过4*4矩阵键盘和8位共阴数码管实现的简易减法器.矩阵键盘以及数码管的原理图如下: (1)4*4矩 ...

  5. 51单片机设计简易计算机原理,基于AT89C51单片机简易计算器的设计(DOC).docx

    PAGE PAGE # 基于AT89C51单片机简易计算器的设计 [摘要]单片机的出现是计算机制造技术高速发展的产物,它是嵌 入式控制系统的核心,如今,它已广泛的应用到我们生活的各个领域, 电子.科技 ...

  6. 基于51单片机的电子时钟设计

    基于51单片机的电子时钟设计 0 功能介绍 1.从DS1302中读取时间显示 2.一共4个按键,按键1按下进入修改时间模式,再按下切换修改的时间变量,这个时候第2和3个按键就是修改时间变量的按键,修改 ...

  7. 9、★♥★基于STM32单片机的颜色检测仪设计♥☆

    9.★♥★基于STM32单片机的颜色检测仪设计♥☆ 文章目录 9.★♥★基于STM32单片机的颜色检测仪设计♥☆ 引言 1.系统概述 1.1.设计任务 1.2.设计要求 2.方案设计与论证 2.1.芯 ...

  8. 单片机数字定时闹钟设计c语言,电子设计 基于51单片机的定时闹钟设计.doc

    电子设计 基于51单片机的定时闹钟设计 课件之家精心整理资料--欢迎你的欣赏 课件之家精心整理资料--欢迎你的欣赏 摘 要 单片计体积小.能耗低.成本低.功能强,广泛应用于智能产品和工业自动化上.本次 ...

  9. 台灯c语言,基于msp430单片机的智能台灯设计(C语言).doc

    基于msp430单片机的智能台灯设计(C语言) 桂林理工大学信息学院 实 习 报 告 实习名称: 电子系统设计创新与实践 名: 学 号: 组 员: 指导老师: 实习时间: 目 录1概述3 1.1 题目 ...

最新文章

  1. visio网络拓扑图模具_【无机纳米材料科研制图——Visio 0304】上转换NaYF4:Yb Er/Tm光子能级跃迁图...
  2. mysql触发器 while循环_mysql触发器跳出当前循环方法
  3. MySQL常用存储引擎之Innodb
  4. 【LeetCode笔记】19.删除链表的倒数第N个结点(Java、快慢指针)
  5. leetcode 145 --- 二叉树后序遍历
  6. C语言判断某个字符串中 是否存在子字符串
  7. 安装和运行Maven
  8. 基于Promise对象的新一代Ajax API--fetch
  9. 写论文的第三天 自建zookeeper集群
  10. memset()详解
  11. cf519C. A and B and Team Training(找规律)
  12. 2021世界机器人大赛— 青少年机器人设计大赛
  13. (四)52周存钱挑战 1.0
  14. 【正本清源】算力大战根本就从未开始过!BCH分叉事件之技术细节七问
  15. android 百度网盘 播放器,最好用的安卓播放器,支持云盘播放,看电影必备
  16. NetBeans 打开/保存具有指定编码的文件插件
  17. 电脑读卡器,读卡器是什么
  18. 智能网 联汽车信息安全发展趋势
  19. CAD建筑室内图纸素材
  20. ZOJ3864:Quiz for EXO-L(BFS)

热门文章

  1. 抖音世界杯直播的低延迟是怎么做到的?
  2. swift之inout
  3. PMP与ACP哪一个更有用?
  4. 解决在安装Autokroma Influx插件的 Premiere Pro for Mac m1电脑上,导入Flac/MKV/FLV文件后,拖入音轨无声音、导入失败等一系列问题?
  5. GPT-4 被开源,OpenAI:不撤下就告你;推特将发单篇付费,马斯克:双赢;中国棋手首夺「世界棋王」,奖金 830 万
  6. 程序员穿衣审美很谜?更谜的他们开始自己定义Style了
  7. nginx代理去掉URl前缀
  8. 全国中学生乒乓球锦标赛
  9. java2048ai_MinMax-极小极大算法——2048
  10. 基于声表面滤波器(SAWF)实现2ps分辨率TDC设计