微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)

这篇具有很好参考价值的文章主要介绍了微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、搭建环境

1、esp8266NodeMcu(cp2102)驱动安装

 2、为esp8266NodeMcu搭建Arduino开发环境

3、安装PubSubClient库

二、编写代码


上一篇文章微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(一)介绍了onenet平台注册及设备连接,接下来介绍,如何使用Arduino IDE编写代码,控制esp8266,使用MQTT协议与onenet平台进行数据交互。关于MQTT协议,可参考太极创客的教程,非常详细。零基础入门学用物联网 – MQTT基础篇 – 目录 – 太极创客

一、搭建环境

1、esp8266NodeMcu(cp2102)驱动安装

下载地址:CP210x USB 至 UART 桥 VCP 驱动器 - 芯科科技

解压缩后安装驱动,根据自己电脑系统选择安装文件,我安装的是64位驱动。

微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)

安装后,使用usb数据线连接8266,然后打开设备管理器,查看端口(我的端口为com5)。

 微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)

 2、为esp8266NodeMcu搭建Arduino开发环境

Arduino IDE下载地址:国外官网   或者 太极创客百度网盘 请输入提取码0ig4

打开“文件”-“首选项”

微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)

在Arduino IDE的“首选项”对话框中找到“附加开发板管理网址”,复制网址:

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

然后点击“好”

微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)

 打开Arduino IDE的“开发板管理器”

微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)

 微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)

 安装时间比较长,也可以取消安装,然后去网盘下载: https://pan.baidu.com/s/1b0vs8SG5pCAji7MrsE3Aiw?pwd=ag4s 提取码: ag4s 

安装完毕后,在Arduino IDE的开发板菜单中选中“NodeMCU开发板”

微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)

 设置Arduino IDE的NodeMCU开发板端口微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)

3、安装PubSubClient库

PubSubClient库是一个MQTT库,进行主题的发布与订阅,

打开Arduino,按下图安装,或前往1-6 ESP8266发布MQTT消息 – 太极创客下载。 

微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)

二、编写代码

15年前学过c语言,不过,早都忘光了,调试过程中废了很大劲,勉强可以用。

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>

// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid = "wifi名称";//wifi名称
const char* password = "wifi密码";//wifi密码
//MQTT连接设置
const char* mqttServer = "mqtts.heclouds.com";//onenet 的 域名
//const char *mqtt_server = "183.230.40.96"; //onenet 的 IP地址
const int mqtt_port = 1883;//onenet 的 端口
#define mqtt_devName "d1"//设备名
#define mqtt_pubid "558037"//产品ID
//鉴权信息,即onenet生成的设备连接token
#define mqtt_authorization "version=2018-10-31&res=products%2F558....."

WiFiClient wifiClient;//创建一个WIFI连接客户端
PubSubClient mqttClient(wifiClient);// 创建一个PubSub客户端, 传入创建的WIFI客户端
Ticker tim1; //定时器,用来循环上传数据

void setup() {
  // put your setup code here, to run once:
  pinMode(LED_BUILTIN, OUTPUT);     // 设置板上LED引脚为输出模式
  digitalWrite(LED_BUILTIN, HIGH);  // 启动后关闭板上LED
  Serial.begin(9600);

  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);

  // 连接WiFi
  connectWifi();

  // 设置MQTT服务器和端口号
  mqttClient.setServer(mqttServer, mqtt_port);
  // 设置MQTT订阅回调函数
  mqttClient.setCallback(receiveCallback);
  // 连接MQTT服务器
  connectMQTTServer();
  //定时 每隔10秒发送一次温度数据点
  tim1.attach(10, sendDpData);
}

void loop() {
  // put your main code here, to run repeatedly:
  if (mqttClient.connected()) { // 如果开发板成功连接服务器
    // 保持心跳
    mqttClient.loop();
  } else {                  // 如果开发板未能成功连接服务器
    connectMQTTServer();    // 则尝试连接服务器
  }
}

连接wifi

// ESP8266连接wifi
void connectWifi() {
  WiFi.begin(ssid, password);
  //等待WiFi连接,成功连接后输出成功信息
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi Connected!");
  Serial.println("");
}

连接MQTT服务器

//连接MQTT
void connectMQTTServer() {
  if (mqttClient.connect(mqtt_devName, mqtt_pubid, mqtt_authorization)) {
    Serial.println("MQTT Server Connected.");
    Serial.println("Server Address: ");
    Serial.println(mqttServer);
    //订阅主题
    subscribeTopic();
  } else {
    Serial.print("MQTT Server Connect Failed. Client State:");
    Serial.println(mqttClient.state());
    delay(3000);
  }
}

发布数据,向数据流temperatrue发送数据

