کوډ ولټوئ

ESP32 ټیوټوریل 30/55 - د Adafruit IO خدمت په کارولو سره د MQTT له لارې د ویب پر سر سروو کنټرول | د SunFounder د ESP32 IoT زده کړې کټ

ESP32 ټیوټوریل 30/55 - د Adafruit IO خدمت په کارولو سره د MQTT له لارې د ویب پر سر سروو کنټرول | د SunFounder د ESP32 IoT زده کړې کټ

په دې ټیوټوریل کې به موږ زده کړو چې څنګه د ESP32 مایکروکنټرولر او د MQTT پروتوکول په کارولو سره د ویب له لارې د سروو موټور موقعیت کنټرول کړو. د Adafruit IO خدمت په ګټه اخیستنې سره، تاسو به وکولی شئ سروو په مختلفو زاویو لکه 0°، 90°، یا 180° له لرې ځای پر ځای کړئ. دا پروژه د ESP32 وړتیاوې ښیي، چې پکې جوړ شوی Wi-Fi او Bluetooth شامل دي، او دا د IoT غوښتنلیکونو لپاره یوه پیاوړې وسیله ګرځوي.

ESP32-30_MQTT_diagram-0

په دې پروژه کې به موږ د Adafruit IO په کارولو سره یو MQTT بروکر جوړ کړو، د سروو کنټرول لپاره یو ډشبورډ جوړ کړو، او ESP32 له هغې سره وصل کړو. د سروو موقعیت به د ډشبورډ په سلایډر سره د تنظیم وړ وي، چې د انټرنیټ وړ هرې وسیلې څخه په ریښتیني وخت کې کنټرول ته اجازه ورکوي (په ویډیو کې په 5:30).

هارډویر تشریح شوی

د دې پروژې لومړني اجزا د ESP32 مایکروکنټرولر او سروو موټور شامل دي. ESP32 یو څو اړخیز مایکروکنټرولر دی چې د جوړ شوي Wi-Fi او Bluetooth وړتیاوې لري، چې دا د IoT غوښتنلیکونو لپاره مثالی کوي. دا د MQTT پروتوکول په کارولو سره د Adafruit IO خدمت سره اړیکه نیسي، کوم چې د انټرنیټ له لارې د پیغامونو لیږدولو لپاره سپک او اغیزمن دی.

سروو موټور یو څرخیدونکی محرک دی چې د زاویه موقعیت دقیق کنټرول ته اجازه ورکوي. دا د پلن-موده ماډولیشن (PWM) سیګنال په ترلاسه کولو سره کار کوي چې د هغې موقعیت ټاکي. په دې پروژه کې به موږ سروو د ESP32 په یوه ډیجیټل پن سره وصل کړو، چې موږ ته اجازه راکوي د هغې زاویه له لرې کنټرول کړو.

ډیټاشیټ تفصیلات

جوړونکی Parallax
د پرزې شمېره SG90
منطق/IO ولټاژ 3.3 V - 5 V
د برېښنا رسولو ولټاژ 4.8 V - 6.0 V
د تولید جریان (په هر چینل) 1 A اعظمي
د PWM فریکونسي لارښود 50 Hz
د منطق داخلولو حدونه 0.3 V - 0.7 V
د ولټاژ کمښت / RDS(on) / سنتریشن 0.2 V اعظمي
حرارتي حدونه د عملیاتو تودوخه: -10°C څخه تر 60°C
بسته بندي پلاستیکي قاب
یادښتونه / بڼې مینی سروو، 180° څرخ

 

  • سروو ته د مناسب ولټاژ رسولو ډاډ ترلاسه کړئ (4.8 V - 6.0 V).
  • د ESP32 او سروو ترمنځ یو ګډ ځمکنی (ګراونډ) وکاروئ.
  • د PWM سیګنال څارنه وکړئ ترڅو د سروو له حدونو څخه د تیریدو مخه ونیسئ.
  • سروو په خوندي ډول وصل کړئ ترڅو د عملیاتو په جریان کې د بېلتون مخه ونیسئ.
  • د مطابقت ډاډ ترلاسه کولو لپاره د Adafruit MQTT کتابتون تازه کړئ.

MQTT ډیاګرامونه

ESP32-30_MQTT_diagram-2
ESP32-30_MQTT_diagram
ESP32-28_dht_temperature-sensor-main

