Search Code

ESP32 Eğitimi 46/55 - HiveMQ MQTT Kullanarak Uzaktan Sıcaklık İzleme | SunFounder'ın ESP32 kiti

ESP32 Eğitimi 46/55 - HiveMQ MQTT Kullanarak Uzaktan Sıcaklık İzleme | SunFounder'ın ESP32 kiti

Bu eğitimde, ESP32 ve MQTT protokolünü kullanarak uzaktan sıcaklık izleme sistemi oluşturacağız. Bu proje, sıcaklık verilerini bir MQTT broker'ına yayınlamamıza ve bir web arayüzü kullanarak bir LED'i uzaktan kontrol etmemize olanak tanır. Bir düğmeye basarak sıcaklık okumalarını buluta gönderebilir ve ayrıca LED'i açıp kapatmak için komutlar alabiliriz.

esp32-47-mqt-1

ESP32, yerleşik Wi-Fi ve Bluetooth özelliklerine sahip güçlü bir mikrodenetleyicidir ve bu da onu Nesnelerin İnterneti (IoT) uygulamaları için ideal kılar. Bu kurulumda, sıcaklığı ölçmek için bir NTC termistör, okumaları tetiklemek için bir basma düğme ve durumu belirtmek için bir LED kullanacağız. Veriler, popüler bir MQTT broker'ı olan HiveMQ'ya gönderilecek ve buradan uzaktan erişilebilecektir (videoda 00:45'te).

esp32-47-mqt-2

Donanım Açıklaması

Bu proje için aşağıdaki bileşenleri kullanacağız:

  • ESP32 Mikrodenetleyici: Bu kart, Wi-Fi bağlantılarını ve MQTT iletişimlerini yöneten merkezi işlem birimi olarak görev yapar.
  • NTC Termistör: Bu sıcaklık sensörü, sıcaklığa bağlı olarak direncini değiştirir. ESP32'nin mevcut sıcaklığı belirlemek için okuyabileceği analog bir sinyal sağlar.
  • LED: Bu ışık yayan diyot, MQTT üzerinden alınan komutlara göre durumu belirtmek için kullanılacaktır.
  • Basma Düğme: Bu düğme, ESP32'nin sıcaklığı okumasını ve MQTT broker'ına yayınlamasını tetikleyecektir.

Veri Sayfası Detayları

Üretici SunFounder
Parça numarası ESP32
Mantık/G/Ç voltajı 3.3 V
Besleme voltajı 5 V (USB üzerinden)
Çıkış akımı (kanal başına) 12 mA maks.
PWM frekansı kılavuzu 40 kHz'e kadar
Giriş mantık eşikleri 0.3 V (düşük), 2.4 V (yüksek)
Termal sınırlar -40 ila 85 °C
Paket ESP32-WROOM-32

 

  • Hasardan kaçınmak için uygun voltaj seviyelerini sağlayın.
  • Stabil okumalar sağlamak için basma düğmesi için pull-up dirençleri kullanın.
  • Dekuplaj kapasitörleri güç kaynağını stabilize etmeye yardımcı olabilir.
  • Yanlış okumalardan kaçınmak için termistörün kablolamasına dikkat edin.
  • Başarılı bağlantı için MQTT broker bilgilerinizi doğrulayın.

Bağlantı Talimatları

esp32-47-mqtt-wiring

Bileşenleri bağlamak için NTC termistörü bağlayarak başlayın. Termistörün bir pinini ESP32 üzerindeki 3.3 V beslemeye bağlayın. Diğer pin, ESP32 üzerindeki pin 36'ya bağlanır ve ayrıca toprağa bağlanan bir 10 kΩ direncine bağlanmalıdır. Bu, ESP32'nin termistörün direncini okumasını sağlayan bir voltaj bölücü oluşturur.

Ardından LED'i bağlayın. LED'in uzun pini (anot), ESP32 üzerindeki pin 4'e bir 220 Ω direnç üzerinden bağlanırken, kısa pin (katot) toprağa bağlanır. Basma düğmesi için, bir tarafı 3.3 V'a ve diğer tarafı ESP32 üzerindeki pin 14'e bağlayın. Ayrıca, düğmeye basılmadığında stabil bir DÜŞÜK durum sağlamak için düğme pininden toprağa bir 10 kΩ direnç bağlayın.

Gerekli Kütüphaneyi Kurun

Burada PubSubClient kütüphanesi kullanılır, bunu Kütüphane Yöneticisi'nden kurabilirsiniz.

esp32-47-mqtt-library

Kod Örnekleri ve Açıklama

Kurulumda, seri iletişimi başlatır, Wi-Fi bağlantısını kurar ve MQTT sunucusunu yapılandırırız. İşte kurulum kodunun bir parçası:

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

Kodun bu kısmı Wi-Fi ağına bağlantıyı kurar ve MQTT sunucusunu ayarlar. Düğme ve LED için pin modları da burada yapılandırılır.

Döngü fonksiyonu sürekli olarak düğme durumunu kontrol eder ve basıldığında sıcaklık verilerini yayınlar. İşte döngüden odaklanmış bir alıntı:

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);
    }
  }
}

Bu döngüde, ESP32'nin MQTT broker'ına bağlı olup olmadığını kontrol ederiz. Düğmeye basılırsa, termistörden sıcaklığı okur ve her 5 saniyede bir "SF/TEMP" konusuna yayınlar.

Gösterim / Ne Beklemeli

Proje kurulup çalıştırıldığında, butona basmak mevcut sıcaklığı MQTT broker'ına yayınlayacaktır. Bu verileri herhangi bir MQTT istemcisinden izleyebilirsiniz. Ayrıca LED'i kontrol etmek için mesaj gönderebilirsiniz; "on" göndermek LED'i yakacak, "off" göndermek ise söndürecektir. Videoda 15:30'daki beklenen davranışı izleyin; burada her buton basışından sonra sıcaklık okumaları gösterilmektedir.

Video Zaman Damgaları

  • 00:00 Başlangıç
  • 2:05 Projeye giriş
  • 7:06 Ücretsiz HiveMQ hizmeti
  • 7:56 Bağlantı şeması açıklaması
  • 11:11 Arduino kodu açıklaması
  • 18:46 Arduino IDE'de ESP32 kartı ve COM portu seçimi
  • 20:30 HiveMQ Free broker gösterimi

Görseller

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
Dil: 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);
    }
  }
}

Kaynaklar ve referanslar

Dosyalar📁

Dosya mevcut değil.