Arduino连接ESP8266实现联网功能

2023-05-16

目录

1.前期准备

2.ESP8266代码

 3.Arduino代码

4.易联智能


        由于自己是物联网工程专业的学生,所以对于一些单片机等硬件都必须要有一些了解,接着这次做课设的机会,我打算将自己的这次做课设的经验记录下来,以便于以后自己的CV。万一以后需要用到这些,而自己又忘记了,因为我并不打算走硬件这条路。做好记录,以备不时之需。

        首先是使用Arduino连接各种所需要的传感器,例如:温湿度、光照、等等。这些感觉还是比较简单的,只需要搞清楚所用传感器的引脚该如何去连接,一般情况如下:

VCC——正极

GND——负极

DO——(连接一个数字引脚,Arduino为2~13)

AO——(连接一个模拟引脚,Arduino为A0~A5)

其他的大部分能够在网上找到相关教程,这里就不多讲了。

1.前期准备

        首先我们需要准备一个8266模块和一个下载器。

 下载器

 ESP8266

        需要注意的是,当需要将代码通过下载器下载到ESP8266使,需要进行一些操作,否则会导致下载失败。

将两个短孔短接 ,不然会导致下载失败

随后进行一系列准备工作,

第一步: 

 

 附加网址:https://arduino.esp8266.com/stable/package_esp8266com_index.json

 第二步:相关库下载

        进入工具->开发板->开发板管理器添加esp8266库

        进入工具->管理库添加 pubsubclient 库和 ArduinoJson 库

 

将库安装好以后就可以进行下一步了。 

2.ESP8266代码

        如果你需要使用此代码,只需要修改WIFI账号跟密码以及sub和pub。

建议:

  • sub与pub需要自己去易联智能云平台上去创建一个项目后获取。
  • wifi名称和密码建议修改成自己的手机热点密码,这样更为方便。

特别注意:我使用的是易联智能云平台,这里所说的sub和pub也都是基于此平台而来的。

下面附上相关网址:易联智能物联网平台

该平台相较于其他云平台,使用起来更为简单、比较适合初学者。

        上传至ESP8266的代码:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define BUILTIN_LED 2
char P_NAME[] = " ";           //设置热点名称
char P_PSWD[] = " ";          //设置热点密码
char sub[] = "Sub/100052";    //设置设备SUB名称
char pub[] = "Pub/100052";    //设置设备PUB名称

const char *ssid = P_NAME;
const char *password = P_PSWD;
const char *mqtt_server = "121.5.58.100";
String reStr;
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;

void setup_wifi()
{
  delay(10);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
  }
  randomSeed(micros());
}

void callback(char *topic, byte *payload, unsigned int length)
{
  for (int i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect()
{
  while (!client.connected())
  {
    String clientId = "ESP8266Client";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str()))
    {
      client.publish(pub, "{\"State\":\"OnLine\"}");
      client.subscribe(sub);
    }
    else
    {
      Serial.print(client.state());
      delay(5000);
    }
  }
}

void setup()
{
  pinMode(BUILTIN_LED, OUTPUT);
  Serial.begin(9600);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  digitalWrite(BUILTIN_LED, HIGH);
}

void loop()
{

  if (!client.connected())
  {
    reconnect();
  }
  client.loop();
  if (Serial.available() > 0)
  {
    reStr = Serial.readStringUntil('\n');
    //检测json数据是否完整
    int jsonBeginAt = reStr.indexOf("{");
    int jsonEndAt = reStr.lastIndexOf("}");
    if (jsonBeginAt != -1 && jsonEndAt != -1)
    {
      reStr = reStr.substring(jsonBeginAt, jsonEndAt + 1);
      int str_len = reStr.length() + 1;
      char char_array[str_len];
      reStr.toCharArray(char_array, str_len);
      client.publish(pub, char_array);
    }
  }
}

 3.Arduino代码

        这个就没啥好讲的了,但有些连线需要提一下

