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
#define N_SAMPLES 10
float buffer1[N_SAMPLES] = {0}; float buffer2[N_SAMPLES] = {0}; int idx = 0;
void setup() { Serial.begin(115200); UART - Laborator 1 analogReadResolution(12); ADC - Laborator 4
pinMode(SELECT_GPIO, INPUT_PULLUP); GPIO - Laborator 0
}
float average(float* buf) {
float sum = 0;
for (int i = 0; i < N_SAMPLES; i++) sum += buf[i];
return sum / N_SAMPLES;
}
void loop() {
bool useOpt1 = digitalRead(SELECT_GPIO);
if (useOpt1) {
buffer1[idx] = analogRead(OPT1_PIN);
float avg = average(buffer1);
Serial.print(“CH1: ”);
Serial.println(avg);
} else {
buffer2[idx] = analogRead(OPT2_PIN);
float avg = average(buffer2);
Serial.print(“CH2: ”);
Serial.println(avg);
}
idx = (idx + 1) % N_SAMPLES;
delay(10);
}
</note>
===== Script Receiver Python : =====
<note tip>
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()
</note>
===== Rezultate Obţinute =====
<note tip>
Care au fost rezultatele obţinute în urma realizării proiectului vostru.
</note>
===== Concluzii =====
===== Download =====
<note warning>
O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună .
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
</note>
===== Jurnal =====
not finished yet
===== Bibliografie/Resurse =====
not finished yet
<html><a class=“media mediafile mf_pdf” href=”?do=export_pdf”>Export to PDF</a></html>