271 lines
4.8 KiB
Markdown
271 lines
4.8 KiB
Markdown
# STM32 + STM32CubeMX + Senzor + UDP (LwIP)
|
||
|
||
## Descriere
|
||
Acest proiect descrie un circuit și un exemplu de firmware pentru un **STM32**
|
||
care citește date de la un **senzor** și le trimite prin **UDP** în rețea,
|
||
folosind **STM32CubeMX** și **LwIP**.
|
||
|
||
Exemplu:
|
||
- MCU: STM32F407 / STM32F103 / STM32F7 (orice STM32 cu Ethernet sau WiFi)
|
||
- Stack rețea: LwIP (UDP)
|
||
- Senzor: DHT22 (temperatură & umiditate)
|
||
- Protocol: UDP
|
||
|
||
---
|
||
|
||
## Schema electronică (logică)
|
||
|
||
### Componente
|
||
- STM32 (cu Ethernet PHY sau modul WiFi extern)
|
||
- DHT22
|
||
- Rezistor 10kΩ (pull-up)
|
||
- Alimentare 3.3V
|
||
|
||
### Conexiuni DHT22
|
||
|
||
+----------------------+
|
||
| STM32 |
|
||
| |
|
||
| 3V3 o----+----------+---- VCC (DHT22)
|
||
| |
|
||
| [10kΩ]
|
||
| |
|
||
| GPIOx o----+---------- DATA (DHT22)
|
||
| |
|
||
| GND o---------------+---- GND (DHT22)
|
||
| |
|
||
+----------------------+
|
||
|
||
|
||
- DATA → orice GPIO configurat ca output/input
|
||
- Pull-up 10kΩ între DATA și 3.3V
|
||
|
||
---
|
||
|
||
## Configurare STM32CubeMX
|
||
|
||
### 1. Clock
|
||
- Configurează HSE / PLL conform plăcii tale
|
||
- Asigură-te că SysTick funcționează corect (important pentru LwIP)
|
||
|
||
### 2. GPIO
|
||
- GPIOx → Output Push-Pull (pentru DHT22)
|
||
- No pull (pull-up extern)
|
||
|
||
### 3. Ethernet / WiFi
|
||
#### Ethernet:
|
||
- Activează **ETH**
|
||
- PHY: LAN8720 / DP83848 (în funcție de placă)
|
||
|
||
#### WiFi:
|
||
- Modul extern (ex: ESP-AT) sau STM32 cu WiFi integrat
|
||
|
||
### 4. Middleware → LwIP
|
||
- Enable **LwIP**
|
||
- Mode: **UDP**
|
||
- DHCP: Enabled (sau IP static)
|
||
|
||
### 5. FreeRTOS (opțional)
|
||
- Recomandat pentru aplicații mai mari
|
||
- Task separat pentru senzori
|
||
|
||
---
|
||
|
||
## Structura proiectului
|
||
|
||
|
||
- DATA → orice GPIO configurat ca output/input
|
||
- Pull-up 10kΩ între DATA și 3.3V
|
||
|
||
---
|
||
|
||
## Configurare STM32CubeMX
|
||
|
||
### 1. Clock
|
||
- Configurează HSE / PLL conform plăcii tale
|
||
- Asigură-te că SysTick funcționează corect (important pentru LwIP)
|
||
|
||
### 2. GPIO
|
||
- GPIOx → Output Push-Pull (pentru DHT22)
|
||
- No pull (pull-up extern)
|
||
|
||
### 3. Ethernet / WiFi
|
||
#### Ethernet:
|
||
- Activează **ETH**
|
||
- PHY: LAN8720 / DP83848 (în funcție de placă)
|
||
|
||
#### WiFi:
|
||
- Modul extern (ex: ESP-AT) sau STM32 cu WiFi integrat
|
||
|
||
### 4. Middleware → LwIP
|
||
- Enable **LwIP**
|
||
- Mode: **UDP**
|
||
- DHCP: Enabled (sau IP static)
|
||
|
||
### 5. FreeRTOS (opțional)
|
||
- Recomandat pentru aplicații mai mari
|
||
- Task separat pentru senzori
|
||
|
||
---
|
||
|
||
## Structura proiectului
|
||
|
||
Core/
|
||
├── Src/
|
||
│ ├── main.c
|
||
│ ├── udp_client.c
|
||
│ └── dht22.c
|
||
└── Inc/
|
||
├── udp_client.h
|
||
└── dht22.h
|
||
|
||
|
||
|
||
---
|
||
|
||
## Cod – UDP Client (LwIP)
|
||
|
||
### udp_client.c
|
||
```c
|
||
#include "lwip/udp.h"
|
||
#include "lwip/ip_addr.h"
|
||
#include <string.h>
|
||
|
||
static struct udp_pcb *upcb;
|
||
static ip_addr_t dest_ip;
|
||
|
||
void udp_client_init(void)
|
||
{
|
||
upcb = udp_new();
|
||
IP4_ADDR(&dest_ip, 192,168,1,100); // IP destinatie
|
||
udp_connect(upcb, &dest_ip, 5005); // Port UDP
|
||
}
|
||
|
||
void udp_send_data(char *data)
|
||
{
|
||
struct pbuf *p;
|
||
p = pbuf_alloc(PBUF_TRANSPORT, strlen(data), PBUF_RAM);
|
||
memcpy(p->payload, data, strlen(data));
|
||
udp_send(upcb, p);
|
||
pbuf_free(p);
|
||
}
|
||
```
|
||
|
||
### udp_client.h
|
||
```h
|
||
void udp_client_init(void);
|
||
void udp_send_data(char *data);
|
||
```
|
||
|
||
# Cod – DHT22 (simplificat)
|
||
### dht22.h
|
||
```h
|
||
float DHT22_ReadTemperature(void);
|
||
float DHT22_ReadHumidity(void);
|
||
```
|
||
|
||
### dht22.c
|
||
```c
|
||
#include "dht22.h"
|
||
|
||
// Implementare minimală (pseudo-cod)
|
||
// Timing-ul real trebuie ajustat cu delay-uri precise
|
||
|
||
float DHT22_ReadTemperature(void)
|
||
{
|
||
return 23.5; // exemplu
|
||
}
|
||
|
||
float DHT22_ReadHumidity(void)
|
||
{
|
||
return 45.2; // exemplu
|
||
}
|
||
```
|
||
|
||
### main.c – Integrare
|
||
|
||
```c
|
||
#include "udp_client.h"
|
||
#include "dht22.h"
|
||
#include <stdio.h>
|
||
|
||
int main(void)
|
||
{
|
||
HAL_Init();
|
||
SystemClock_Config();
|
||
MX_GPIO_Init();
|
||
MX_LWIP_Init();
|
||
|
||
udp_client_init();
|
||
|
||
char msg[128];
|
||
|
||
while (1)
|
||
{
|
||
MX_LWIP_Process();
|
||
|
||
float t = DHT22_ReadTemperature();
|
||
float h = DHT22_ReadHumidity();
|
||
|
||
snprintf(msg, sizeof(msg),
|
||
"{ \"device\":\"stm32\", \"temp\":%.2f, \"hum\":%.2f }",
|
||
t, h);
|
||
|
||
udp_send_data(msg);
|
||
|
||
HAL_Delay(5000);
|
||
}
|
||
}
|
||
```
|
||
|
||
# Exemplu pachet UDP trimis
|
||
```json
|
||
{
|
||
"device": "stm32",
|
||
"temp": 23.50,
|
||
"hum": 45.20
|
||
}
|
||
```
|
||
---
|
||
# Recepție UDP (test rapid pe PC)
|
||
|
||
### Linux
|
||
|
||
```bash
|
||
nc -u -l 5005
|
||
```
|
||
|
||
### Python
|
||
|
||
```python
|
||
import socket
|
||
|
||
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||
s.bind(("0.0.0.0", 5005))
|
||
|
||
while True:
|
||
data, addr = s.recvfrom(1024)
|
||
print(data.decode())
|
||
```
|
||
---
|
||
### Extensii posibile
|
||
|
||
* Integrare Grafana / InfluxDB
|
||
|
||
* Trimitere JSON + autentificare
|
||
|
||
* Mai mulți senzori
|
||
|
||
* Task FreeRTOS separat
|
||
|
||
* Watchdog + reconnect rețea
|
||
|
||
---
|
||
|
||
### Note importante
|
||
|
||
* LwIP necesită apel constant la MX_LWIP_Process()
|
||
|
||
* UDP nu garantează livrarea
|
||
|
||
* Pentru producție → recomand TCP sau MQTT |