立创开发板介绍【立创·ESP32S3R8N8开发板】

官方教程链接:https://lceda001.feishu.cn/wiki/PICgwjcDsiN7TjkWw5tc3OzbnHb

上个周末有幸参与了嘉立创的开源活动、遇见了好多大佬、自己抽中了一块esp32开发板,为了激励一下自己边学边记录,并不是教程,仅供参考。

在这里插入图片描述
现在好像还有活动、板子还挺不错的,我是白嫖的真香!
大概了解一下它的资源
在这里插入图片描述

在这里插入图片描述
总的来说 麻雀虽小 五脏俱全 我这里仅仅是截图说明,大家需要详细资料请移步官方教程链接

说一下开发环境

三种方式都支持,我这里选择了比较简单的一种方式、这个对初学者比较友好、如果后面拿它做项目再考虑ESP-IDF 方式。

在这里插入图片描述
官方也有这个问题的答案:
我应该选择哪一个手册进行学习?

  1. 如果你是一名新人朋友,建议选择Arduino环境,该环境搭建简单,编程内容也容易。
  2. 如果你用惯了C语言,想要扩展自己的知识,建议选择MicroPython语言,该环境搭建也简单,并且基于Python的特性,在了解了python语言的风格后,编程内容也很容易理解。
  3. 如果你是一位大佬,想要深究底层的驱动,建议使用官方的ESP-IDF,该环境搭建较为复杂,并且是基于FreeRTOS操作系统的基础上,进行的扩展。

Arduino IDE 环境介绍

Arduino 是一种开源硬件和软件平台,用于构建和控制各种物理设备和交互式项目。它由一个基于开放源代码的软件开发环境构成。Arduino 编程语言是一种基于 C/C++简单易懂 的语言。Arduino 的简易性、灵活性、还有易获得的资源以及丰富的应用领域,使得它成为 一个受欢迎和广泛使用的开发平台。无论是初学者还是专业开发者,都可以从中获得快速开发和创新的能力

安装参考:https://lceda001.feishu.cn/wiki/RpCAw65FsiHfKSkFVV6ckdPjnlf

特别注意:在线安装库的时候需要访问外网、要不然大概率装不上,也可以下载下来解压,只是比较麻烦,官方有详细的介绍,我这里仅仅是提醒在这里插入图片描述

环境搭建好了 运行一下测试例子

/* The true ESP32 chip ID is essentially its MAC address.
This sketch provides an alternate chip ID that matches 
the output of the ESP.getChipId() function on ESP8266 
(i.e. a 32-bit integer matching the last 3 bytes of 
the MAC address. This is less unique than the 
MAC address chip ID, but is helpful when you need 
an identifier that can be no more than a 32-bit integer 
(like for switch...case).

created 2020-06-07 by cweinhofer
with help from Cicicok */
	
uint32_t chipId = 0;

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

void loop() 
{
	for(int i=0; i<17; i=i+8) 
	{
	  chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
	}

	Serial.printf("ESP32 Chip model = %s Rev %d\n", ESP.getChipModel(),ESP.getChipRevision());
	Serial.printf("This chip has %d cores\n", ESP.getChipCores());
	Serial.print("Chip ID: "); Serial.println(chipId);
  
	delay(3000);

}

代码理解

这是一个串口打印ID的例子 代码解释的是这个ID是由Mac地址生成的
于是就做了一个探究

    uint64_t macAddress = 0x8C3AC727843C;
   // 提取 MAC 地址的最后 3 个字节,并生成 32 位的 Chip ID
    for (int i = 0; i < 24; i += 8) 
	{
        chipId |= ((macAddress >> (40 - i)) & 0xFF) << i;
    }
	printf("生成的 ESP32 Chip ID: %08X\n",  chipId);
	printf("生成的 ESP32 Chip ID: %d\n",   chipId);
    for(int i=0; i<17; i=i+8) 
    {
	  chipId |= ((macAddress >> (40 - i)) & 0xff) << i;
	}
    // 打印 32 位的 Chip ID
    printf("生成的 ESP32 Chip ID: %08X\n", chipId);
    printf("生成的 ESP32 Chip ID: %d\n",   chipId);
    
	MAC 地址: 8C:3A:C7:27:84:3C
	生成的 ESP32 Chip ID: 00C73A8C
	生成的 ESP32 Chip ID: 13056652
	生成的 ESP32 Chip ID: 00C73A8C
	生成的 ESP32 Chip ID: 13056652
	
	可以看到这两种写法效果是一样的、但是写法上for循环的次数不一样 但是我感觉不太容易理解
	chipId |=   
	       (uint8_t)(macAddress >> 40) & 0xFF<<16|
           (uint8_t)(macAddress >> 32) & 0xFF<<8 |
           (uint8_t)(macAddress >> 24) & 0xFF<<0,
           
    printf("生成的 ESP32 Chip ID: %08X\n", chipId);
    printf("生成的 ESP32 Chip ID: %d\n",   chipId);
	这是我理解后写的代码,结果是一样的 目的都是为了拿到高24位数据最后变成一个32位的数据,

--------------------------------

完整测试代码

#include <stdio.h>
#include <stdint.h>

