কোড অনুসন্ধান

ESP32 টিউটোরিয়াল ৪৬/৫৫ - HiveMQ MQTT ব্যবহার করে রিমোট তাপমাত্রা মনিটরিং | SunFounder-এর ESP32 কিট

ESP32 টিউটোরিয়াল ৪৬/৫৫ - HiveMQ MQTT ব্যবহার করে রিমোট তাপমাত্রা মনিটরিং | SunFounder-এর ESP32 কিট

এই টিউটোরিয়ালে, আমরা ESP32 এবং MQTT প্রোটোকল ব্যবহার করে একটি দূরবর্তী তাপমাত্রা পর্যবেক্ষণ সিস্টেম তৈরি করব। এই প্রকল্পটি আমাদের তাপমাত্রার ডেটা একটি MQTT ব্রোকারে প্রকাশ করতে এবং একটি ওয়েব ইন্টারফেস ব্যবহার করে দূরবর্তীভাবে একটি LED নিয়ন্ত্রণ করতে দেয়। একটি বোতাম চাপার মাধ্যমে, আমরা ক্লাউডে তাপমাত্রা রিডিং পাঠাতে পারি, এবং LED চালু বা বন্ধ করার জন্য কমান্ডও গ্রহণ করতে পারি।

esp32-47-mqt-1

ESP32 একটি শক্তিশালী মাইক্রোকন্ট্রোলার যা বিল্ট-ইন Wi-Fi এবং ব্লুটুথ বৈশিষ্ট্যযুক্ত, যা এটি ইন্টারনেট অফ থিংস (IoT) অ্যাপ্লিকেশনের জন্য আদর্শ করে তোলে। এই সেটআপে, আমরা তাপমাত্রা পরিমাপের জন্য একটি NTC থার্মিস্টর, রিডিং ট্রিগার করার জন্য একটি পুশ বোতাম এবং অবস্থা নির্দেশ করার জন্য একটি LED ব্যবহার করব। ডেটা HiveMQ-তে পাঠানো হবে, যা একটি জনপ্রিয় MQTT ব্রোকার, যেখানে এটি দূরবর্তীভাবে অ্যাক্সেস করা যেতে পারে (ভিডিওতে 00:45 এ)।

esp32-47-mqt-2

হার্ডওয়্যার ব্যাখ্যা

এই প্রকল্পের জন্য, আমরা নিম্নলিখিত উপাদানগুলি ব্যবহার করব:

  • ESP32 মাইক্রোকন্ট্রোলার: এই বোর্ডটি কেন্দ্রীয় প্রক্রিয়াকরণ ইউনিট হিসাবে কাজ করে, Wi-Fi সংযোগ এবং MQTT যোগাযোগ পরিচালনা করে।
  • NTC থার্মিস্টর: এই তাপমাত্রা সেন্সরটি তাপমাত্রার উপর ভিত্তি করে এর প্রতিরোধ পরিবর্তন করে। এটি একটি অ্যানালগ সংকেত সরবরাহ করে যা ESP32 বর্তমান তাপমাত্রা নির্ধারণ করতে পড়তে পারে।
  • LED: এই আলো-নিঃসরণকারী ডায়োডটি MQTT এর মাধ্যমে প্রাপ্ত কমান্ডের উপর ভিত্তি করে অবস্থা নির্দেশ করতে ব্যবহৃত হবে।
  • পুশ বোতাম: এই বোতামটি ESP32-কে তাপমাত্রা পড়তে এবং এটি MQTT ব্রোকারে প্রকাশ করতে ট্রিগার করবে।

ডেটাশিট বিবরণ

প্রস্তুতকারক SunFounder
পার্ট নম্বর ESP32
লজিক/IO ভোল্টেজ 3.3 V
সাপ্লাই ভোল্টেজ 5 V (USB এর মাধ্যমে)
আউটপুট কারেন্ট (প্রতি চ্যানেল) সর্বোচ্চ 12 mA
PWM ফ্রিকোয়েন্সি নির্দেশিকা 40 kHz পর্যন্ত
ইনপুট লজিক থ্রেশহোল্ড 0.3 V (নিম্ন), 2.4 V (উচ্চ)
থার্মাল সীমা -40 থেকে 85 °C
প্যাকেজ ESP32-WROOM-32

 

  • ক্ষতি এড়াতে সঠিক ভোল্টেজ স্তর নিশ্চিত করুন।
  • স্থিতিশীল রিডিং নিশ্চিত করতে পুশ বোতামের জন্য পুল-আপ রোধ ব্যবহার করুন।
  • ডিকপলিং ক্যাপাসিটর পাওয়ার সাপ্লাই স্থিতিশীল করতে সাহায্য করতে পারে।
  • ভুল রিডিং এড়াতে থার্মিস্টরের তারের বিষয়ে সতর্ক থাকুন।
  • সফল সংযোগের জন্য আপনার MQTT ব্রোকারের বিবরণ যাচাই করুন।

