基于nb-iot和arduino的气象站(一)

2023-11-10

基于nb-iot和arduino的气象站(一)温湿度和紫外线传感器

上一篇已经介绍了项目的大概情况。

这一篇先讲温湿度传感器和紫外线传感器的使用。

一、温湿度传感器

我使用的温度传感器为DHT21。

DHT21数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。

DHT21.jpg

1.1DHT21模块接线说明:

  1. VCC 外接3.3V-5V
  2. GND 外接GND
  3. DATA 串行数据,单总线

1.2DHT21发送数据格式:

  • 通过串口显示温度和湿度值波特率:9600

  • 采用单总线数据格式,一次通讯时间5ms左右 ,具体格式在下面说明,当前数据传输为40bit,高位先出。

    例子:0000 0010 1000 1100 0000 0001 0101 1111 1110 1110

    其中前16位为湿度数据,接着16位为温度数据,最后8位为校验位。

    • 湿度=(高8位*256+低八位)/10
    • 温度=((高八位&0x7F)*256+低八位)/10
    • 校验位=温度高八位+温度低八位+湿度高八位+湿度低八位

    当温度低于0℃时温度数据最高位置为1。

  • DHT22与此相同,DHT11数据格式略有不同,具体需要看传感器说明书。但是其实arduino已经有了相应的库,并不需要我们自己去处理这些传感器的数据。

1.3参考代码

// 导入头文件
#include "DHT.h"
// 定义OUT接口的数字引脚,即把OUT接口接到arduino的pin2
#define DHTPIN 2     

// 选择DHT类型为 DHT 21
//#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
#define DHTTYPE DHT21   // DHT 21 (AM2301)

// 生成 DHT 对象,参数是PIN和DHT类型
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  // 必须使用的begin()函数  
  dht.begin();
}

void loop() {
  // 每次等待2秒后再输出(这里必须等大于1秒,不然不准确)
  delay(2000);

  // readHumidity() 这里是读取当前的湿度
  float h = dht.readHumidity();
  // readTemperature() 读取当前的温度,单位C
  float t = dht.readTemperature();
  //readTemperature(true) 读取当前的温度,单位F
  float f = dht.readTemperature(true);
  // 如果读取失败则退出,再读取一次
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // 读取体感温度,单位F
  float hif = dht.computeHeatIndex(f, h);
  // 读取体感温度,单位C
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
}

需要下载DHT库文件,打开arduino后,项目->加载库->管理库,搜索DHT,选择第一个DHT_sensor_library。安装完成后,在arduino的安装目录下library文件夹中会出现对应的库。运行其中的DHTTester,可能会有一个错误,这个错误是缺少 Adafruit_Sensor.h 。可在 https://github.com/adafruit/Adafruit_Sensor 此处下载,将下载后的压缩包解压后,放入library文件夹下。重新打开 Arduino后,编译就没有错误了。

上传之后可以看到 湿度,C温度,F温度,体感C温度,体感F温度。如果不是DHT21,只要将代码中的DHTTYPE作相应修改即可。

二、紫外线传感器

我选择的紫外线传感器型号为ML8511。

ML8511-1.JPG

2.1接线说明

  1. 3V3 外接3.3V
  2. GND 外接GND
  3. OUT为数据输出,我将它接了arduinoA0口
  4. EN接3.3v

2.2输出数据说明

uv sensor.png

传感器OUT口输出为模拟信号,输出电压值与紫外线强度对应关系如上图所示。

2.3参考代码

