This is an old revision of the document!
Microfon laser :
Listă de piese: ESP32 DevKit (cu Wi-Fi și capacitate de procesare DSP)
2x Laser pointer roșu (clasă II sau III, alimentare 3–5V)
2x Fotodiodă (ex: BPW34 sau similar)
2x Amplificator operațional (MAX7804)
Priză jack stereo de 3.5mm (pentru ieșire audio)
Breadboard și fire de conexiune
Sursă de alimentare stabilizată 5V
- 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
Citirea a două canale analogice conectate la ieșirile a două module OPT101
Filtrare software:
moving average (medie glisantă)
mediana pe N eșantioane
Reducere zgomot prin comparație diferențială:
dacă semnalele sunt în opoziție de fază (unul e zgomot de fond, altul e reflexie utilă)
semnal final = semnal1 - semnal2
Transmisie UART / Wi-Fi la laptop pentru analiză sau redare
→ setup() inițializează ADC-urile (analogReadResolution(12))
configurează pinii OPT101 (analogRead(GPIO34) și analogRead(GPIO35))
inițializează comunicarea (USB Serial sau Wi-Fi)
→ loop() citește periodic ambele canale
adaugă valorile într-un buffer circular
aplică un filtru (
calculează diferența dintre canale
trimite rezultatul prin Serial/WiFi
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
import serial import time from collections import deque import matplotlib.pyplot as plt import matplotlib.animation as animation
SERIAL_PORT = 'COM3' # sau '/dev/ttyUSB0' pe Linux BAUD_RATE = 115200
BUFFER_SIZE = 100 data_buffer = deque([0]*BUFFER_SIZE, maxlen=BUFFER_SIZE)
fig, ax = plt.subplots() line, = ax.plot([], [], lw=2) ax.set_ylim(0, 4095) # ADC pe 12 biți ax.set_xlim(0, BUFFER_SIZE) ax.set_title(“Semnal de la ESP32”) ax.set_ylabel(“Valoare ADC”) ax.set_xlabel(“Timp (ultimele N puncte)”)
def update_plot(frame):
global ser try: line_raw = ser.readline().decode().strip() if line_raw.startswith("CH"): val = float(line_raw.split(":")[1]) data_buffer.append(val) line.set_data(range(len(data_buffer)), list(data_buffer)) except: pass return line,
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1) time.sleep(2) # Așteaptă pornirea ESP-ului
ani = animation.FuncAnimation(fig, update_plot, interval=50) plt.tight_layout() plt.show()
ser.close()