From 253ea56b595777a64a473fd2a28cf437f54a6b44 Mon Sep 17 00:00:00 2001 From: EDDmanoo Date: Tue, 3 Feb 2026 17:10:32 +0200 Subject: [PATCH] Update README.md --- README.md | 271 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 270 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fd79e4d..4feffb7 100644 --- a/README.md +++ b/README.md @@ -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 + +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 + +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 \ No newline at end of file