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, 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).
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ı

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.
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
/*********
: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);
}
}
}
Common Course Links
Common Course Files
Kaynaklar ve referanslar
-
BelgelendirmeESP32 Tutorial 46/55- SunFounder doc page for IoT Communication with MQTTdocs.sunfounder.com
Dosyalar📁
Dosya mevcut değil.