亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

具有GPS的温湿度监测器

发布时间:2021-04-29
分享到:

具有GPS的温湿度监测器

发布时间:2021-04-29
分享到:

该项目利用温湿度传感器、GPS模块在选择的特定位置之间进行温度和湿度的数据监测,可用于对温度的监控等应用,只需将设备放置在具有电源、网络连接的位置。如要测量内外部温度,则需将传感器正确安装。

项目特点:

  • 能够监测温度数据和GPS数据
  • 在不同位置使用多个设备和传感器制作温度监控阵列的潜力。
  • 低成本
  • 紧凑的设计
  • 易于组装和安装
  • 数据输出到互联网连接的应用程序和服务
  • 可以针对不同的应用进行编程

流程图:

硬件部件:

  • 粒子氩
  • GPS NEO-6M
  • DHT22温度传感器
  • 跳线
  • 面包板

电路图:

代码:

1、GPS和温度传感器代码(此代码将数据从NEO-6M GPS模块和DHT22温度传感器输出到粒子云)

// 此#include语句是由粒子IDE自动添加的
#include <TinyGPS-gngga.h>

// 此#include语句是由粒子IDE自动添加的
#include <Particle-GPS.h>

// 此#include语句是由粒子IDE自动添加的
#include <PietteTech_DHT.h>

// 此#include语句是由粒子IDE自动添加的
#include <PietteTech_DHT.h>

// 此#include语句是由粒子IDE自动添加的
#include <Particle-GPS.h>

// 此#include语句是由粒子IDE自动添加的
#include <Particle-GPS.h>

// 此#include语句是由粒子IDE自动添加的
#include <TinyGPS-gngga.h>


#include "PietteTech_DHT.h" 

#define DHTTYPE  DHT22       // 传感器类型DHT11 / 21/22
#define DHTPIN   D3   
//版权所有©2016-2017 Daniel Porrey。版权所有。
//
//此文件是Particle.GPS库的一部分。
// 
// Particle.GPS库是免费软件:您可以重新分发和/或修改
//根据GNU发布的GNU通用公共许可证的条款
//自由软件基金会(许可的第3版)或
//(根据您的选择)任何更高版本。
// 
//分发了Particle.GPS库,希望它会有用,
//但没有任何保证;甚至没有默示的保证
//特定用途的适销性或适用性。见
//有关更多详细信息,请参见GNU通用公共许可证。
// 
//您应该已经收到了GNU通用公共许可证的副本
//以及Particle.GPS库。如果不,
//参见http://www.gnu.org/licenses/。
//
#include "Particle-GPS.h"

// ***
// ***创建一个Gps实例。RX和TX引脚连接到
// ***电子(Serial1)上的TX和RX引脚。
// ***
Gps _gps = Gps(&Serial1);
// ***
// ***创建一个定时器,每1 ms触发一次以捕获
// ***从GPS输入的串行端口数据。
// ***
Timer _timer = Timer(1, onSerialData);


PietteTech_DHT DHT(DHTPIN, DHTTYPE);
int n;

void setup()
{
    Serial.begin(9600);
  while (!Serial.available() && millis() < 30000) {
    Serial.println("Press any key to start.");
    Particle.process();
    delay(10000);
  }
  Serial.println("DHT Simple program using DHT.acquireAndWait");
  Serial.print("LIB version: ");
  Serial.println(DHTLIB_VERSION);
  Serial.println("---------------");
  DHT.begin();
  // ***
  // ***初始化USB串行进行调试。
  // ***
  Serial.begin();
  Serial.println("Initializing...");

  // ***
  // ***初始化GPS。
  // ***
  _gps.begin(9600);

  // ***
  // *** 请求发送所有数据
  // ***
  _gps.sendCommand(PMTK_SET_NMEA_OUTPUT_ALLDATA);

  // ***
  // *** 启动计时器
  // ***
  _timer.start();
}

void onSerialData()
{
  _gps.onSerialData();
}