/* 
 The MP8511 UV Sensor outputs an analog signal in relation to the amount of UV light it detects.

 Connect the following MP8511 breakout board to Arduino:
 3.3V = 3.3V
 OUT = A0
 GND = GND
 EN = 3.3V
 3.3V = A1
 These last two connections are a little different. Connect the EN pin on the breakout to 3.3V on the breakout.
 This will enable the output. Also connect the 3.3V pin of the breakout to Arduino pin 1.

 This example uses a neat trick. Analog to digital conversions rely completely on VCC. We assume this is 5V but if the board is powered from USB this may be as high as 5.25V or as low as 4.75V: http://en.wikipedia.org/wiki/USB#Power Because of this unknown window it makes the ADC fairly inaccurate in most cases. To fix this, we use the very accurate onboard 3.3V reference (accurate within 1%). So by doing an  ADC on the 3.3V pin (A1) and then comparing this against the reading from the sensor we can extrapolate a true-to-life reading no matter what VIN is (as long as it's above 3.4V).
*/

int UVOUT = A0; //Output from the sensor
int REF_3V3 = A1; //3.3V power on the Arduino board

void setup()
{
  Serial.begin(9600);

  pinMode(UVOUT, INPUT);
  pinMode(REF_3V3, INPUT);

  Serial.println("MP8511 example");
}

void loop()
{
  int uvLevel = averageAnalogRead(UVOUT);
  int refLevel = averageAnalogRead(REF_3V3);

  //Use the 3.3V power pin as a reference to get a very accurate output value from sensor
  float outputVoltage = 3.3 / refLevel * uvLevel;

  float uvIntensity = mapfloat(outputVoltage, 0.99, 2.9, 0.0, 15.0);

  Serial.print("MP8511 output: ");
  Serial.print(uvLevel);

  Serial.print(" MP8511 voltage: ");
  Serial.print(outputVoltage);

  Serial.print(" UV Intensity (mW/cm^2): ");
  Serial.print(uvIntensity);

  Serial.println();

  delay(100);
}

//Takes an average of readings on a given pin
//Returns the average
int averageAnalogRead(int pinToRead)
{
  byte numberOfReadings = 8;
  unsigned int runningValue = 0; 

  for(int x = 0 ; x < numberOfReadings ; x++)
    runningValue += analogRead(pinToRead);
  runningValue /= numberOfReadings;

  return(runningValue);  
}

