本文介绍了如何基于Arduino制作超声波测距仪和温湿度监视,使用的零部件如下:
使用的Arduino库包括Adafruit_SSD1306
,Adafruit-GFX-Library
,DHTlib
。Adafruit_SSD1306
和Adafruit-GFX-Library
用于OLED屏控制,DHTlib
用于DH11温湿度传感器。
SR-04超声波测距模块测距精确,还很便宜,在各种DIY中广泛应用。模块的测距原理比较简单,首先在TRIG
控制口发一个10US以上的高电平,然后在ECHO
接收口等待高电平输出,一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,该值即为声音来回的时间,根据下面的公式就可计算出距离。
测试距离=(声音来回时间乘以声速)/2
声音在各介质中传播速度不同,正常使用SR-04超声波测距模块均在空气中,所以该处声速取 340 m/s 。
注意SR-04超声波测距模块最大测距为4.5米,精度0.2厘米。
DHT11温湿度传感器包括一个电阻式感湿元件和一个NTC测温元件,可以检测周围环境的湿度和温度。如果想要更高的测量范围和测量精度,可以选择DHT22温湿度传感器。
湿度测量范围 | 湿度测量误差 | 温度测量范围 | 温度测量误差 |
---|---|---|---|
20%-80% | ±5% | 0度-50度 | ±2度 |
湿度测量范围 | 湿度测量误差 | 温度测量范围 | 温度测量误差 |
---|---|---|---|
0%-100% | ±2% | -40度-125度 | ±0.5度 |
#include
#include
Adafruit_SSD1306 display(128, 64);
int trigPin = 6;
int echoPin = 7;
long aver[3];
long duration, distance;
void setup()
{
delay(100);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setRotation(0);
display.setTextWrap(false);
display.dim(0);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop()
{
for (int i=0;i<=2;i++) {
measure();
aver[i]=distance;
delay(50);
}
distance=(aver[0]+aver[1]+aver[2])/3;
display.clearDisplay();
display.setTextSize(2); //设置字体大小
display.setCursor(0, 10);
display.println("distance:");
display.setCursor(0, 30);
display.println(distance);
display.setCursor(40, 30);
display.println("cm");
display.display();
delay(300);
}
void measure() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(15);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
distance = duration *0.034 / 2; //测距过程
}
#include
#include
#include
#define dataPin 5
dht DHT;
int readData;
float t,h;
Adafruit_SSD1306 display(128, 64);
void setup()
{
delay(100);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setRotation(0);
display.setTextWrap(false);
display.dim(0);
}
void loop()
{
data();
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 10);
display.println("Temp:");
display.setCursor(0, 40);
display.println("Humi:");
display.setCursor(60, 10);
display.println(t);
display.setCursor(60, 40);
display.println(h);
display.display();
}
void data(){
readData = DHT.read11(dataPin);
t = DHT.temperature;
h = DHT.humidity;
delay(2000); //读取DH11数据
}