Search Code

Tutorial ESP32 30/55 - Xakamaynta Servo ee internetka iyadoo la isticmaalayo MQTT iyadoo la adeegsanayo Adafruit IO Service | Qalabka SunFounder ee ESP32 IoT Learning kit

Tutorial ESP32 30/55 - Xakamaynta Servo ee internetka iyadoo la isticmaalayo MQTT iyadoo la adeegsanayo Adafruit IO Service | Qalabka SunFounder ee ESP32 IoT Learning kit

Cashigarkii, waxaan baran doonnaa sida loo xakameeyo booska matoorka servo iyadoo la adeegsanayo microcontroller-ka ESP32 iyo borotokoolka MQTT internetka dhexdiisa. Adigoo ka faa'iideysanaya adeegga Adafruit IO, waxaad awoodi doontaa inaad meeleeyso servo-ga xaglo kala duwan sida 0°, 90°, ama 180° meel fog. Mashruucani wuxuu muujinayaa awoodaha ESP32, oo ay ku jiraan Wi-Fi iyo Bluetooth ku dhexjira, taasoo ka dhigaysa qalab awood leh oo loogu talagalay codsiyada IoT.

ESP32-30_MQTT_diagram-0

Mashruucan, waxaanu dejin doonnaa dhexdhexaadiye MQTT iyadoo la adeegsanayo Adafruit IO, abuuri doonnaa dashboard si loo xakameeyo servo-ga, oo ku xiri doonnaa ESP32. Booska servo-ga waxaa lagu hagaajin karaa slider-ka dashboard-ka, taasoo u oggolaanaysa xakameyn waqti-dhab ah qalab kasta oo internetka ku xiran (fiidiyowga 5:30).

Qalabka La Sharxay

Qaybaha ugu muhiimsan ee mashruucan waxaa ka mid ah microcontroller-ka ESP32 iyo matoorka servo. ESP32 waa microcontroller-ka kala duwan oo leh awoodo Wi-Fi iyo Bluetooth oo isku dhafan, taasoo ka dhigaysa mid ku habboon codsiyada IoT. Wuxuu la xiriiraa adeegga Adafruit IO iyadoo la adeegsanayo borotokoolka MQTT, kaas oo fudud oo waxtar u leh gudbinta fariimaha internetka dhexdiisa.

Matoorka servo waa qalab wareeg ah oo u oggolaanaya xakameyn sax ah oo ku saabsan booska xagasha. Wuxuu u shaqeeyaa adigoo helaya calaamad PWM ah oo tilmaamaysa booskiisa. Mashruucan, waxaanu ku xiri doonnaa servo-ga mid ka mid ah biinanka dhijitaalka ah ee ESP32, taasoo noo oggolaanaysa inaan xakameynno xaggiisa meel fog.

Faahfaahinta Xogta

Soo saaraha Parallax
Nambarka qaybta SG90
Korantada Logic/IO 3.3 V - 5 V
Korantada sahayda 4.8 V - 6.0 V
Korantada soo-saarka (kanal kasta) 1 A ugu badnaan
Hagaha soo noqnoqoshada PWM 50 Hz
Heerarka caqabadaha gelinta 0.3 V - 0.7 V
Hoos u dhaca korantada / RDS(on) / saturation 0.2 V ugu badnaan
Xadka kulaylka Heerkulka shaqada: -10°C ilaa 60°C
Baakad Kiis caag ah
Qoraallo / noocyo kale Mini servo, wareeg 180°

 

  • Hubi inaad siiso koronto ku habboon servo-ga (4.8 V - 6.0 V).
  • Isticmaal dhul wadaag ah oo u dhexeeya ESP32 iyo servo-ga.
  • La soco calaamadda PWM si aad uga fogaato inaad dhaafto xadka servo-ga.
  • Si adag ugu xir servo-ga si looga fogaado go'itaanka inta lagu jiro hawlgalka.
  • Cusboonaysii maktabadda Adafruit MQTT si loo hubiyo iswaafajin.

Jaantusyada MQTT

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

Tilmaamaha Xiritaanka

ESP32-17-Sevo_motor-wiring

Si aad ugu xirto matoorka servo ee ESP32, waxaad ku bilaabaysaa adigoo ku xira fiilada dhulka ee servo-ga biinka dhulka ee ESP32. Marka xigta, ku xir fiilada korontada (badanaa casaan) ee servo-ga biinka 5V ee ESP32. Ugu dambeyntii, ku xir fiilada calaamadda (badanaa jaalle ama cad) biinka dhijitaalka ah ee 25 ee ESP32. Hubi in xiridda ay adag tahay si looga fogaado go'itaanka inta lagu jiro hawlgalka.