//The Arduino Map function but for floats
//From: http://forum.arduino.cc/index.php?topic=3922.0
float mapfloat(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

这段代码的注释部分已经给出了连线方式。注意需要将arduino的A1口连上3.3v电压,从A1口读取的电压值作为校准作用。

有趣的是,因为我使用的是arduino pro mini,该型号并没有3.3v的输出,因此,需要改变接线方法。观察到,在紫外线传感器上有个黑色的三极管,上面数字是662,google一下发现是一个稳压管。那么就可以猜测,在vin口输入5v,可以在3.3v口输出3.3v,试验后,发现果真如此!那么,接线就应该改为:VIN口接5v,GND接GND,OUT接arduino A0,EN接3V3口的输出,arduino板上A1接3V3口输出。这样接线后就可以正常工作。当然,如果你的arduino有3.3v输出,就不用这么麻烦,直接照着代码注释接线就好。

下一篇将记录pm2.5传感器和gps传感器的使用方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于nb-iot和arduino的气象站(一) 的相关文章

  • 揭秘看不见人的“黑灯工厂”

    你知道吗 未来工厂不需要人也能24小时运转 未来机器能自己配合的天衣无缝 未来工厂连一点灰尘都进不去 未来自研的智能化设备甚至几秒就能生产出一部手机 千万不要惊讶 其实这样的工厂已经在我们的身边 很可能你在元旦买到的一件衣服 一部手机就是
  • Mac OS 10.9 不显示 Arduino 的 USB 调制解调器

    我正在尝试选择 dev tty usbmodem on my Arduino Lenardo设备 操作系统是Mac OSX 10 9 问题是它没有显示 我什至尝试安装FTDI http www ftdichip com Drivers VC
  • Android 和 Arduino 都通过蓝牙接收奇怪的值

    我正在 Android 端使用 BluetoothChat 代码使用聊天框向 Arduino UNO 发送开 关信号 我发送 110 119 或下面定义的其他情况 但是当我显示接收到的值时 它显示奇怪的Arduino 串行监视器中的值 即
  • DCF77 解码器与噪声信号

    我几乎完成了我的开源 DCF77 解码器项目 当我注意到标准 Arduino DCF77 库在噪声信号上表现非常差时 这一切就开始了 特别是当天线靠近计算机或洗衣机正在运行时 我永远无法从解码器中获取时间 我的第一个方法是向输入信号添加 数
  • sim800L GPRS 发布请求

    我一直在研究 LoNet 迷你 GSM 模块 SIM800L 并将其与 Arduino 连接 我已插入 SIM 移动卡并且可以连接互联网 通过串行监视器 我可以毫无问题地与它通信 但是当向网络服务器页面发出 GET 或 POST 请求时 它
  • Arduino从SD卡读取最后一行

    我对 Arduino 业务还很陌生 如何从 SD 卡读取最后一行 通过以下代码片段 我可以读取第一行 n 之前的所有字符 现在我想添加一个 向后 声明 或其他内容 到目前为止我的代码 include
  • 在Python中快速绘制数据

    我正在尝试使用 arduino 绘制来自 mpu6050 imu 的数据 MPU6050 发送数据的速度比绘图快 Arduino 代码从串口提供 6 个数据 即偏航 俯仰 滚动 轴 ay 和 az 我需要快速情节的建议 Python代码 i
  • 终止导致设备或资源繁忙的进程:“/dev/ttyUSB0”?

    我使用以下 Python 代码连接到我的 Arduino 板 device glob glob dev ttyUSB 0 time sleep 1 arduino serial Serial device 115200 timeout 5
  • pySerial 与 python 2.7 和 3.4 的差异

    我正在开发一个项目 需要通过串口将一些数字从 Windows 10 中的 python 发送到 arduino uno 作为一个简单的测试 我只想通过发送 2 来打开 LED 并通过从命令提示符发送 4 来关闭 LED 尽管我希望最终能够将
  • ESP8266 I2C从机不确认数据

    我有一个 TM4C123 处理器作为 I2C 主处理器 一个 ESP8266 作为从处理器 对于 ESP 我使用的是 Arduino IDE 并在 2 5 2 版安装了 ESP8266 支持 它应该支持 I2C 从模式 但是 我无法让它工作
  • 如何使用GSM模块SIM800和Arduino Uno发送短信?

    我正在尝试通过 SIM800 GSM 模块从 Arduino 发送短信 消息到达给定号码 但格式不正确 它显示 消息格式不支持 我在这里添加了我的代码 非常感谢您的快速回复 include
  • Arduino C++ 析构函数?

    我知道在Arduino中你不能使用delete 那么什么时候调用 C 类中定义的析构函数呢 同样 如果我想创建一个指向数组的指针 我必须使用malloc and free 当对象被销毁时 析构函数被调用 对于自动 堆栈上 变量 它在离开其作
  • 编译器:如果条件始终为真/假怎么办

    我想到了条件和编译器 我正在为 Arduino 编写一个应用程序 因此我需要该应用程序尽可能快 在我的代码中我有这个 define DEBUG false if DEBUG String pinName pinName Pin pinNam
  • 在链接时合并全局数组/从多个编译单元填充全局数组

    我想定义一系列的东西 比如事件处理程序 的内容 该数组在编译时是完全已知的 但定义在 多个编译单元 分布在多个库中 至少在最终 静态 链接之前是相当解耦的 我想要 也保持这种方式 因此添加或删除编译单元将 还可以自动管理事件处理程序 而无需
  • 使用 Arduino 来操作 Android [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人尝试过让 Android 和 Arduino 相互通信吗 我在网上找到了几个项目 Amarino http www amarino tool
  • 无法将 minicom 的输出保存到文件中

    当我使用Minicom从串口捕获数据时 我需要将大数据保存到一个文件中 名为minicom cap 但是 如果我按 Ctrl A 和 L 来捕获文件 则失败 没有创建文件 minicom cap之前并不存在 我的下载目录已正确创建 我的操作
  • ESP32:dsb1820 温度传感器给出恒定的负 127 读数

    我正在尝试使用连接到 esp32 微控制器的单个 dsb1820 温度传感器来获取温度读数 传感器连接到 esp32 的 GPIO 4 我打算将温度读数发送到云端 我面临的问题是温度读数总是给出值 127 我在网上某处读到 当 dsb182
  • Arduino 串行输出丢弃字符

    当我尝试为我的 Arduino Uno 编写一些代码时 我遇到了一个奇怪的串行输出 我有这个原始代码 MyClass myclass void setup Serial Begin 9600 Serial println Starting
  • Arduino CLI 编译器“ino”和一些基本草图导致编译错误

    我正在尝试使用 cli 编译器 ino 编译基本的以太网 UDP Sketch 我从他们的 github 存储库下载了最新版本 ino init然后是 src sketch ino 的内容 include
  • 如何将 Android 应用程序正确连接到支持蓝牙的 Arduino 微控制器上的 RFCOMM 套接字?

    我正在与我大学的一些学生合作开发一个简单的蓝牙 Android 应用程序 该应用程序将用于与连接有蓝牙模块的 Arduino 微控制器进行串行通信 RFCOMM 据我所知 我正在使用正确的蓝牙地址和 UUIDRFCOMM SPP 00001

随机推荐

  • pytorch LayerNorm参数详解,计算过程

    目录 说明 LayerNorm参数 normalized shape eps elementwise affine LayerNorm前向传播 以normalized shape为一个int举例 总结 说明 LayerNorm中不会像Bat
  • npm的.npmrc文件在哪里?缓存及全局包文件在什么位置?

    npm的 npmrc文件在哪里 缓存及全局包文件在什么位置 npm作为node开发过程中的必备工具 长期使用之后 您可能会想 这些全局安装的node包都放在硬盘里面的哪个地方 配置文件 npmrc文件在哪里 node包的缓存位置在哪里 本文
  • Ubuntu和windows系统下安装odoo15 企业版终于安装成功了附带安装方法

    方法和社区版一样 用官方方法 轻松简单 界面清爽多了 比社区版 和14的企业版 比起来 效率高了很多 很多细节上的改变 网站模板多了 还有多了视频会议功能 安装方法 先安装数据库 sudo apt install postgresql y
  • Windows------openvino 2022.1安装步骤

    openvino安装 1 下载安装包 官网链接 https www intel com content www us en developer tools openvino toolkit download html 点击download
  • C#泛型方法的定义及使用

    在 C 语言中泛型方法是指通过泛型来约束方法中的参数类型 也可以理解为对数据类型设置了参数 如果没有泛型 每次方法中的参数类型都是固定的 不能随意更改 在使用泛型后 方法中的数据类型则有指定的泛型来约束 即可以根据提供的泛型来传递不同类型的
  • [疯狂Java]AWT:菜单栏、菜单、菜单项、菜单事件处理

    1 菜单栏 菜单 菜单项之间的关系 1 菜单栏 MenuBar 就是窗口中常见的顶层菜单栏 包含文件 编辑 格式等等子菜单的菜单条 即包含菜单的容器 2 菜单 Menu 是必定包含菜单项或者菜单 嵌套包含菜单 也叫子菜单 的容器 3 菜单项
  • python爬虫入门案例(爬取lol所有英雄名称及技能)

    滴滴滴 这几天忙着增强自己的实力 发现了一个非常适合新手的案例 案例就是爬取英雄联盟的所有英雄名称和技能 废话不多说 我们来分析分析 要练手的链接 进入此网站我们会发现 网页上的响应数据里面并没有我们想要的数据 由此我们可以猜测 该响应的数
  • onvif协议常见错误总结

    1 返回28 TCP ERROR或者error 28 SOAP ENV Receiver No route to h 可能存在的原因 原因可能是账号密码错误 或者设备不在线的原因 导致TCP连接超时 或者onvif的地址写错导致的 我当时是
  • 使用easy excel进行简单的excel表格导入导出

    1 创建项目 导入easy excel的依赖
  • 腾讯云DDoS攻击防护指南

    1 什么是DDoS攻击 DDoS是目前成本较低的一种攻击方式之一 攻击者通过控制大量肉鸡 被黑客入侵控制的终端 同时向目标站点发起访问 目标站点被大量涌入的访问会话占满性能 而无法接收实际正常用户的访问请求 形成 拒绝服务 攻击 2 腾讯云
  • 基于遗传算法二维下料问题/矩形件排样/matlab程序

    基于遗传算法的二维板材切割下料优化问题 matlab程序 关键词 遗传算法 二维板材切割 matlab 引言 二维板材切割问题在实际的工程中有很多的应用 该问题基本等同于矩形件优化排样 具体是指将若干尺寸不相同的矩形零件在给定的矩形板材上以
  • 打靶练习:DC-1

    文章目录 主机发现和nmap信息收集 web信息收集 漏洞扫描 密码爆破 获得系统立足点 MySQL渗透 web渗透 用户提权 总结 主机发现和nmap信息收集 主机发现 kali kali sudo arp scan l 查找到主机地址为
  • 计算机最最基础的原理

    这是一篇知乎的文章详细的介绍了电子计算机运算器加减的原理及存储的原理 作者 张大昭 链接 https www zhihu com question 20112194 answer 84394468 来源 知乎 著作权归作者所有 商业转载请联
  • Heroku登录失败

    Heoku 在国内 注册和登录是个大问题 不知道原来怎么注册上了 如今需要登录删除 app 就是删除不了 今天努力找了个vpn 无奈还是登录不成功 https id heroku com login 在群里问了下有人能上 就知道肯定设置的有
  • Android Update Engine 分析(二十)为什么差分包比全量包小,但升级时间却更长?

    本文为洛奇看世界 guyongqiangx 原创 转载请注明出处 原文链接 https blog csdn net guyongqiangx article details 132343017 0 导读 时不时有同学在 OTA 讨论群和 V
  • 华为OD机试真题-机房布局/栈解法【2023.Q1】

    小明正在规划一个大型数据中心机房 需要满足的条件是 确保在每个机柜边上至少要有一个电箱 已知 机房排成1排 我们用M表示机柜 I表示间隔 请你返回这整排机房 至少需要多少个电箱 如果无解请返回 1 输入描述 第一行输入一个字符串 由 M 和
  • SqliLabs Less21-22

    第二十一关 基于单引号和括号 64位编码的密码注入 1 判断注入点 有了20关的经验 输入爆破账户 admin密码 admin后抓包 发现admin输入为YWRtaW4 3D 根据提示用64位数据解码得到YWRtaW4 用url编码 为 3
  • 新老域名更替时的页面跳转

    不少站长都有换域名的经历 新买的www xxx com的域名和老域名都已经绑定在空间上了 但老域名总是不敢轻易拿掉 更换的话 跟老域名相关的所有链接都将失效 出现404的页面非常不友好 用户也将找不到原来的内容 其实用JS跳转功能可以帮站长
  • 机器学习零基础?手把手教你用TensorFlow搭建图像识别系统

    转 http www leiphone com news 201701 Y4uyEktkkwb5YhJM html http www leiphone com news 201701 2tH3DgLmsGhnDd8D html 导语 这是W
  • 基于nb-iot和arduino的气象站(一)

    基于nb iot和arduino的气象站 一 温湿度和紫外线传感器 上一篇已经介绍了项目的大概情况 这一篇先讲温湿度传感器和紫外线传感器的使用 一 温湿度传感器 我使用的温度传感器为DHT21 DHT21数字温湿度传感器是一款含有已校准数字