ESP8266连接Arduino:

        3V3——3.3V

        EN——3.3V

        GND——负极

        RX——连Arduino上的TX

        TX——连Arduino上的RX

        如果没有将RX与TX接反,那么云平台接收不到上传的数据。

        在将Arduino代码上传至Arduino板的时候,一定要将RX和TX拔掉,不然会导致代码无法上传。当年就是这个坑,搞了我一下午,人都搞麻了。。。

        上传时Arduino的代码 :

/*
《智慧寝室例程》
需安装的Arduino库:
  ArduinoJson、DHT sensor library

可实现功能:
  温湿度查看,灯光控制,窗帘控制,火焰检测,空调开关,空调温度设定。

接线:
  温湿度使用DHT11传感器,接10号引脚;
  窗帘舵机连接9号引脚;
  火焰传感器连接8号引脚;
  LED灯连接7号引脚;
  继电器连接6号引脚模拟空调的控制;
  将ESP8266的Rx引脚接在Arduino的Tx上,Tx引脚接在Rx上。但下载代码时需将Rx与Tx的接线移除,否则程序会报错;
*/


#include <ArduinoJson.h>                  //导入JSON库,用来封装发送数据的格式
#include <DHT.h>                          //导入温湿度传感器库
#include <Servo.h>                        //控制舵机的库

StaticJsonDocument<200> sendJson;          // 创建JSON对象,用来存放发送数据
StaticJsonDocument<200> readJson;          // 创建JSON对象,用来存放接收到的数据
unsigned long lastUpdateTime = 0;          //记录上次上传数据时间
const unsigned long updateInterval = 4000; // 在这里设置数据发送至云平台的时间间隔,单位为毫秒

//定义传感器相关的引脚

#define DHTPIN 10                         //定义温湿度传感器引脚为10
#define DHTTYPE DHT11                     //定义温湿度传感器型号为DHT11
#define CURTAIN 9                         //设定舵机(窗帘)的Arduino引脚为9
#define COPEN 10                          //设定舵机的角度,窗帘开启时舵机的角度
#define CCLOSE 100                        //窗帘关闭时舵机的角度
#define FIRE 8                            //设定火焰传感器连接的Arduino引脚为4
#define LED 7                             //设定LED灯引脚为7
#define AIR 6                             //设定继电器(空调)的引脚为6

//定义相关的变量
long ID = 100061;                // 定义设备ID号,替换成云平台生成的ID号
float temperature, humidity;    // 定义温湿度变量
int lightState,fireState,airState,curtainState;     // 定义灯光,火焰,继电器(空调),窗帘状态(0代表无或者关闭,1代表有或者打开)
int airTemperatureSet=26;       // 定义空调的设定温度,默认26度

DHT dht(DHTPIN, DHTTYPE);       //创建dht对象,用于操作温湿度传感器
Servo curtainServo;                  // 创建舵机对象,用来控制窗帘的舵机
// Arduino的初始化函数,仅在通电时运行一次
void setup()
{
  Serial.begin(9600);       //初始化串口,用于和esp8266进行通信,完成数据的接收与上传
  dht.begin();              //初始化温湿度传感器
  curtainServo.attach(CURTAIN);   //初始化9号引脚为舵机引脚
  pinMode(FIRE, INPUT);     //初始化火焰传感器引脚为输入模式
  pinMode(LED, OUTPUT);     //初始化LED灯引脚为输出模式
  pinMode(AIR, OUTPUT);     //初始化继电器(空调)引脚为输出模式
}

