آموزش ها
خانه هوشمند 3 اتصال esp32 به سرور mqtt رسپبری پای با آردوینو و idf
رخب اول کدش رو با آردوینو تست کردم
در محیط برنامه نویس platform io
لینک ریپازیتوری پروژی بر روی گیت هاب
#include
#include
#include
#include "secrets.h" // <--- این خط فایل اطلاعات حساس را اضافه میکند
WiFiClient espClient;
PubSubClient client(espClient);
// تابعی برای اتصال مجدد به MQTT
void reconnect() {
while (!client.connected()) {
Serial.print("try to connect MQTT ... ");
if (client.connect("ESP32_Client", MQTT_USER, MQTT_PASSWORD)) {
Serial.println("connected ✅");
// بعد از اتصال میتوانید subscribe کنید
client.subscribe("test/topic");
} else {
Serial.print("code not work!");
Serial.print(client.state());
Serial.println(" retry after 5 second..");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
// اتصال به وای فای
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("try to connect WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi ✅ connected");
client.setServer(MQTT_SERVER, MQTT_PORT);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// ارسال پیام هر 10 ثانیه
static unsigned long lastMsg = 0;
unsigned long now = millis();
if (now - lastMsg > 10000) {
lastMsg = now;
String msg = "Hello from Arduino ESP32!";
client.publish("test/topic", msg.c_str());
Serial.println("message send sucsessfully " + msg);
}
}
عد همین تست رو با idf گرفتم تا مطمئ بشم
#include
#include
#include
#include
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_event.h"
#include "esp_netif.h"
#include "protocol_examples_common.h"
#include "esp_log.h"
#include "mqtt_client.h"
static const char *TAG = "mqtt5_example";
static void log_error_if_nonzero(const char *message, int error_code)
{
if (error_code != 0) {
ESP_LOGE(TAG, "Last error %s: 0x%x", message, error_code);
}
}
static esp_mqtt5_user_property_item_t user_property_arr[] = {
{"board", "esp32"},
{"u", "user"},
{"p", "password"}
};
#define USE_PROPERTY_ARR_SIZE sizeof(user_property_arr)/sizeof(esp_mqtt5_user_property_item_t)
static esp_mqtt5_publish_property_config_t publish_property = {
.payload_format_indicator = 1,
.message_expiry_interval = 1000,
.topic_alias = 0,
.response_topic = "/topic/test/response",
.correlation_data = "123456",
.correlation_data_len = 6,
};
static esp_mqtt5_subscribe_property_config_t subscribe_property = {
.subscribe_id = 25555,
.no_local_flag = false,
.retain_as_published_flag = false,
.retain_handle = 0,
.is_share_subscribe = true,
.share_name = "group1",
};
static esp_mqtt5_subscribe_property_config_t subscribe1_property = {
.subscribe_id = 25555,
.no_local_flag = true,
.retain_as_published_flag = false,
.retain_handle = 0,
};
static esp_mqtt5_unsubscribe_property_config_t unsubscribe_property = {
.is_share_subscribe = true,
.share_name = "group1",
};
static esp_mqtt5_disconnect_property_config_t disconnect_property = {
.session_expiry_interval = 60,
.disconnect_reason = 0,
};
static void print_user_property(mqtt5_user_property_handle_t user_property)
{
if (user_property) {
uint8_t count = esp_mqtt5_client_get_user_property_count(user_property);
if (count) {
esp_mqtt5_user_property_item_t *item = malloc(count * sizeof(esp_mqtt5_user_property_item_t));
if (esp_mqtt5_client_get_user_property(user_property, item, &count) == ESP_OK) {
for (int i = 0; i < count; i ++) {
esp_mqtt5_user_property_item_t *t = &item[i];
ESP_LOGI(TAG, "key is %s, value is %s", t->key, t->value);
free((char *)t->key);
free((char *)t->value);
}
}
free(item);
}
}
}
/*
* @brief Event handler registered to receive MQTT events
*
* This function is called by the MQTT client event loop.
*
* @param handler_args user data registered to the event.
* @param base Event base for the handler(always MQTT Base in this example).
* @param event_id The id for the received event.
* @param event_data The data for the event, esp_mqtt_event_handle_t.
*/
static void mqtt5_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data)
{
ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32, base, event_id);
esp_mqtt_event_handle_t event = event_data;
esp_mqtt_client_handle_t client = event->client;
int msg_id;
ESP_LOGD(TAG, "free heap size is %" PRIu32 ", minimum %" PRIu32, esp_get_free_heap_size(), esp_get_minimum_free_heap_size());
switch ((esp_mqtt_event_id_t)event_id) {
case MQTT_EVENT_CONNECTED:
ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED");
print_user_property(event->property->user_property);
esp_mqtt5_client_set_user_property(&publish_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE);
esp_mqtt5_client_set_publish_property(client, &publish_property);
msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "hello from idf esp32", 0, 1, 1);
esp_mqtt5_client_delete_user_property(publish_property.user_property);
publish_property.user_property = NULL;
ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
esp_mqtt5_client_set_user_property(&subscribe_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE);
esp_mqtt5_client_set_subscribe_property(client, &subscribe_property);
msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0);
esp_mqtt5_client_delete_user_property(subscribe_property.user_property);
subscribe_property.user_property = NULL;
ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);
esp_mqtt5_client_set_user_property(&subscribe1_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE);
esp_mqtt5_client_set_subscribe_property(client, &subscribe1_property);
msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 2);
esp_mqtt5_client_delete_user_property(subscribe1_property.user_property);
subscribe1_property.user_property = NULL;
ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id);
esp_mqtt5_client_set_user_property(&unsubscribe_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE);
esp_mqtt5_client_set_unsubscribe_property(client, &unsubscribe_property);
msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos0");
ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id);
esp_mqtt5_client_delete_user_property(unsubscribe_property.user_property);
unsubscribe_property.user_property = NULL;
break;
case MQTT_EVENT_DISCONNECTED:
ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED");
print_user_property(event->property->user_property);
break;
case MQTT_EVENT_SUBSCRIBED:
ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id);
print_user_property(event->property->user_property);
esp_mqtt5_client_set_publish_property(client, &publish_property);
msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0);
ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id);
break;
case MQTT_EVENT_UNSUBSCRIBED:
ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id);
print_user_property(event->property->user_property);
esp_mqtt5_client_set_user_property(&disconnect_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE);
esp_mqtt5_client_set_disconnect_property(client, &disconnect_property);
esp_mqtt5_client_delete_user_property(disconnect_property.user_property);
disconnect_property.user_property = NULL;
esp_mqtt_client_disconnect(client);
break;
case MQTT_EVENT_PUBLISHED:
ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id);
print_user_property(event->property->user_property);
break;
case MQTT_EVENT_DATA:
ESP_LOGI(TAG, "MQTT_EVENT_DATA");
print_user_property(event->property->user_property);
ESP_LOGI(TAG, "payload_format_indicator is %d", event->property->payload_format_indicator);
ESP_LOGI(TAG, "response_topic is %.*s", event->property->response_topic_len, event->property->response_topic);
ESP_LOGI(TAG, "correlation_data is %.*s", event->property->correlation_data_len, event->property->correlation_data);
ESP_LOGI(TAG, "content_type is %.*s", event->property->content_type_len, event->property->content_type);
ESP_LOGI(TAG, "TOPIC=%.*s", event->topic_len, event->topic);
ESP_LOGI(TAG, "DATA=%.*s", event->data_len, event->data);
break;
case MQTT_EVENT_ERROR:
ESP_LOGI(TAG, "MQTT_EVENT_ERROR");
print_user_property(event->property->user_property);
ESP_LOGI(TAG, "MQTT5 return code is %d", event->error_handle->connect_return_code);
if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) {
log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err);
log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err);
log_error_if_nonzero("captured as transport's socket errno", event->error_handle->esp_transport_sock_errno);
ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno));
}
break;
default:
ESP_LOGI(TAG, "Other event id:%d", event->event_id);
break;
}
}
static void mqtt5_app_start(void)
{
esp_mqtt5_connection_property_config_t connect_property = {
.session_expiry_interval = 10,
.maximum_packet_size = 1024,
.receive_maximum = 65535,
.topic_alias_maximum = 2,
.request_resp_info = true,
.request_problem_info = true,
.will_delay_interval = 10,
.payload_format_indicator = true,
.message_expiry_interval = 10,
.response_topic = "/test/response",
.correlation_data = "123456",
.correlation_data_len = 6,
};
esp_mqtt_client_config_t mqtt5_cfg = {
.broker.address.uri = CONFIG_BROKER_URL,
.session.protocol_ver = MQTT_PROTOCOL_V_5,
.network.disable_auto_reconnect = true,
.credentials.username = "123",
.credentials.authentication.password = "456",
.session.last_will.topic = "/topic/will",
.session.last_will.msg = "i will leave",
.session.last_will.msg_len = 12,
.session.last_will.qos = 1,
.session.last_will.retain = true,
};
#if CONFIG_BROKER_URL_FROM_STDIN
char line[128];
if (strcmp(mqtt5_cfg.uri, "FROM_STDIN") == 0) {
int count = 0;
printf("Please enter url of mqtt broker\n");
while (count < 128) {
int c = fgetc(stdin);
if (c == '\n') {
line[count] = '\0';
break;
} else if (c > 0 && c < 127) {
line[count] = c;
++count;
}
vTaskDelay(10 / portTICK_PERIOD_MS);
}
mqtt5_cfg.broker.address.uri = line;
printf("Broker url: %s\n", line);
} else {
ESP_LOGE(TAG, "Configuration mismatch: wrong broker url");
abort();
}
#endif /* CONFIG_BROKER_URL_FROM_STDIN */
esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt5_cfg);
/* Set connection properties and user properties */
esp_mqtt5_client_set_user_property(&connect_property.user_property, user_property_arr, USE_PROPERTY_ARR_SIZE);
esp_mqtt5_client_set_user_property(&connect_property.will_user_property, user_property_arr, USE_PROPERTY_ARR_SIZE);
esp_mqtt5_client_set_connect_property(client, &connect_property);
/* If you call esp_mqtt5_client_set_user_property to set user properties, DO NOT forget to delete them.
* esp_mqtt5_client_set_connect_property will malloc buffer to store the user_property and you can delete it after
*/
esp_mqtt5_client_delete_user_property(connect_property.user_property);
esp_mqtt5_client_delete_user_property(connect_property.will_user_property);
/* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */
esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt5_event_handler, NULL);
esp_mqtt_client_start(client);
}
void app_main(void)
{
ESP_LOGI(TAG, "[APP] Startup..");
ESP_LOGI(TAG, "[APP] Free memory: %" PRIu32 " bytes", esp_get_free_heap_size());
ESP_LOGI(TAG, "[APP] IDF version: %s", esp_get_idf_version());
esp_log_level_set("*", ESP_LOG_INFO);
esp_log_level_set("mqtt_client", ESP_LOG_VERBOSE);
esp_log_level_set("mqtt_example", ESP_LOG_VERBOSE);
esp_log_level_set("transport_base", ESP_LOG_VERBOSE);
esp_log_level_set("esp-tls", ESP_LOG_VERBOSE);
esp_log_level_set("transport", ESP_LOG_VERBOSE);
esp_log_level_set("outbox", ESP_LOG_VERBOSE);
ESP_ERROR_CHECK(nvs_flash_init());
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
/* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
* Read "Establishing Wi-Fi or Ethernet Connection" section in
* examples/protocols/README.md for more information about this function.
*/
ESP_ERROR_CHECK(example_connect());
mqtt5_app_start();
}
ای دی اف دسترسی ها امنیتی بیشتری میده که می تونیم سیستم امنت تری نسبت به آردوینو طراحی کنیم
نوشته های مشابه
5/1 خانه هوشمند اتصال سنسور dht11 به اپلکیشن فلاتر
قسمت 5 بخش اول آموزش کد آردوینو برای dt11 برای دریافت دما و رطوبت برای خانه هوشمن
4/2 طراحی اپلیکیشن خانه هوشمند ارسال و دریافت اطلاعات به esp32
قسمت چهارم بخش دوم طراحی خانه هوشمند صنعتی در این بخش یاد می گیریم که چطور یک اپلیکیشن فلاتر بنویسیم که از esp32 اط طریق اینترنت و بروکر رسپبری پایی که قبلا ساختیم اطلاعات رو دریافت کنم و اطلاعات بفرستیم
خانه هوشمند 4/1 ارسال از esp32 آردوینو به اپلیکیشن فلاتر از طریق اینترنت
در این قسمت از طراحی خانه هوشمند یاد میگیرید که چطور از طریق اینترنت و با پروتوکل mqtt که قبلا بر روی سرور رسپبری نصب کردیم با اپلیکیشن فلاتر خودمون ارتباط بر قرار کنیم
ساخت رادار با آردوینو و اپلیکیشن فلاتر (Flutter)
در این پروژه ما با استفاده از آردوینو و ماژول srf04 یک رادار ساختیم و برای نمایش وضعیت رادار یک اپلیکیشن برای ویندوز/اندروید با کمک فلاتر نوشتیم
اتصال ماژول بلوتوث (HC-05) با آردوینو Uno
. در اینجا ما یک ماژول بلوتوث (HC-05) را با آردوینو Uno متصل می کنیم. و هر خط کد را شرح می دهیم. سپس LED داخلی آردوینو Uno را از طریق بلوتوث از گوشی هوشمند کنترل می کنیم.
رطوبت ساز اتوماتیک با آردوینو
این پروژه رطوبت ساز اتوماتیک با آردوینو به گونه ای طراحی شده است که رطوبت ساز بتواند به طور خودکار روشن و خاموش شود تا رطوبت خاص و راحت هوا حفظ شود.
سیستم اتوماسیون خانگی با استفاده از آردوینو و یک برنامه ساده اندروید
در اینجا یک پروژه اتوماسیون خانگی با استفاده از یک برنامه ساده اندرویدی ارائه شده است که می توانید از آن برای کنترل وسایل برقی با کلیک یا دستورات صوتی استفاده کنید.
سیستم آبیاری خودکار گیاهان با آردوینو
این جعبه به طور خودکار حجم قابل تنظیم آب را به چهار گیاه (یا کمتر) هر روز یا یک بار در روز "x" (حداکثر هفت روز) تحویل می دهد. یک میکرو کنترلر ردیابی زمان و سوئیچینگ 120AC (از طریق یک رله) را کنترل می کند. رله یک پمپ فواره را تغذیه می کند که به عنوان سیستم انتقال آب عمل می کند.
مانیتورینگ دما با 2DHT2 و آردوینو
این پست بسیار ساده و کوچک است اما همیشه چیزهای ساده و کوچک محصولات هوشمند و سازمانی را می سازند.
آردوینو برای مبتدیان
آردوینو یک برد مدار قابل برنامهریزی منبع باز است که میتواند در طیف گستردهای از پروژههای سازنده فضای ساده و پیچیده ادغام شود. این برد دارای یک میکروکنترلر است که می تواند برای حس و کنترل اشیاء در دنیای فیزیکی برنامه ریزی شو
چشمک زدن یک LED و LED با سوئیچ پروژه های ساده آردوینو برای مبتدیان
در این آموزش، ما به شما کمک می کنیم تا چند پروژه ساده آردوینو ایجاد کنید که برای مبتدیان عالی هستند. این پروژههای اساسی به شما کمک میکنند تا نحوه راهاندازی نرمافزار آردوینو و سپس اتصال اجزا برای انجام یک عمل خاص را درک کنید.