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

4.8 KiB
Raw Blame History

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

#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

void udp_client_init(void);
void udp_send_data(char *data);

Cod DHT22 (simplificat)

dht22.h

float DHT22_ReadTemperature(void);
float DHT22_ReadHumidity(void);

dht22.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

#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

{
  "device": "stm32",
  "temp": 23.50,
  "hum": 45.20
}

Recepție UDP (test rapid pe PC)

Linux

nc -u -l 5005

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