Arduino与ESP8266实现联网以及需要的库

目录

1.Arduino开发板

2.ESP8266开发板

3.Arduino开发环境

4.Esp8266端代码

5.Arduino端代码

6.为设备添加功能

7.数据调试

8.易联智能


本文主要是在读了物联网工程专业后,在搞毕业论文过程中遇到问题以及解决问题后成功实现联网之后写下这个过程,预防自己以后忘记的同时也给他人一个参考,于是写下来留个记录。

1.Arduino开发板

 准备一个Arduino uno R3的开发板,用于接收各传感器检测的数据。

2.ESP8266开发板

准备一个ESP8266的开发板,用于接收Arduino开发板发送的数据,同时也将此数据同步到易联智能物联网平台,平台再将数据可视化呈现出来。

3.Arduino开发环境

官网下载并安装Arduino idea,官网如下。

Software | Arduino

然后添加ESP8266开发板,方法如下。

打开arduino->文件->首选项->附加开发板管理器网址添加:

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

进入工具->开发板->开发板管理器添加esp8266开发板(我的是已经安装上的)

4.Esp8266端代码

这端的代码主要设置热点名称、热点密码、sub名称、pub名称。

sub名称、pub名称需要打开易联智能物联网平台->智能设备->创建设备后,在设备开发控制台中获取它的sub、pub,界面如下

热点名称、热点密码最好使用手机热点,可以观察是否连接设备。连接手机热点之前,需要把AP频段改为2.4GHz。

在这里需要一个PubSubClient的库,但是Arduino中搜出来的不一定能用,如果搜出来的不能用,就下载我这个来用了,下载链接如下

通过网盘分享的文件:PubSubClient.rar
链接: https://pan.baidu.com/s/1iHa3HuitXWOwU6NgDyPI0g 提取码: 0727

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define BUILTIN_LED 2
char P_NAME[] = "youtao";           //设置热点名称,根据自己的热点名称修改
char P_PSWD[] = "12345678";       //设置热点密码,根据自己的密码修改
char sub[] = "Sub/1014176";    //设置设备SUB名称
char pub[] = "Pub/10141476";    //设置设备PUB名称

const char *ssid = P_NAME;
const char *password = P_PSWD;
const char *mqtt_server = "easyiothings.com";
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);
    }
  }
}

 写好以后 就可以给8266下载代码了,注意:

ArduinoIDE里的开发板要换成ESP8266 MOUDLE。

如果插上数据线之后设备管理器没有显示出端口,那就需要安装一个USB的串口驱动,下载之后双击打开,然后点击安装即可,如下:

通过网盘分享的文件:usb转串口通用驱动.EXE
链接: https://pan.baidu.com/s/1OrjQx1W81UlgK6h6z-WRhw 提取码: 0727

这里的下载只需要用一根数据线连接电脑和ESP8266,然后选择USB对应的端口,查看端口的操作为:右键此电脑——管理——设备管理器——端口。图示如下。

然后就可以在Arduino Idea中选择工具——端口——找到对应USB端口的那个端口号,我这里是COM5。 

以上是WiFi模块的代码,WiFi模块(Esp8266)与Arduino的连线为。

WiFi模块        Arduino

3v3                 3v3

GND               GND

EN                  3v3、VIN

TX                   RX

RX                   TX

以上的3v3的电源可以直接由电脑提供,也可以连接Arduino来供电。

5.Arduino端代码

 Arduino端的代码也需要上传到Arduino开发板中,此处也是一样要用到数据线,电脑上同样是要在设备管理器里面看USB端口号,然后把Arduino Idea中的端口换成开发板的端口就可以进行上传。
注意:

运行代码过程中,RX、TX先不要与arduino上的TX、RX连接,不然会报错,导致上传失败

上传代码成功后,将esp8266的RT、TX与arduino上的TX、RX相连接。

同样,在这里需要一个ArduinoJson的库,但是Arduino中搜出来的不一定能用,如果搜出来的不能用,就下载我这个来用了,下载链接如下:

通过网盘分享的文件:ArduinoJson.rar
链接: https://pan.baidu.com/s/1mdj1X7apjl3dMDJ7P6Wxsg 提取码: 0727

/*
《智慧卧室》
可实现功能:
  温湿度查看,灯光控制,窗帘控制,火焰检测,空调开关,空调温度设定。
*/

#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 = 101476;                // 定义设备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");
}

6.为设备添加功能

需要在易联智能物联网平台中选择自己建好的设备,然后添加相应功能。

注意:

1、增加功能里的标识符要与JSON对象里的数据保持一致

2、需要在云平台显示的数据参数必须封装到JSON对象中

3、控制类型的参数也要封装到JSON对象中

如果不封装,云平台将不会显示数据。

7.数据调试

在设备调试那里选择新建调试,然后随便起一个调试名字,选择要调试的设备,然后设备ID会自动填充,紧接着数据就会上传到云平台中,手机中点击右上角+号,输入设备码就可以添加设备,同时也会同步数据。

手机端可以扫码下载,二维码如下:

8.易联智能

       易联智能是由安徽工程大学物联网开放创新实验室开发的智能化教学应用物联网平台。其具有零代码开发、MCU 低代码开发等特性,使用户可以快速搭建出属于自己的物联网应用。同时具备开发板等配套设施,供用户进行进一步的学习。(可通过访问官网,加入开发者QQ群,群内有专人解答疑问)

        官方网址:易联智能物联网平台
————————————————
版权声明:本文为CSDN博主「Schdust」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_52991090/article/details/122157194

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值