This is an old revision of the document!
https://github.com/iosif-stan/pm
Microfon laser :
Listă de piese:
ESP32 DevKit1
2x Laser pointer roșu (alimentare 3–5V)
2x Fotodiodă (opt101)
Breadboard și fire de conexiune
Sursă de alimentare stabilizată 5V
3x led clasic (rosu , galben , verde)
3x rezistente 220ohmi
- Mediu de dezvoltare: PlatformIO
- Placă țintă: ESP32 DevKitC
- Firmware scris în C++ (Arduino Framework)
Arduino.h – suport de bază pentru ESP32
WiFi.h – pentru trimiterea datelor la PC (opțional)
MovingAverage.h (sau filtru mediană custom) – pentru atenuarea zgomotului
esp_adc_cal.h – pentru calibrarea ADC-ului
Algoritmi și structuri:
Citire simultană a două canale analogice (OPT101)
Filtrare software: medie glisantă și mediană pe N eșantioane
Reducere zgomot prin diferență: semnal final = semnal1 − semnal2 (pentru semnale în opoziție de fază)
Transmisie date prin UART sau Wi-Fi către laptop
Funcționare:
setup():
Inițializează ADC (rezoluție 12 biți)
Configurează pinii pentru OPT101 (GPIO34, GPIO35)
Inițializează comunicația Serial/Wi-Fi
loop():
Citește ambele canale periodic
Stochează valorile în buffer circular
Aplică filtrul și calculează diferența
Trimite rezultatul prin Serial/Wi-Fi
CONST N_SAMPLES = 10
BUFFER1 = array de 10 elemente, inițializate cu 0
BUFFER2 = array de 10 elemente, inițializate cu 0
IDX = 0
FUNCȚIE setup:
initializează comunicarea serială setează rezoluția ADC la 12 biți configurează pinul SELECT_GPIO ca intrare cu rezistență pull-up internă (dacă mai trebuie pentru alt scop)
FUNCȚIE average(buffer):
sumă = 0 pentru fiecare valoare din buffer: sumă = sumă + valoare returnează sumă împărțit la N_SAMPLES
FUNCȚIE loop:
citește valoarea analogică de pe pinul OPT1_PIN salvează valoarea în BUFFER1[IDX]
citește valoarea analogică de pe pinul OPT2_PIN salvează valoarea în BUFFER2[IDX]
calculează media1 = average(BUFFER1) calculează media2 = average(BUFFER2)
calculează semnal_filtrat = media1 - media2 // exemplu de calcul pentru atenuarea zgomotului
afișează "Media senzor 1:" + media1 afișează "Media senzor 2:" + media2 afișează "Semnal filtrat:" + semnal_filtrat
IDX = (IDX + 1) modulo N_SAMPLES
așteaptă 10 milisecunde
DEFINE SERIAL_PORT = 'COM3' DEFINE BAUD_RATE = 115200 DEFINE BUFFER_SIZE = 100
INITIALIZE data_buffer ca coadă cu maxim BUFFER_SIZE elemente, toate inițializate cu 0
INITIALIZE grafic cu axele setate astfel:
axa verticală: 0 până la 4095 (rezoluție ADC 12 biți) axa orizontală: 0 până la BUFFER_SIZE titlu: "Semnal de la ESP32" etichete: "Valoare ADC" pe verticală, "Timp (ultimele N puncte)" pe orizontală
DESCHIDE portul serial pe SERIAL_PORT cu BAUD_RATE și timeout de 1 secundă AȘTEAPTĂ 2 secunde (pentru a permite ESP32 să pornească)
FUNCȚIE update_plot(frame):
încearcă să citească un rând din portul serial dacă rândul începe cu "CH": extrage valoarea numerică după ":" adaugă valoarea în data_buffer (se șterge cel mai vechi dacă s-a depășit dimensiunea) actualizează datele graficului cu valorile din data_buffer ignoră orice eroare la citirea sau conversia datelor returnează linia graficului actualizată
PORNEȘTE animația graficului care apelează update_plot la fiecare 50 ms
CÂND fereastra graficului se închide:
ÎNCHIDE portul serial