Search Code

บทช่วยสอน ESP32 48/55 - การตรวจวัดอุณหภูมิระยะไกลและการควบคุม LED ด้วย MQTT | ชุด IoT ESP32 ของ SunFounder

บทช่วยสอน ESP32 48/55 - การตรวจวัดอุณหภูมิระยะไกลและการควบคุม LED ด้วย MQTT | ชุด IoT ESP32 ของ SunFounder

ในบทช่วยสอนนี้ เราจะสำรวจวิธีการใช้โมดูล ESP32 ร่วมกับบอร์ดขยาย ESP32 ของ SunFounder เพื่อตรวจสอบอุณหภูมิและความชื้นจากระยะไกลโดยใช้แพลตฟอร์ม Adafruit IO นอกจากนี้ เราจะ implement ฟังก์ชันการควบคุม LED ผ่านเว็บอินเทอร์เฟซด้วย เมื่อสิ้นสุดโปรเจกต์นี้ คุณจะสามารถดูข้อมูลอุณหภูมิและความชื้นแบบเรียลไทม์ และเปิด/ปิด LED จากเบราว์เซอร์ของคุณได้

โปรเจกต์นี้ใช้โปรโตคอล MQTT เพื่อการสื่อสารที่มีประสิทธิภาพระหว่าง ESP32 และบริการ Adafruit IO MQTT เป็นโปรโตคอลที่มีน้ำหนักเบาและเหมาะสำหรับแอปพลิเคชัน IoT ทำให้เราสามารถเผยแพร่ข้อมูลเซนเซอร์และสมัครรับคำสั่งสำหรับการควบคุม LED ได้อย่างง่ายดาย สำหรับคำอธิบายเพิ่มเติมเกี่ยวกับโค้ดและการเดินสายไฟ โปรดดูวิดีโอที่มาพร้อมกับบทช่วยสอนนี้ (ในวิดีโอที่ 00:00)

อธิบายฮาร์ดแวร์

ส่วนประกอบหลักสำหรับโปรเจกต์นี้ประกอบด้วยไมโครคอนโทรลเลอร์ ESP32 เซนเซอร์วัดอุณหภูมิและความชื้น DHT11 และ LED หนึ่งดวง ESP32 เป็นไมโครคอนโทรลเลอร์ที่ทรงพลังซึ่งมีคุณสมบัติ Wi-Fi และ Bluetooth ในตัว ทำให้เป็นตัวเลือกที่เหมาะสำหรับโปรเจกต์ IoT สามารถจัดการงานหลายอย่างและเชื่อมต่ออินเทอร์เน็ตได้อย่างราบรื่น

เซนเซอร์ DHT11 มีหน้าที่วัดอุณหภูมิและความชื้น โดยจะส่งสัญญาณดิจิทัลที่ ESP32 สามารถอ่านได้ LED ทำหน้าที่เป็นตัวบ่งชี้และสามารถควบคุมจากระยะไกลเพื่อสาธิตประสิทธิภาพของโปรโตคอล MQTT ในการจัดการอุปกรณ์ผ่านอินเทอร์เน็ต

รายละเอียดจาก Datasheet

ผู้ผลิต Adafruit
หมายเลขชิ้นส่วน DHT11
แรงดันไฟฟ้าลอจิก/IO 3.3 V
แรงดันไฟฟ้าจ่าย 3.3 V
กระแสเอาต์พุต (ต่อช่อง) 20 mA
กระแสสูงสุด (ต่อช่อง) 50 mA
คำแนะนำความถี่ PWM N/A
เกณฑ์แรงดันไฟฟ้าอินพุตลอจิก 0.3 V (ต่ำ), 0.7 V (สูง)
แรงดันตก / RDS(on) / ความอิ่มตัว N/A
ขีดจำกัดความร้อน 0 ถึง 50 °C
แพ็คเกจ 3 ขา
หมายเหตุ / รุ่นอื่น ใช้ DHT22 เพื่อความแม่นยำที่สูงขึ้น

 

  • ตรวจสอบการเดินสายไฟให้ถูกต้องเพื่อป้องกันความเสียหาย
  • ใช้ตัวต้านทาน 220 โอห์มร่วมกับ LED เพื่อจำกัดกระแส
  • ใช้ตัวต้านทาน pull-up สำหรับขาข้อมูล DHT11 หากจำเป็น
  • ตรวจสอบข้อมูลรับรอง Wi-Fi ว่าคำนึงถึงตัวพิมพ์ใหญ่-เล็กหรือไม่
  • ตรวจสอบเอาต์พุตซีเรียลเพื่อดีบักปัญหาการเชื่อมต่อ
  • ทำให้หัวข้อ MQTT ไม่ซ้ำกันเพื่อหลีกเลี่ยงความขัดแย้ง
  • ทดสอบการอ่านค่าเซนเซอร์เพื่อให้แน่ใจว่าถูกต้อง
  • ระวังเวลาตอบสนองของ DHT11 อาจใช้เวลาในการทำให้การอ่านค่าคงที่

