arduino+esp8266+onenet+mqtt_通过网页控制 ESP8266 模块 LED

前言

嵌入式系统课程的期末设计项目是基于 ESP8266 模块的,在上个月月初的时候,老师给每个同学发放了一个 ESP8266 模块。当时还没对 ESP8266 模块进行深入探索。因为在课程中老师没有讲解过关于 ESP8266 模块的开发,期末设计需要完全依靠我们自己进行摸索,而且悲剧的是,我并没有杜邦线、面包板、传感器等基本元器件,所以仅凭一块小板子进行物联网相关功能的开发有些困难。不过好在期末设计可以从以下几项中任选一项或多项做:

  • 利用模块的 AD 通道,设计对外部信号进行模拟量采集;
  • 利用模块的 IO 口,设计对 1-wire 总线传感器采集数据;
  • 编制一个网页,在网页上对采集到的信号输出显示;
  • 编制一个网页,通过该网页控制 LED 灯的工作状态;
  • 将采集到的信号传送到手机上,建议使用 MQTT 协议;
  • 通过手机控制 LED 灯的状态,建议使用 MQTT 协议;
  • 在云端建立数据模型和服务,对物联数据进行分析;
  • 用其他方式(如 aduino)搭建物联系统和编程。

在使用 WebREPL 终端进行编程或者默认上传 Python 脚本的方式进行编程和程序调试的话,存在一定的弊端。特别是在 WebREPL,最大的缺点是代码不能复制,需要逐行输入。这样一来,如果输入一个很长的循环语句,且存在代码缩进,最终提示执行错误的话,又需要花费很长的时间重新编写。在大一的「电子工程训练」课程中,我接触过 Arduino 的开发,基本的操作还未忘记。因此我就考虑使用 Arduino IDE 编程,编制一个网页,通过该网页控制 LED 灯的工作状态。Arduino IDE 需要使用 C/C++ 语言编程,因此就和 MicroPython 没有什么关系了。

正文

配置

首先在 Arduino 官网下载编译器。打开编译器后,点击菜单栏中的「文件」菜单,进入「首选项」设置。

32e070cfaeb043fc0218237e3763a9a1.png

在附加开发板管理器网址汇总添加有关 ESP8266 的内容:

http://arduino.esp8266.com/stable/package_esp8266com_index.json>

然后进入「工具」菜单,在「开发板」中选择进入「开发板管理器」,搜索 esp8266 并下载安装。

fb471fea805ea3e6931e70b285b26893.png

接着将开发板接入计算机。因为我是用的是 NodeMCU 开发板,如下图所示,在工具菜单中的「开发板」一栏选择的是 NodeMCU1.0(ESP-12E),「端口」一栏选择开发板接入的端口,我这里是 COM3。

为了验证当前设置是否正确,可以在「文件」菜单的「示例」中找到有关 ESP8266 的例程,比如控制 LED 闪烁的 Blink 程序,编译上传,成功运行则证明设置正确。

749bac6146b7955983f11724406b2b06.png

编程

首先编写一个简单的网页。设置两个超链接,一个控制 LED 点亮,链接跳转至 /gpio/0,一个控制 LED 熄灭,链接跳转至 /gpio/1。再添加一个状态显示区域,显示当前 LED 的亮灭情况,具体的网页画面如下图所示(图中遮盖了个人信息)。

6c11fdec90a433d8fbaca22a82ab9798.png

在程序中,需要将该网页存放进一个字符串中:

String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n\r\n\r\n

状态:"

;
s += ""Content-Type"" content=""text/html; charset=utf-8"" />";
s += (val)?"LED 已关闭":"LED 已开启";
s += "

开启 LED

关闭 LED

  嵌入式系统与应用课程设计

\n";

程序的运行步骤是,先连接手机提供的热点,通过 ID 和密码进行连接,得到一个固定的 IP 地址。我们需要用这个 IP 地址来访问设计的网页。完整的程序如下所示,经编译测试,功能运行良好。

