Update README.md

This commit is contained in:
2026-02-03 17:10:32 +02:00
parent ecb688eeaf
commit 253ea56b59

271
README.md
View File

@@ -1,2 +1,271 @@
# pt.ionut
# 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