利用Arduino UNO与W5500搭建在线温度、湿度、光照检测装置

一、温度和湿度的测量

关于利用Arduino测量温度和湿度的部分可以参考以下博文:

利用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,即可查看到环境的温度、湿度、光强信息。

 

posted @ 2021-07-17 17:16  逸笔  阅读(955)  评论(0编辑  收藏  举报