void loop()
{
 // ***
  // ***这将显示从接收到的字符串
  // *** GPS单位。如果GPS可能有些是空的
  // ***未设置为发送所有数据。
  // ***
  Serial.print("Data[0] = "); Serial.println(_gps.data[0]);
  Serial.print("Data[1] = "); Serial.println(_gps.data[1]);
  Serial.print("Data[2] = "); Serial.println(_gps.data[2]);
  Serial.print("Data[3] = "); Serial.println(_gps.data[3]);
  Serial.print("Data[4] = "); Serial.println(_gps.data[4]);
  Serial.print("Data[5] = "); Serial.println(_gps.data[5]);
  Serial.print("Data[6] = "); Serial.println(_gps.data[6]);
  Particle.publish("Brian_GPS", String(_gps.data[0]), PUBLIC);
  Particle.publish("Brian_GPS", String(_gps.data[1]), PUBLIC);
  
  
  Serial.print("\n");
  Serial.print(n);
  Serial.print(": Retrieving information from sensor: ");
  Serial.print("Read sensor: ");

  int result = DHT.acquireAndWait(1000);

  switch (result) {
  case DHTLIB_OK:
    Serial.println("OK");
    break;
  case DHTLIB_ERROR_CHECKSUM:
    Serial.println("Error\n\r\tChecksum error");
    break;
  case DHTLIB_ERROR_ISR_TIMEOUT:
    Serial.println("Error\n\r\tISR time out error");
    break;
  case DHTLIB_ERROR_RESPONSE_TIMEOUT:
    Serial.println("Error\n\r\tResponse time out error");
    break;
  case DHTLIB_ERROR_DATA_TIMEOUT:
    Serial.println("Error\n\r\tData time out error");
    break;
  case DHTLIB_ERROR_ACQUIRING:
    Serial.println("Error\n\r\tAcquiring");
    break;
  case DHTLIB_ERROR_DELTA:
    Serial.println("Error\n\r\tDelta time to small");
    break;
  case DHTLIB_ERROR_NOTSTARTED:
    Serial.println("Error\n\r\tNot started");
    break;
  default:
    Serial.println("Unknown error");
    break;
}
  delay(1000);
  
  
  Serial.print("Humidity (%): ");
  Serial.println(DHT.getHumidity(), 2);

  Serial.print("Temperature (oC): ");
  Serial.println(DHT.getCelsius(), 2);

  Serial.print("Temperature (oF): ");
  Serial.println(DHT.getFahrenheit(), 2);

  Serial.print("Temperature (K): ");
  Serial.println(DHT.getKelvin(), 2);
  
    int temp_c = (DHT.getCelsius()); //读取DHT传感器
    int temp_f = (DHT.getFahrenheit()); //读取DHT传感器
    int humid = (DHT.getHumidity()); // 读取DHT传感器
  
   //发送来自粒子的发布
    Particle.publish("T_C", String(temp_c),60,PUBLIC);
    Particle.publish("T_F", String(temp_f),60,PUBLIC);
    Particle.publish("H_%", String(humid),60,PUBLIC);

  n++;
  delay(10000);
}

2、GPS、温度传感器代码(这是来自第二个Argon的代码,该代码也将GPS和温度传感器数据报告给粒子云)

//此#include语句是由粒子IDE自动添加的
#include <TinyGPS-gngga.h>

// 此#include语句是由粒子IDE自动添加的
#include <Particle-GPS.h>

// 此#include语句是由粒子IDE自动添加的
#include <PietteTech_DHT.h>

// 此#include语句是由粒子IDE自动添加的
#include <PietteTech_DHT.h>

// 此#include语句是由粒子IDE自动添加的
#include <Particle-GPS.h>

// 此#include语句是由粒子IDE自动添加的
#include <Particle-GPS.h>

//此#include语句是由粒子IDE自动添加的
#include <TinyGPS-gngga.h>


#include "PietteTech_DHT.h" 

#define DHTTYPE  DHT22       // 传感器类型DHT11 / 21/22
#define DHTPIN   D3   
//版权所有©2016-2017 Daniel Porrey。版权所有。
//
//此文件是Particle.GPS库的一部分。
// 
// Particle.GPS库是免费软件:您可以重新分发和/或修改
//根据GNU发布的GNU通用公共许可证的条款
//自由软件基金会(许可的第3版)或
//(根据您的选择)任何更高版本。
// 
//分发了Particle.GPS库,希望它会有用,
//但没有任何保证;甚至没有默示的保证
//特定用途的适销性或适用性。见
//有关更多详细信息,请参见GNU通用公共许可证。
// 
//您应该已经收到了GNU通用公共许可证的副本
//以及Particle.GPS库。如果不,
//参见http://www.gnu.org/licenses/。
//
#include "Particle-GPS.h"

