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