软件开发人员从0到1实现物联网项目:初步实现智能开关

前言

智能开关技术调研之后,就立刻在网上买了相关的设备进行验证。由于缺乏物联网相关知识,从购买设备到实现功能的过程踩了不少坑。遂特此记录,希望能够为和我一样在物联网道路上摸索的小伙伴们提供一些参考。

遇到的坑

设备的坑

在买设备之前已经了解过,实现一个远程控制开关需要用到继电器和ESP8266,相关的远程控制代码需要一个烧录器烧到ESP8266芯片上。在某宝上一番了解后就在一家店铺购买一个继电器,一个ESP-01S模块,还有一个烧录器。

设备到手后立刻去安装开发环境准备开发,不出意外的话要出意外了。两个意外:

  1. 继电器连线端子的螺丝口太小了,宽度只有2mm(见图),一般家用的螺丝刀都没办法使用。

  2. 竟然没有连接继电器的线!!!这个属实没有想到。

于是乎,购买了2mm的一字螺丝刀和arduino uno开发板套件。

列一下设备清单:

  1. 一个ESP-01S模块。
  2. 一个ESP-01S专用继电器模块。
  3. 一把2mm的一字螺丝刀。
  4. arduino uno开发板套件。

驱动的坑

在代码烧录的时候,报了个错A fatal esptool.py error occurred: Failed to write to target RAM (result was 0107)

大家都知道,新人在遇到问题的时候很懵逼的,根本无从下手。好在一位博友的解答下,问题才得以解决。@Grayson_Zheng

这个问题和烧录器芯片有关系,我按照教程安装的是cp210驱动。在博友的解答下,才得知我购买的烧录器芯片是CH9102F,这个型号大家可以在烧录器上看到。

不过芯片上的字体太小了,如果不是我这5.3的眼睛,根本看不清。

下载CH9102F驱动后,成功烧录。比个耶

搭建开发环境

基于ESP8266开发远程控制开关(有多种选择),需要搭建ESP8266开发环境以及开发工具,这里使用Arduino IDE作为开发工具。

Arduino + ESP8266 开发环境搭建网上一大堆,我这里就不多赘述了。

我是mac电脑,是跟着这个教程搭建的开发环境,大家可以参考一下。不过需要注意上面遇到的坑(驱动问题)。

实现远程控制开关

开发环境搭建完成后,就可以打开Arduino IDE使用C语言进行编程了,此时会看到setup() loop() 这两个函数。

从软件开发的角度来看:

  • setup() 就相当于main函数,通常在程序启动时做一些初始化配置。这里可以理解成为:在硬件设备通电后立即执行一次。
  • loop() 则是在setup() 运行完后不断地循环运行。

代码编写

要实现远程控制,那么设备就需要联网,然后接收命令进行控制。

所以在setup() 中要做以下几件事:

  1. 连接Wi-Fi。
  2. 设置控制设备的端口(也叫数字引脚)。这里就是ESP-01S模块的GPIO0端口,最终会通过GPIO0来控制继电器是否通电。
  3. 设置设备的通讯方式。这里基于TCP协议和设备进行通讯。
c 复制代码
#include <ESP8266WiFi.h>

#define RELAY 0    // ESP-01S模块的GPIO0端口

const char *ssid = "WiFi SSID";    // 设备要连接的Wi-Fi名称
const char *password = "WiFi password";    // 设备要连接的Wi-Fi密码

WiFiServer server(80);

//硬件通电后自动执行一次
void setup()
{
    pinMode(RELAY, OUTPUT);    //设置GPIO0端口为输出模式
    digitalWrite(RELAY, LOW);    //初始化继电器为关闭状态  
    WiFi.begin(ssid, password); //进行WiFi连接
    server.begin();//启动一个Web服务器,监听80端口
}

到这里Web开发人员应该就很熟悉了。Web服务器启动成功后,就可以接收参数,然后根据参数对GPIO0端口进行高电压、低电压的输出,从而达到远程控制的效果。

这些代码在 loop() 进行编写,关键代码如下。

c 复制代码
//setup()执行完成后循环执行该函数
void loop()
{
    WiFiClient client = server.available();
    if (!client)
        return;
    String request = client.readStringUntil('\r');
    client.flush();
    if (request.indexOf("/RELAY=ON") != -1) {
        digitalWrite(RELAY, LOW);//低电压关闭
    }
    if (request.indexOf("/RELAY=OFF") != -1) {
        digitalWrite(RELAY, HIGH);//高电压通电
    }

}

完整的代码如下

c 复制代码
#include <ESP8266WiFi.h>

#define RELAY 0    //connected to GPIO0

const char *ssid = "xxx";    // Enter your router or WiFi SSID here
const char *password = "xxx";    // Enter your router or WiFi password here

WiFiServer server(80);