int main(void) 
{
    // 模拟 MAC 地址(用于演示)
    uint64_t macAddress = 0x8C3AC727843C;
    //C73A8C
    // 打印完整的 MAC 地址
    printf("MAC 地址: %02X:%02X:%02X:%02X:%02X:%02X\n",
           (uint8_t)(macAddress >> 40) & 0xFF,
           (uint8_t)(macAddress >> 32) & 0xFF,
           (uint8_t)(macAddress >> 24) & 0xFF,
           (uint8_t)(macAddress >> 16) & 0xFF,
           (uint8_t)(macAddress >> 8) & 0xFF,
           (uint8_t)macAddress & 0xFF);

    // 初始化 Chip ID
    uint32_t chipId = 0;

    // 提取 MAC 地址的最后 3 个字节,并生成 32 位的 Chip ID
    for (int i = 0; i < 24; i += 8) 
	{
        chipId |= ((macAddress >> (40 - i)) & 0xFF) << i;
    }
	printf("生成的 ESP32 Chip ID: %08X\n",  chipId);
	printf("生成的 ESP32 Chip ID: %d\n",   chipId);
    for(int i=0; i<17; i=i+8) 
    {
	  chipId |= ((macAddress >> (40 - i)) & 0xff) << i;
	}
	    // 打印 32 位的 Chip ID
    printf("生成的 ESP32 Chip ID: %08X\n", chipId);
    printf("生成的 ESP32 Chip ID: %d\n",   chipId);
    
	chipId |=   
	       (uint8_t)(macAddress >> 40) & 0xFF<<16|
           (uint8_t)(macAddress >> 32) & 0xFF<<8 |
           (uint8_t)(macAddress >> 24) & 0xFF<<0,
           
    printf("生成的 ESP32 Chip ID: %08X\n", chipId);
    printf("生成的 ESP32 Chip ID: %d\n",   chipId);
    
    
    return 0;
}

思考MAC地址一般用在什么地方?

MAC地址通常是网络设备的唯一标识符,用于在局域网中唯一标识设备。在一些特定的场景下,例如物联网中的设备通信,可以使用MAC地址来订阅主题。在这种情况下,通常使用类似 MQTT(Message Queuing Telemetry Transport)这样的通信协议。

MQTT 是一种基于发布/订阅模式的轻量级消息传输协议,常用于物联网应用中的设备通信。在 MQTT 中,设备可以订阅(Subscribe)一个或多个主题(Topic),并且发布(Publish)消息到这些主题。其他设备可以通过订阅相同的主题来接收这些消息。

因此,如果你的物联网应用中需要根据设备的唯一标识符(如MAC地址)来订阅特定的主题,你可以将MAC地址作为设备的标识符,将其用作 MQTT 订阅主题的一部分。

写个例子

#include <stdio.h>
#include <stdint.h>

// Function to convert MAC address to MQTT topic
char * macToMqttTopic(uint64_t macAddress, char *mqttTopic) 
{
    // Format MAC address as hexadecimal string
    sprintf(mqttTopic, "/Devices/%02X/%02X/%02X/%02X/%02X/%02X",
            (uint8_t)((macAddress >> 40) & 0xFF),
            (uint8_t)((macAddress >> 32) & 0xFF),
            (uint8_t)((macAddress >> 24) & 0xFF),
            (uint8_t)((macAddress >> 16) & 0xFF),
            (uint8_t)((macAddress >> 8 ) & 0xFF),
            (uint8_t)((macAddress >> 0 ) & 0xFF));
    return mqttTopic;
}

int main(void) 
{
    // 模拟 MAC 地址(用于演示)
    uint64_t macAddress = 0x8C3AC727843C;
    char mqttTopic[50]; 
    //C73A8C
    // 打印完整的 MAC 地址
    printf("MAC 地址: %02X:%02X:%02X:%02X:%02X:%02X\n",
           (uint8_t)(macAddress >> 40) & 0xFF,
           (uint8_t)(macAddress >> 32) & 0xFF,
           (uint8_t)(macAddress >> 24) & 0xFF,
           (uint8_t)(macAddress >> 16) & 0xFF,
           (uint8_t)(macAddress >> 8) & 0xFF,
           (uint8_t)macAddress & 0xFF);

    // 初始化 Chip ID
    uint32_t chipId = 0;

    // 提取 MAC 地址的最后 3 个字节,并生成 32 位的 Chip ID
    for (int i = 0; i < 24; i += 8) 
	{
        chipId |= ((macAddress >> (40 - i)) & 0xFF) << i;
    }
	printf("生成的 ESP32 Chip ID: %08X\n",  chipId);
	printf("生成的 ESP32 Chip ID: %d\n",   chipId);
    for(int i=0; i<17; i=i+8) 
    {
	  chipId |= ((macAddress >> (40 - i)) & 0xff) << i;
	}
	    // 打印 32 位的 Chip ID
    printf("生成的 ESP32 Chip ID: %08X\n", chipId);
    printf("生成的 ESP32 Chip ID: %d\n",   chipId);
    
	chipId |=   
	       (uint8_t)(macAddress >> 40) & 0xFF<<16|
           (uint8_t)(macAddress >> 32) & 0xFF<<8 |
           (uint8_t)(macAddress >> 24) & 0xFF<<0,
           
    printf("生成的 ESP32 Chip ID: %08X\n", chipId);
    printf("生成的 ESP32 Chip ID: %d\n",   chipId);
    
    // Call the function and get the MQTT topic pointer
    char *result = macToMqttTopic(macAddress, mqttTopic);
    
    // Print MQTT topic
    printf("由MAC地址信息生成MQTT topic: %s\n", result);
    
    return 0;
}




MAC生成的MQTT主题

由MAC地址信息生成MQTT topic: /Devices/8C/3A/C7/27/84/3C
Logo

一站式 AI 云服务平台

更多推荐