ওয়্যারিং নির্দেশাবলী

esp32-47-mqtt-wiring

উপাদানগুলি সংযোগ করতে, প্রথমে NTC থার্মিস্টর সংযোগ করে শুরু করুন। থার্মিস্টরের একটি পিন ESP32-এর 3.3 V সাপ্লাইতে সংযোগ করুন। অন্য পিনটি ESP32-এর পিন 36-এ সংযোগ করে, এবং এটি একটি 10 kΩ রোধের সাথেও সংযুক্ত হওয়া উচিত, যা তারপর গ্রাউন্ডে সংযুক্ত। এটি একটি ভোল্টেজ ডিভাইডার তৈরি করে যা ESP32-কে থার্মিস্টরের প্রতিরোধ পড়তে দেয়।

এরপর, LED সংযোগ করুন। LED-এর লম্বা পিন (অ্যানোড) একটি 220 Ω রোধের মাধ্যমে ESP32-এর পিন 4-এ সংযোগ করে, যখন ছোট পিন (ক্যাথোড) গ্রাউন্ডে সংযোগ করে। পুশ বোতামের জন্য, এক পাশ 3.3 V-তে এবং অন্য পাশ ESP32-এর পিন 14-এ সংযোগ করুন। অতিরিক্তভাবে, বোতামটি চাপা না হলে একটি স্থিতিশীল LOW অবস্থা নিশ্চিত করতে বোতাম পিন থেকে গ্রাউন্ডে একটি 10 kΩ রোধ সংযোগ করুন।

প্রয়োজনীয় লাইব্রেরি ইনস্টল করুন

PubSubClient লাইব্রেরি এখানে ব্যবহৃত হয়, আপনি এটি লাইব্রেরি ম্যানেজার থেকে ইনস্টল করতে পারেন।

esp32-47-mqtt-library

কোড উদাহরণ ও ওয়াকথ্রু

সেটআপে, আমরা সিরিয়াল যোগাযোগ শুরু করি, Wi-Fi সংযোগ সেট আপ করি এবং MQTT সার্ভার কনফিগার করি। এখানে সেটআপ কোডের একটি অংশ রয়েছে:

void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

কোডের এই অংশটি Wi-Fi নেটওয়ার্কে সংযোগ স্থাপন করে এবং MQTT সার্ভার সেট আপ করে। বোতাম এবং LED-এর পিন মোডও এখানে কনফিগার করা হয়েছে।

লুপ ফাংশনটি ক্রমাগত বোতামের অবস্থা পরীক্ষা করে এবং চাপলে তাপমাত্রার ডেটা প্রকাশ করে। এখানে লুপ থেকে একটি ফোকাসড অংশ রয়েছে:

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  if (digitalRead(buttonPin)) {
    long now = millis();
    if (now - lastMsg > 5000) {
      lastMsg = now;
      char tempString[8];
      dtostrf(thermistor(), 1, 2, tempString);
      client.publish("SF/TEMP", tempString);
    }
  }
}

এই লুপে, আমরা পরীক্ষা করি যে ESP32 MQTT ব্রোকারের সাথে সংযুক্ত কিনা। যদি বোতামটি চাপা হয়, এটি থার্মিস্টর থেকে তাপমাত্রা পড়ে এবং প্রতি 5 সেকেন্ডে "SF/TEMP" টপিকে প্রকাশ করে।

প্রদর্শন / কী আশা করবেন

প্রকল্পটি সেট আপ এবং চালু হলে, বোতাম টিপলে বর্তমান তাপমাত্রা MQTT ব্রোকারে প্রকাশিত হবে। আপনি যেকোনো MQTT ক্লায়েন্ট থেকে এই ডেটা পর্যবেক্ষণ করতে পারেন। অতিরিক্তভাবে, আপনি LED নিয়ন্ত্রণ করতে বার্তা পাঠাতে পারেন; "on" পাঠালে এটি জ্বলবে, আর "off" পাঠালে এটি বন্ধ হবে। ভিডিওতে 15:30 সময়ে প্রত্যাশিত আচরণ দেখুন, যেখানে প্রতিটি বোতাম চাপার পর তাপমাত্রা রিডিং দেখানো হয়েছে।