void setup()
{
    Serial.begin(115200);
    pinMode(RELAY, OUTPUT);    //Set GPIO0 to output mode.
    digitalWrite(RELAY, HIGH);    //Set the GPIO0 output level to high.

    /* Connect to the WiFi network. */
    Serial.println("");
    Serial.print("Conneting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED) {     // If the connection to WiFi fails, retry every 500 milliseconds.
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.println("WiFi connected.");

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

    /* Output of the IP address. */
    Serial.print("Use this URL to connect: ");
    Serial.print("http://");
    Serial.print(WiFi.localIP());
    Serial.println("/");
}

void loop()
{
    /* Check whether a user has established a connection. */
    WiFiClient client = server.available();
    if (!client)
        return;

    /* Wait until the user sends data. */
    Serial.println("new client.");
    while (!client.available())
        delay(1);

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

    /* Assignment of the request. */
    int value = HIGH;
    if (request.indexOf("/RELAY=ON") != -1) {
        Serial.println("RELAY=ON");
        digitalWrite(RELAY, LOW);
        value = LOW;
    }
    if (request.indexOf("/RELAY=OFF") != -1) {
        Serial.println("RELAY=OFF");
        digitalWrite(RELAY, HIGH);
        value = HIGH;
    }

    /* Return the answer. */
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("");
    client.println("<!DOCTYPE HTML>");
    client.println("<html>");
    client.println("<meta name='viewport' content='width=device-width, inital-scale=1'>");
    client.println("<head><title>ESP8266 RELAY Control</title></head>");
    client.println("<style>");
    client.println("* {text-align: center; font-family: Conso-las;}");
    client.println("");
    client.println(".container {position: absolute; top: 45%;");
    client.println("left: 50%; transform: translateX(-50%) translateY(-50%);}");
    client.println("");
    client.println(".inner {font-size: 40px;}");
    client.println("");
    client.println("a {display: inline-block; width: 300px; height: 100px;");
    client.println("color: #FFFF00; background-color: #275C6B;");
    client.println("margin-top: 20px; padding: 10px 20px;");
    client.println("text-decoration: none; border-radius: 5px;");
    client.println("font-weight: 800; font-size: 70px;}");
    client.println("</style>");
    client.println("<div class='container'>");
    client.println("<div class='inner'>");
    client.print("RELAY if now: ");

    if (value == HIGH)
        client.print("OFF");
    else
        client.print("ON");

    client.println("<br>");
    client.println("<a href=\"/RELAY=OFF\">OFF</a>");
    client.println("<a href=\"/RELAY=ON\">ON</a>");
    client.println("<style>");
    client.println(".footer-text { font-size: 25px; }");
    client.println(".bold-text { font-weight: bold; }"); 
    client.println("</style>");
    client.println("<div class='footer'>");
    client.println("<p class='footer-text'>This software was written by <span class='bold-text'>Grayson Zheng</span>.</p>");
    client.println("</div>");
    client.println("</div>");
    client.println("</html>");
    client.println("");
}

代码烧录

代码烧录就是通过烧录器将刚才的代码烧写到ESP-01S模块的芯片上,这样ESP-01S模块在通上电后就可以执行代码了。

烧录时只需要将ESP-01S插入烧录器中(下图左),烧录器连接电脑USB,然后在Arduino进行上传(下图右)即可。

烧录完成后,复位 ESP-01S,通过串口监视器可以查看ESP-01S 的 IP 地址。

此时在浏览器上输入该IP,出现下图页面意味着烧录成功

效果演示

最后,将ESP-01S模块连接继电器,在页面上进行操作就会看到这样的效果

视频链接

大功告成!!!

更详细的实现教程可以移步ESP8266 系列------ESP-01S 控制继电器模块

小结

目前只是初步验证了局域网内的远程控制开关,后期会将该功能逐步完善。待完善事项:

  1. 添加权限机制,只有授权用户才能控制开关。
  2. 支持MQTT通信协议,接入云厂商。
  3. 接入逆变器,使得继电器电源端可以连接交流电。
  4. 3D打印智能开关外壳。
相关推荐
中科岩创10 小时前
中科岩创边坡自动化监测解决方案
大数据·网络·物联网
Rinai_R11 小时前
计算机组成原理的学习笔记(7)-- 存储器·其二 容量扩展/多模块存储系统/外存/Cache/虚拟存储器
笔记·物联网·学习
老刘莱国瑞12 小时前
STM32 与 AS608 指纹模块的调试与应用
python·物联网·阿里云
三月七(爱看动漫的程序员)18 小时前
HiQA: A Hierarchical Contextual Augmentation RAG for Multi-Documents QA---附录
人工智能·单片机·嵌入式硬件·物联网·机器学习·语言模型·自然语言处理
安科瑞刘鸿鹏18 小时前
老旧小区用电安全保护装置#限流式防火保护器参数介绍#
运维·服务器·物联网·能源
委员21 小时前
基于NodeMCU的物联网电灯控制系统设计
单片机·物联网·嵌入式·nodemcu··lu_asr01·gy-302
逝灮1 天前
【蓝桥杯——物联网设计与开发】基础模块8 - RTC
stm32·单片机·嵌入式硬件·mcu·物联网·蓝桥杯·rtc
Amarantine、沐风倩✨1 天前
设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
java·物联网·音视频·webrtc·html5·视频编解码·七牛云存储
撞上电子2 天前
蓝桥杯物联网开发板硬件组成
物联网·职场和发展·蓝桥杯
lsalp2 天前
OpenAI于2024年12月21日在GitHub上正式发布了实时嵌入式SDK。支持ESP32-S3
物联网·github·esp32-s3