//发送数据 向主题发送数据流,即设备数据点上传
void sendDpData() {
  //  payload,需要发送的数据格式
  //  {
  //    "id": 123,
  //    "dp": {
  //        "temperatrue": [{
  //            "v": 30,
  //        }]
  //    }
  //  }
  //将payload转为字符串,传递的参数格式化为浮点数,保留2位小数
  char dataTemplate[] = "{\"id\":123,\"dp\":{\"temperatrue\":[{\"v\":%.2f,}]}}";
  //生成1-100的随机数,作为温度值
  srand((unsigned int)time(NULL));
  int temp = rand() % 100 + 1;
  //  Serial.println("随机数");
  //  Serial.println(temp);
  //发送信息缓冲区
  char msgJson[56];
  //将temp放入dataTemplate,复制给msgJson
  snprintf(msgJson, 56, dataTemplate, (float)temp);

  //设置发布主题
  String topicString = "$sys/558037/d1/dp/post/json";
  char publishTopic[topicString.length() + 1];
  strcpy(publishTopic, topicString.c_str());//将字符串转为字符数组

  // 实现ESP8266向主题发布信息
  if (mqttClient.publish(publishTopic, msgJson)) {
    Serial.println("发布数据点主题:"); Serial.println(publishTopic);
    Serial.println("发布信息:"); Serial.println(msgJson);
  } else {
    Serial.println("Message Publish Failed.");
  }
}

订阅用户发送命令主题

//订阅命令主题
void subscribeTopic() {
  // 建立主题
  String topicString = "$sys/558037/d1/cmd/request/+";
  char subTopic[topicString.length() + 1];
  strcpy(subTopic, topicString.c_str());

  // 通过串口监视器输出是否成功订阅主题以及订阅的主题名称
  if (mqttClient.subscribe(subTopic)) {
    Serial.println("订阅的主题为:");
    Serial.println(subTopic);
  } else {
    Serial.print("Subscribe Fail...");
  }
}

MQTT订阅回调函数,根据用户发送的命令,执行开关灯,及调节灯的亮度

/*
   订阅回调函数,参数固定
   当用户端发送cmd命令后,esp8266进行的回调处理
*/
void receiveCallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("收到的cmd主题 [");
  Serial.print(topic);
  Serial.println("] ");
  //获取主题topic//$sys/558037/d1/cmd/request/b790bdca-5528-4469-8639-7439046bf39a 中的 cmdid 90977789-5c61-4bb9-9387-ba9a676ff9f5
  char cmdStr[strlen(topic) - 27];//声明cmdStr,保存cmdid
  strcpy(cmdStr, topic + 27);//从topic字符串第27个位置开始向后取值

  //输出payload内容
  Serial.print("收到的数据:");
  char payload_char[length + 1];
  memset(payload_char, 0, sizeof(payload_char));
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    payload_char[i] = (char)payload[i];
  }
  Serial.println();
  Serial.println("--------------");

  /*
    判断收到的命令类型
    led 开关灯,led:0关灯,led:1开灯
    bright 调节灯亮度,bright:数字,数字为PWD调节灯的亮度,范围0-1023
  */
  char *dataPtr = NULL;//传递的数据
  char numBuf[10];
  int num = 0;
  dataPtr = strchr((char *)payload_char, ':');//查找冒号
  if (dataPtr != NULL)         //如果找到了
  {
    dataPtr++;//后移一位,指向数据
    while (*dataPtr >= '0' && *dataPtr <= '9')   //循环取出数据
    {
      numBuf[num++] = *dataPtr++;
    }
    //numBuf[num] = 0;
    num = atoi((const char *)numBuf);       //转为数值
    if (strstr((char *)payload_char, "led"))   //搜索"led"
    {
      Serial.println("控制类型led");
      Serial.print("数值:");
      Serial.println(num);
      if (num == 1)               //控制数据如果为1,代表开
      {
        digitalWrite(BUILTIN_LED, LOW);  // 则点亮LED。
        Serial.println("LED ON");
      }
      else if (num == 0)            //控制数据如果为0,代表关
      {
        digitalWrite(BUILTIN_LED, HIGH); // 否则熄灭LED。
        Serial.println("LED OFF");
      }
    }
    if (strstr((char *)payload_char, "bright"))   //搜索"bright"
    {
      Serial.println("控制类型bright");
      Serial.print("数值:");
      Serial.println(num);
      analogWrite(4, num); //GPIO4接Led灯,pwm输出
    }
  }

  //向服务器返回信息,即已收到命令
  sendCmdResponse(cmdStr);

}

向服务器发送确认信息,通知服务器已收到cmd命令信息。文章来源地址https://www.toymoban.com/news/detail-427237.html

//接受到cmd命令后,返回的数据信息
void sendCmdResponse(char* cmdStr) {
  //返回OK
  char responseData[] = "ok";
  //设置主题的模板字符串
  char topicString[] = "$sys/558037/d1/cmd/response/%s";
  //计算发布主题publicTopic需要的字符空间,topicString长度 + cmdStr长度
  int slength = strlen(topicString) + strlen(cmdStr);
  //定义发布主题
  char publicTopic[slength];
  //将topicString和cmdStr进行拼接
  snprintf(publicTopic, slength, topicString, cmdStr);

  // 实现ESP8266向主题发布信息
  if (mqttClient.publish(publicTopic, responseData)) {
    Serial.println("发布命令回复主题:"); Serial.println(publicTopic);
    Serial.println("主题信息:"); Serial.println(responseData);
  } else {
    Serial.println("Message Publish Failed.");
  }
}

