Search Code

ESP32 Оқулық 46/55 - HiveMQ MQTT көмегімен қашықтан температураны бақылау | SunFounder ESP32 жинағы

ESP32 Оқулық 46/55 - HiveMQ MQTT көмегімен қашықтан температураны бақылау | SunFounder ESP32 жинағы

Бұл оқулықта біз ESP32 және MQTT протоколын қолдана отырып, қашықтан температураны бақылау жүйесін жасаймыз. Бұл жоба температура деректерін MQTT брокеріне жариялауға және веб-интерфейс арқылы жарықдиодты қашықтан басқаруға мүмкіндік береді. Түймені басу арқылы біз температура көрсеткіштерін бұлтқа жібере аламыз, сонымен қатар жарықдиодты қосу немесе өшіру пәрмендерін қабылдай аламыз.

esp32-47-mqt-1

ESP32 - бұл кірістірілген Wi-Fi және Bluetooth мүмкіндіктері бар қуатты микроконтроллер, оны Интернет заттары (IoT) қолданбалары үшін өте қолайлы етеді. Бұл қондырғыда біз температураны өлшеу үшін NTC термисторын, көрсеткіштерді іске қосу үшін түймені және күйді көрсету үшін жарықдиодты қолданамыз. Деректер танымал MQTT брокері HiveMQ-ге жіберіледі, оны қашықтан қол жетімді етеді (бейнеде 00:45).

esp32-47-mqt-2

Аппараттық құрал түсіндірмесі

Бұл жоба үшін біз келесі компоненттерді қолданамыз:

  • ESP32 микроконтроллері: Бұл плата орталық өңдеу бірлігі ретінде қызмет етеді, Wi-Fi қосылымдарын және MQTT байланыстарын басқарады.
  • NTC термисторы: Бұл температура сенсоры температураға байланысты кедергісін өзгертеді. Ол ESP32 ағымдағы температураны анықтау үшін оқи алатын аналогтық сигнал береді.
  • Жарықдиод: Бұл жарық шығаратын диод MQTT арқылы қабылданған пәрмендерге негізделген күйді көрсету үшін қолданылады.
  • Түйме: Бұл түйме ESP32 температураны оқуға және оны MQTT брокеріне жариялауға әкеледі.

Деректер парағының мәліметтері

Өндіруші SunFounder
Бөлшек нөмірі ESP32
Логика/IO кернеуі 3.3 В
Қоректендіру кернеуі 5 В (USB арқылы)
Шығыс тогы (арнаға) 12 мА макс
PWM жиілігі бойынша нұсқау 40 кГц дейін
Кіріс логикалық шектері 0.3 В (төмен), 2.4 В (жоғары)
Жылулық шектер -40-тан 85 °C-қа дейін
Қаптама ESP32-WROOM-32

 

  • Зақымдануды болдырмау үшін дұрыс кернеу деңгейлерін қамтамасыз етіңіз.
  • Тұрақты көрсеткіштерді қамтамасыз ету үшін түйме үшін жоғары тарту резисторларын қолданыңыз.
  • Ажырату конденсаторлары қуат көзін тұрақтандыруға көмектеседі.
  • Қате көрсеткіштерді болдырмау үшін термистордың сымдарына абай болыңыз.
  • Сәтті қосылу үшін MQTT брокерінің мәліметтерін тексеріңіз.

Сым қосу нұсқаулары

esp32-47-mqtt-wiring

Компоненттерді қосу үшін алдымен NTC термисторын қосыңыз. Термистордың бір істікшесін ESP32-дегі 3.3 В қоректендіруге қосыңыз. Басқа істікше ESP32-дегі 36 істікшеге қосылады, сонымен қатар ол жерге қосылған 10 кΩ резисторға қосылуы керек. Бұл ESP32-ге термистордың кедергісін оқуға мүмкіндік беретін кернеу бөлгішін жасайды.

Әрі қарай, жарықдиодты қосыңыз. Жарықдиодтың ұзын істікшесі (анод) ESP32-дегі 4 істікшеге 220 Ω резистор арқылы қосылады, ал қысқа істікше (катод) жерге қосылады. Түйме үшін бір жағын 3.3 В-қа, ал екінші жағын ESP32-дегі 14 істікшеге қосыңыз. Сонымен қатар, түйме басылмаған кезде тұрақты LOW күйін қамтамасыз ету үшін түйме істікшесінен жерге 10 кΩ резисторды қосыңыз.

Қажетті кітапхананы орнату

Мұнда 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 серверін конфигурациялайды. Түйме мен жарықдиодтың істікше режимдері де осында конфигурацияланады.

Цикл функциясы түйменің күйін үздіксіз тексереді және басылған кезде температура деректерін жариялайды. Міне, циклден алынған үзінді:

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 Free брокерінің демонстрациясы

Суреттер

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

Ресурстар мен сілтемелер

Файлдар📁

Файлдар жоқ.