// Arduino的loop函数,当setup函数执行完毕后进入该函数并一直循环运行
void loop()
{
  // 该函数段可完成数据定时上报的功能,并且不会阻塞loop函数的运行
  if (millis() - lastUpdateTime > updateInterval) 
  {
    sendJsonData();
    lastUpdateTime = millis();
  }
  // 当用户使用手机控制当前设备时ESP8266会通过串口向Arduino发送指令,该函数段可判断串口有没有接收到消息,并完成对用户消息的解析
  while (Serial.available() > 0) { // 判断串口缓冲区是否有消息
    String inputString = Serial.readStringUntil('\n');  //从串口缓冲区读入数据,并赋值给inputString变量(String变量为Arduino独有变量类型,可以简化字符串操作)

    //检测json数据是否完整,若通过则进行下一步的处理
    /*
      云平台向硬件下发JSON的格式为 {"Light":"1"} 类型的字符串,通常叫键值对,C语言中叫做哈希表。
      左边的"Air"为我们在云平台中定义的标识符,右边为具体的指令
    */
    int jsonBeginAt = inputString.indexOf("{");
    int jsonEndAt = inputString.lastIndexOf("}");
    if (jsonBeginAt != -1 && jsonEndAt != -1)
    {
      inputString = inputString.substring(jsonBeginAt, jsonEndAt + 1);    //净化json数据
      deserializeJson(readJson, inputString);                             //通过ArduinoJSON库将JSON字符串转换为方便操作的对象
      // 判断接收的指令
      if (readJson.containsKey("LightState"))   //判断云平台下发的消息是否包含Light标识符,如果是则进行下一步处理
      {
        digitalWrite(LED, (int)readJson["LightState"]); // 根据Light的值来控制小灯,0为关,1为开,由于是char类型,所以我们需要转换为int
        delay(100);
        lightState = digitalRead(LED);                  // 及时更新小灯的状态信息,这样云平台才能知道是否控制成功
      }
      else if(readJson.containsKey("CurtainState"))  // 若添加了多个功能,则使用else if隔开
      {
        //更新curtain的值
        curtainState = (int)readJson["CurtainState"];
      }
      // 空调开关设定
      else if(readJson.containsKey("AirState")){
        airState = (int)readJson["AirState"];  // 让Arduino中的空调设定值更新为云平台下放的值
      }
      // 空调温度设定
      else if(readJson.containsKey("AirTemperatureSet")){
        airTemperatureSet = (int)readJson["AirTemperatureSet"];  // 让Arduino中的空调设定值更新为云平台下放的值
      }
      delay(500);
      sendJsonData(); //向云平台发送最新的信息
    }
  }
  //判读curtainState的值是否为1,是则让舵机转到开启的角度,否则关闭
  if(curtainState){      
    curtainServo.write(COPEN); 
  } 
  else{
    curtainServo.write(CCLOSE); 
  }
  //判断空调是否为开启的状态
  if(curtainState){      
    // 判断当前室内温度是否低于设定温度,是则触发继电器,否则关闭
    if(temperature<airTemperatureSet){
      digitalWrite(AIR,HIGH);
    }
    else{
      digitalWrite(AIR,LOW);
    }
  } 
  else{
    digitalWrite(AIR,LOW);
  }
  //读取传感器数据
  fireState = digitalRead(FIRE);  //火焰传感器
  // 温湿度传感器
  temperature = dht.readTemperature();
  humidity = dht.readHumidity();
  lightState = digitalRead(LED);  //LED灯状态
}
//上传数值
void sendJsonData()
{
  // 将数据添加到JSON对象中,左边为在云平台中定义的标识符,右边为变量
  sendJson["ID"] = ID;
  sendJson["Temperature"] = temperature;
  sendJson["Humidity"] = humidity;
  sendJson["LightState"] = lightState;
  sendJson["AirState"] = airState;
  sendJson["CurtainState"] = curtainState;
  sendJson["FireState"] = fireState;
  sendJson["AirTemperatureSet"] = airTemperatureSet;
  //将对象转换成字符串,并向ese8266发送消息
  serializeJson(sendJson, Serial);  
  Serial.print("\n");
}

