Files
pt.ionut/README.md
2026-02-03 17:10:32 +02:00

271 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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