د تارونو د نښلولو لارښوونې

ESP32-17-Sevo_motor-wiring

د سروو موټور د ESP32 سره د نښلولو لپاره، لومړی د سروو ځمکنی تار د ESP32 په ځمکني پن سره وصل کړئ. بیا، د سروو د برېښنا تار (معمولا سور) د ESP32 په 5V پن سره وصل کړئ. په پای کې، د سیګنال تار (معمولا ژیړ یا سپین) د ESP32 په ډیجیټل پن 25 سره وصل کړئ. ډاډ ترلاسه کړئ چې اړیکې خوندي دي ترڅو د عملیاتو په جریان کې د بېلتون مخه ونیول شي.

که تاسو د ESP32 د برېښنا رسولو لپاره بیټرۍ کاروئ، ډاډ ترلاسه کړئ چې د بیټرۍ ولټاژ د ESP32 او سروو دواړو لپاره د منلو وړ حد کې دی. سربیره پردې، دوه ځله وګورئ چې تارونه ستاسو په کوډ کې کارول شوي پن تعریفونو سره سمون لري ترڅو د کومې ستونزې مخه ونیول شي (په ویډیو کې په 12:45).

د کوډ مثالونه او تفصیل

په چمتو شوي کوډ کې، موږ لومړی د ESP32 او MQTT لپاره اړین کتابتونونه شامل کوو. موږ د سروو اعتراض تعریف کوو او هغه پن مشخص کوو چې له هغې سره وصل دی د const int servoPin = 25; په کارولو سره. ډیفالټ زاویه هم د const int defaultServoAngle = 90; سره ټاکل شوې، کوم چې به لومړنی موقعیت وي کله چې ESP32 پیل شي.


Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle = defaultServoAngle;

دا ټوټه سروو په پن 25 باندې پیل کوي او د هغې ډیفالټ زاویه 90° ټاکي. متغیر servoAngle به د MQTT بروکر څخه ترلاسه شوي پیغامونو پر بنسټ تازه شي.

په setup() فنکشن کې، موږ Wi-Fi سره وصل کیږو او د MQTT کلاینټ تنظیم کوو. د Adafruit IO اسناد دلته تعریف شوي، پشمول د کارن نوم او کیلي:


#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"

دا برخه د Adafruit IO خدمت سره اړیکه ټینګوي. ډاډ ترلاسه کړئ چې د کوډ پلي کولو پر مهال دا ارزښتونه د خپلو Adafruit IO اسنادو سره بدل کړئ.

په پای کې، اصلي لوپ ډاډ ترلاسه کوي چې د MQTT سرور سره اړیکه فعاله پاتې کیږي او راتلونکي پیغامونه پروسس کوي. د سروو موقعیت د ترلاسه شوي زاویې پر بنسټ تازه کیږي:


mqtt.processPackets(500);
int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);

دا کوډ د سروو زاویه د اړونده پلس پراخوالي سره نقشه کوي او دا د سروو موټور ته لیږي. د processPackets() فنکشن ESP32 ته اجازه ورکوي چې راتلونکي MQTT پیغامونه اداره کړي، ډاډ ترلاسه کوي چې سروو د Adafruit IO ډشبورډ له لارې لیږل شوي امرونو ته غبرګون ښیې.

ښودنه / څه تمه وکړئ

یوځل چې هرڅه تنظیم شي، تاسو باید وکولی شئ د Adafruit IO ډشبورډ څخه د هغه سلایډر په کارولو سره سروو کنټرول کړئ چې تاسو جوړ کړی دی. لکه څنګه چې تاسو سلایډر حرکت کوئ، سروو به په ریښتیني وخت کې خپله زاویه تنظیم کړي. ډاډ ترلاسه کړئ چې ستاسو ESP32 Wi-Fi سره وصل دی، او د MQTT اړیکه باثباته ده. که سروو ځواب ورنه کړي، تارونه او د سروو بریښنا رسول وګورئ (په ویډیو کې په 20:15).

د سروو لپاره د حد محدودیتونو څخه خبر اوسئ؛ د 0° څخه تر 180° پورې د ارزښت لیږل ممکن د غیر متوقع چلند لامل شي. کوډ د دې زاویې په دې حد کې د تړلو له لارې د داسې پیښو مخنیوي لپاره چیکونه شاملوي.

