ESP8266+ MQTT+SG90(舵机) platformio

ESP8266 + MQTT + SG90(舵机) platformio

连线

ESP8266 MG90S(舵机)
GND 棕色
VCC 红色
模拟引脚 橙色

源代码

https://gitee.com/zhudachangs/esp8266-mqtt-sg90.git

注意事项!!!!

舵机角度有时候不是0-180 差别很大,设置 attach 最后两个参数

// 第二个参数是0度脉冲宽度 第三个是180度的脉冲宽度 最后两个参数自己微调 
servo.attach(SERVO_PIN, 500, 2400);
#include <Arduino.h>
#include <Ticker.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <Servo.h>

#define SERVO_PIN  14
// 接线
// | ESP8266  | MG90S(舵机) |
// | -------- | ----------- |
// | GND      | 棕色        |
// | VCC      | 红色        |
// | 模拟引脚  | 橙色        |

// wifi info
const char *SSID = "优美屋205"; // wifi 名字
const char *PASSWORD = "18111549"; // wifi密码

// MQTT info https://www.emqx.com/zh/mqtt/public-mqtt5-broker
const char *MQTT_SERVER = "broker-cn.emqx.io"; // MQTT 服务器地址
const int MQTT_PROT = 1883;                    // MQTT 端口

// mqtt 主题
const char *MQTT_TOPIC_PUB_ONLINE = "my/home/pub_online";
const char *MQTT_TOPIC_PUB_UPDATE = "my/home/pub_update"; // 订阅更新
const char *MQTT_TOPIC_SUB_DATA = "my/home/sub_data";     // 发布
const char *MQTT_TOPIC_HEARTBEAT = "my/home/heartbeat";   // 心跳
const char *CLIENT_ID = "esp8266-457065e5-f063-474e-2saf-cacf5cb52af5";

// SG90
int SG90_i;

// ticker.attach(s秒数, 函数名)
Ticker ticker; // 定时调用某一个函数
WiFiClient espClient;
PubSubClient client(espClient);
Servo servo;

void init_wifi();                                                        // 初始化wifi
void mqtt_reconnect();                                                   // 重新连接wifi
void mqtt_msg_callback(char *topic, byte *payload, unsigned int length); // mqtt 消息回调
void mqtt_heartbeat();  // 心跳
void SG90_reset(); // SG 90 初始化                                                 
void SG90_update(int data); // sg90

void setup()
{
  Serial.begin(115200);
  // 第二个参数是0度脉冲宽度 第三个是180度的脉冲宽度 最后两个参数自己微调
  servo.attach(SERVO_PIN, 500, 2400);
  SG90_reset(); // SG90 初始化

  init_wifi(); // 初始化 wifi
  client.setServer(MQTT_SERVER, MQTT_PROT); // 设置mqtt 服务和端口
  client.setCallback(mqtt_msg_callback);    // 设置mqtt 回调函数
  ticker.attach(1, mqtt_heartbeat);   // 心跳
}

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

void init_wifi()
{
  Serial.println("Connecting to");
  Serial.println(SSID);

  WiFi.begin(SSID, PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
}

void mqtt_reconnect()
{
  while (!client.connected())
  {
    Serial.print("Attempting MQTT connection...");

    // 第一步: 创建连接
    if (client.connect(CLIENT_ID))
    {
      Serial.println("connected");
      client.publish(MQTT_TOPIC_PUB_ONLINE, "online"); // 发布
      client.subscribe(MQTT_TOPIC_PUB_UPDATE);         // 监听
    }
    else
    {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

void mqtt_msg_callback(char *topic, byte *payload, unsigned int length)
{
  Serial.print("Message arrived [");
  Serial.print(topic); // 打印主题信息
  Serial.print("] ");
  String data = "";
  for (unsigned int i = 0; i < length; i++)
  {
    Serial.print((char)payload[i]); // 打印主题内容
    data += (char)payload[i];
  }
  Serial.println();

  // ************** string 转 int **************
  if(strcmp(MQTT_TOPIC_PUB_UPDATE, topic) == 0){
    Serial.printf("ok");
    String msg_data = data;
    int num_int = msg_data.toInt();
    SG90_update(num_int);
    Serial.print(num_int);
  }

}

void mqtt_heartbeat()
{
  if (client.connected())
  {
    client.publish(MQTT_TOPIC_HEARTBEAT, "1");
  }
}

void SG90_update(int data){
  servo.write(data);
  delay(300);
}

void SG90_reset()
{
  SG90_i = servo.read();
  for( SG90_i; SG90_i >= 0; SG90_i--)
  {
    servo.write(SG90_i);
    delay(30);
  }
}
posted @ 2022-05-30 22:56  半截肥皂  阅读(932)  评论(0编辑  收藏  举报