Embedded Systems & IoT
Microcontroller Platforms
| Platform |
Best For |
Language |
IDE |
| ESP32 |
WiFi/BLE IoT devices |
C/C++, MicroPython |
PlatformIO, Arduino IDE |
| STM32 |
Industrial, real-time |
C/C++ |
STM32CubeIDE, PlatformIO |
| Arduino |
Prototyping, learning |
C++ (Arduino) |
Arduino IDE, PlatformIO |
| Raspberry Pi Pico |
RP2040, dual-core |
C/C++, MicroPython |
Thonny, VS Code |
| nRF52 |
BLE-focused IoT |
C, Zephyr |
nRF Connect SDK |
Firmware Patterns
GPIO & Peripherals
// ESP-IDF GPIO example
gpio_config_t io_conf = {
.pin_bit_mask = (1ULL << GPIO_NUM_2),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&io_conf);
gpio_set_level(GPIO_NUM_2, 1);
I2C Communication
// Read sensor via I2C
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (SENSOR_ADDR << 1) | I2C_MASTER_WRITE, true);
i2c_master_write_byte(cmd, REG_TEMP, true);
i2c_master_start(cmd);
i2c_master_write_byte(cmd, (SENSOR_ADDR << 1) | I2C_MASTER_READ, true);
i2c_master_read(cmd, data, 2, I2C_MASTER_LAST_NACK);
i2c_master_stop(cmd);
i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(1000));
i2c_cmd_link_delete(cmd);
RTOS (FreeRTOS)
// Task creation
void sensor_task(void *pvParameters) {
while (1) {
float temp = read_temperature();
xQueueSend(data_queue, &temp, portMAX_DELAY);
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
xTaskCreate(sensor_task, "sensor", 4096, NULL, 5, NULL);
// Mutex for shared resources
SemaphoreHandle_t spi_mutex = xSemaphoreCreateMutex();
if (xSemaphoreTake(spi_mutex, pdMS_TO_TICKS(100)) == pdTRUE) {
spi_transfer(data);
xSemaphoreGive(spi_mutex);
}
IoT Protocols
MQTT
// ESP-IDF MQTT client
esp_mqtt_client_config_t mqtt_cfg = {
.broker.address.uri = "mqtt://broker.hivemq.com",
};
esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);
esp_mqtt_client_start(client);
esp_mqtt_client_publish(client, "/sensors/temp", "23.5", 0, 1, 0);
Key IoT Protocols
| Protocol |
Transport |
Use Case |
| MQTT |
TCP/TLS |
Pub/sub messaging, telemetry |
| CoAP |
UDP/DTLS |
Constrained devices, REST-like |
| BLE |
Radio |
Short-range, low power |
| LoRaWAN |
Radio |
Long-range, low data rate |
| Matter |
IP |
Smart home interoperability |
Best Practices
- Power management: Deep sleep modes, wake-on-interrupt, duty cycling
- Watchdog timers: Always enable, reset periodically, catch firmware hangs
- OTA updates: Dual partition scheme, rollback on boot failure, signature verification
- Memory: Static allocation preferred, avoid heap fragmentation, use memory pools
- Testing: Hardware-in-the-loop (HIL), mock hardware interfaces for unit tests
1---2name: embedded-iot3description: Embedded systems firmware, microcontrollers (ESP32, STM32, Arduino, Raspberry Pi), RTOS (FreeRTOS, Zephyr), IoT protocols (MQTT, CoAP, BLE), bare-metal C/C++, and hardware peripheral interfaces (I2C, SPI, UART, GPIO). Use when developing firmware, working with microcontrollers, or building IoT devices.4---5
6# Embedded Systems & IoT
7
8## Microcontroller Platforms
9
10| Platform | Best For | Language | IDE |
11|----------|----------|----------|-----|
12| **ESP32** | WiFi/BLE IoT devices | C/C++, MicroPython | PlatformIO, Arduino IDE |
13| **STM32** | Industrial, real-time | C/C++ | STM32CubeIDE, PlatformIO |
14| **Arduino** | Prototyping, learning | C++ (Arduino) | Arduino IDE, PlatformIO |
15| **Raspberry Pi Pico** | RP2040, dual-core | C/C++, MicroPython | Thonny, VS Code |
16| **nRF52** | BLE-focused IoT | C, Zephyr | nRF Connect SDK |
17
18## Firmware Patterns
19
20### GPIO & Peripherals
21```c
22// ESP-IDF GPIO example
23gpio_config_t io_conf = {
24 .pin_bit_mask = (1ULL << GPIO_NUM_2),
25 .mode = GPIO_MODE_OUTPUT,
26 .pull_up_en = GPIO_PULLUP_DISABLE,
27 .pull_down_en = GPIO_PULLDOWN_DISABLE,
28 .intr_type = GPIO_INTR_DISABLE,
29};
30gpio_config(&io_conf);
31gpio_set_level(GPIO_NUM_2, 1);
32```
33
34### I2C Communication
35```c
36// Read sensor via I2C
37i2c_cmd_handle_t cmd = i2c_cmd_link_create();
38i2c_master_start(cmd);
39i2c_master_write_byte(cmd, (SENSOR_ADDR << 1) | I2C_MASTER_WRITE, true);
40i2c_master_write_byte(cmd, REG_TEMP, true);
41i2c_master_start(cmd);
42i2c_master_write_byte(cmd, (SENSOR_ADDR << 1) | I2C_MASTER_READ, true);
43i2c_master_read(cmd, data, 2, I2C_MASTER_LAST_NACK);
44i2c_master_stop(cmd);
45i2c_master_cmd_begin(I2C_NUM_0, cmd, pdMS_TO_TICKS(1000));
46i2c_cmd_link_delete(cmd);
47```
48
49## RTOS (FreeRTOS)
50
51```c
52// Task creation
53void sensor_task(void *pvParameters) {
54 while (1) {
55 float temp = read_temperature();
56 xQueueSend(data_queue, &temp, portMAX_DELAY);
57 vTaskDelay(pdMS_TO_TICKS(1000));
58 }
59}
60xTaskCreate(sensor_task, "sensor", 4096, NULL, 5, NULL);
61
62// Mutex for shared resources
63SemaphoreHandle_t spi_mutex = xSemaphoreCreateMutex();
64if (xSemaphoreTake(spi_mutex, pdMS_TO_TICKS(100)) == pdTRUE) {
65 spi_transfer(data);
66 xSemaphoreGive(spi_mutex);
67}
68```
69
70## IoT Protocols
71
72### MQTT
73```c
74// ESP-IDF MQTT client
75esp_mqtt_client_config_t mqtt_cfg = {
76 .broker.address.uri = "mqtt://broker.hivemq.com",
77};
78esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);
79esp_mqtt_client_start(client);
80esp_mqtt_client_publish(client, "/sensors/temp", "23.5", 0, 1, 0);
81```
82
83### Key IoT Protocols
84| Protocol | Transport | Use Case |
85|----------|-----------|----------|
86| **MQTT** | TCP/TLS | Pub/sub messaging, telemetry |
87| **CoAP** | UDP/DTLS | Constrained devices, REST-like |
88| **BLE** | Radio | Short-range, low power |
89| **LoRaWAN** | Radio | Long-range, low data rate |
90| **Matter** | IP | Smart home interoperability |
91
92## Best Practices
93- **Power management:** Deep sleep modes, wake-on-interrupt, duty cycling
94- **Watchdog timers:** Always enable, reset periodically, catch firmware hangs
95- **OTA updates:** Dual partition scheme, rollback on boot failure, signature verification
96- **Memory:** Static allocation preferred, avoid heap fragmentation, use memory pools
97- **Testing:** Hardware-in-the-loop (HIL), mock hardware interfaces for unit tests