LED = ควบคุม LED; temperature = เผยแพร่ข้อมูลอุณหภูมิ; humidity = เผยแพร่ข้อมูลความชื้น

คำแนะนำการเดินสายไฟ

ในการเดินสายไฟส่วนประกอบ ให้เริ่มต้นด้วยการเชื่อมต่อเซนเซอร์ DHT11 เชื่อมต่อขาซ้ายของ DHT11 เข้ากับรางไฟ 3.3V บนเบรดบอร์ดโดยใช้สายสีแดง ขากลางของ DHT11 ควรเชื่อมต่อกับขา 13 บน ESP32 โดยใช้สายสีเหลือง สุดท้าย เชื่อมต่อขาขวาของ DHT11 เข้ากับรางกราวด์โดยใช้สายสีน้ำเงิน

ถัดไป สำหรับ LED ให้เชื่อมต่อขาแอโนด (ขาที่ยาวกว่า) เข้ากับขา 15 ของ ESP32 ผ่านตัวต้านทาน 220 โอห์ม เชื่อมต่อขาแคโทด (ขาที่สั้นกว่า) เข้ากับรางกราวด์บนเบรดบอร์ดโดยตรง ตรวจสอบให้แน่ใจว่าการเชื่อมต่อทั้งหมดแน่นหนา และตรวจสอบอีกครั้งว่ามีสายไฟหลวมหรือไม่

การตั้งค่าแดชบอร์ด

  1. ไปที่ Adafruit IO จากนั้นคลิกที่ Start for free เพื่อสร้างบัญชีฟรี

    ../../_images/sp230516_102503.png
  2. กรอกแบบฟอร์มเพื่อสร้างบัญชี

    ../../_images/sp230516_102629.png
  3. หลังจากสร้างบัญชี Adafruit แล้ว คุณจะต้องเปิด Adafruit IO อีกครั้ง คลิกที่ Dashboards จากนั้นคลิกที่ New Dashboard

    ../../_images/sp230516_103347.png
  4. สร้าง New Dashboard

    ../../_images/sp230516_103744.png
  5. เข้าไปยัง Dashboard ที่สร้างใหม่และสร้างบล็อกใหม่

    ../../_images/sp230516_104234.png
  6. สร้างบล็อก Toggle จำนวน 1 บล็อก

    ../../_images/sp230516_105727.png
  7. ถัดไป คุณจะต้องสร้างฟีดใหม่ที่นี่ สวิตช์นี้จะใช้ควบคุม LED และเราจะตั้งชื่อฟีดนี้ว่า “LED”

    ../../_images/sp230516_105641.png
  8. เลือกฟีด LED จากนั้นไปยังขั้นตอนถัดไป

    ../../_images/sp230516_105925.png
  9. ตั้งค่าบล็อกให้สมบูรณ์ (ส่วนใหญ่คือ Block Title, On Text และ Off Text) จากนั้นคลิกที่ปุ่ม Create block ที่มุมขวาล่างเพื่อเสร็จสิ้น

    ../../_images/sp230516_110124.png
  10. เรายังต้องสร้าง Text Blocks สองบล็อกถัดไปด้วย พวกมันจะใช้แสดงอุณหภูมิและความชื้น ดังนั้น ให้สร้างฟีดสองตัวชื่อ temperature และ humidity

    ../../_images/sp230516_110657.png
  11. หลังจากสร้างเสร็จ Dashboard ของคุณควรมีลักษณะประมาณนี้:

    ../../_images/sp230516_111134.png
  12. คุณสามารถปรับเค้าโครงได้โดยใช้ตัวเลือก Edit Layout บน Dashboard

    ../../_images/sp230516_111240.png
  13. คลิกที่ API KEY แล้วคุณจะเห็นชื่อผู้ใช้และ API KEY ของคุณปรากฏขึ้น จดข้อมูลเหล่านี้ไว้เพราะคุณจะต้องใช้ในโค้ดของคุณ

    ../../_images/sp230516_111641.png

 

ตัวอย่างโค้ดและคำอธิบาย

โค้ดเริ่มต้นด้วยการรวมไลบรารีที่จำเป็น ตั้งค่าข้อมูลรับรอง Wi-Fi และกำหนดพารามิเตอร์ MQTT ตัวระบุสำคัญ เช่น AIO_USERNAME และ AIO_KEY ถูกใช้เพื่อยืนยันตัวตนกับบริการ Adafruit IO

