Search Code

ESP32 ትምህርት 30/55 - ሰርቮን በድር ላይ በMQTT በመጠቀም በAdafruit IO አገልግሎት መቆጣጠር | SunFounder የESP32 IoT መማሪያ ኪት

ESP32 ትምህርት 30/55 - ሰርቮን በድር ላይ በMQTT በመጠቀም በAdafruit IO አገልግሎት መቆጣጠር | SunFounder የESP32 IoT መማሪያ ኪት

በዚህ ትምህርት ውስጥ፣ የሰርቮ ሞተርን አቀማመጥ በESP32 ማይክሮኮንትሮለር እና በMQTT ፕሮቶኮል በድር ላይ እንዴት መቆጣጠር እንደምንችል እንማራለን። የAdafruit IO አገልግሎትን በመጠቀም፣ ሰርቮውን እንደ 0°፣ 90°፣ ወይም 180° ባሉ የተለያዩ ማዕዘኖች በርቀት ማስቀመጥ ይችላሉ። ይህ ፕሮጀክት የESP32 አቅሞችን ያሳያል፣ እሱም አብሮ የተሰራ Wi-Fi እና ብሉቱዝ ያካትታል፣ ለIoT አፕሊኬሽኖች ኃይለኛ መሳሪያ ያደርገዋል።

ESP32-30_MQTT_diagram-0

በዚህ ፕሮጀክት ውስጥ፣ Adafruit IO በመጠቀም MQTT ብሮከር እናዘጋጃለን፣ ሰርቮውን ለመቆጣጠር ዳሽቦርድ እንፈጥራለን፣ እና ESP32ን ከእሱ ጋር እናገናኛለን። የሰርቮ አቀማመጥ በዳሽቦርዱ ላይ ባለ ስላይደር አማካኝነት ሊስተካከል ይችላል፣ ይህም ከማንኛውም በይነመረብ ከተገናኘ መሳሪያ በእውነተኛ ጊዜ ቁጥጥር ለማድረግ ያስችላል (በቪዲዮ በ5:30)።

ሃርድዌር ተብራርቷል

የዚህ ፕሮጀክት ዋና ክፍሎች ESP32 ማይክሮኮንትሮለር እና ሰርቮ ሞተር ያካትታሉ። ESP32 ከተዋሃደ Wi-Fi እና ብሉቱዝ አቅሞች ጋር ሁለገብ ማይክሮኮንትሮለር ነው፣ ለIoT አፕሊኬሽኖች ተስማሚ ያደርገዋል። በበይነመረብ ላይ መልዕክቶችን ለማስተላለፍ ቀላል እና ቀልጣፋ የሆነውን MQTT ፕሮቶኮል በመጠቀም ከAdafruit IO አገልግሎት ጋር ይገናኛል።

ሰርቮ ሞተር የማዕዘን አቀማመጥን በትክክል ለመቆጣጠር የሚያስችል የማሽከርከር አንቀሳቃሽ ነው። አቀማመጡን የሚወስነውን የ pulse-width modulation (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 ምስክርነቶች መተካትዎን ያረጋግጡ።

በመጨረሻም፣ ዋናው loop ከMQTT አገልጋይ ጋር ያለው ግንኙነት ንቁ ሆኖ እንዲቆይ ያደርጋል እና የገቡ መልዕክቶችን ያስኬዳል። የሰርቮ አቀማመጥ በተቀበለው ማዕዘን ላይ በመመስረት ይዘመናል፦


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

ይህ ኮድ የሰርቮውን አንግል ወደ ተጓዳኝ የ pulse width ይቀይረዋል እና ወደ ሰርቮ ሞተሩ ይልከዋል። የ 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!");
}

እንደሚያስፈልግዎት ይችላል

ምንጮች እና ምንጮች

ፋይሎች📁

ሌላ ፋይሎች