ভিডিও টাইমস্ট্যাম্প

  • 00:00 শুরু
  • 2:05 প্রকল্পের পরিচিতি
  • 7:06 ফ্রি HiveMQ পরিষেবা
  • 7:56 ওয়্যারিং ব্যাখ্যা
  • 11:11 Arduino কোড ব্যাখ্যা
  • 18:46 Arduino IDE-তে ESP32 বোর্ড এবং COM পোর্ট নির্বাচন
  • 20:30 HiveMQ ফ্রি ব্রোকারের প্রদর্শন

ছবি

esp32-47-mqt-1
esp32-47-mqt-1
esp32-47-mqt-2
esp32-47-mqt-2
esp32-47-mqtt-library
esp32-47-mqtt-library
esp32-47-mqtt-wiring
esp32-47-mqtt-wiring
847-ESP32 Tutorial 46/55- Arduino code for IoT Communication with MQTT
ভাষা: C++
/*********
  :ref: https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide/
  https://docs.sunfounder.com/projects/kepler-kit/en/latest/iotproject/5.mqtt_pub.html
*********/

#include <WiFi.h>
#include <PubSubClient.h>
//#include <Wire.h>

// Replace the next variables with your SSID/Password combination
const char* ssid = "SSID";
const char* password = "PASSWORD";

// Add your MQTT Broker address, example:
const char* mqtt_server = "broker.hivemq.com";
const char* unique_identifier = "sunfounder-client-sdgvsda";

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int value = 0;


// LED Pin
const int ledPin = 4;
const int buttonPin = 14;

// When you connect to WIFI, only 36 39 34 35 32 33 pins can be used for analog reading.
// Define constants
const int thermistorPin = 36; // Pin connected to the thermistor
const float referenceVoltage = 3.3;
const float referenceResistor = 10000; // Resistance value (10k)
const float beta = 3950; // Beta value (Typical Value)
const float nominalTemperature = 25; // Nominal temperature for calculating the temperature coefficient
const float nominalResistance = 10000; // Resistance value at nominal temperature



void setup() {
  Serial.begin(115200);

  // default settings
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

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

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

void callback(char* topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;

  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();

  // If a message is received on the topic "SF/LED", you check if the message is either "on" or "off".
  // Changes the output state according to the message
  if (String(topic) == "SF/LED") {
    Serial.print("Changing state to ");
    if (messageTemp == "on") {
      Serial.println("on");
      digitalWrite(ledPin, HIGH);
    } else if (messageTemp == "off") {
      Serial.println("off");
      digitalWrite(ledPin, LOW);
    }
  }
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect(unique_identifier)) {
      Serial.println("connected");
      // Subscribe
      client.subscribe("SF/LED");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

float thermistor() {
  int adcValue = analogRead(thermistorPin); // Read ADC value
  float voltage = (adcValue * referenceVoltage) / 4095.0; // Calculate voltage
  float resistance = (voltage * referenceResistor) / (referenceVoltage - voltage); // Calculate thermistor resistance with updated configuration

  // Calculate temperature using the Beta parameter equation
  float tempK = 1 / (((log(resistance / nominalResistance)) / beta) + (1 / (nominalTemperature + 273.15)));
  
  float tempC = tempK - 273.15; // Get temperature in Celsius
  float tempF = 1.8 * tempC + 32.0; // Get temperature in Fahrenheit

  //Print temperature
  Serial.print("Temp: ");
  Serial.println(tempC);
  delay(200); //wait for 200 milliseconds
  return tempC;
}

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

  // if the button pressed, publish the temperature to topic "SF/TEMP"
  if (digitalRead(buttonPin)) {
    long now = millis();
    if (now - lastMsg > 5000) {
      lastMsg = now;
      char tempString[8];
      dtostrf(thermistor(), 1, 2, tempString);
      client.publish("SF/TEMP", tempString);
    }
  }
}

সম্পদ ও রেফারেন্সসমূহ

ফাইলসমূহ📁

কোনো ফাইল উপলব্ধ নেই।