// ***
// ***创建一个Gps实例。RX和TX引脚连接到
// ***电子(Serial1)上的TX和RX引脚。
// ***
Gps  _gps  =  Gps (&Serial1 );

// ***
// ***创建一个定时器,每10毫秒触发一次以捕获
// ***从GPS输入的串行端口数据。
// ***

Timer _timer = Timer(10, onSerialData);


PietteTech_DHT DHT(DHTPIN, DHTTYPE);
int n;

int temp_f2;

void setup()
{
    Serial.begin(9600);
  while (!Serial.available() && millis() < 30000) {
    Serial.println("Press any key to start.");
    Particle.process();
    delay(10000);
  }
  Serial.println("DHT Simple program using DHT.acquireAndWait");
  Serial.print("LIB version: ");
  Serial.println(DHTLIB_VERSION);
  Serial.println("---------------");
  DHT.begin();
  // ***
  // ***初始化USB串行进行调试.
  // ***
  Serial.begin();
  Serial.println("Initializing...");

  // ***
  // *** 初始化GPS
  // ***
  _gps.begin(9600);

  // ***
  // *** 请求发送所有数据
  // ***
  _gps.sendCommand(PMTK_SET_NMEA_OUTPUT_ALLDATA);

  // ***
  // ***启动计时器
  // ***
  _timer.start();


  Particle.subscribe("T_F", tempfHandler, MY_DEVICES);
  Particle.variable("temp_f2", temp_f2);

}


void onSerialData()
{
  _gps.onSerialData();
}

void loop()
{
  // ***
  // ***这将显示从接收到的字符串
  // *** GPS单位。如果GPS可能有些是空的
  // ***未设置为发送所有数据。
  // ***
  Serial.print("Data[0] = "); Serial.println(_gps.data[0]);
  Serial.print("Data[1] = "); Serial.println(_gps.data[1]);
  Serial.print("Data[2] = "); Serial.println(_gps.data[2]);
  Serial.print("Data[3] = "); Serial.println(_gps.data[3]);
  Serial.print("Data[4] = "); Serial.println(_gps.data[4]);
  Serial.print("Data[5] = "); Serial.println(_gps.data[5]);
  Serial.print("Data[6] = "); Serial.println(_gps.data[6]);
  
  Particle.publish("GPS_0", String(_gps.data[0]), PRIVATE);

  
  Serial.print("\n");
  Serial.print(n);
  Serial.print(": Retrieving information from sensor: ");
  Serial.print("Read sensor: ");

  int result = DHT.acquireAndWait(5000);

  Serial.print("Humidity (%): ");
  Serial.println(DHT.getHumidity(), 2);

  Serial.print("Temperature (oC): ");
  Serial.println(DHT.getCelsius(), 2);

  Serial.print("Temperature (oF): ");
  Serial.println(DHT.getFahrenheit(), 2);

  Serial.print("Temperature (K): ");
  Serial.println(DHT.getKelvin(), 2);
  
    int temp_c = (DHT.getCelsius()); // 读取DHT传感器
    int temp_f = (DHT.getFahrenheit()); //读取DHT传感器
    int humid = (DHT.getHumidity()); //读取DHT传感器
  
   // 发送来自粒子的发布
    Particle.publish("T_C", String(temp_c),PRIVATE);
    Particle.publish("T_F", String(temp_f),PRIVATE);
    Particle.publish("H_%", String(humid),PRIVATE);

  n++;
  delay(10000);
}

void tempfHandler(const char *event, const char *data)
{
temp_f2 = atof(data);
}

项目演示:

实时温度数据:点击查看 

实时湿度数据:点击查看

实时GPS数据:点击查看

该温度监控器优势在于对温度的实时监控、生产率提高、设备监控等,这些传感器的数据可发布到粒子云中,可通过互联网查看,并将数据导出到与Internet连接的其他应用程序和服务,如IFTTT应用程序和Google云端硬盘。

 

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论