Update README.md
This commit is contained in:
271
README.md
271
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 <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
|
||||||
Reference in New Issue
Block a user