ESP8266+CH340+SG90舵机远程控制开关

因为晚上不想下去关灯,所以打算搞一个可以替代手关灯的操作,最后采用控制舵机的方式实现,物理层面实现远程开关

所需硬件

  • ESP8266
    是一款高性价比、低功耗的wifi模块,主要作用是使设备接入wifi网络,提供 GPIO、UART、SPI、I2C、PWM、ADC 等接口,频率范围2.4GHz–2.5GHz,应用层协议支持http/https、MQTT、WebSocket
  • CH340
    USB转串口,主要作用是程序烧录,使用3.3V/5V逻辑电平,直接连接单片机等嵌入式设备,无需额外电平转换
  • SG90
    PWM信号控制的小型的位置伺服驱动器,主要作用是实现物理操作,这里直接选择了180的就可以
    这里直接购买了以下硬件
  • ESP12F
    板子直接集成了CH340,不用额外布线,直接usb插入电脑即可(如果是安卓micro口,最好买一条usb数据线,因为有的只有充电功能,没有数据传输功能),成本价11

    或者也可以使用ESP-01s,最好用配套的烧录器
  • SG90
    180度的舵机绰绰有余,成本价4.13
  • 若干杜邦线
    最好公对母,公对公,母对母都买单,成本价3.32
  • 5V电源
    因为esp12f板子上的电为3.3v,而sg90舵机的需要5v电压,用3.3v会出现供电不足打滑的清空,需要5v电源为舵机单独供电

所需软件

软件开发

首先检查板子是否正确,可以用示例代码测试一下

#include <ESP8266WiFi.h>


void setup() {
  pinMode(LED_BUILTIN, OUTPUT); // 设置引脚为输出模式
  Serial.begin(115200);    // 初始化串口通信
}

void loop() {
  digitalWrite(LED_BUILTIN, LOW);   // 点亮LED
  delay(1000);                 // 延时1秒
  digitalWrite(LED_BUILTIN, HIGH);  // 熄灭LED
  delay(1000);                 // 延时1秒
}

例程中宏LED_BUILTIN为开发板厂家定义的连接板载LED的引脚,如果您选择的开发板没有定义LED_BUILTIN,可以自行修改为您要使用的引脚
编译并上传程序到esp8266开发板,打开串口调试器,如果按照代码编写的要求,led灯开始闪烁,表名代码没问题,

/*
* 网址:https://www.bmobapp.com
* wechat:18102215493
*/

// 加载WIFI头文件
#include <ESP8266WiFi.h>
// 加载MQTT库文件
#include <PubSubClient.h>

// 你的WIFI名称,需要修改
const char* WIFI_SSID = "kelike";
// 你的WIFI密码,需要修改
const char* WIFI_PASSWORD = "kelike888";
// Bmob云的物联网地址
const char* MQTT_SERVER = "broker.codenow.cn";
// Bmob云的物联网端口
const int MQTT_PORT = 1883;
// 灯光引脚
const int LED = 2;
// 用户名,到Bmob云->创建的应用-> IOT -> 连接信息 中获取
#define APPID  "c137a89bda5c4f1c"
// 密码,到Bmob云->创建的应用-> IOT -> 连接信息 中获取
#define APPPASSWORD "8bd9088034704e0d"
// 你自己定义的设备类型,方便记忆就好,这里的LINE表示灯光的意思
#define TYPE  "LINE"

WiFiClient espClient;
PubSubClient client(espClient);

// 打开灯泡
void turnOnLed() {
  Serial.println("打开灯光");
  digitalWrite(LED, LOW);
}
// 关闭灯泡
void turnOffLed() {
  Serial.println("关闭灯光");
  digitalWrite(LED, HIGH);
}

// 配置esp8266的WIFI账号和密码
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WIFI_SSID);
  // 设置WIFI的账号和密码
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  // 检测WIFI是否联通
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi已连接");
}

// MQTT服务的回调
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print(topic);
  Serial.print("主题收到消息");
  String message = "";
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }
  Serial.print(message);
  Serial.println();

  if (message == "1") {
    //如果接收到1字符串,调用开灯方法
    turnOnLed();//开灯函数

  } else if (message == "0") {
    //如果接收到0字符串,调用关灯方法
    turnOffLed();
  }
  message = "";
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("正在尝试MQTT连接...");

    String client_id = "esp8266client";
    client_id += String(WiFi.macAddress());
    if (client.connect(client_id.c_str(), APPID, APPPASSWORD)) {
      Serial.println("正常连接");

      //这是你的主题名称
      String topic = "devices/" + String(TYPE) + "/" + String(APPID) + "/" + client_id;
      client.subscribe(topic.c_str());
    } else {
      Serial.print("连接异常,rc=");
      Serial.print(client.state());
      Serial.println(" 5秒后重试");
      // 5秒重试
      delay(5000);
    }
  }
}

void setup() {
  pinMode(LED, OUTPUT);
  // 设置波特率
  Serial.begin(115200);
  // 配置WIFI并连接上网
  setup_wifi();
  // 连接MQTT服务
  client.setServer(MQTT_SERVER, MQTT_PORT);
  // 设置MQTT消息回掉
  client.setCallback(callback);
  digitalWrite(LED, HIGH);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
}

posted @ 2025-09-25 11:32  木马不是马  阅读(130)  评论(0)    收藏  举报