#define AIO_USERNAME "YourUsername"
#define AIO_KEY "YourKey"

บรรทัดเหล่านี้กำหนดชื่อผู้ใช้และคีย์ Adafruit IO ของคุณ ซึ่งจำเป็นสำหรับการเชื่อมต่อกับ MQTT broker ตรวจสอบให้แน่ใจว่าค่าเหล่านี้ถูกต้องเพื่อสร้างการเชื่อมต่อที่สำเร็จ

ในฟังก์ชัน setup() การเชื่อมต่อ Wi-Fi จะถูกเริ่มต้น และไคลเอนต์ MQTT จะถูกตั้งค่าด้วยใบรับรอง CA หลักสำหรับการสื่อสารที่ปลอดภัย

WiFi.begin(WLAN_SSID, WLAN_PASS);
client.setCACert(adafruitio_root_ca);

โค้ดนี้เชื่อมต่อ ESP32 กับเครือข่าย Wi-Fi ที่ระบุและตั้งค่า CA หลักสำหรับการเชื่อมต่อ MQTT ที่ปลอดภัย การจัดการการเชื่อมต่อเหล่านี้อย่างถูกต้องเป็นสิ่งสำคัญสำหรับการส่งข้อมูลที่เชื่อถือได้

สุดท้าย ฟังก์ชัน loop() จัดการการเชื่อมต่อ MQTT และเผยแพร่ค่าอุณหภูมิและความชื้นในช่วงเวลาปกติ

mqtt.processPackets(5000);

บรรทัดนี้ช่วยให้ ESP32 ประมวลผลข้อความขาเข้าสำหรับหัวข้อที่สมัครสมาชิก เพื่อให้แน่ใจว่าอุปกรณ์ตอบสนองต่อคำสั่งที่ส่งจากอินเทอร์เฟซเว็บ

สำหรับโค้ดที่สมบูรณ์ โปรดดูโปรแกรมเต็มที่โหลดไว้ด้านล่างบทความ

การสาธิต / สิ่งที่คาดหวัง

เมื่อตั้งค่าเสร็จสมบูรณ์ คุณควรเห็นการอัปเดตอุณหภูมิและความชื้นแบบเรียลไทม์บนแดชบอร์ด Adafruit IO ของคุณ คุณยังสามารถเปิดและปิด LED ผ่านอินเทอร์เฟซเว็บได้ หาก LED ไม่ตอบสนองตามที่คาดหวัง ให้ตรวจสอบการเดินสายไฟของคุณและตรวจสอบให้แน่ใจว่าชื่อหัวข้อ MQTT ตรงกับที่กำหนดไว้ในโค้ด

โปรดทราบว่าข้อผิดพลาดการเชื่อมต่อ MQTT บางอย่างอาจเกิดขึ้นเนื่องจากใบรับรองหมดอายุ ตรวจสอบให้แน่ใจว่าคุณมีใบรับรอง CA หลักล่าสุดในโค้ดของคุณเพื่อหลีกเลี่ยงปัญหาเหล่านี้ (ในวิดีโอที่ 15:30)

ไทม์สแตมป์ของวิดีโอ

  • 00:00 เริ่มต้น
  • 1:50 แนะนำโปรเจกต์
  • 3:16 MQTT คืออะไร
  • 6:36 การตั้งค่า Adafruit IO
  • 11:13 การเดินสายไฟ
  • 13:38 อธิบายโค้ด Arduino
  • 22:03 การเลือกบอร์ด ESP32 และพอร์ต COM
  • 23:44 การสาธิตโปรเจกต์
  • 27:05 การอัปเดตแดชบอร์ด
849-ESP32 Tutorial 48/55- Arduino code for Remote Temperature Monitoring and LED control MQTT
ภาษา: C++
/***********************************************************************
  Adafruit MQTT Library ESP32 Adafruit IO SSL/TLS example

  Use the latest version of the ESP32 Arduino Core:
    https://github.com/espressif/arduino-esp32

  Works great with Adafruit Huzzah32 Feather and Breakout Board:
    https://www.adafruit.com/product/3405
    https://www.adafruit.com/products/4172

  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Tony DiCola for Adafruit Industries.
  Modified by Brent Rubell for Adafruit Industries
  MIT license, all text above must be included in any redistribution
 **********************************************************************/


/// ref: https://www.electronicwings.com/esp32/esp32-mqtt-client

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

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

#define WLAN_SSID "SSID"
#define WLAN_PASS "PASSWORD"

