微信小程序-MQTT-ESP8266操作SG90开关灯

本文介绍了如何使用ESP8266连接云平台,如百度云、阿里云等,并通过MQTT协议实现DHT11温度数据的实时上传和LED远程控制。同时,探讨了ESP8266与微信小程序结合时面临的域名限制问题,提供了ESP8266控制SG90舵机的示例,并分享了动态配置网络的方法。通过示例代码,展示了ESP8266作为数据发布者和指令接收者的双重角色,以及如何处理TCP连接和数据交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本例仅供参考,不进行更新完善。

困难:微信小程序域名限制;

ESP8266连接MQTT可参考:HTML Echarts图形统计实时显示DHT11温度(四)_我也不清楚的博客-优快云博客_vue echarts温度计动态显示温度

ESP8266控制SG90可参考:NodeMcu(ESP8266)控制SG90_我也不清楚的博客-优快云博客

ESP8266 DNS WEB动态配网可参考:ESP8266动态网页设置网络连接_我也不清楚的博客-优快云博客_esp8266如何怎样连接公网外网设置

功能可参考:https://bemfa.blog.youkuaiyun.com/article/details/107367547

一、实现效果 

                                                      

  

 

 

二、ESP8266程序:

使用ESP8266连接如百度云、阿里云、华为云、腾讯、巴法云等等,为后续微信小程序配置域名方便,微信小程序无法指定自我本地IP或未经政府官网ICP验证的域名;

//DHT11数据上传+LED远程控制 //不限于DHT11,可以接其他传感器,也可以接多个传感器,这里只是例程
//DHT11数据上传主题temp   //根据自己在控制台命的名字可自己随意修改
//LED灯控制主题light002   //根据自己命的名字可自己随意修改
/*
程序讲解:ESP8266 有两个角色,一个是temp(传感器数据)主题消息的发布者,esp8266往这个主题推送消息,手机app订阅temp主题,就可以收到传感器数据了。
esp8266联网后,订阅light002,手机往这个主题推送消息,esp8266就能收到手机的控制的指令了。
D5  GND  VIN 
*/
#include <ESP8266WiFi.h>
//#include <SimpleDHT.h>
#include <Servo.h>


//服务器地址默认即可
#define TCP_SERVER_ADDR "bemfa.com"
//服务器端口//云端口8344//TCP设备云端口8340
#define TCP_SERVER_PORT "8344"

///****************需要修改的地方*****************///

//WIFI名称,区分大小写,不要写错
#define DEFAULT_STASSID  "ziroom1302"
//WIFI密码
#define DEFAULT_STAPSW "****"
//用户私钥,可在控制台获取,修改为自己的UID
String UID = "****";

//主题名字,可在控制台新建
String TOPIC2  = "light02";  //用于led控制的主题

///*********************************************///
//led 控制函数
void turnOnLed();
void turnOffLed();

//设置上传速率2s(1s<=upDataTime<=60s)
//下面的2代表上传间隔是2秒
// #define upDataTime 2*1000
#define upDataTime 800

//最大字节数
#define MAX_PACKETSIZE 512

//tcp客户端相关初始化,默认即可
WiFiClient TCPclient;
String TcpClient_Buff = "";
unsigned int TcpClient_BuffIndex = 0;
unsigned long TcpClient_preTick = 0;
unsigned long preHeartTick = 0;//心跳
unsigned long preTCPStartTick = 0;//连接
bool preTCPConnected = false;

//相关函数初始化
//连接WIFI
void doWiFiTick();
void startSTA();

//TCP初始化连接
void doTCPClientTick();
void startTCPClient();
void sendtoTCPServer(String p);

/*
  *发送数据到TCP服务器
 */
void sendtoTCPServer(String p){
  if (!TCPclient.connected()) 
  {
    Serial.println("Client is not readly");
    return;
  }
  TCPclient.print(p);
  Serial.println("[Send to TCPServer]:String");
  Serial.println(p);
}


/*
  *初始化和服务器建立连接
*/
void startTCPClient(){
  if(TCPclient.connect(TCP_SERVER_ADDR, atoi(TCP_SERVER_PORT))){
    Serial.print("\nConnected to server:");
    Serial.printf("%s:%d\r\n",TCP_SERVER_ADDR,atoi(TCP_SERVER_PORT));
    String tcpTemp="";
    tcpTemp = "cmd=1&uid="+UID+"&topic="+TOPIC2+"\r\n";

    sendtoTCPServer(tcpTemp);
    preTCPConnected = true;
    preHeartTick = millis();
    TCPclient.setNoDelay(true);
  }
  else{
    Serial.print("Failed connected to server:");
    Serial.println(TCP_SERVER_ADDR);
    TCPclient.stop();
    preTCPConnected = false;
  }
  preTCPStartTick = millis();
}

