使用 ESP8266 WiFi 模块制作简单的物联网项目

ESP8266 是一个成本不到 5 美元的 WiFi 模块。它能使得我们可以将传感器放在网上。(当然 75 美元的 Arduino Yun + 你的每个传感器 - 这也不是不可行的)。目前互联网上有很多关于这个传感器的点子,让人很举。人们做了惊人的工作来破译,这个来自中国的设备,仅仅得到一个模糊的命令结构。似乎有三种使用这个模块的方式:

  1. 使用 AT 命令,在计算机上通过 USB 发送到串行适配器。这对测试和设置非常有用。
  2. 与 Arduino 或任何其他微控制器对接,并使用该板作为外围设备。
  3. 直接对模块进行编程,并使用其 GPIO 引脚与传感器进行通信,因此不需使用第二个控制器。

我已经探索了上面的第 1 点和第 2 点,这是我们要在这里谈论的内容。

步骤1:设置 ESP8266

为了用 ESP8266,要做的第一件事(和任何外星人一样)是建立沟通。为此,您将一个 USB 转 TTL 适配器连接到该模块,并使用串行端口终端应用程序(如CoolTerm)与之通信。连接此模块时要注意的一件事是:该模块工作在 3.3 V 电压上 - 即使串行线路也不应超过此电压。 以下是我连接 ESP8266 的方式:

ESP8266 USB 转 TTL 连线图

在上面的电路中,您可以看到我使用 3.3V 稳压器为电路供电,并在 RX 线路上使用电阻分压器来保持电压。下面的会话使用 CoolTerm。我的主板工作波特率为 9600,因为其固件已经升级到0.9.2.2。您可能需要尝试其他波特率 - 例如115200。

þ<.—Ž.þ...‡,‡.(Š–Š‹‡.‡....û.‡.ÿ
[System Ready, Vendor:www.ai-thinker.com])

现在,您可以发送 AT 命令。您可以在此处看到完整的命令参考(ESP8266)。 首先让我们发送“AT”:

AT


OK

然后,让我们获取固件版本:

AT+GMR

0018000902

OK

现在,我们来看看操作模式(operation mode):

AT+CWMODE?

+CWMODE:3

OK

上面的 3 意味着我们处于 单机(Standalone)+ 接入点(Access Point)模式。 没关系。 现在,让我们做一些有趣的事情。我们列出所有可用的 WiFi 接入点:

AT+CWLAP

+CWLAP:(0,"Cisco15010-guest",-84,"ce:d7:19:0b:80:19",1)
+CWLAP:(4,"TRENDnet",-86,"c8:d7:19:0b:80:19",1)
+CWLAP:(2,"ASingh",-87,"00:25:5e:c5:d1:88",1)
+CWLAP:(4,"HMMA",-66,"80:ea:96:f1:27:7a",11)
+CWLAP:(4,"dlink-30B8",-91,"c8:d3:a3:6e:30:b8",6)
+CWLAP:(4,"Deepak Mullick",-93,"80:a1:d7:77:a1:e4",6)
+CWLAP:(1,"MGMNT",-91,"80:a1:d7:77:a1:e5",6)
+CWLAP:(3,"rajat_linksys",-67,"20:aa:4b:31:43:9d",6)
+CWLAP:(2,"smk385",-89,"00:1f:33:bc:02:f6",6)
+CWLAP:(4,"Apoorv",-91,"ec:1a:59:17:53:93",7)
+CWLAP:(3,"AkhIshir",-88,"08:60:6e:cb:63:b0",11)
+CWLAP:(2,"sunil",-77,"94:d7:23:f5:fc:34",9)
+CWLAP:(1,"MGMNT",-77,"94:d7:23:f5:fc:35",9)
+CWLAP:(1,"Tanu",-92,"00:1d:7e:1e:68:4e",11)

OK

然后,让我们连接上我的 WiFi:

AT+CWJAP="HMMA","NOTTELLINGMYPASSWD"