#include 

const char* ssid = ""; // 替换为自己的热点 ID
const char* password = ""; // 替换为自己的热点密码
 
// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);
 
void setup() {
    Serial.begin(9600);
    delay(10);

    // prepare GPIO2
    pinMode(2, OUTPUT);
    digitalWrite(2, 0);
 
    // Connect to WiFi network
    Serial.println();
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);

    WiFi.begin(ssid, password);
    struct ip_info info;
        IP4_ADDR(&info.ip,192,168,43,119); //替换为自己的热点 IP
        IP4_ADDR(&info.gw,192,168,43,1); //替换为自己的热点网关 IP
        IP4_ADDR(&info.netmask,255,255,255,0);
        wifi_station_dhcpc_stop();
        wifi_set_ip_info(STATION_IF,&info); //设置 sta 模式的 IP
 
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connected");

    // Start the server
    server.begin();
    Serial.println("Server started @ ");

    // Print the IP address & instructions
    Serial.println(WiFi.localIP());
    Serial.println("To control GPIO, open your web browser.");
    Serial.println("To set GPIO 0 high, type:");
    Serial.print(WiFi.localIP());
    Serial.println("/gpio/1");
    Serial.println("To set GPIO 0 low, type:");
    Serial.print(WiFi.localIP());
    Serial.println("/gpio/0");
    Serial.println("To toggle GPIO 0, type:");
    Serial.print(WiFi.localIP());
    Serial.println("/gpio/0");
}

void loop() {
    // Check if a client has connected
    WiFiClient client = server.available();
    if (!client) {
        delay(100);
        return;
    }

    // Read the first line of the request
    String req = client.readStringUntil('\r');
    Serial.println(req);
    client.flush();

    // Match the request
    int val;
    if (req.indexOf("/gpio/0") != -1)
        val = 0;
    else if (req.indexOf("/gpio/1") != -1)
        val = 1;
    else if (req.indexOf("/gpio/4") != -1)
        val = (!digitalRead(0)); // <<<<else {
        Serial.println("invalid request");
        client.print("HTTP/1.1 404\r\n");
        client.stop();return;
    }// Set GPIO2 according to the request
    digitalWrite(2, val);
    client.flush();// Prepare the response
    String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n\r\n\r\n

状态:"

;
    s+=""Content-Type"" content=""text/html; charset=utf-8"" />";
    s += (val)?"LED 已关闭":"LED 已开启";
    s += "

开启 LED

关闭 LED

GuanQirui 嵌入式系统与应用课程设计

\n";// Send the response to the client
    client.print(s);
    delay(1);  
    Serial.println("Client disonnected");// The client will actually be disconnected // when the function returns and 'client' object is detroyed

推荐阅读

  • 处在风口浪尖的浙大

  • 非同凡想

  • 一种简单的 OCT 视网膜图像分割方法

  • 一次对优秀毕业生的采访

  • 对北方的眷恋

c90e2a0e34f1bddb31b53ec562e7f2b7.png

微信号:荷戟独彷徨

博客:https://guanqr.com

爱光学,爱生活,爱创造