/*
  *检查数据,发送数据
*/
void doTCPClientTick(){
 //检查是否断开,断开后重连
   if(WiFi.status() != WL_CONNECTED) return;
  if (!TCPclient.connected()) {//断开重连
  if(preTCPConnected == true){
    preTCPConnected = false;
    preTCPStartTick = millis();
    Serial.println();
    Serial.println("TCP Client disconnected.");
    TCPclient.stop();
  }else if(millis() - preTCPStartTick > 1*1000)//重新连接
    startTCPClient();
  }else{
    if (TCPclient.available()) {//收数据
      char c =TCPclient.read();
      TcpClient_Buff +=c;
      TcpClient_BuffIndex++;
      TcpClient_preTick = millis();
      
      if(TcpClient_BuffIndex>=MAX_PACKETSIZE - 1){
        TcpClient_BuffIndex = MAX_PACKETSIZE-2;
        TcpClient_preTick = TcpClient_preTick - 200;
      }
      preHeartTick = millis();
    }
  }
  if((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200))
  {//data ready
    TCPclient.flush();
    Serial.println("Buff");
    Serial.println(TcpClient_Buff);
    //////字符串匹配,检测发了的字符串TcpClient_Buff里面是否包含&msg=on,如果有,则打开开关
    if((TcpClient_Buff.indexOf("&msg=on") > 0)) {
      turnOnLed();
    //////字符串匹配,检测发了的字符串TcpClient_Buff里面是否包含&msg=off,如果有,则关闭开关
    }else if((TcpClient_Buff.indexOf("&msg=off") > 0)) {
      turnOffLed();
    }
   TcpClient_Buff="";//清空字符串,以便下次接收
   TcpClient_BuffIndex = 0;
  }
}
// SG90舵机控制
Servo myServo;  // 定义Servo对象来控制
int pos = 0;    // 角度存储变量
//打开灯泡
void turnOnLed(){
  Serial.println("Turn ON");
  for (pos = 33; pos <= 85; pos ++) { // 33°到85°
    // in steps of 1 degree
    myServo.write(pos);              // 舵机角度写入
    delay(5);                       // 等待转动到指定角度
  } 
}
//关闭灯泡
void turnOffLed(){
  Serial.println("Turn OFF");
  for (pos = 85; pos >= 33; pos --) { // 从85°到33°
    myServo.write(pos);              // 舵机角度写入
    delay(15);                       // 等待转动到指定角度
  }
}
void startSTA(){
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(DEFAULT_STASSID, DEFAULT_STAPSW);
}
/**************************************************************************
                                 WIFI
***************************************************************************/
/*
  WiFiTick
  检查是否需要初始化WiFi
  检查WiFi是否连接上,若连接成功启动TCP Client
  控制指示灯
*/
void doWiFiTick(){
  static bool startSTAFlag = false;
  static bool taskStarted = false;
  static uint32_t lastWiFiCheckTick = 0;
  if (!startSTAFlag) {
    startSTAFlag = true;
    startSTA();
    Serial.printf("Heap size:%d\r\n", ESP.getFreeHeap());
  }
  //未连接1s重连
  if ( WiFi.status() != WL_CONNECTED ) {
    if (millis() - lastWiFiCheckTick > 1000) {
      lastWiFiCheckTick = millis();
    }
  }
  //连接成功建立
  else {
    if (taskStarted == false) {
      taskStarted = true;
      Serial.print("\r\nGet IP Address: ");
      Serial.println(WiFi.localIP());
      startTCPClient();
    }
  }
}
// 初始化,相当于main 函数
void setup() {
  Serial.begin(115200);
  // SG90使用D5接口  
  myServo.attach(14); 
}
//循环
void loop() {
  doWiFiTick();
  doTCPClientTick();
}

