Arduino连接ESP8266实现联网功能

您所在的位置:网站首页 路亚用什么钩饵最好 Arduino连接ESP8266实现联网功能

Arduino连接ESP8266实现联网功能

2023-08-30 22:57| 来源: 网络整理| 查看: 265

目录

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 #include #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 //导入JSON库,用来封装发送数据的格式 #include //导入温湿度传感器库 #include //控制舵机的库 StaticJsonDocument sendJson; // 创建JSON对象,用来存放发送数据 StaticJsonDocument 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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3