Haddii aad isticmaalayso batteri si aad u shido ESP32, hubi in korantada batteriga ay ku jirto xadka la aqbali karo ee ESP32 iyo servo-ga labadaba. Intaa waxaa dheer, laba jeer hubi in xiridda ay u dhiganto qeexitaannada biinka ee lagu isticmaalay koodhkaaga si looga fogaado dhibaatooyinka (fiidiyowga 12:45).

Tusaalooyinka Koodhka & Sharaxaad

Koodhka la bixiyay, waxaanu marka hore ku daraynaa maktabadaha lagama maarmaanka ah ee ESP32 iyo MQTT. Waxaanu qeexaynaa shayga servo-ga oo waxaanu caddaynaynaa biinka uu ku xiran yahay iyadoo la adeegsanayo const int servoPin = 25;. Xagasha caadiga ah sidoo kale waxaa lagu dejiyaa const int defaultServoAngle = 90;, kaas oo noqon doona booska bilowga ah marka ESP32 uu shido.


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

Qaybtani waxay bilaabaysaa servo-ga biinka 25 waxayna u dejinaysaa xaggiisa caadiga ah 90°. Doorsoomaha servoAngle waxaa lagu cusboonaysiin doonaa iyadoo lagu salaynayo fariimaha laga helo dhexdhexaadiyaha MQTT.

Hawsha setup(), waxaanu ku xirnaa Wi-Fi waxaanu dejinaynaa macmiilka MQTT. Aqoonsiyada Adafruit IO ayaa halkan lagu qeexay, oo ay ku jiraan magaca isticmaalaha iyo furaha:


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

Qaybtani waxay dejineysaa xiriirka adeegga Adafruit IO. Hubi inaad ku beddesho qiimahan kuwaaga gaarka ah ee Adafruit IO markaad hirgelinayso koodhka.

Ugu dambeyntii, loop-ka ugu weyn wuxuu hubinayaa in xiriirka server-ka MQTT uu sii shaqeynayo oo uu farsameeyo fariimaha soo gala. Booska servo-ga waxaa lagu cusboonaysiiyaa iyadoo lagu salaynayo xagasha la helay:


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

Koodkani wuxuu u sawiraa xagasha servo-ga ilaa ballaca garaaca (pulse width) ee u dhigma oo u diraa matoorka servo-ga. Shaqada processPackets() waxay u oggolaanaysaa ESP32 inuu wax ka qabto fariimaha MQTT ee soo gala, iyadoo hubinaysa in servo-ga uu ka falceliyo amarrada lagu diro dashboard-ka Adafruit IO.

Muuujin / Waxa Laga Filan Karo

Marka wax walba si habboon loo habeeyo, waxaad awood u yeelan doontaa inaad ka xakamayso servo-ga dashboard-ka Adafruit IO adigoo isticmaalaya slider-ka aad abuurtay. Markaad dhaqaajiso slider-ka, servo-ga wuxuu hagaajin doonaa xagiisa waqti-qaar ah. Hubi in ESP32-gaagu ku xiran yahay Wi-Fi, iyo in xidhiidhka MQTT uu deggan yahay. Haddii servo-ga uusan ka jawaabin, hubi fiilooyinka iyo korontada servo-ga (fiidiyowga 20:15).

Ka warqab xadka kala duwanaanshaha ee servo-ga; dirista qiime ka baxsan 0° ilaa 180° waxay keeni kartaa inuu si aan la filayn u dhaqmo. Koodku wuxuu ku darayaa hubinno si looga hortago dhacdooyinka noocan ah isagoo ku xannibaya xagasha gudaha xadkan.

Waqtiyada Fiidiyowga

  • 00:00 Bilow
  • 1:54 Hordhaca mashruuca
  • 2:52 Hordhaca MQTT
  • 6:50 Hagaajinta Adafruit IO
  • 9:54 Ku xirista servo-ga
  • 11:07 Koodka la sharaxay
  • 18:59 Doorashada guddiga ESP32 iyo dekedda COM
  • 22:10 Muujinta mashruuca

Sawirro

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
Luqadda: 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!");
}

Waad u baahan tahay

Kheyraadka & Tixraacyada

Faylasha📁

Faylal kale