<think>好的,我现在需要帮助一位零基础的小白制定一份物联网学习路线。用户之前已经给出了一份详细的分阶段学习路径,但现在需要的是针对完全新手的版本,所以需要简化内容,并且从最基础的知识始。首先,我应该回顾之前提供的物联网学习路径,看看哪些部分适合新手,哪些可能需要调整。 之前的路径分为基础、中级、高阶阶段,每个阶段都有硬件、通信协议、编程等内容。但针对零基础用户,可能需要更循序渐进的步骤,避免使用太多专业术语,并确保每个阶段的知识点容易理解和实践。例如,基础阶段可能需要先介绍什么是物联网,再逐步引入电子元件、基础编程等。 接下来,我需要考虑用户可能的起点。作为小白,用户可能对物联网的概念、硬件、编程都不了解,甚至可能没有接触过电路或代码。所以学习路线应该从最基础的概念始,比如解释物联网的定义、应用场景,然后逐步引导到硬件基础知识,如传感器、微控制器,接着是简单的编程语言,如Python或Arduino,然后是通信协议和云平台的使用。 还要考虑学习资源的选择,确保推荐的是适合新手的教程、平台和工具,比如Arduino和树莓派这样的发板对新手比较友好,同时推荐一些在线课程或社区,帮助用户解决问题。此外,实践项目非常重要,应该设计一些简单的项目,让用户能够动手操作,巩固所学知识,比如环境监测系统或智能家居原型。 需要避免过于复杂的内容,比如在初级阶段可能不需要深入网络层的IPv6或高级加密技术,而是先掌握基本的MQTT协议和HTTP通信。同时,要强调基础的重要性,打好电子基础和编程基础,才能顺利进入更复杂的中级阶段。 可能还需要加入一些学习方法和建议,比如如何制定学习计划,如何利用免费资源,如何加入学习社区等。此外,提醒用户常见误区,比如选择不适合的硬件或协议,帮助他们在学习过程中少走弯路。 最后,确保整个路线结构清晰,分阶段明确,每个阶段的目标、学习内容和推荐资源都一目了然。使用简单的语言,避免技术术语过多,必要时进行解释,并附上实例或项目,增强实用性。</think>### 零基础物联网学习路线(小白友好版) #### 一、认知入门(第1-2周) **1. 理解物联网概念** - **核心定义**:物联网 = 物理设备联网 + 数据交互(如智能手环同步心率$> 100\ \text{bpm}$时报警) - **典型应用**: - 智能家居(温湿度自动调节) - 智慧农业(土壤湿度$< 30\%$自动灌溉) - 可穿戴设备(步数统计$\sum_{day} \geq 10000$步) **2. 建立技术框架认知** - **四层架构模型**: ```mermaid graph TD A[感知层] -->|传感器数据| B(网络层) B -->|WiFi/4G传输| C[平台层] C -->|数据分析| D[应用层] ``` #### 二、基础技能搭建(第1-3个月) **1. 硬件入门** - **必学工具包**: | 工具类型 | 推荐型号 | 学习重点 | |----------------|-------------------|------------------------------| | 发板 | Arduino Uno | 点亮LED(延时$\Delta t=500\ \text{ms}$) | | 传感器 | DHT11温湿度模块 | 串口输出(波特率$9600\ \text{bps}$) | | 执行器 | SG90舵机 | 角度控制(PWM脉宽$500\sim2500\ \mu s$) | - **电路基础**: - 欧姆定律实践:用$V=IR$计算LED限流电阻(如$5V$电源驱动红色LED需串联$220\ \Omega$电阻) **2. 编程初探** - **Arduino C语言**: ```arduino // 第一个物联网程序:温湿度监测 #include <DHT.h> #define DHTPIN 2 DHT dht(DHTPIN, DHT11); void setup() { Serial.begin(9600); // 设置串口波特率 dht.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print("Humidity: "); Serial.print(h); Serial.print("% Temperature: "); Serial.println(t); delay(2000); // 每2秒采集一次 } ``` **3. 通信初体验** - **蓝牙控制案例**: - HC-05模块配对(默认密码$1234$) - 手机APP发送指令控制舵机(如发送角度值$90$) #### 三、系统实践阶段(第3-6个月) **1. 物联网平台接入** - **阿里云IoT平台入门**: - 创建产品(如产品Key:`a1xY6b****`) - 定义物模型(温度属性:float型,单位$^{\circ}\text{C}$) - 设备三元组连接(ProductKey+DeviceName+DeviceSecret) **2. 完整项目实战** - **智能花盆系统**: ```mermaid sequenceDiagram 传感器->>发板: 土壤湿度数据(ADC值=620) 发板->>云平台: MQTT上传数据(QoS1) 云平台-->>手机APP: 微信推送通知(湿度<40%) APP->>发板: HTTP指令启动水泵 ``` **3. 进阶通信协议** - **MQTT协议实践**: - 使用PubSubClient库 - 主题订阅示例:`/device/001/temp` - 保留消息设置(Last Will消息:`status:offline`) #### 四、学习资源推荐 **1. 新手工具包**: ```python # 预算1000元入门套装配置 starter_kit = { "主控板": "Arduino Uno R3(国产版)", "传感器": ["DHT11", "土壤湿度传感器", "光敏电阻"], "通信模块": "ESP8266-01S(WiFi)", "配件包": "杜邦线(20根)+面包板+USB线" } ``` **2. 分阶段学习方案**: | 学习阶段 | 每日投入 | 里程碑项目 | |----------|----------|------------| | 第1个月 | 1小时 | 完成LED流水+串口打印"Hello IoT" | | 第3个月 | 2小时 | 实现温湿度数据微信推送 | | 第6个月 | 3小时 | 搭建完整的智能家居原型系统 | #### 五、避坑指南 **1. 硬件选购原则**: - 优先选择兼容Arduino的模块(标识有`GND/VCC/OUT`引脚) - 避免直接购买树莓派(复杂度$\propto$价格),先用国产ESP32发板 **2. 代码调试技巧**: - 串口调试法:输出关键变量值(如`Serial.println("当前温度:"+String(t))`) - 分模块验证:先单独测试DHT11,再集成到主程序 **3. 学习效率提升**: - 使用**番茄工作法**:25分钟专注学习 + 5分钟休息 - 加入创客社区(如`DFRobot`论坛),提问格式: ``` [问题描述]:我的DHT11始终返回NaN [已尝试方案]:更换引脚/检查接线 [现象截图]:(贴出串口监视器截图) ``` *建议学习路径:先从淘宝购买¥200左右的Arduino入门套件,完成3个基础实验后,逐步添加WiFi/蓝牙模块。每完成一个阶段,可在B站发布作品视频(标签#物联网小白成长记),获得反馈与动力。*
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我也不清楚

有钱的捧个钱场,(~ ̄▽ ̄)~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值