# 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