د ویډیو وخت نښې

  • 00:00 پیل
  • 1:54 د پروژې پیژندنه
  • 2:52 د MQTT پیژندنه
  • 6:50 د Adafruit IO تنظیم
  • 9:54 د سروو تارونه
  • 11:07 کوډ تشریح شوی
  • 18:59 د ESP32 بورډ او COM پورټ غوره کول
  • 22:10 د پروژې ښودنه

انځورونه

ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-wiring
ESP32-17-Sevo_motor-wiring
ESP32-28_dht_temperature-sensor-main
ESP32-28_dht_temperature-sensor-main
ESP32-30_MQTT_diagram
ESP32-30_MQTT_diagram
ESP32-30_MQTT_diagram-0
ESP32-30_MQTT_diagram-0
ESP32-30_MQTT_diagram-2
ESP32-30_MQTT_diagram-2
831-ESP32 Tutorial 30/55- ESP32 to control Servo motor using MQTT service of Adafruit
ژبه: C++
/***********************************************************************
 This is Arduino sketch for ESP32 to control Servo motor using MQTT service of Adafruit
 www.Robojax.com
 Written By Ahamd Shamshiri
 on Feb 2nd, 2024
Watch video instruction for this code on YouTube https://youtu.be/T4DhWNg2Rb8
  Adafruit MQTT Library ESP32 Adafruit IO SSL/TLS example
  this code can be downloaded from  https://robojax.com/RJT671

  

/// ref: https://www.electronicwings.com/esp32/esp32-mqtt-client
*/
#include <ESP32Servo.h>

// Define the servo and the pin it is connected to
Servo myServo;
const int servoPin = 25;
const int defaultServoAngle = 90;
int servoAngle =defaultServoAngle;

// Define the minimum and maximum pulse widths for the servo
const int minPulseWidth = 500; // 0.5 ms
const int maxPulseWidth = 2500; // 2.5 ms




#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

/************************* WiFi Access Point *********************************/


#define WLAN_SSID "Barqasaa"
#define WLAN_PASS "wan9&Jang~5"

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER "io.adafruit.com"

// Using port 8883 for MQTTS
#define AIO_SERVERPORT 8883

// Adafruit IO Account Configuration
// (to obtain these values, visit https://io.adafruit.com and click on Active Key)
// #define AIO_USERNAME "YOUR_ADAFRUIT_IO_USERNAME"
// #define AIO_KEY      "YOUR_ADAFRUIT_IO_KEY"

#define AIO_USERNAME "robojax"
#define AIO_KEY "aio_xmIW58uNNsjJCSOqzZ9QoHyq29wu"

/************ Global State (you don't need to change this!) ******************/

// WiFiFlientSecure for SSL/TLS support
WiFiClientSecure client;

// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);