到了这里,关于微信小程序+esp8266NodeMcu(cp2102)+onenet物联平台(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP32连接到oneNET云平台,传数据到微信小程序

    学习物联网的同学们在进行毕业设计时都需要面对一个共同的问题:如何使用传感器获取数据并将其上传至云平台,然后通过微信小程序访问云平台数据。在这个过程中,恰巧在课程设计中接触到了ESP32,发现它内置蓝牙和WiFi模块, 这不是天生的上传云平台圣体吗? 因此,

    2024年04月15日
    浏览(42)
  • 使用CH9102F平替ESP32系列下载电路中的CP2102

    乐鑫官方ESP32开发板的外围电路主要包含: USB-UART电路 自动下载电路 RC延迟电路 重启按键 下载按键 电源降压芯片LDO  下面简单介绍一下这些电路的功能。 ESP32的USB-UART电路部分,核心芯片 CP2102 。其作用是将USB接口传入的D+、D-信号转换为串口信号RX、TX以及流控信号RTS、DTR。

    2024年02月07日
    浏览(103)
  • 微信小程序可自定义单片机温湿度阈值(基于esp32c3+onenet+微信小程序)

    ​ 前段时间有个粉丝问我能不能出一个微信小程序调节阈值的教程,我就下班之余在原来的基础上改进一下,因为是修改阈值,这里我就用继电器控制风扇、温度达到一定阈值控制风扇启动来做例子。这个成功了,其他阈值修改都是依样画葫芦啦。 ​ 之前博客 :基于物联网

    2024年02月07日
    浏览(38)
  • 基于物联网的环境调节系统(ESP32-C3+Onenet+微信小程序)

    这个是我最近做的一个课程设计,实时监测室内的温湿度和光照强度,在微信小程序上实时显示监测数据并下发命令控制风扇开关和舵机正反转(从而实现模拟窗帘的开关)。有两种模式控制,一个是手动控制,通过微信小程序远程控制设备开关,一个是设备自动控制,设定温

    2024年02月02日
    浏览(72)
  • 两星期自学:微信小程序+ESP8266实现智能家居控制(1)

    在开始前,我简单的介绍一下我的项目功能和原理。项目功能:支持一键配网、有完整的微信小程序注册登录流程、小程序控制ESP8266、ESP8266读温湿度显示到小程序上、支持50组自定义红外遥控和一键配置米家、天猫精灵。 项目原理:巴法云作为服务器,可以把他理解成一个

    2024年03月15日
    浏览(45)
  • MQTT通讯-使用EMQX将ESP8266与微信小程序通讯

    MQTT MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅范式的“轻量级”消息协议,由IBM发布。MQTT可以在TCP/IP协议族上工作,并且是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。因此,MQTT协议适用于硬件性能低下的远程设备以及

    2024年04月14日
    浏览(36)
  • 微信小程序-MQTT-ESP8266操作SG90开关灯

    本例仅供参考,不进行更新完善。 困难:微信小程序域名限制; ESP8266连接MQTT可参考:HTML Echarts图形统计实时显示DHT11温度(四)_我也不清楚的博客-CSDN博客_vue echarts温度计动态显示温度 ESP8266控制SG90可参考:NodeMcu(ESP8266)控制SG90_我也不清楚的博客-CSDN博客 ESP8266 DNS WEB动态配

    2024年02月12日
    浏览(59)
  • Arduino + ESP8266 NodeMcu(超详细)

            从计算机学院入坑工学院,第一次学习Arduino+ESP8266 NodeMcu( CH340驱动版 )开发板的学习         本着小白上道,才发现各种开源项目和一些包在到处割韭菜,记录一下第一次学习安装遇到的坑 (本次记录所有下载链接和我上传在CSDN上的下载项目全部免费提供

    2023年04月08日
    浏览(48)
  • 01-ESP8266 NodeMCU 物联网开发初识

    Author:teacherXue ESP8266 是 Espressif Systems 生产的 Wi-Fi 片上系统 (SoC)。它非常适合物联网和家庭自动化项目,目前有非常高的市场普及率,还有更加高端的同时支持wifi和蓝牙的双核心芯片ESP32,可以在乐鑫官网查看完整的芯片列表。 ESP8266芯片的技术特性 处理器: L106 32 位 RISC 微

    2024年02月11日
    浏览(49)
  • NodeMCU ESP8266 中断介绍以及使用详解

    今天,我们将学习中断和定时器的相关概念,并且基于NodeMCU ESP8266 12E开发板搭建硬件电路,通过使用中断和定时器实现我们想要实现的功能。 中断在嵌入式开发中是很常见的功能,特别是在单片机的开发中。通常 GPIO 引脚可以接收外部的信号,根据不同的信号类型,可以触

    2024年02月04日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包