点击「阅读原文」即可进入我的博客

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ESP8266可以通过MQTT协议连接OneNet平台。具体步骤如下: 1. 注册OneNet账号并创建设备,获取设备ID和API Key。 2. 下载并安装Arduino IDE,安装ESP8266开发板支持。 3. 在Arduino IDE中安装PubSubClient库,该库可以实现ESP8266MQTT服务器的通信。 4. 编写ESP8266的程序,包括WiFi连接和MQTT连接部分。在MQTT连接部分,需要设置MQTT服务器地址、端口号、设备ID和API Key等参数。 5. 将程序上传到ESP8266开发板中,启动设备并连接到WiFi网络。 6. 在OneNet平台上创建数据流,并将数据流与设备关联。 7. 在ESP8266的程序中,通过PubSubClient库实现数据的发布和订阅,将设备采集的数据发送到OneNet平台。 以上是ESP8266通过MQTT连接OneNet平台的基本步骤,具体实现过程需要根据具体情况进行调整。 ### 回答2: ESP8266是一款资源占用较少、平台支持丰富的物联网芯片,而MQTT是一种轻量级的通信协议,被广泛应用于物联网领域。OneNet是中国移动物联网推出的云平台服务,提供物联网数据存储、应用管理等功能。在实际应用中,如何通过MQTT连接ESP8266OneNet是非常重要的。 首先,需要在OneNet平台上创建设备和数据流。具体步骤如下: 1. 登录OneNet平台,点击“创建产品”; 2. 输入产品名称、编码、设备数量等信息,点击“下一步”; 3. 在设备信息页面,填写设备名称、描述信息、设备类型等,点击“下一步”; 4. 在数据流信息页面,填写数据流名称、数据类型、单位等,点击“创建产品”。 接下来,需要使用MQTT协议连接OneNet平台和ESP8266。具体步骤如下: 1. 安装MQTT客户端,例如Eclipse Paho MQTT客户端; 2. 在ESP8266编写程序,包括WIFI连接和MQTT连接两部分。WIFI连接可使用ESP8266 Wi-Fi库实现,MQTT连接可使用PubSubClient库实现(通过Arduino IDE添加库); 3. 在程序中,需要填写OneNet平台的设备CCID、MQTT地址、端口、设备Token等信息; 4. ESP8266通过MQTT协议与OneNet平台建立连接,可以发布数据流或订阅数据流等操作。 总体来说,ESP8266通过MQTT连接OneNet平台需要以下步骤:创建OneNet设备和数据流、使用MQTT客户端连接OneNet平台、在程序中填写必要信息、建立连接并实现数据传输。在实际应用中,需要根据需求不断优化代码并进行测试。 ### 回答3: ESP8266是一款极具性价比的物联网芯片,它的开发板价格低廉,拥有丰富的GPIO和ADC输入输出口,可以与各种传感器和执行器进行交互。而MQTT作为一种轻量级的物联网协议,其传输数据的效率高、占用的带宽少,在物联网应用中得到了广泛的应用。而OneNet云平台则提供了云端数据存储与管理、远程控制等服务,是物联网开发的重要工具之一。 将ESP8266OneNet云平台结合起来,可以实现各种智能化的控制和响应,例如远程控制家中的灯光、监控室内温湿度等。 实现ESP8266通过MQTT连接OneNet云平台主要分为以下几个步骤: 1.注册OneNet账号、创建设备和数据流 在OneNet账号中创建设备,拥有特定的设备ID和API Key。同时,需要在设备中创建对应的数据流,例如温度、湿度等,将来ESP8266采集的数据会通过MQTT协议传输到这些数据流中。 2.配置ESP8266开发板 需要先将ESP8266与电脑连接,配置Wi-Fi和Arduino IDE环境,下载并导入MQTT库等工作。这些步骤可以参考ESP8266的官方文档或者开发者社区中的资料。 3.实现MQTT传输协议 在ESP8266中可以利用MQTT库实现数据的传输,该库提供了MQTT协议的相关接口函数,例如连接OneNet平台、订阅和发布数据流、解析回调函数等。需要在代码中填写OneNet平台分配的设备ID、API Key和数据流等信息。 4.测试与调试 在ESP8266OneNet平台完成MQTT连接和数据传输后,可以通过OneNet控制台观察数据流的变化,验证ESP8266的数据采集和传输功能是否正常。如果有问题,需要检查代码中的配置信息、MQTT协议的回调函数等。 同时,为了节约电量和延长ESP8266的寿命,可以采用低功耗模式、深度睡眠模式等技术来优化ESP8266的电源管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值