// io.adafruit.com root CA
const char* adafruitio_root_ca = \
      "-----BEGIN CERTIFICATE-----\n"
      "MIIEjTCCA3WgAwIBAgIQDQd4KhM/xvmlcpbhMf/ReTANBgkqhkiG9w0BAQsFADBh\n"
      "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
      "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\n"
      "MjAeFw0xNzExMDIxMjIzMzdaFw0yNzExMDIxMjIzMzdaMGAxCzAJBgNVBAYTAlVT\n"
      "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
      "b20xHzAdBgNVBAMTFkdlb1RydXN0IFRMUyBSU0EgQ0EgRzEwggEiMA0GCSqGSIb3\n"
      "DQEBAQUAA4IBDwAwggEKAoIBAQC+F+jsvikKy/65LWEx/TMkCDIuWegh1Ngwvm4Q\n"
      "yISgP7oU5d79eoySG3vOhC3w/3jEMuipoH1fBtp7m0tTpsYbAhch4XA7rfuD6whU\n"
      "gajeErLVxoiWMPkC/DnUvbgi74BJmdBiuGHQSd7LwsuXpTEGG9fYXcbTVN5SATYq\n"
      "DfbexbYxTMwVJWoVb6lrBEgM3gBBqiiAiy800xu1Nq07JdCIQkBsNpFtZbIZhsDS\n"
      "fzlGWP4wEmBQ3O67c+ZXkFr2DcrXBEtHam80Gp2SNhou2U5U7UesDL/xgLK6/0d7\n"
      "6TnEVMSUVJkZ8VeZr+IUIlvoLrtjLbqugb0T3OYXW+CQU0kBAgMBAAGjggFAMIIB\n"
      "PDAdBgNVHQ4EFgQUlE/UXYvkpOKmgP792PkA76O+AlcwHwYDVR0jBBgwFoAUTiJU\n"
      "IBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsG\n"
      "AQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMDQGCCsGAQUFBwEB\n"
      "BCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEIGA1Ud\n"
      "HwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEds\n"
      "b2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEW\n"
      "HGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDQYJKoZIhvcNAQELBQADggEB\n"
      "AIIcBDqC6cWpyGUSXAjjAcYwsK4iiGF7KweG97i1RJz1kwZhRoo6orU1JtBYnjzB\n"
      "c4+/sXmnHJk3mlPyL1xuIAt9sMeC7+vreRIF5wFBC0MCN5sbHwhNN1JzKbifNeP5\n"
      "ozpZdQFmkCo+neBiKR6HqIA+LMTMCMMuv2khGGuPHmtDze4GmEGZtYLyF8EQpa5Y\n"
      "jPuV6k2Cr/N3XxFpT3hRpt/3usU/Zb9wfKPtWpoznZ4/44c1p9rzFcZYrWkj3A+7\n"
      "TNBJE0GmP2fhXhP1D/XVfIW/h0yCJGEiV9Glm/uGOa3DXHlmbAcxSyCRraG+ZBkA\n"
      "7h4SeM6Y8l/7MBRpPCz6l8Y=\n"
      "-----END CERTIFICATE-----\n";

/****************************** Feeds ***************************************/

// Setup a feed called 'test' for publishing and 'test2' for subscription.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Subscribe SERVO = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/servo-angle-1");


/*************************** Sketch Code ************************************/


void setup() {
    // Attach the servo to the specified pin and set its pulse width range
  myServo.attach(servoPin, minPulseWidth, maxPulseWidth);

  // Set the PWM frequency for the servo
  myServo.setPeriodHertz(50); // Standard 50Hz servo

  Serial.begin(115200);
  delay(10);

  Serial.println(F("Adafruit IO MQTTS (SSL/TLS) Example"));

  // Connect to WiFi access point.
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

  delay(1000);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  delay(2000);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Set Adafruit IO's root CA
  client.setCACert(adafruitio_root_ca);

  // register callback for feed
  SERVO.setCallback(servoCallback);
  // Setup MQTT subscription for time feed.
  mqtt.subscribe(&SERVO);


}

// uint32_t x=0;


void loop() {

  // Ensure the connection to the MQTT server is alive (this will make the first
  // connection and automatically reconnect when disconnected).  See the MQTT_connect
  // function definition further below.
  MQTT_connect();

  Serial.print("Angle: ");
  Serial.println(servoAngle);

  // wait 0.5 seconds for subscription messages
  mqtt.processPackets(500);

  //from lesson 17
  int pulseWidth = map(servoAngle, 0, 180, minPulseWidth, maxPulseWidth);
  myServo.writeMicroseconds(pulseWidth);
  delay(15);
  // wait a couple seconds to avoid rate limit
  //delay(2000);
}

void servoCallback(char* message, uint16_t len) {
  char messageBuffer[40];
  snprintf(messageBuffer, sizeof(messageBuffer), "Servo status is :: %s, len :: %u", message, len);
  Serial.println(messageBuffer);
  Serial.println(message);
  String inString = message;//sotre the message to String
 
  servoAngle  =  inString.toInt();//convert the message to Integer
  if(servoAngle >180 || servoAngle < 0)
  {
    servoAngle =0;
  }

}




// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
  int8_t ret;
  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }
  Serial.print("Connecting to MQTT... ");
  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) {  // connect will return 0 for connected
    Serial.println(mqtt.connectErrorString(ret));
    Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);  // wait 5 seconds
    retries--;
    if (retries == 0) {
      // basically die and wait for WDT to reset me
      while (1)
        ;
    }
  }
  Serial.println("MQTT Connected!");
}

هغه شیان چې تاسو ورته اړتیا لرئ

سرچینې او حوالې

فایلونه📁

نور فایلونه