利用Arduino UNO与W5500搭建在线温度、湿度、光照检测装置
一、温度和湿度的测量
关于利用Arduino测量温度和湿度的部分可以参考以下博文:
二、光强的测量
光强的检测通过光敏电阻完成,方法是将光敏电阻与一个固定电阻串联,然后将光敏电阻与固定电阻之间的电压输入到Arduino的模拟输入管脚中,通过电压的幅值变化反映出当前光照强度的变化。
光敏电阻的阻值很大,因此为了让光照强度变化时,电压幅值变化更明显,需要接一个阻值较大的电阻,这里选用了1千欧的电阻。
另外,由于光敏电阻的阻值与环境光照强度成反比,即光照越强,光敏电阻越小,因此,将VCC连接在光敏电阻的一侧,而将固定电阻一侧接地,这样光照强度和测量的电压变化趋势也就是一样的了,即模拟输入口(这里选用了A0口)的度数越大,光照越强。
三、网页服务器的搭建
为了让Arduino能够联网,这里用到了W5500以太网模块。
Arduino与W5500的接线方式参看下表
Arduino | W5500 |
10 | CS |
11 | MOSI |
12 | MIOS |
13 | SCK |
RESET | RST |
3.3V | 3V3 |
GND | GND |
注意,用的是3.3V的供电,一开始我用的5V供电,W5500不工作(W5500也提供了5V的供电口,至于为什么不工作,需要往后再研究一下O.O)
接着,需要安装Ethernet2的库,在Arduino IDE中安装Ethernet2的步骤为:工具>管理库...>(搜索W5500,找到Ethernet2库,然后再选择安装即可)
(这里顺便提一下,陌生芯片快速上手的方法,就是直接在Arduino库中搜索响应的芯片型号即可,一般相应的库都会提供一些例程,通过运行例程可以比较方便的了解芯片的使用方法)
编程部分,我的程序是在Ethernet2库中WebServer、Simple DHT库中的DHT11Default和LiquidCrystal库中的HelloWorld的基础上改的,俗称代码的搬运工o( ̄▽ ̄)d
下面是我的程序源码:
// include the library code:
#include <LiquidCrystal.h>
#include <SimpleDHT.h>
// 导入W5500所需要的包
#include <SPI.h>
#include <Ethernet2.h>
int pinDHT11 = 6;
SimpleDHT11 dht11(pinDHT11);
// 设置物理地址和IP
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);
// 建立服务器
EthernetServer server(80);
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 8, en = 7, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
}
void loop() {
int time0=0;
int time1=0;
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
while(1){
time0 = millis()/2000;//隔2000ms测一次温度湿度信息
if (time0!=time1){
time1=time0;
lcd.setCursor(0, 0);
dht11.read(&temperature, &humidity, NULL);
lcd.print(temperature); lcd.print("C");
lcd.setCursor(0, 1);
lcd.print(humidity); lcd.print("H");
}
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("Temperature:");
client.print(temperature);
client.print("C");
client.println("<br />");
client.print("Humidity:");
client.print(humidity);
client.print("%");
client.println("<br />");
client.print("Light intensity:");
client.print(analogRead(0));
client.println("<br />");
client.println("</html>");
break;
}
if (c == '\n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != '\r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
}
}
注意:在使用W5500联网时IP地址需要设置与路由器同一个网段的,不然无法进行通信。
程序中为了避免读取DHT11温度、湿度信息出错的情况(DHT11的温度、湿度读取间隔需大于1s),设置了一个while循环,让程序只有在Arduino运行时间与开机时间或上一次读取时间超过2000ms后才读取一次温度和湿度数据和更新LCD的显示。
以上程序包含了LCD显示(点击蓝字,查看LCD显示的实现方法)部分的内容,如果不需要LCD显示,可以删除对应部分的代码段即可。
程序编译下载到Arduino后,在浏览器输入Arduino的IP,即可查看到环境的温度、湿度、光强信息。
本文来自博客园,作者:逸笔
转载请注明原文链接:https://www.cnblogs.com/1blog/p/15186568.html