OK

我们检查一下,我们是否真的获得了一个IP地址:

AT+CIFSR

192.168.4.1
192.168.4.10

OK

Whoohoo!我们已经连接上网络了。实际上,我们会在下一节中使用互联网。此外,上述的设置已经存储在模块中。即使您打开和关闭电源,它将自动连接到此网络。

步骤2:Arduino 连接 LM35 温度传感器

现在,我们将模块放在网络上,我们通过创建一个小的物联网(物联网)设备来利用它。我在 ThingSpeak 上写了一篇关于绘制传感器数据的文章。这一次,我会用一个 LM35 温度传感器。我将使用 Arduino Mini Pro 克隆版与 ESP8266 通信。这是 LM35 的样子:

LM35 温度传感器

在如下的代码中,我使用 SoftwareSerial 库与 ESP8266 通信。我使用硬件 Serial 进行调试。(您可以尝试相反的方法。)我也假设 ESP8266 已经设置为连接到WiFi网络:

// esp8266_test.ino
//
// Plot LM35 data on thingspeak.com using an Arduino and an ESP8266 WiFi
// module.
//
// Author: Mahesh Venkitachalam
// Website: electronut.in

#include <SoftwareSerial.h>
#include <stdlib.h>

// LED
int ledPin = 13;
// LM35 analog input
int lm35Pin = 0;

// replace with your channel's thingspeak API key
String apiKey = "T2RJXWQAVXG4ZV39";

// connect 10 to TX of Serial USB
// connect 11 to RX of serial USB
SoftwareSerial ser(10, 11); // RX, TX

// this runs once
void setup() {                
  // initialize the digital pin as an output.
  pinMode(ledPin, OUTPUT);

  // enable debug serial
  Serial.begin(9600);
  // enable software serial
  ser.begin(9600);

  // reset ESP8266
  ser.println("AT+RST");
}


// the loop
void loop() {

  // blink LED on board
  digitalWrite(ledPin, HIGH);   
  delay(200);               
  digitalWrite(ledPin, LOW);

  // read the value from LM35.
  // read 10 values for averaging.
  int val = 0;
  for(int i = 0; i < 10; i++) {
      val += analogRead(lm35Pin);   
      delay(500);
  }

  // convert to temp:
  // temp value is in 0-1023 range
  // LM35 outputs 10mV/degree C. ie, 1 Volt => 100 degrees C
  // So Temp = (avg_val/1023)*5 Volts * 100 degrees/Volt
  float temp = val*50.0f/1023.0f;

  // convert to string
  char buf[16];
  String strTemp = dtostrf(temp, 4, 1, buf);

  Serial.println(strTemp);

  // TCP connection
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += "184.106.153.149"; // api.thingspeak.com
  cmd += "\",80";
  ser.println(cmd);

  if(ser.find("Error")){
    Serial.println("AT+CIPSTART error");
    return;
  }

  // prepare GET string
  String getStr = "GET /update?api_key=";
  getStr += apiKey;
  getStr +="&field1=";
  getStr += String(strTemp);
  getStr += "\r\n\r\n";

  // send data length
  cmd = "AT+CIPSEND=";
  cmd += String(getStr.length());
  ser.println(cmd);

  if(ser.find(">")){
    ser.print(getStr);
  }
  else{
    ser.println("AT+CIPCLOSE");
    // alert user
    Serial.println("AT+CIPCLOSE");
  }

  // thingspeak needs 15 sec delay between updates
  delay(16000);  
}

在上面的代码中,我读取模拟引脚来计算温度,并通过 GET 请求将该信息发送给 ThingSpeak 的频道(channel)。随后,你就可以在 ThingSpeak 上看到温度曲线。

步骤3:总结

我认为这个模块是非常有价值的,也是将传感器放在互联网上的非常实用的方式。尽管这个模块可以直接编程,但是由于可以轻松地使用它,所以我可能会将其用作外设。

1 人评价

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.