基于Arduino的部分常用传感器嵌入式开发代码总结(一)
作者:田超凡
时间:2019年8月20日
目录
1.DHT11 温湿度传感器
2.PT550 亮度传感器
3.PIR光敏运动传感器
更多传感器后面会抽时间持续更新,更多对Arduino物联网开发感兴趣可以去Arduino中文社区官网查找资料:https://www.arduino.cn/
注意:
1.本总结文档为本人经常使用的一些传感器硬件Arduino代码总结,传感器和端口通信只提供连接图,其他相关的非程序代码问题(如端口占用、硬件连接错误)可以到Arduino开源官网查找解决方案。硬件连接一定要正确,否则在有些传感器电压比较高的情况下可能会烧坏传感器、UNO主板。如果程序发布运行后发现UNO开发板长时间红灯常亮或温度升高请立即断开UNO开发板和电脑的连接。
2.Arduino开发环境有很多,目前官方推荐的是Arduino IDE,也可以使用一些其他的图形化IDE进行嵌入式开发。
1.一个UNO开发板只能对应一个COM端口,可以在Arduino IDE设置COM端口,默认COM3
2.Arduino程序是基于C语言开发的,很多传感器例程代码需要#include 第三方类库。
3.编写ino程序之后先checked编译,如果有异常会有相应提示,最常见的checked异常就是有语法错误、路径不对无法引用类库
4.编译通过之后可以发布运行,发布之后当前COM端口处于占用状态,如果需要重启必须先关闭对应端口停止运行,否则可能出现端口占用异常
5.发布运行之后,对于运行的结果可以在控制台监视,波率必须和setup入口函数的Serial.open()参数保持一致,
如Serial.open(9600) 表示控制台监视的波率必须是9600,否则可能出现监测结果不准确或乱码情况。
GND - GND
VCC - 输入电压5V
OUT - 输出端口定义域A0-A5最佳
1.DHT11 温湿度传感器
工作电压 :3.3V~5v
尺寸大小:40mm x 28mm
重量大小:3g
信号类型:数字信号
供电电流:最大2.5mA
温度范围:0-50℃,误差±2℃
湿度范围:当环境温度在 0 ℃时为30~90%RH;当环境温度在25℃时为20~90%RH ;当环境温度在50℃时为20~80%RH
响应时间:1/e(63%) 6-30s
测量分辨率分别为:温度(8bit)湿度(8bit)
采样周期间隔:<1s
接口定义
S:输出信号
+:电源(VCC)
-:地(GND)
UNO开发板接线原理图:
Arduino代码
double Fahrenheit(double celsius)
{
return 1.8 * celsius + 32;
} //摄氏温度度转化为华氏温度
double Kelvin(double celsius)
{
return celsius + 273.15;
} //摄氏温度转化为开氏温度
// 露点(点在此温度时,空气饱和并产生露珠)
// 参考: http://wahiduddin.net/calc/density_algorithms.htm
double dewPoint(double celsius, double humidity)
{
double A0= 373.15/(273.15 + celsius);
double SUM = -7.90298 * (A0-1);
SUM += 5.02808 * log10(A0);
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
SUM += log10(1013.246);
double VP = pow(10, SUM-3) * humidity;
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558-T);
}
// 快速计算露点,速度是5倍dewPoint()
// 参考: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity/100);
double Td = (b * temp) / (a - temp);
return Td;
}
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 10
//TODO TCF PT550
#define PIN_A 1
#define PIN_D 2
void setup()
{
//TODO 启动串口UNO开发板COM3
Serial.begin(9600);
// Serial.println("DHT11 TEST PROGRAM ");
// Serial.print("LIBRARY VERSION: ");
// Serial.println(DHT11LIB_VERSION);
// Serial.println();
}
void loop()
{
//TODO TCF DHT11
//Serial.println("\n");
int chk = DHT11.read(DHT11PIN);
// Serial.print("DHT11 温度: ");
Serial.println((int)DHT11.temperature);
// Serial.println(analogRead(PIN_A),DEC);
// int nums[]={(int)DHT11.temperature,(int)Fahrenheit(DHT11.temperature)};
// Serial.println((String)nums[0]+","+(String)nums[1]);
// Serial.print("DHT11 湿度: ");
// Serial.print("\t");
//TODO TCF PT550
// int val;
// val=analogRead(PIN_A);
Serial.print("PT550 亮度:");
// Serial.println(val,DEC);
delay(200);
}
2.PT550 亮度传感器
- 检测环境光密度
- 环保光敏二极管
- 模拟输出电压:0~5 VDC
- 适用电源电压:+3~5VDC
- 模拟传感器
- 使用PH-2.0插座
- 传感器匹配Arduino扩展板
UNO开发板和传感器接线图
Arduino代码
#define PIN_A 1
#define PIN_D 2
void setup()
{
Serial.begin(9600);
}
void loop()
{
int val;
val=analogRead(PIN_A);
//Serial.print("a:");
Serial.print(val,DEC);
Serial.println();
//Serial.print(",d:");
//val=digitalRead(PIN_D);
//Serial.println(val+"\n");
delay(500);
}
3.PIR光敏运动传感器
UNO开发板传感器接线示意图:
Arduino代码:
#define pirPin 2
int calibrationTime = 30;
long unsigned int lowIn;
long unsigned int pause = 5000;
boolean lockLow = true;
boolean takeLowTime;
int PIRValue = 0;
void setup() {
Serial.begin(9600);
pinMode(pirPin, INPUT);
}
void loop() {
PIRSensor();
}
void PIRSensor() {
if(digitalRead(pirPin) == HIGH) {
if(lockLow) {
PIRValue = 1;
lockLow = false;
Serial.println("Motion detected.");
delay(50);
}
takeLowTime = true;
}
if(digitalRead(pirPin) == LOW) {
if(takeLowTime){
lowIn = millis();takeLowTime = false;
}
if(!lockLow && millis() - lowIn > pause) {
PIRValue = 0;
lockLow = true;
Serial.println("Motion ended.");
delay(50);
}
}
}