4.易联智能

        易联智能是由安徽工程大学物联网开放创新实验室开发的智能化教学应用物联网平台。其具有零代码开发、MCU 低代码开发等特性,使用户可以快速搭建出属于自己的物联网应用。同时具备开发板等配套设施,供用户进行进一步的学习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arduino连接ESP8266实现联网功能 的相关文章

  • 树莓派入坑笔记

    一 安装树莓派官方操作系统Raspbian stretch步骤 xff1a 准备好SD卡 xff08 大小一般16GB及以上 xff09 准备SD卡的读卡器 准备树莓派的镜像 xff1a 链接 xff1a https pan baidu c
  • yolov5知识笔记

    1 在yolov的同等目录下创建一个自己的数据集文件夹 xff0c 存放自己的数据集 xff08 dataset xff09 xff1b 2 在dataset数据文件夹里 xff08 coco128 xff09 创建 train2017 存
  • Ceph安装步骤2——ceph存储池

    Ceph安装步骤1完成之后 xff0c 即可进行该步骤的操作 本文中以对sas池进行操作为例 一 创建Ceph Pool 1 计算每个池所需要的PG数目 在创建池之前 xff0c 首先需要计算PG数目 xff08 简单来说 xff0c PG
  • scrapy安装笔记并使用

    1 安装方法 xff1a Linux Mac xff1a pip install scrapy windows 简单使用直接pip install scrapy即可 1 pip install wheel 用于安装twisted 2 下载t
  • rosbag库的安装

    Output 1 python3 m pip install bagpy 2 python3 m pip install roslz4 extra index url https rospypi github io simple 1 安装a
  • 下载安装dingding

    百度搜索钉钉官网 xff1a https page dingtalk com wow z dingtalk simple ddhomedownlaod 下载安装包 xff1a com alibabainc dingtalk 1 4 0 20
  • su认证失败

    sudo passwd
  • 2021.12.30遇到的错误:No module named ‘paddle‘

    实际上已经安装了paddlepaddle xff0c 但不知为何又报这个错误 根据提示可知原因为未安装paddle 于是又去安装百度飞桨官网安装paddle 安装命令为 python span class token operator sp
  • 计组第六课

    汇编语言的组成 1 汇编指令 xff1a 机器码的助记符 xff0c 有对应机器码 2 伪指令 xff1a 无对应机器码 xff0c 由编译器执行 xff0c 没有对应机器码 3 其他符号 xff1a 如 43 等 xff0c 由编译器识别
  • GitLab秘钥添加

    前提 xff1a 下载Git Bash软件 xff0c 并拥有GitLab账号 1 选择用户主目录 xff08 C 用户 用户名 xff09 下 xff0c 新建一个文件夹 直接修改其文件名为 ssh会提示 必须输入文件名 xff0c 修改
  • C++/C sort函数用法(详细),cmp的构造--一学就会,一用就对

    sort函数 sort是c 43 43 STL标准库中提到的基于快速排序的排序函数 xff0c 在做题的时候使用sort函数很方便 xff0c 使用sort要使用 include 快速排序具有不稳定性 不稳定性是指 xff0c 对于指定区域
  • 远程桌面蓝屏解决办法

    远程桌面蓝屏解决方法 原理 xff1a 重新启动远程桌面进程 操作 xff1a Ctrl Alt End 进入任务管理器 选择expolrer exe结束进程 切换到C盘的Windows目录 运行expolrer exe
  • DPU环境配置

    DPU 型号 xff1a MBF2M516A CEEOT xff08 全高半长 xff08 FHHL xff09 DPU xff09 DPU 类型 xff1a NVIDIA BlueField 2 Ethernet DPU 操作系统 xff
  • s3cmd安装及配置

    一 安装s3cmd 安装命令如下所示 xff1a yum y install python pip pip install s3cmd 二 配置s3cmd 配置s3cmd有两种方式 xff1a 1 使用s3cmd configure方式配置
  • C++中cin输入过程中如何处理ctrl+c输入

    引子 今天在写一个while true 循环程序 xff0c 程序中有用到SetConsoleCtrlHandler函数处理CTRL 43 C输入 xff0c 用到cin输入时不小心按下ctrl 43 c进入了无限循环 xff0c cin不
  • 如果正确修改数据库编码为utf8仍然无法插入中文可以试试用Navicat插入数据

    我的MySQL编码已经修改为utf8 但是仍然无法插入中文数据 如下 这是我的MySQL编码格式 此时插入中文数据就会报错 我的解决办法是使用Navicat插入数据 使用eclipse连接并输出后可以正常执行 lt 64 page lang
  • 如何用LaTeX写一个PPT

    如何用LaTeX写一个PPT 说到写PPT大家一般会想到的是微软的Microsoft PowerPoint xff0c 因为他更易于制作并且拥有丰富的动画 xff0c 但是当你需要制作一个学术相关的ppt时 xff0c 你需要更好的排版以及
  • Ubuntu 22.04图形界面的卸载

    如果你想在 Ubuntu 上卸载图形界面 xff0c 可以按照以下步骤操作 xff1a 进入终端界面 xff1a 按下 Ctrl 43 Alt 43 F3 xff08 或者其他 F1 F6 xff09 可以切换到终端界面 xff0c 然后使
  • 百鸡百钱问题

    我国古代数学家张丘建在 算经 一书中曾提出过著名的 百钱买百鸡 问题 该问题叙述如下 xff1a 鸡翁一 xff0c 值钱五 xff1b 鸡母一 xff0c 值钱三 xff1b 鸡雏三 xff0c 值钱一 xff1b 百钱买百鸡 xff0c
  • 2.【已修复】windows10更新:你的设备中缺少重要的安全和质量修复。

    问题 xff1a 由于自己给笔记本重装Windows10 专业版系统 xff0c 用一段时间后发现系统更新失败 xff0c 更新错误 xff1a 你的设备中缺少重要的安全和质量修复 危 xff1a 电脑有问题先备份资料 解决问题 xff1a