/************************* 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 "JimmyKernel"
#define AIO_KEY "aio_Mxiv12i74b5jKfKNSKLYjlhPmoHC"

/************ 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 LED = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/LED");
Adafruit_MQTT_Publish humidity = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/humidity");
Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

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

// set pin numbers
const int ledPin = 15;  // the number of the led pin

#include "DHT.h"

#define DHTPIN 13      // Set the pin connected to the DHT11 data pin
#define DHTTYPE DHT11  // DHT 11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  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
  LED.setCallback(ledCallback);
  // Setup MQTT subscription for time feed.
  mqtt.subscribe(&LED);

  // initialize the LED pin as an output
  pinMode(ledPin, OUTPUT);

  // Initialize the dht11
  dht.begin();
}

// 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();

  indicatorPublish();

  // wait 10 seconds for subscription messages
  mqtt.processPackets(5000);

  // wait a couple seconds to avoid rate limit
  //delay(2000);
}

void ledCallback(char* message, uint16_t len) {
  char messageBuffer[40];
  snprintf(messageBuffer, sizeof(messageBuffer), "LED status is :: %s, len :: %u", message, len);
  Serial.println(messageBuffer);
  if (strcmp(message, "ON") == 0) {
    Serial.println("Turning ON LED");
    digitalWrite(ledPin, HIGH);
  } else {
    Serial.println("Turning OFF LED");
    digitalWrite(ledPin, LOW);
  }
}

void indicatorPublish() {

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor)
  float humValue = dht.readHumidity();
  float tempValue = dht.readTemperature();

  if (isnan(humValue) || isnan(tempValue)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  if (!temperature.publish(tempValue)) {
    Serial.println(F("Failed"));
  } else {
    Serial.print("Temperature: ");
    Serial.println(tempValue);
  }
  if (!humidity.publish(humValue)) {
    Serial.println(F("Failed"));
  } else {
    Serial.print("Humidity: ");
    Serial.println(humValue);
  }
}

// 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!");
}
850-ESP32 Tutorial 48/55- Basic Adafruit MQTT code (watch video)
ภาษา: C++
/***********************************************************************
  Adafruit MQTT Basic lesson 1
Watch video instruction for this code on YouTube https://youtu.be/M9BQweAsHJM
Resource page for this lesson and code:
📚⬇️ Download and resource page https://robojax.com/RJT670
Tutoril by https://youTube.com/@robojax

  Adafruit MQTT Library ESP32 Adafruit IO SSL/TLS example

  Use the latest version of the ESP32 Arduino Core:
    https://github.com/espressif/arduino-esp32

  Works great with Adafruit Huzzah32 Feather and Breakout Board:
    https://www.adafruit.com/product/3405
    https://www.adafruit.com/products/4172

  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Tony DiCola for Adafruit Industries.
  Modified by Brent Rubell for Adafruit Industries
  MIT license, all text above must be included in any redistribution
 **********************************************************************/


/// ref: https://www.electronicwings.com/esp32/esp32-mqtt-client

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

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

#define WLAN_SSID "dars"
#define WLAN_PASS "5152535455"

/************************* 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_wCyL33EVKLcGoAotGNEQ4dGQYOLZ"

/************ 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"
  "MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n"
  "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
  "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n"
  "QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n"
  "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
  "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n"
  "9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n"
  "CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n"
  "nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n"
  "43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n"
  "T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n"
  "gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n"
  "BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n"
  "TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n"
  "DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n"
  "hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n"
  "06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n"
  "PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n"
  "YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n"
  "CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\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 LED = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/LED");
//Adafruit_MQTT_Publish humidity = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/humidity");
//Adafruit_MQTT_Publish temperature = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

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

// set pin numbers
const int ledPin = 15;  // the number of the led pin



void setup() {
  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
  LED.setCallback(ledCallback);
  // Setup MQTT subscription for time feed.
  mqtt.subscribe(&LED);

  // initialize the LED pin as an output
  pinMode(ledPin, OUTPUT);


}

// 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();

 // indicatorPublish();

  // wait 10 seconds for subscription messages
  mqtt.processPackets(10000);

  // wait a couple seconds to avoid rate limit
  //delay(2000);
}

void ledCallback(char* message, uint16_t len) {
  char messageBuffer[40];
  snprintf(messageBuffer, sizeof(messageBuffer), "LED status is :: %s, len :: %u", message, len);
  Serial.println(messageBuffer);
  if (strcmp(message, "ON") == 0) {
    Serial.println("Turning ON LED");
    digitalWrite(ledPin, LOW);
  } else {
    Serial.println("Turning OFF LED");
    digitalWrite(ledPin, HIGH);
  }
}



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

แหล่งข้อมูลและเอกสารอ้างอิง

ไฟล์📁

ไม่มีไฟล์ที่พร้อมใช้งาน