随机推荐

  • Python实现用户注册登录功能

    一 环境 python3 43 vscode 二 文件 xff1a 程序文件 用户 管理员 注册 登陆 py 启动标记文件 flag txt gt 文件内容 xff1a 0 三 程序步骤分块 xff1a 主程序入口 初次启动后 xff0c
  • 5.MySQL建立表的关系(外键)

    目录 1 前言 2 表与表关系 1 一对多关系 2 多对多关系 xff1a 3 一对一关系 3 对表总结 xff1a 4 补充 xff1a 1 修改表 2 复制表 1 前言 1 方法 xff1a foreign key xff1a 外键 外
  • 41.Django之web注册登录修改注销功能实现

    目录 1 django配置步骤 2 django链接数据库 MySQL 3 利用orm创建数据库表 4 django的myweb01项目中的url py添加路由 5 django的app01应用中的views py添加逻辑函数 6 temp
  • 1. 403 错误 html

    目录 1 效果图 2 code 3 使用 1 效果图 2 code lt DOCTYPE html gt lt html lang zh gt lt head gt lt meta charset utf 8 gt lt title gt
  • linux vi/vim命令学习

    一 依据个人理解 xff0c vi和vim主要有以下几点区别 xff1a 1 vim命令编辑脚本时 xff0c 能够检查出一些基本的语法错误 xff0c 比如括号匹配等 xff0c vi命令不具有这一功能 2 一般linux系统安装时都是自
  • 2. 404 错误 html

    目录 1 效果图 2 code 3 使用 1 效果图 2 code lt DOCTYPE html gt lt html gt lt head gt lt meta charset utf 8 gt lt title gt 404 lt t
  • 3. 500 服务器异常 html

    目录 1 效果图 2 code 1 效果图 2 code lt DOCTYPE html gt lt html gt lt head gt lt meta charset utf 8 gt lt title gt 500 lt title
  • 蓝桥杯之单片机学习(三)——共阳数码管的静态显示

    文章目录 一 训练任务二 训练重点三 训练准备3 1 原理图展示3 2 数字对照表3 3 数码管分路3 4 一些解释 四 代码实现注意事项 一 训练任务 在CT107D单片机综合训练平台上 xff0c 8个数码管分别依次显示0 9的值 xf
  • Dockerfile 定制专属镜像|果断收藏

    前言 大家好 xff0c 本文是对 Docker 自定义镜像的详细讲解 xff0c 讲解了如何进行构建自己的 Docker 镜像以及 Dockerfile 的操作指令 希望对大家有所帮助 一 使用 Dockerfile 定制镜像 1 1 D
  • 蓝桥杯python组练题第六天——七段码——蓝桥杯官网题库

    单词分析 题目描述 本题为填空题 xff0c 只需要算出结果后 xff0c 在代码中使用输出语句将所填结果输出即可 不建议写代码 小蓝要用七段码数码管来表示一种特殊的文字 上图给出了七段码数码管的一个图示 xff0c 数码管中一共有 7 段
  • Ubuntu22.04开机网络无法连接,ping不通解决方案

    从前天开始 xff0c 虚拟机不知道为什么开机之后就无法联网 xff0c 也ping不通 xff0c 而且ifconfig显示我只有lo 没有ens33 xff0c 之后就开始找解决方案 失败的方案有很多 xff0c 比如 xff1a 重置
  • 计蒜客 T1096 石头剪刀布--C语言

    计蒜客 T1096 石头剪刀布 题目 石头剪刀布是常见的猜拳游戏 石头胜剪刀 xff0c 剪刀胜布 xff0c 布胜石头 如果两个人出拳一样 xff0c 则不分胜负 一天 xff0c 小 AA 和小 BB 正好在玩石头剪刀布 已知他们的出拳
  • AT89C52流水灯+外部中断INT0+定时器(汇编语言)

    AT89C52流水灯 43 外部中断INT0 43 定时器 xff08 汇编语言 xff09 任务要求 用 AT89S52 单片机控制彩灯 xff08 流水灯 xff09 图形及继电器 即 xff1a AT89S52 单片机上电时控制由发光
  • 【Verilog】通过任务(task)完成3个8bit数据的冒泡排序

    题目 xff1a 设计一个模块 xff0c 通过任务完成3个8位2进制输入数据的冒泡排序 要求 xff1a 时钟触发任务的执行 xff0c 每个时钟周期完成一次数据交换的操作 Verilog代码 xff1a module sort inpu
  • 官网下载JAVA的JDK11版本(下载、安装、配置环境变量)

    目录 前言必读 xff1a 一 下载JDK11 1 先去浏览器搜索 2 选择Products 3 Java 4 往下滑找到Oracle JDK 然后点击 5 往下滑找到Java11 xff0c 再选择自己的操作系统 6 选择exe这个直接安
  • linux命令学习之————ls,pwd,cd,hostnamectl,systemctl

    这几条命令之间没有什么联系 xff0c 随便写写 一 ls命令 1 显示当前目录下所包含的文件或目录名 xff1a ls 2 显示当前目录下所包含的文件或目录的详细信息 xff1a ls l 3 显示当前目录下所包含的文件或目录的详细信息
  • win10系统重装(超简单)

    目录 前言 操作步骤 第一步 xff1a 格式化硬盘 第二步 xff1a 硬盘重新分区 固态硬盘分区 机械硬盘分区 完成效果展示 第三步 xff1a 把ISO镜像文件写入固态硬盘 第四步 xff1a 关机拔u盘 第五步 xff1a 开机重装
  • 字符串中数据的排序

    题目 xff1a 有一个字符串 xff1a 91 27 46 38 50 xff0c 请写程序实现最终输出结果 xff1a 27 38 46 50 91 思路 xff1a 给数据排序 xff0c 我们首先想到的就是数组的排序方法 xff0c
  • Hadoop的shell命令

    Hadoop的shell命令 启动Hadoop常见的shell命令 与Linux系统命令差不多 xff0c 但小部分有区别 帮助命令 help 显示目录信息 ls 创建文件夹 mkdir 删除文件或文件夹 xff08 rm xff09 移动
  • Arduino连接ESP8266实现联网功能

    目录 1 前期准备 2 ESP8266代码 3 Arduino代码 4 易联智能 由于自己是物联网工程专业的学生 xff0c 所以对于一些单片机等硬件都必须要有一些了解 xff0c 接着这次做课设的机会 xff0c 我打算将自己的这次做课设