Ова категорија садржи практичне вежбе и пројекте засноване на Arduino платформи. Кроз рад са сензорима, актуаторима и различитим електронским компонентама ученици стичу основна знања из програмирања микроконтролера, електронике и STEM области. Вежбе су намењене почетницима и напреднијим корисницима који желе да развијају своје пројекте и истражују свет уграђених система.
У овој лекцији ученици ће научити како ради акцелерометар, један од три сензора који се налазе у оквиру MPU-9250 модула. Акцелерометар мери убрзање по три међусобно нормалне осе (X, Y и Z) и омогућава одређивање нагиба, детекцију покрета и анализу кретања објекта.
Иако назив говори да мери убрзање, акцелерометар може да одреди и оријентацију у односу на Земљину гравитацију. Управо зато се користи у мобилним телефонима, дроновима, паметним сатовима, роботима и бројним STEM пројектима.

MPU-9250 комбинује акцелерометар, жироскоп и магнетометар у једном интегрисаном колу.

Акцелерометар непрекидно мери убрзање по три осе и омогућава одређивање нагиба и кретања уређаја.
Акцелерометар је електронски сензор који мери убрзање. Под убрзањем не подразумевамо само повећање брзине, већ сваку промену кретања: полазак, успоравање, окретање или нагло заустављање.
Када је сензор потпуно миран на столу, он и даље мери приближно 1 g, јер на њега делује Земљина гравитација. Управо захваљујући томе можемо да одредимо како је плочица нагнута у простору.
Региструје промену брзине кретања по свакој оси.
Користи Земљину гравитацију као референтни правац.
Може да препозна пад, тресење, удар или промену положаја.

Акцелерометар мери убрзање по X, Y и Z оси које су везане за сам сензор.
На Земљиној површини сва тела привлачи сила гравитације. Ако је сензор потпуно миран, једино убрзање које региструје потиче управо од гравитације и има вредност приближно:
g ≈ 9.81 m/s²
Када је плочица положена хоризонтално, скоро целокупно гравитационо убрзање пројектује се на Z осу, док су вредности на X и Y осама близу нуле.
При нагињању плочице мењају се пројекције вектора гравитације на све три осе. Управо из тих вредности могуће је израчунати угао нагиба.

Нагињањем сензора мењају се компоненте гравитације по X, Y и Z оси, што омогућава одређивање нагиба.
Акцелерометар мери убрзање по три међусобно нормалне осе које су везане за сам сензор. То значи да се координатни систем увек окреће заједно са плочицом, а не са простором у коме се она налази.
Када окренемо ESP32 или MPU-9250 модул, мења се положај његових оса у односу на Земљину гравитацију. Због тога ће се променити и вредности које очитавамо на X, Y и Z оси.

Приликом окретања плочице окрећу се и координатне осе акцелерометра. Сензор увек мери компоненте убрзања у свом локалном координатном систему.
Док се плочица не креће нагло, највећи део измереног убрзања представља Земљина гравитација. Због тога се из односа компоненти убрзања могу израчунати углови нагиба.
Најчешће се користе два угла:
У пракси се најчешће користе следеће формуле:
Roll = atan2(AY, AZ)
Pitch = atan2(-AX, √(AY² + AZ²))
Функција atan2() враћа угао на основу односа две величине и омогућава исправно одређивање нагиба у свим квадрантима.

Нагиб око X и Y осе израчунава се на основу вредности које мери акцелерометар.
Замислимо да је ESP32 постављен потпуно хоризонтално на сто. Тада ће вредности бити приближно:
Ако затим нагнемо плочицу улево, вредност по X оси почиње да расте или опада, док се вредност по Z оси смањује. Исто важи и за нагиб напред или назад, само што се тада мењају AY и AZ.
AX≈0
AY≈0
AZ≈1g
AX се мења
AZ се смањује
AY се мења
AZ се смањује
Акцелерометар не мери директно угао нагиба, већ компоненте убрзања по свакој оси. Израчунавање угла представља математичку обраду измерених података.
Када се плочица брзо креће, поред гравитације јављају се и додатна убрзања, па мерење нагиба постаје мање прецизно. Због тога се у напреднијим системима акцелерометар комбинује са жироскопом.
| MPU-9250 | ESP32 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO23 |
| SCL | GPIO22 |
U Arduino IDE instalirati biblioteku:
MPU9250_asukiaaa
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
#define SDA_PIN 23
#define SCL_PIN 22
MPU9250_asukiaaa mpu;
void setup() {
Serial.begin(115200);
delay(1000);
Wire.begin(SDA_PIN, SCL_PIN);
mpu.setWire(&Wire);
mpu.beginAccel();
Serial.println("MPU-9250 je spreman.");
}
void loop() {
// Učitavanje novog merenja
mpu.accelUpdate();
// Slanje: AX, AY, AZ i intenzitet ubrzanja
Serial.print(mpu.accelX(),3);
Serial.print(",");
Serial.print(mpu.accelY(),3);
Serial.print(",");
Serial.print(mpu.accelZ(),3);
Serial.print(",");
Serial.println(mpu.accelSqrt(),3);
delay(100);
}
Уколико је све исправно повезано, у Serial Monitor-у добијају се вредности сличне следећим:
AX: 0.01 AY: -0.03 AZ: 0.99
AX: 0.02 AY: -0.04 AZ: 0.98
AX: 0.00 AY: -0.02 AZ: 1.00
Вредност по Z оси је близу 1 g, јер сензор мирује и региструје Земљину гравитацију. Ако нагнете плочицу, приметићете да се вредности по X и Y осама мењају, док се вредност по Z постепено смањује.
Ovaj program u okruženju Processing koristi biblioteku Serial za prijem podataka sa mikrokontrolera (preko serijske komunikacije) i njihov prikaz u 3D prostoru pomoću P3D renderera. Crvena, zelena i plava linija predstavljaju koordinatne ose (X, Y i Z), dok narandžasta linija prikazuje vektor ubrzanja dobijen sa senzora.
import processing.serial.*; // Biblioteka za serijsku komunikaciju
Serial port; // Objekat za komunikaciju preko serijskog porta
// Promenljive za komponente ubrzanja i ukupno ubrzanje
float ax, ay, az, a;
void setup() {
// Kreiranje prozora dimenzija 900x700 sa P3D rendererom
size(900, 700, P3D);
// Otvaranje prvog dostupnog serijskog porta brzinom 115200 bps
port = new Serial(this, Serial.list()[0], 115200);
// Čitanje podataka tek kada stigne novi red ('\n')
port.bufferUntil('\n');
}
void draw() {
// Svetlosiva pozadina
background(240);
// Uključivanje osvetljenja za 3D prikaz
lights();
// Pomeranje koordinatnog sistema u centar prozora
translate(width/2, height/2);
// Blago naginjanje scene radi boljeg prikaza
rotateX(-PI/6);
// Kontinuirana rotacija oko Y ose
rotateY(frameCount * 0.002);
// Debljina linija koordinatnih osa
strokeWeight(3);
// X osa - crvena
stroke(255, 0, 0);
line(0, 0, 0, 150, 0, 0);
// Y osa - zelena
stroke(0, 255, 0);
line(0, 0, 0, 0, 150, 0);
// Z osa - plava
stroke(0, 0, 255);
line(0, 0, 0, 0, 0, 150);
// Deblja narandžasta linija predstavlja vektor ubrzanja
strokeWeight(6);
stroke(255, 120, 0);
// Skaliranje vrednosti senzora radi preglednijeg prikaza
// Negativni znaci kod Y i Z prilagođavaju orijentaciju Processing koordinatnom sistemu
line(0, 0, 0,
ax * 120,
-ay * 120,
-az * 120);
}
// Funkcija se automatski poziva kada stigne novi red podataka
void serialEvent(Serial p) {
// Čitanje jednog reda i uklanjanje praznih karaktera
String s = trim(p.readString());
// Razdvajanje vrednosti po zarezu
String[] v = split(s, ',');
// Očekuje se format:
// ax,ay,az,a
if (v.length == 4) {
// Konverzija tekstualnih vrednosti u decimalne brojeve
ax = float(v[0]);
ay = float(v[1]);
az = float(v[2]);
// Ukupno ubrzanje (trenutno se ne koristi u prikazu,
// ali može poslužiti za ispis ili dodatne analize)
a = float(v[3]);
}
}
Вредности које очитава акцелерометар представљају пројекције вектора гравитације на координатне осе сензора. Из тих вредности могуће је израчунати угао нагиба уређаја.
У овој лекцији користићемо два најважнија угла:
Функција atan2() враћа угао у радијанима, па је потребно резултат претворити у степене множењем са 180/PI.

Из измерених вредности AX, AY и AZ могу се израчунати углови нагиба Pitch и Roll.
Ovaj program koristi biblioteku MPU9250_asukiaaa za komunikaciju sa MPU9250 IMU senzorom preko I²C magistrale. U svakom prolazu kroz glavnu petlju očitavaju se vrednosti ubrzanja po osama X, Y i Z, nakon čega se na osnovu akcelerometra izračunavaju uglovi pitch (nagib napred–nazad) i roll (nagib levo–desno). Dobijeni uglovi se šalju preko serijskog porta u formatu pitch,roll, što omogućava njihovu jednostavnu obradu ili vizuelizaciju u programu Processing.
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
// Kreiranje objekta za rad sa MPU9250 senzorom
MPU9250_asukiaaa imu;
// Promenljive za komponente ubrzanja
float ax, ay, az;
// Promenljive za uglove nagiba
float pitch, roll;
void setup() {
// Pokretanje serijske komunikacije
Serial.begin(115200);
// Pokretanje I2C magistrale
// SDA = GPIO21
// SCL = GPIO22
Wire.begin(21, 22);
// Povezivanje biblioteke sa I2C magistralom
imu.setWire(&Wire);
// Inicijalizacija senzora
imu.beginAccel();
Serial.println("MPU9250 inicijalizovan.");
}
void loop() {
// Očitavanje novih podataka sa akcelerometra
imu.accelUpdate();
// Učitavanje ubrzanja po osama (u jedinicama g)
ax = imu.accelX();
ay = imu.accelY();
az = imu.accelZ();
// Izračunavanje ugla roll
// Određuje nagib oko X ose
roll = atan2(ay, az) * 180.0 / PI;
// Izračunavanje ugla pitch
// Određuje nagib oko Y ose
pitch = atan2(-ax,
sqrt(ay * ay + az * az))
* 180.0 / PI;
// Slanje rezultata preko serijskog porta
// Format:
// pitch,roll
Serial.print(pitch);
Serial.print(",");
Serial.println(roll);
// Očitavanje približno 50 puta u sekundi
delay(20);
}
Program koristi samo podatke sa akcelerometra, zbog čega je veoma jednostavan i pogodan za određivanje statičkog nagiba senzora. Međutim, prilikom brzih pokreta ili vibracija merenja mogu biti manje stabilna, jer akcelerometar registruje i dinamička ubrzanja. Za preciznije određivanje orijentacije u pokretu potrebno je kombinovati podatke akcelerometra i žiroskopa primenom odgovarajućeg filtra (npr. komplementarnog ili Kalmanovog filtra).
Један од најзанимљивијих начина да ученици разумеју рад акцелерометра јесте приказ нагиба на екрану рачунара. Processing ће читати вредности које шаље ESP32 и приказивати линију која се окреће у складу са нагибом плочице.
import processing.serial.*;
Serial port;
float pitch = 0;
void setup()
{
size(600,600);
println(Serial.list());
port = new Serial(this,
Serial.list()[0],
115200);
port.bufferUntil('\n');
}
void draw()
{
background(240);
translate(width/2,height/2);
rotate(radians(pitch));
strokeWeight(8);
line(-150,0,150,0);
fill(0);
ellipse(0,0,20,20);
}
void serialEvent(Serial p)
{
String data = p.readStringUntil('\n');
if(data!=null)
{
data=trim(data);
String vrednosti[] = split(data,',');
if(vrednosti.length==2)
{
pitch=float(vrednosti[0]);
}
}
}

Како ученик помера ESP32 плочицу, линија на екрану ротира и приказује угао нагиба у реалном времену.
Једна од великих предности рада са ESP32 је могућност да се измерени подаци не приказују само као бројеви у Serial Monitor-у, већ и графички. На тај начин много је лакше разумети како се вредности акцелерометра мењају приликом померања сензора.
У овој лекцији направићемо једноставан индикатор нагиба. ESP32 ће преко серијске комуникације слати вредности углова израчунатих на основу акцелерометра, а Processing ће приказати линију која представља тренутни нагиб плоче.

У Processing-у се угао нагиба приказује графички, што омогућава једноставно праћење оријентације ESP32 плоче.
import processing.serial.*;
Serial port;
float angle = 0;
void setup() {
size(600,600);
port = new Serial(this,"COM5",115200);
port.bufferUntil('\n');
}
void draw(){
background(240);
translate(width/2,height/2);
rotate(radians(angle));
strokeWeight(8);
line(0,0,180,0);
fill(255,0,0);
ellipse(0,0,18,18);
}
void serialEvent(Serial p){
String s = trim(p.readString());
angle = float(s);
}
Поставите ESP32 на сто тако да мирује. Запишите вредности AX, AY и AZ. Потом ротирајте плочу за 90° око сваке осе и поново измерите вредности.
Питања:
Напишите програм који приказује угао нагиба око X осе. Полако нагињите плочу и пратите како се угао мења.
Задатак:
Повежите ESP32 са Processing програмом и прикажите линију која прати угао нагиба.
Проширење:
Направити дигиталну либелу која приказује да ли је плоча у хоризонталном положају.
Приказати угао нагиба као казаљку на екрану Processing програма.
Испробати различите брзине освежавања (20 ms, 50 ms и 100 ms) и упоредити како то утиче на глаткоћу приказа.
Акцелерометар је један од најважнијих сензора у савременој електроници. Иако је његова основна намена мерење убрзања, у мировању се може користити и за одређивање нагиба јер региструје Земљину гравитацију.
У овој лекцији научили сте како функционише акцелерометар, како се читају вредности помоћу ESP32 платформе, како се израчунава угао нагиба и како се резултати могу приказати у програму Processing. Ово представља основу за бројне наредне пројекте као што су дигитална либела, баланс роботи, системи стабилизације и управљање покретима.
У претходној лекцији упознали смо се са MPU-9250 сензором и сазнали да он у себи обједињује три различита сензора: акцелерометар, жироскоп и магнетометар. У овој лекцији посветићемо се само магнетометру, који омогућава одређивање правца у односу на Земљино магнетно поље и представља основу за израду дигиталног компаса.
Ученици ће научити како функционише магнетометар, зашто је неопходна његова калибрација и како се добијени подаци могу обрадити на ESP32 платформи. На крају лекције направићемо једноставан дигитални компас, а затим приказати његов рад помоћу графичке визуелизације у програмском окружењу Processing.

Магнетометар омогућава мерење Земљиног магнетног поља и одређивање смера кретања, па се користи као дигитални компас у бројним електронским системима.
Магнетометар је електронски сензор који мери јачину и правац магнетног поља. Он не мери растојање нити положај, већ детектује магнетне силе које делују у његовој околини. Захваљујући томе, магнетометар може да одреди где се налази магнетни север, па се често користи као основа за дигитални компас.
У MPU-9250 модулу магнетометар истовремено мери магнетно поље дуж три просторне осе:
Комбиновањем ова три мерења могуће је одредити оријентацију уређаја у простору и израчунати угао окретања у односу на север.

Магнетометар истовремено мери компоненте магнетног поља по X, Y и Z оси.
Прати магнетно поље у хоризонталном правцу лево–десно.
Мери компоненту магнетног поља у смеру напред–назад.
Одређује вертикалну компоненту магнетног поља.
Да би магнетометар могао да одреди правац, потребно је да постоји природно магнетно поље које ће мерити. Управо то омогућава Земљино магнетно поље. Наша планета се понаша као огроман магнет чије се линије магнетног поља простиру од једног пола до другог.
Игла класичног компаса увек покушава да се поравна са овим линијама, па зато показује приближно ка северу. Дигитални компас не користи механичку иглу већ магнетометар који електронски мери исти ефекат.
Magnetne linije prikazuju oblik Земљиног магнетног поља. У свакој тачки простора постоји вектор магнетног поља B , који је увек тангента на магнетну линију у тој тачки. Магнетометар не мери саме линије, већ компоненте тог вектора по X, Y и Z осама свог координатног система.

Линије магнетног поља окружују Земљу и омогућавају компасу да одреди правац севера.
Птице селице, морске корњаче и неке врсте риба користе Земљино магнетно поље за оријентацију током миграција. Научници сматрају да поседују природни „биолошки компас“ који им омогућава да проналазе пут и након више хиљада километара.
Јачина Земљиног магнетног поља није свуда иста. Она зависи од географске локације и најчешће износи између 25 и 65 μT (микротесла). Управо тако мале вредности магнетометар може веома прецизно да измери.
Мери јачину и правац магнетног поља које делује на сензор.
Магнетно поље се најчешће изражава у микротеслама (μT).
Навигација, роботика, дронови, паметни телефони и аутономни системи.
Класичан компас садржи магнетну иглу која може слободно да се окреће. Пошто је игла магнетисана, она се увек поставља у смеру Земљиног магнетног поља. Један крај игле показује ка магнетном северу, а други ка магнетном југу.
Дигитални компас ради по истом принципу, али уместо механичке игле користи магнетометар. Сензор мери вредности магнетног поља по X и Y оси, а затим микроконтролер израчунава угао у односу на север.

И механички и дигитални компас користе Земљино магнетно поље за одређивање правца.
За израчунавање смера најчешће се користи функција:
ugao = atan2(Y, X)
Функција atan2() израчунава угао на основу односа вредности X и Y осе. Добијени резултат представља смер у степенима:
0° или 360°
90°
180°
270°
Унутар MPU-9250 модула налази се посебан магнетометар под називом AK8963. Овај сензор производи компанија Asahi Kasei Microsystems и комуницира са главним MPU чипом преко интерне I2C магистрале.
AK8963 омогућава мерење магнетног поља по све три осе и има довољну прецизност за израду дигиталног компаса, навигационих система и роботичких пројеката.

Посебан чип унутар MPU-9250 модула задужен за мерење магнетног поља.
14-битни и 16-битни режим рада.
Истовремено мери X, Y и Z компоненту магнетног поља.
Компас, навигација, роботи, дронови и системи оријентације.
За рад магнетометра није потребно посебно повезивање. Пошто је AK8963 део MPU-9250 модула, довољно је повезати цео модул са ESP32 преко I2C комуникације.
| MPU-9250 | ESP32 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO21 |
| SCL | GPIO22 |

За коришћење магнетометра користе се исте I2C везе као и за цео MPU-9250 модул.
Иако у овој лекцији користимо само магнетометар, повезује се комплетан MPU-9250 модул јер су акцелерометар, жироскоп и магнетометар интегрисани у исти уређај.
У каснијим лекцијама користићемо и остале сензоре без икаквих измена у повезивању.
Један од најважнијих корака приликом рада са магнетометром је калибрација. Без калибрације компас може показивати погрешан смер чак и када сензор ради исправно.
На мерења утичу:
Због тога је потребно одредити минималне и максималне вредности које сензор очитава током окретања у свим правцима.

Сензор се полако окреће у облику броја 8 како би се измериле максималне и минималне вредности свих оса.
Овај поступак је стандардна процедура код свих дигиталних компаса, паметних телефона и дронова.
Пре него што започнемо програмирање потребно је припремити Arduino IDE и инсталирати библиотеку која омогућава једноставан рад са MPU-9250 сензором.
Повежите ESP32 плочу USB каблом са рачунаром.
Покрените Arduino IDE и изаберите одговарајућу ESP32 плочу.
Инсталирајте библиотеку MPU9250_asukiaaa преко Library Manager-а.

У Arduino IDE отворити Sketch → Include Library → Manage Libraries и потражити библиотеку MPU9250_asukiaaa.
Следећи програм чита вредности магнетног поља по све три осе и приказује их у Serial Monitor-у. Ово је основа за све наредне пројекте који користе дигитални компас.
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mpu;
void setup() {
Serial.begin(115200);
Wire.begin(21,22);
mpu.setWire(&Wire);
mpu.beginAccel();
mpu.beginGyro();
mpu.beginMag();
Serial.println("MPU9250 Magnetometar");
}
void loop() {
mpu.magUpdate();
Serial.print("X: ");
Serial.print(mpu.magX());
Serial.print(" Y: ");
Serial.print(mpu.magY());
Serial.print(" Z: ");
Serial.println(mpu.magZ());
delay(200);
}
Након покретања програма у Serial Monitor-у појављују се три вредности које представљају јачину магнетног поља по X, Y и Z оси.
X: -32.5 Y: 18.7 Z: 41.9
X: -31.9 Y: 19.3 Z: 42.0
X: -29.4 Y: 20.5 Z: 41.8
...

Очитане вредности магнетног поља приказују се у реалном времену у Serial Monitor-у.
Циљ ове вежбе је да ученици разумеју да магнетометар непрекидно мери магнетно поље које окружује сензор.
Која оса највише мења вредност када ротираш модул лево и десно?
Шта се дешава ако приближиш магнет сензору?
Да ли се вредности враћају када удаљиш магнет?
Саме вредности X и Y осе нису довољне да бисмо знали ка ком правцу је окренут сензор. Због тога се користи математичка функција atan2() која на основу односа X и Y вредности израчунава угао у односу на магнетни север.
У Arduino окружењу функција atan2() враћа угао у радијанима, па је потребно извршити конверзију у степене.
float heading = atan2(mpu.magY(), mpu.magX());
heading = heading * 180.0 / PI;
if (heading < 0)
heading += 360.0;
Следећи програм очитава магнетометар и израчунава смер компаса који се приказује у Serial Monitor-у.
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mpu;
void setup() {
Serial.begin(115200);
Wire.begin(21,22);
mpu.setWire(&Wire);
mpu.beginAccel();
mpu.beginGyro();
mpu.beginMag();
}
void loop() {
mpu.magUpdate();
float heading = atan2(mpu.magY(), mpu.magX());
heading *= 180.0 / PI;
if (heading < 0)
heading += 360;
Serial.println(heading);
delay(100);
}

ESP32 израчунава угао и шаље га у Serial Monitor.
Један од најбољих начина да ученици разумеју рад магнетометра јесте приказ смера компаса на екрану. Processing може директно да чита податке које ESP32 шаље преко серијског порта.
У овом примеру ESP32 шаље само један број — угао компаса, док Processing ротира стрелицу у складу са добијеном вредношћу.

Стрелица се ротира у реалном времену на основу података које шаље ESP32.
import processing.serial.*;
Serial port;
float heading = 0;
void setup() {
size(600,600);
port = new Serial(this, Serial.list()[0],115200);
port.bufferUntil('\n');
}
void draw(){
background(240);
translate(width/2,height/2);
rotate(radians(heading));
strokeWeight(5);
line(0,0,0,-180);
fill(255,0,0);
ellipse(0,-180,18,18);
}
void serialEvent(Serial p){
String s = trim(p.readStringUntil('\n'));
if(s!=null){
heading=float(s);
}
}
Циљ вежбе је да се направи компас који приказује смер у степенима и графички приказује оријентацију на екрану.
Проверити да ли стрелица показује север када је модул окренут ка северу.
Приближити магнет и посматрати како се компас понаша.
Покушати калибрацију и упоредити резултате пре и после ње.
Модификовати ESP32 програм тако да, поред угла, исписује и назив стране света:
У Processing програму додати приказ слова N, E, S и W око кружнице компаса тако да визуелизација буде што сличнија правом дигиталном компасу.
Након што су ученици савладали основе рада са магнетометром и израдили једноставан дигитални компас, могу започети развој сложенијих пројеката. Следећи предлози представљају добру основу за школске, STEM и роботичке пројекте.
Приказ смера на OLED или TFT екрану уз приказ страна света.
Робот користи магнетометар за одређивање смера кретања.
Детекција оријентације и аларм ако се ранац окрене.
Приказ тренутног смера кретања на LCD или OLED дисплеју.
Слање података паметном телефону преко Bluetooth комуникације.
Приказ оријентације сензора у Processing окружењу.
Покушајте да проширите програм тако да компас приказује не само угао већ и назив стране света.
| Угао | Правац |
|---|---|
| 337.5° – 22.5° | Север (N) |
| 22.5° – 67.5° | Североисток (NE) |
| 67.5° – 112.5° | Исток (E) |
| 112.5° – 157.5° | Југоисток (SE) |
| 157.5° – 202.5° | Југ (S) |
| 202.5° – 247.5° | Југозапад (SW) |
| 247.5° – 292.5° | Запад (W) |
| 292.5° – 337.5° | Северозапад (NW) |
Уместо исписивања само угла, измените програм тако да на основу измереног угла исписује и назив стране света.
Шта мери магнетометар?
Која функција се користи за израчунавање угла компаса?
Зашто је потребна калибрација магнетометра?
Који GPIO пинови ESP32 се најчешће користе за I2C комуникацију?
Коју улогу има програм Processing у овој лекцији?
Шта ће се догодити ако магнет приближимо магнетометру?
Магнетометар је један од најважнијих сензора за одређивање оријентације у простору. Иако самостално може да функционише као дигитални компас, у пракси се скоро увек комбинује са акцелерометром и жироскопом како би се добили што прецизнији подаци о положају и кретању уређаја.
У наредним лекцијама ученици ће научити како се комбинују сва три сензора MPU-9250 модула и како се добија потпуна оријентација уређаја у тродимензионалном простору, што представља основу за рад дронова, мобилних робота, паметних уређаја и система за стабилизацију.
У овој вежби ученици упознају рад сензора светлости и његову примену у комбинацији са ESP32 микроконтролером. Помоћу аналогног улаза очитава се ниво осветљења у околини, а затим се та вредност користи за приказ информација у Serial Monitor-у или за управљање LED диодом.
Вежба представља добар увод у рад са аналогним сензорима и повезује:

Основна поставка за мерење нивоа осветљења у околини.
Сензор светлости је електронска компонента која омогућава да се детектује јачина светлости у окружењу. У зависности од врсте сензора, промена осветљења може да доведе до промене отпора, напона или дигиталног сигнала.
У овој вежби користимо сензор који се понаша као део напонског делитеља, а ESP32 затим чита промене на аналогном улазу. На основу тога можемо да проценимо да ли је у просторији јаче светло или је присутан мрак.

Светлосни сензор мења електрична својства у зависности од количине светлости.
Један од најчешћих елемената за мерење светлости је фоторезистор (LDR – Light Dependent Resistor). Његов отпор се мења у зависности од количине светлости која пада на његову површину. Када је светлости више, отпор је мањи, а када је светлости мање, отпор расте.
Више о једноставном мерењу осветљења помоћу light сензора може се видети и на овој страни: мерење осветљења помоћу light сензора и ESP32.
У овој лекцији се акценат ставља на практично очитавање вредности светлости, њихово приказивање у серијском монитору и каснију примену за управљање LED диодом.
Овакав приступ је веома користан у аутоматским системима осветљења, паметним кућама и разним сензорским пројектима.
За реализацију ове вежбе потребно је:
Модул сензора светлости већ садржи LDR сензор и отпорник који формирају напонски делитељ. Аналогни излаз модула (AO) повезује се на аналогни улаз ESP32 плоче, а вредност осветљености очитава се помоћу функције analogRead().
У овој вежби користимо следеће повезивање:
Дигитални излаз DO се у овој вежби не користи.
Kod različitih LDR modula analogna vrednost može da se ponaša različito. Kod nekih modula povećanjem osvetljenosti raste i ADC vrednost, dok kod drugih ona opada.
Razlog nije u fotootporniku, već u načinu na koji su fotootpornik i otpornik povezani u naponskom delitelju.
Preporučuje se da se pre pisanja programa senzor osvetli lampom i zatim prekrije rukom. Posmatranjem vrednosti u Serial Monitor-u lako se utvrđuje da li ADC raste ili opada sa povećanjem osvetljenosti.
Većina LDR modula sa četiri priključka (VCC, GND, AO i DO) pored fotootpornika sadrži i komparator LM393. Analogni izlaz (AO) koristi se za merenje nivoa osvetljenosti, dok je digitalni izlaz (DO) namenjen samo detekciji da li je osvetljenost iznad ili ispod zadatog praga.
Potenciometar na modulu služi za podešavanje praga aktiviranja digitalnog izlaza DO. Njegovo okretanje uglavnom ne utiče na analogni izlaz AO, pa se očitane ADC vrednosti ne menjaju značajno.

Приказ основне шеме за мерење осветљења помоћу ESP32.

Приказ распореда и повезивања са задње стране.

Каснија проширена верзија вежбе са LED диодом.

Задња страна кола које укључује и LED диоду.
ESP32 користи 12-битни ADC, па је важно да аналогни сигнал буде стабилан и правилно доведен на GPIO34.
Код мерног кола је добро да се користе кратке жице и чврста веза на breadboard плочи како би очитавања била што поузданија.
ADC konvertor ESP32 može da meri napone u opsegu od približno 0 V do 3,3 V, što odgovara vrednostima od 0 do 4095. Međutim, to ne znači da će svaki analogni senzor koristiti ceo taj opseg.
Kod većine gotovih LDR modula analogni izlaz (AO) predstavlja napon naponskog delitelja koji formiraju fotootpornik i otpornik na modulu. Zbog njihovih karakteristika izlazni napon često zauzima samo deo mogućeg opsega, pa se u normalnim uslovima mogu dobijati vrednosti, na primer, između 100 i 1200 umesto од 0 до 4095.
To nije greška ESP32 niti senzora, već normalna osobina konkretnog modula.
У овој вежби ESP32 очитава аналогну вредност са сензора светлости, затим ту вредност преводи у погодан опсег за приказивање јачине осветљења. На тај начин ученици виде како се сирови ADC подаци могу обрадити и употребити у даљој примени.
Овде се не користи LED диода. Циљ је да се разуме сам принцип мерења светлости и начин на који се добијена вредност приказује у серијском монитору.

Практично повезивање сензора светлости на breadboard плочи.
Циљ је да се очита вредност са аналогног улаза, затим да се из ње добије процена осветљености. Што је амбијент тамнији, то је очитана вредност другачија, па се преко програма може пратити промена услова у просторији.
// Аналогни улаз на који је доведен сигнал са напонског делитеља
// који чине LDR сензор и отпорник од 10 kΩ
#define LDR_PIN 34
void setup() {
// Покретање серијске комуникације брзином од 115200 bps
// да бисмо могли да пратимо очитане вредности у Serial Monitor-у
Serial.begin(115200);
// ESP32 користи 12-битни ADC,
// па analogRead() враћа вредности од 0 до 4095
analogReadResolution(12);
}
void loop() {
// Очитавање аналогне вредности са GPIO34 пина
int ocitanaVrednost = analogRead(LDR_PIN);
// Превођење ADC вредности у опсег 255–0
// Обрнут распон је користан јер већа вредност
// може да представља слабије осветљење
int nivoOsvetljenosti = map(ocitanaVrednost, 0, 4095, 255, 0);
// Испис оригиналне ADC вредности
Serial.print("LDR: ");
Serial.print(ocitanaVrednost);
// Испис прерачунате вредности осветљења
Serial.print(" brightness: ");
Serial.println(nivoOsvetljenosti);
// Кратка пауза између два мерења
delay(500);
}

Приказ очитаних ADC вредности и израчунате вредности осветљености током рада програма.
nivoOsvetljenosti = map(ocitanaVrednost, 0, 4095, 255, 0);
Ова линија кода омогућава да се сирови ADC подаци лакше тумаче у наставку рада.
Primer u programu koristi teorijski ADC opseg od 0 do 4095. Međutim, kod mnogih LDR modula stvarni opseg može biti znatno manji. Zbog toga je preporučljivo da se najpre očitaju minimalna i maksimalna ADC vrednost u uslovima u kojima će uređaj raditi.
Na primer, ako očitane vrednosti variraju između 120 i 1180, bolje je koristiti:
int brightness = map(ldrValue,120,1180,0,255);
brightness = constrain(brightness,0,255);
Na ovaj način koristi se ceo PWM opseg LED diode, pa promena osvetljenosti postaje znatno uočljivija.
Izmeri:
Na osnovu dobijenih rezultata odgovori:
Неки модули сензора светлости немају аналогни излаз (AO), већ само дигитални излаз (D0). У том случају сензор не мери тачну јачину светлости, већ само детектује да ли је у просторији светло или мрак.
Резултат је бинарни сигнал:
Праг осетљивости се подешава помоћу потенциометра на самом модулу.
// Пин на који је повезан D0 излаз
#define LDR_PIN 34
// LED диода
#define LED_PIN 2
void setup() {
Serial.begin(115200);
pinMode(LDR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int stanje = digitalRead(LDR_PIN);
// Ако је мрак (1) → LED јаче светли
// Ако је светло (0) → LED слабије светли
int jacina = (stanje == 1) ? 255 : 40;
analogWrite(LED_PIN, jacina);
Serial.print("D0: ");
Serial.println(jacina);
delay(100);
}
| Тип сензора | Излаз | Шта мери |
|---|---|---|
| A0 | Аналогни (0–4095) | Јачину светлости |
| D0 | Дигитални (0/1) | Само светло / мрак |
D0 варијанта се користи када није потребно прецизно мерење, већ само детекција услова осветљења. Овај режим је једноставнији и погодан за основне аутоматске системе.
Поред готових модула са аналогним (AO) или дигиталним (DO) излазом, мерење осветљења може се реализовати и употребом самог фотоотпорника (LDR) и фиксног отпорника од 10 kΩ. На овај начин формира се напонски разделник, чији се излаз доводи на аналогни улаз ESP32 микроконтролера.
Ово је један од најчешћих начина повезивања LDR сензора јер омогућава прецизно мерење осветљености без употребе готовог сензорског модула.

Фотоотпорник и отпорник од 10 kΩ повезани као напонски разделник.

Повезивање фотоотпорника и отпорника у Circuit Designer окружењу.

Приказ распореда проводника са задње стране breadboard плоче.
Фотоотпорник мења свој отпор у зависности од количине светлости која пада на његову површину. Заједно са отпорником од 10 kΩ формира напонски разделник чији се излазни напон доводи на аналогни улаз ESP32 микроконтролера.
Фотоотпорник није поларизована компонента, па није важно којом ће страном бити повезан. Важно је само да са отпорником од 10 kΩ формира напонски разделник чији је средишњи чвор повезан на аналогни улаз ESP32.
// Аналогни улаз на који је повезан средишњи чвор
// напонског разделника
#define LDR_PIN 34
void setup() {
Serial.begin(115200);
analogReadResolution(12);
}
void loop() {
// Очитавање напона са разделника
int ldrValue = analogRead(LDR_PIN);
// Пример мапирања.
//По потреби прилагодити опсег стварно измереним ADC вредностима.
int brightness = map(ldrValue, 0, 4095, 255, 0);
brightness = constrain(brightness,0,255);//ограничење да вредност не премаши 255
Serial.print("LDR: ");
Serial.print(ldrValue);
Serial.print(" brightness: ");
Serial.println(brightness);
delay(500);
}
Поред приказа вредности у Serial Monitor-у, могуће је визуелизовати ниво осветљености и у Processing окружењу. ESP32 шаље податке преко серијске комуникације, а Processing их чита и на основу њих исцртава индикатор јачине осветљења. На тај начин промене светлости могу се пратити у реалном времену.
import processing.serial.*;
// Objekat koji predstavlja serijski port
// preko koga Processing komunicira sa ESP32
Serial myPort;
// Promenljiva u kojoj će biti sačuvana
// vrednost osvetljenosti (0-255)
int brightness = 0;
void setup()
{
// Kreiranje prozora dimenzija 600x250 piksela
size(600,250);
// Ispis liste svih dostupnih serijskih portova.
// Na osnovu ove liste bira se odgovarajući port.
println(Serial.list());
// Otvaranje prvog pronađenog serijskog porta
// brzinom od 115200 bps.
// Brzina mora biti ista kao u ESP32 programu.
myPort = new Serial(this,
Serial.list()[0],
115200);
// Funkcija serialEvent() biće pozvana
// svaki put kada stigne jedan red teksta,
// odnosno kada se primi znak '\n'.
myPort.bufferUntil('\n');
// Podešavanje veličine teksta
textSize(20);
}
void draw()
{
// Boja pozadine prozora
background(245);
// Naslov iznad indikatora
fill(0);
text("Ниво осветљености",40,40);
// Iscrtavanje okvira indikatora
noFill();
strokeWeight(2);
rect(40,80,500,40);
// Popunjavanje indikatora.
// Što je brightness veći,
// plavi pravougaonik je duži.
fill(60,160,255);
noStroke();
rect(40,80,brightness*500.0/255.0,40);
// Ispis numeričke vrednosti
fill(0);
text("Brightness: " + brightness,40,170);
}
// Ova funkcija se automatski poziva
// kada Processing primi jedan red teksta
// sa serijskog porta.
void serialEvent(Serial port)
{
// Čitanje jednog reda teksta
// do znaka '\n'
String data = port.readStringUntil('\n');
// Provera da li je tekst uspešno pročitan
if(data!=null)
{
// Uklanjanje znakova novog reda
// i praznih karaktera sa početka i kraja
data = trim(data);
// Pronalaženje dela teksta
// koji počinje rečju "brightness:"
int index = data.indexOf("brightness:");
// Ako je tekst pronađen...
if(index!=-1)
{
// Izdvajanje dela teksta koji dolazi
// iza reči "brightness:"
String vrednost = trim(data.substring(index+12));
// Pretvaranje izdvojenog teksta u ceo broj
brightness = int(vrednost);
}
}
}
У другој вежби истом сензору светлости додаје се LED диода. Када је у околини мање светлости, LED треба да јаче светли, а када је осветљење веће, њен интензитет треба да буде мањи. На тај начин добија се једноставан пример аутоматског ноћног осветљења.

Проширена верзија кола у којој се додаје и LED диода-шема у Circuit designer-у

Проширена верзија кола у којој се додаје и LED диода.
Циљ је да се покаже практична примена мерења светлости. Сензор очитава услове у просторији, а ESP32 на основу тога управља LED диодом тако да она постане јача у мраку, а слабија на јаком светлу.
// Analogni ulaz na koji je povezan LDR senzor
#define LDR_PIN 34
// LED dioda povezana na GPIO2
#define LED_PIN 2
void setup() {
// Pokretanje serijske komunikacije
Serial.begin(115200);
// Postavljanje LED pina kao izlaza
pinMode(LED_PIN, OUTPUT);
// ESP32 koristi 12-bitni ADC,
// pa analogRead() vraća vrednosti od 0 do 4095
analogReadResolution(12);
}
void loop() {
// Očitavanje analogne vrednosti sa LDR senzora
int ocitanaVrednost = analogRead(LDR_PIN);
// Pretvaranje ADC vrednosti (0–4095)
// u PWM opseg (255–0).
// Obrnuto mapiranje omogućava da LED
// jače svetli kada je manje svetlosti.
// Po potrebi opseg 0–4095 može se zameniti
// stvarno izmerenim vrednostima senzora.
int jacinaSvetlosti = map(ocitanaVrednost, 0, 4095, 255, 0);
// Obezbeđuje da PWM vrednost uvek bude
// u dozvoljenom opsegu od 0 do 255.
jacinaSvetlosti = constrain(jacinaSvetlosti, 0, 255);
// Slanje PWM vrednosti LED diodi
analogWrite(LED_PIN, jacinaSvetlosti);
// Kratka pauza pre sledećeg očitavanja
delay(100);
}

Приказ очитаних вредности током рада програма који управља јачином светлења LED диоде.
У овој вежби упознаћемо се са паметним адресабилним ЛЕД диодама у облику прстена (модел WS2812B). За разлику од обичних ЛЕД диода које захтевају додатне отпорнике за ограничење струје, паметни ЛЕД прстенови унутар сваке диоде имају уграђен посебан микрочип (драјвер). Ови чипови самостално регулишу јачину струје и омогућавају нам да преко само једне дигиталне линије (једне жице) контролишемо боју и јачину великог броја диода појединачно. Због уграђене заштите, напајање прстена везује се директно на развојну плочу.

Повезивање WS2812B ЛЕД прстена са DIN стране на ESP32 плочу.
Паметни прстенови могу да се везују у ланац један за другим, па због тога имају две групе жица. Са једне стране се налазе улазни контакти (означени са DIN или IN), а са друге излазни (означени са DO или OUT). За везу са ESP32 плочом користи се искључиво улазна страна (DIN), док излазне жице остају слободне.
Пре интеграције са сензором, потребно је проверити исправност прстена. За контролу ових диода користи се популарна библиотека FastLED (аутор Daniel Garcia), коју је потребно инсталирати кроз Library Manager. Следећи код константно пали и гаси цео прстен од 36 диода у црвеној боји.
#include <FastLED.h>
// Дигитални пин за слање података ка прстену
#define LED_PIN 4
// Број диода на вашем прстену (нпр. 36)
#define NUM_LEDS 36
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
void setup() {
Serial.begin(115200);
Serial.println("--- ТЕСТ ЛЕД ПРСТЕНА ПОКРЕНУТ ---");
// Иницијализација ФастЛЕД библиотеке
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
// Постављање умерене јачине (64 је око 25% снаге ради заштите плоче)
FastLED.setBrightness(64);
}
void loop() {
Serial.println("Палим све диоде у ЦРВЕНУ боју...");
fill_solid(leds, NUM_LEDS, CRGB::Red);
FastLED.show();
delay(1000);
Serial.println("Гасим све диоде...");
FastLED.clear();
FastLED.show();
delay(1000);
}
Изазов: Модификујте претходну Вежбу 2 тако што ћете уместо обичне ЛЕД диоде са отпорником на систем повезати овај паметни ЛЕД прстен од 36 диода. Напишите програм у коме ће прстен реаговати на количину светлости у просторији помоћу LDR сензора (повезаног на GPIO 34), али са обрнутом логиком: што је у просторији мање светлости, прстен треба да светли СЛАБИЈЕ, а када се светлост појача, прстен треба да светли ЈАЧЕ.
⚠️ Упозорење и проблем који ће се јавити: Када спојите код за очитавање фотоотпорника са кодом за ЛЕД прстен унутар исте петље, приметићете да ЛЕД прстен уопште не жели да се упали или да систем константно блокира!
WS2812B чипови захтевају изузетно прецизан пренос података који се мери у наносекундама. С друге стране, стандардна функција analogRead() привремено зауставља рад процесора како би измерила напон на пину сензора. Ова два процеса се међусобно сукобљавају унутар брзе loop() петље. Када процесор застане због читања сензора, прекида се сигнал ка прстену, због чега паметни чипови на прстену не добијају исправне команде и остају угашени.
Да бисте успешно решили овај проблем и завршили задатак, потребно је да у свом коду примените следећа два инжењерска решења:
millis()) који ће очитавати сензор тек на сваких 500 милисекунди (пола секунде), док ће у међувремену прстен добијати константан и несметан сигнал.FASTLED_ALLOW_INTERRUPTS 0), као и наредбу која активира изоловани хардверски блок унутар ESP32 чипа за управљање даљинским сигналима (#define FASTLED_RMT_BUILTIN_DRIVER 1). Овај РМТ драјвер ће самостално слати сигнале на пин 4, остављајући главни процесор слободним за читање фотоотпорника.map() пажљиво ускладите вредности фотоотпорника са излазним опсегом јачине светла за прстен (од 0 до максимално 150). Пазите на редослед бројева како бисте постигли захтевани ефекат (мање амбијенталног светла = слабије светло прстена). Не заборавите да јачину софтверски ограничите на максимално 150 преко функције constrain() како 36 диода не би повукло превише струје са плоче.

Напомена: Слика приказује финални изглед уређаја у реалном раду. Жице повежите пратећи искључиво текстуално упутство и дигиталне ознаке пинова из претходног корака, а не према изгледу са ове фотографије.
Ова вежба показује како се помоћу ESP32 плоче може мерити светлост и користити та информација за даље управљање излазима. На тај начин се једноставни сензорски подаци претварају у користан аутоматски одговор система.
У следећим корацима могуће је да се овај пројекат прошири на паметно осветљење, алармне системе, аутоматско управљање прозорима или приказ података преко интернета.
## 📚 Додатно учење
Детаљније објашњење рада light сензора, фотоотпорника, напонског делитеља и мерења осветљења помоћу ESP32 платформе.
Истражи како функционише ADC конвертор у ESP32 микроконтролеру и на који начин се аналогни напон претвара у дигиталну вредност.
Комбинуј сензор светлости са OLED дисплејом или Wi-Fi комуникацијом и направи систем за праћење осветљења у реалном времену.
1. Која функција очитава аналогну вредност са ESP32?
2. Који GPIO пин је коришћен за LDR сензор у овој вежби?
3. Која је максимална вредност коју враћа 12-битни ADC на ESP32?
4. Шта се дешава у другој вежби када је мање светлости?
MPU-9250 је инерцијална мерна јединица (IMU – Inertial Measurement Unit) која у једном малом интегрисаном колу садржи три различита сензора: троосни акцелерометар, троосни жироскоп и троосни магнетометар. Захваљујући томе могуће је истовремено пратити кретање, нагиб, окретање и оријентацију у простору.
Овакав тип сензора користи се у великом броју савремених уређаја. Налазимо га у мобилним телефонима, паметним сатовима, дроновима, роботима, системима за стабилизацију камера, навигационим уређајима, па чак и у аутомобилима. Захваљујући овим сензорима телефон зна када га окренемо, дрон одржава равнотежу током лета, а паметни сат броји кораке.

MPU-9250 комбинује акцелерометар, жироскоп и магнетометар у једном интегрисаном колу.
MPU-9250 истовремено обезбеђује чак девет различитих мерења, због чега се често назива 9-осни IMU сензор. Сваки од три уграђена сензора мери вредности по три просторне осе: X, Y и Z.
Мери линеарно убрзање по X, Y и Z оси. На основу тих вредности може се одредити нагиб уређаја и детектовати кретање.
Мери угаону брзину, односно колико брзо се уређај окреће око сваке осе.
Мери Земљино магнетно поље и омогућава одређивање смера као дигитални компас.
Да бисмо разумели како ради MPU-9250, потребно је да знамо шта представљају просторне осе. Сензор увек мери вредности у односу на своје координатне осе.

Сва мерења акцелерометра, жироскопа и магнетометра односе се на X, Y и Z осу.
Када окрећемо модул, вредности на појединим осама се мењају. Управо на тим променама заснивају се све касније вежбе и пројекти.
Акцелерометар мери убрзање. Чак и када сензор мирује, он региструје Земљину тежу (гравитацију), па се на основу тога може одредити нагиб уређаја.
Жироскоп не мери положај већ брзину окретања. Ако брзо окренемо модул, добићемо већу вредност него када га окрећемо полако. Управо зато се жироскоп користи за стабилизацију дронова, робота и камера.
Магнетометар мери јачину и правац Земљиног магнетног поља. На основу ових података могуће је израчунати смер кретања (север, исток, југ и запад), због чега се често назива дигиталним компасом.
Сваки од ова три сензора има своје предности и недостатке.
Због тога се у стварним системима користе сва три сензора истовремено. Комбиновањем њихових мерења добија се много прецизнија процена оријентације у простору.

IMU сензори се налазе у дроновима, роботима, мобилним телефонима, паметним сатовима и многим другим електронским уређајима.
На већини MPU-9250 модула налазе се прикључци који омогућавају комуникацију преко I2C или SPI интерфејса. У школским пројектима најчешће се користи I2C јер захтева само две комуникационе линије и веома је једноставан за повезивање са ESP32.

Приказ најважнијих прикључака који се користе приликом повезивања са ESP32 развојном плочом.
За већину школских пројеката довољно је повезати само VCC, GND, SDA и SCL.
INT, AD0, FSYNC и NCS користе се код сложенијих пројеката који захтевају већу брзину или прекиде.
ESP32 и MPU-9250 комуницирају преко I2C магистрале. То значи да су потребне само две сигналне линије: SDA (подаци) и SCL (сат). ESP32 већ има уграђен I2C контролер, па није потребан никакав додатни хардвер.
Подразумевани I2C пинови на већини ESP32 плоча су:
Поред сигналних линија неопходно је повезати и напајање.
| MPU-9250 | ESP32 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO21 |
| SCL | GPIO22 |

Практичан пример повезивања сензора са ESP32 развојном плочом преко I2C интерфејса.

Пример како изгледа повезан сензор приликом израде школских вежби.
I2C (Inter Integrated Circuit) представља серијски комуникациони протокол који омогућава да више уређаја користи исте SDA и SCL линије. Сваки уређај има своју адресу, па ESP32 може да комуницира са више сензора истовремено.
Најчешћа адреса MPU-9250 модула је:
Уколико нисте сигурни коју адресу има ваш модул, можете покренути I2C Scanner програм у Arduino IDE и проверити адресу аутоматски.

У Serial Monitor-у приказује се I2C адреса пронађеног уређаја.
Иако неки MPU-9250 модули имају уграђен стабилизатор напона и могу да се напајају са 5V, за рад са ESP32 препоручује се напајање од 3.3V.
На тај начин су логички нивои идентични и избегава се могућност оштећења микроконтролера или сензора.
Комбиновањем података са акцелерометра, жироскопа и магнетометра могуће је реализовати велики број практичних пројеката. Управо зато се MPU-9250 налази у многим роботима, дроновима, паметним уређајима и индустријским системима.

Од паметних сатова до дронова – овај сензор је један од најчешће коришћених IMU модула.
У овој вежби ученици ће први пут комуницирати са MPU-9250 сензором и научити како да очитавају вредности магнетног поља. Магнетометар ради као дигитални компас и мери јачину Земљиног магнетног поља по три осе (X, Y и Z).
Циљ није да одмах направимо компас, већ да разумемо како изгледају подаци које сензор шаље ESP32 микроконтролеру.

Мери Земљино магнетно поље и омогућава одређивање смера кретања.
Пре покретања програма потребно је инсталирати библиотеку:
Иако у овој вежби користимо само магнетометар, повезује се цео MPU-9250 модул. Магнетометар се налази унутар сензора и није потребно посебно повезивање његових пинова. Довољно је успоставити I2C комуникацију између ESP32 и MPU-9250 модула.
| MPU-9250 | ESP32 | Опис |
|---|---|---|
| VCC | 3.3V | Напајање модула |
| GND | GND | Заједничка маса |
| SDA | GPIO21 | I2C линија за пренос података |
| SCL | GPIO22 | I2C линија такта |
Иако је циљ ове вежбе рад са магнетометром, преко I2C комуникације ESP32 приступа целом MPU-9250 модулу. Програм једноставно користи само део сензора који представља магнетометар.

За очитавање магнетометра користе се само четири жице: VCC, GND, SDA и SCL.

Библиотека омогућава једноставно очитавање свих сензора MPU-9250.
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mpu;
void setup() {
Serial.begin(115200);
Wire.begin(21,22);
mpu.setWire(&Wire);
mpu.beginMag();
}
void loop() {
mpu.magUpdate();
Serial.print("MX: ");
Serial.print(mpu.magX());
Serial.print(" MY: ");
Serial.print(mpu.magY());
Serial.print(" MZ: ");
Serial.println(mpu.magZ());
delay(200);
}

Вредности се непрекидно мењају приликом окретања сензора.
Уместо приказа бројева могуће је направити једноставну графичку визуелизацију. Processing ће читати серијске податке и ротирати стрелицу која представља смер магнетног поља.

Стрелица се ротира у зависности од вредности које шаље MPU-9250.
import processing.serial.*;
Serial port;
float angle = 0;
void setup(){
size(600,600);
port = new Serial(this,"COM5",115200);
}
void draw(){
background(240);
translate(width/2,height/2);
rotate(radians(angle));
strokeWeight(5);
line(0,0,0,-180);
fill(255,0,0);
triangle(-12,-170,12,-170,0,-210);
}
void serialEvent(Serial p){
String s=p.readStringUntil('\n');
if(s!=null){
// Ovde se kasnije može izračunavati ugao
// iz MX i MY vrednosti.
}
}
У овој лекцији још не израчунавамо правац компаса. Processing служи само као пример како се подаци могу графички приказати. Израчунавање угла и правог дигиталног компаса биће тема једне од наредних лекција.
У овој вежби користимо само акцелерометар који се налази унутар MPU-9250 сензора. Акцелерометар мери убрзање по три осе (X, Y и Z), али када сензор мирује, он заправо мери утицај Земљине теже. Управо захваљујући томе можемо одредити нагиб плоче у простору.
Овај принцип користи се у мобилним телефонима, дроновима, паметним сатовима, роботима и многим индустријским системима.
Акцелерометар је такође интегрисан унутар MPU-9250 модула. Ни у овој вежби није потребно посебно повезивање додатних пинова, већ се користи исто I2C повезивање као и код претходне вежбе.
| MPU-9250 | ESP32 | Опис |
|---|---|---|
| VCC | 3.3V | Напајање сензора |
| GND | GND | Маса |
| SDA | GPIO21 | I2C подаци |
| SCL | GPIO22 | I2C такт |
Иако програм користи само акцелерометар, ESP32 комуницира са целим MPU-9250 модулом. Библиотека затим издваја само податке који припадају акцелерометру.

И код рада са акцелерометром користе се иста четири прикључка јер су сви сензори интегрисани у једном модулу.

Мери убрзање по X, Y и Z оси и омогућава одређивање нагиба уређаја.
MPU-9250 није скуп три одвојена сензора већ једно интегрисано коло. Акцелерометар, жироскоп и магнетометар налазе се унутар истог чипа и са ESP32 комуницирају преко заједничке I2C магистрале. Због тога су за све три вежбе потребна иста четири прикључка (VCC, GND, SDA и SCL), док се разлика прави искључиво у програмском коду који одређује који део сензора ће бити коришћен.
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mpu;
void setup() {
Serial.begin(115200);
Wire.begin(21,22);
mpu.setWire(&Wire);
mpu.beginAccel();
}
void loop() {
mpu.accelUpdate();
Serial.print(mpu.accelX());
Serial.print(",");
Serial.print(mpu.accelY());
Serial.print(",");
Serial.println(mpu.accelZ());
delay(50);
}

Вредности по осама X, Y и Z мењају се приликом нагињања плоче.
Уместо приказа бројева можемо направити електронску либелу. На екрану се приказује круг унутар кога се налази куглица. Како се ESP32 плоча нагиње, тако се куглица помера у одговарајућем смеру.

Куглица прати нагиб сензора у реалном времену.
import processing.serial.*;
Serial port;
float ax=0;
float ay=0;
void setup(){
size(600,600);
port=new Serial(this,"COM5",115200);
}
void draw(){
background(245);
translate(width/2,height/2);
noFill();
strokeWeight(3);
ellipse(0,0,320,320);
fill(0,180,255);
ellipse(ax*120,-ay*120,35,35);
}
void serialEvent(Serial p){
String s=p.readStringUntil('\n');
if(s!=null){
String[] data=split(trim(s),",");
if(data.length==3){
ax=float(data[0]);
ay=float(data[1]);
}
}
}
ESP32 шаље вредности X и Y осе преко серијске комуникације. Processing чита сваки ред података, издваја вредности и на основу њих помера плаву куглицу по екрану. На тај начин добијамо једноставну електронску либелу која приказује нагиб плоче у реалном времену.

Померањем ESP32 плоче помера се и куглица на екрану.
У овој вежби смо научили како се користи акцелерометар за мерење нагиба и како се подаци могу визуелизовати у реалном времену. Овај принцип користи се код електронских либела, баланс робота, паметних телефона и великог броја индустријских уређаја.
Након што сте научили како се читају подаци са акцелерометра, жироскопа и магнетометра, можете почети да правите сопствене пројекте. MPU-9250 је један од најкоришћенијих IMU сензора у роботици, аутоматизацији и IoT системима јер омогућава праћење положаја, кретања и оријентације уређаја у простору.

Од робота и дронова до паметних уређаја и STEM пројеката.
Приказ смера кретања помоћу магнетометра на OLED дисплеју или TFT екрану.
Праћење угла нагиба и активирање аларма ако се предмет превише накрене.
Акцелерометар и жироскоп омогућавају мерење нагиба робота ради одржавања равнотеже.
Управљање игрицом, роботом или презентацијом померањем руке.
Обрада података акцелерометра ради препознавања корака и физичке активности.
Праћење наглих промена убрзања ради препознавања пада особе или предмета.
Једна од најзанимљивијих примена овог сензора јесте приказ мерења у реалном времену. Processing омогућава да податке које ESP32 шаље преко серијске комуникације претворимо у графике, показиваче, инструменте или чак тродимензионалне моделе.

Подаци са ESP32 могу се приказивати као графици, казаљке или 3D модел.
У овој лекцији приказали смо једноставан пример визуелизације магнетометра, али исти принцип може да се примени и за приказ акцелерометра или жироскопа.
Научили смо шта представља инерцијални мерни уређај (IMU).
Повезали смо MPU-9250 и ESP32 преко I2C магистрале.
Очитавали смо вредности са акцелерометра, жироскопа и магнетометра.
Приказивали смо податке на Serial Monitor-у и у Processing окружењу.
MPU-9250 представља један од најкомплетнијих сензора који се користе у образовању, роботици и савременим електронским системима. Захваљујући томе што у једном модулу садржи акцелерометар, жироскоп и магнетометар, омогућава прецизно праћење покрета, нагиба и оријентације уређаја.
У овој лекцији научили сте како се сензор повезује са ESP32, како се читају основни подаци и како се они могу приказати у Arduino IDE и Processing окружењу. То представља основу за израду сложенијих пројеката који ће бити обрађени у наредним лекцијама.
У наставку курса правићемо електронски компас, визуелизацију оријентације у 3D простору, детектор нагиба, систем за препознавање покрета и друге практичне STEM пројекте засноване на MPU-9250 сензору.
У овој вежби ученици ће научити како да управљају SG90 серво мотором помоћу ESP32 микроконтролера. Серво мотор ће се непрекидно померати од 0° до 180° и назад, што представља један од најпознатијих примера за упознавање са радом серво мотора.
Вежба представља одличан увод у управљање актуаторима јер повезује:

Повезивање серво мотора са ESP32 плочом.
SG90 је мали серво мотор који омогућава прецизно позиционирање осовине на одређени угао. За разлику од класичних DC мотора који се непрекидно окрећу, серво мотор може бити постављен на тачно одређен положај.
Најчешће се користи у роботици, моделарству, аутоматским вратима, роботским рукама и STEM пројектима.

Серво мотор се позиционира на тачно одређени угао.
За реализацију ове вежбе потребно је:
Уколико користите развојну плочу са модулом ESP32-WROOM-32E, ову вежбу можете изводити без икаквих измена програмског кода. Није потребно бирати други Board у Arduino IDE нити инсталирати додатне библиотеке – поступак је исти као и за ESP32-WROOM-32D.
Обратите пажњу само на ознаке GPIO пинова на вашој развојној плочи. На појединим моделима пинови могу бити означени као P13, IO13 или GPIO13 (или другом ознаком у зависности од пина који се користи у програму), али представљају исти GPIO пин. Пре повезивања серво мотора проверите распоред и ознаке пинова на својој плочи и повежите сигнални проводник на GPIO који је дефинисан у програму.
Серво мотор SG90 поседује три прикључка:
У овој вежби користимо следеће повезивање:

Повезивање ESP32 плоче и SG90 серво мотора.

Увећан приказ пинова који се користе у пројекту.
Серво мотор током рада може повући већу струју од оне коју ESP32 може обезбедити преко својих GPIO пинова.
Због тога се напајање серво мотора доводи са 5V пина, док се сигнални проводник повезује на GPIO18.
Код сложенијих пројеката препоручује се коришћење посебног извора напајања за серво моторе.
#include <ESP32Servo.h>
Servo myServo;
const int servoPin = 18;
void setup() {
myServo.attach(servoPin);
}
void loop() {
for (int pos = 0; pos <= 180; pos += 1) {
myServo.write(pos);
delay(15);
}
for (int pos = 180; pos >= 0; pos -= 1) {
myServo.write(pos);
delay(15);
}
}
За рад са серво мотором користи се библиотека ESP32Servo.
Вредност:
myServo.write(90);
поставља серво мотор на угао од 90 степени.
На исти начин могуће је поставити било који угао између 0° и 180°.
📌 ESP32 генерише PWM сигнал.
📌 PWM сигнал се шаље серво мотору.
📌 Серво електроника анализира сигнал.
📌 Одређује се жељени угао.
📌 Мотор ротира осовину на задати положај.
📌 Петље омогућавају континуално кретање напред и назад.
Детаљније објашњење рада серво мотора, PWM сигнала, избора GPIO пинова и напајања на ESP32 платформи.
Истражи рад PWM сигнала и начин управљања серво моторима.
Повежи серво мотор са ултразвучним сензором и направи аутоматска врата.
1. Колико прикључака има SG90 серво мотор?
2. Која функција поставља угао серво мотора?
3. Који GPIO пин се користи у овој вежби?
4. Шта ради Sweep програм?
До сада смо видели како се SG90 серво мотор може контролисати помоћу ESP32 платформе. Следећи корак је повезивање серво мотора са сензором који ће доносити одлуку када треба покренути механизам.
У наредне две вежбе комбинујемо HC-SR04 ултразвучни сензор и SG90 серво мотор како бисмо направили систем који реагује на присуство објекта.
У овој вежби комбинујемо HC-SR04 ултразвучни сензор и SG90 серво мотор са ESP32 платформом. ESP32 непрекидно мери растојање до препреке, а када је објекат ближи од задатог прага, серво мотор се помера на угао од 90°. Када се препрека удаљи, серво се враћа на почетни положај од 0°.
Ова вежба је корисна за разумевање аутоматског реаговања система на окружење и често се примењује у моделима аутоматских врата, поклопцима, рампама и једноставним роботичким механизмима.

Приказ комплетне вежбе у раду, са препреком испред сензора.

Увећан приказ пинова на ESP32 плочи и ултразвучном сензору.

Део реалне шеме на коме се јасно виде прикључци сензора.
Циљ ове вежбе је да ученик увиди како се мерење растојања може повезати са конкретном механичком акцијом. Када је препрека довољно близу, ESP32 шаље команду серво мотору да се помери на 90°.
У овој вежби користи се следеће повезивање:

Иста шема се користи и у овој и у следећој вежби.

Приказ кода и резултата мерења у Serial Monitor-у.
HC-SR04 сензор се у овој вежби напаја са 3V3 како би ECHO сигнал био безбедан за ESP32.
SG90 серво мотор се напаја са 5V, а сви GND прикључци морају бити заједнички повезани.
#include <ESP32Servo.h>
// HC-SR04
const int TRIG_PIN = 18;
const int ECHO_PIN = 19;
// Servo motor
const int SERVO_PIN = 23;
// Prag aktivacije
const int DISTANCE_THRESHOLD = 15;
Servo servo;
// Promenljive
float duration_us;
float distance_cm;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
servo.attach(SERVO_PIN);
// Početni položaj
servo.write(0);
}
void loop() {
// Reset TRIG
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
// Slanje impulsa
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Merenje vremena povratka
duration_us = pulseIn(ECHO_PIN, HIGH);
// Izračunavanje rastojanja
distance_cm = duration_us * 0.034 / 2;
// Upravljanje servo motorom
if (distance_cm < DISTANCE_THRESHOLD) {
servo.write(90);
} else {
servo.write(0);
}
// Ispis rezultata
Serial.print("Rastojanje: ");
Serial.print(distance_cm);
Serial.println(" cm");
delay(500);
}
distance_cm = duration_us * 0.034 / 2
Број 0.034 представља брзину звука изражену у cm/μs, а дељење са 2 је потребно јер талас путује до препреке и назад.
📌 ESP32 активира TRIG пин.
📌 HC-SR04 емитује ултразвучни талас.
📌 Талас се одбија од препреке.
📌 Одбијени талас стиже на ECHO пин.
📌 ESP32 израчунава растојање.
📌 Серво мотор се помера на 90° када је објекат близу.
📌 Када се препрека удаљи, серво се враћа на 0°.
У овој вежби користимо исту шему повезивања као у претходној, али се серво мотор не зауставља на једном фиксном углу. Када ESP32 детектује да је препрека ближа од задатог прага, серво мотор изводи Sweep покрет од 0° до 180° и назад.
Ова вежба је добра за демонстрацију кретања серво мотора, а може се користити и у пројектима који симулирају скенер, роботску руку или аутоматски механизам са динамичким одговором на присуство објекта.

Комплетна поставка у раду, са препреком која активира систем.

Иста шема важи и за Sweep варијанту вежбе.

Код и приказ вредности у Serial Monitor-у за Sweep варијанту.
Циљ ове вежбе је да се покаже како ултразвучни сензор може да покрене сложенији покрет серво мотора. Уместо једног положаја, серво изводи целокупно кретање, што је корисно за скенирање простора и анимацију механичких система.
Повезивање је потпуно исто као у претходној вежби:
Пошто је шема повезивања иста, ученик може да користи исто коло, а да промени само логику програма. Ово лепо показује разлику између једноставне реакције (90°) и сложенијег кретања (Sweep).
#include <ESP32Servo.h>
const int TRIG_PIN = 18;
const int ECHO_PIN = 19;
const int SERVO_PIN = 23;
const int DISTANCE_THRESHOLD = 15;
Servo servo;
float duration_us;
float distance_cm;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
servo.attach(SERVO_PIN);
servo.write(0);
}
void loop() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration_us = pulseIn(ECHO_PIN, HIGH);
distance_cm = duration_us * 0.034 / 2;
Serial.print("Rastojanje: ");
Serial.print(distance_cm);
Serial.println(" cm");
if (distance_cm < DISTANCE_THRESHOLD) {
// Sweep 0 -> 180
for (int pos = 0; pos <= 180; pos++) {
servo.write(pos);
delay(10);
}
// Sweep 180 -> 0
for (int pos = 180; pos >= 0; pos--) {
servo.write(pos);
delay(10);
}
}
delay(100);
}
Ако се жели да се Sweep изврши само једном по детекцији, може се додати заставица, на пример activated, која спречава понављање покрета док се објекат не удаљи.
📌 ESP32 мери растојање помоћу HC-SR04 сензора.
📌 Када је објекат ближи од прага, систем покреће серво мотор.
📌 Серво изводи Sweep покрет од 0° до 180° и назад.
📌 Покрет може да се понавља док је објекат испред сензора.
📌 Ово је корисно за скенирање и демонстрацију покрета.
У овој вежби ученици ће научити како да користе HC‑SR04 ултразвучни сензор за мерење растојања до објекта помоћу ESP32 микроконтролера. Добијене вредности биће послате на рачунар преко серијске комуникације и приказане у реалном времену у Processing окружењу.
Вежба повезује рад са сензорима, ESP32 програмирање, серијску комуникацију и визуелизацију података.

Мерење растојања до препреке помоћу ултразвучног сензора.

Приказ измереног растојања у реалном времену.
HC-SR04 је ултразвучни сензор који служи за бесконтактно мерење растојања. Сензор емитује кратак ултразвучни импулс и мери време које је потребно да се одбијени сигнал врати до пријемника.
Пошто је брзина звука позната, микроконтролер може израчунати растојање до препреке. Овај тип сензора често се користи у роботици, паметним системима паркирања и STEM пројектима.
Уколико користите развојну плочу са модулом ESP32-WROOM-32E, ова вежба се изводи на исти начин као и са ESP32-WROOM-32D. Није потребно мењати програмски код, бирати други Board у Arduino IDE нити инсталирати додатне библиотеке.
Једино на шта треба обратити пажњу јесте означавање GPIO пинова на самој развојној плочи. Код појединих ESP32-WROOM-32E плоча пинови могу бити означени као P18, IO18 или GPIO18, као и P19, IO19 или GPIO19. Иако су ознаке различите, реч је о истим GPIO пиновима који се користе у програму. Пре повезивања проверите распоред и ознаке пинова на својој плочи.
У овој вежби користи се следеће повезивање:

Приказ прикључака који се користе на ESP32 плочи.

Приказ прикључака на ултразвучном сензору.
ESP32 користи логичке нивое од 3,3 V. Класичан HC-SR04 се најчешће напаја са 5 V, при чему ECHO пин може враћати сигнал близу 5 V.
Да бисмо избегли додатне компоненте за обарање напона, у овој вежби сензор напајамо директно са 3V3 пина ESP32 плоче. Тако ECHO сигнал остаје у безбедном опсегу за ESP32.
// GPIO pin koji pokreće ultrazvučni impuls
int trigPin = 18;
// GPIO pin na kome se prima povratni impuls
int echoPin = 19;
// Promenljiva u kojoj će biti sačuvano
// trajanje povratnog impulsa (u mikrosekundama)
long duration;
// Izračunato rastojanje u centimetrima
float distance;
void setup() {
// Pokretanje serijske komunikacije
// Brzina mora biti ista kao u Processing programu
Serial.begin(115200);
// TRIG pin je izlaz
pinMode(trigPin, OUTPUT);
// ECHO pin je ulaz
pinMode(echoPin, INPUT);
}
void loop() {
// Kratak LOW impuls kako bi se senzor resetovao
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Slanje ultrazvučnog impulsa
digitalWrite(trigPin, HIGH);
delayMicroseconds(15);
// Završetak impulsa
digitalWrite(trigPin, LOW);
// Merenje trajanja povratnog impulsa
duration = pulseIn(echoPin, HIGH);
// Izračunavanje rastojanja.
// 0.034 predstavlja brzinu zvuka u cm/µs,
// a deljenje sa 2 je potrebno zato što
// talas putuje do prepreke i nazad.
distance = duration * 0.034 / 2;
// Slanje izračunatog rastojanja
// preko serijskog porta.
// Šalju se dve decimale.
Serial.println(distance, 2);
// Kratka pauza između dva merenja
delay(200);
}
distance = duration * 0.034 / 2
Број 0.034 представља брзину звука изражену у cm/μs. Дељење са 2 је неопходно јер талас путује до препреке и назад.
Поред приказа у Serial Monitor-у, измерено растојање може се приказати и графички. Processing прима вредности које шаље ESP32 и приказује хоризонтални индикатор чија се дужина мења у зависности од измереног растојања.
import processing.serial.*;
// Objekat za serijsku komunikaciju
Serial myPort;
// Trenutno izmereno rastojanje
float distance = 0;
void setup()
{
// Kreiranje prozora
size(600,250);
// Prikaz svih dostupnih serijskih portova
println(Serial.list());
// Otvaranje prvog pronađenog porta
// Brzina mora biti ista kao u ESP32 programu
myPort = new Serial(this,
Serial.list()[0],
115200);
// Funkcija serialEvent()
// pozivaće se kada stigne jedan red teksta
myPort.bufferUntil('\n');
textSize(20);
}
void draw()
{
// Boja pozadine
background(245);
// Naslov
fill(0);
text("Измерено растојање",40,40);
// Okvir indikatora
noFill();
strokeWeight(2);
rect(40,80,500,40);
// Popunjavanje indikatora.
// Pretpostavlja se da senzor meri
// do približno 200 cm.
fill(100,200,255);
noStroke();
rect(
40,
80,
map(distance,0,200,0,500),
40
);
// Ispis numeričke vrednosti
fill(0);
text("Distance: " + nf(distance,0,2) + " cm",40,170);
}
// Funkcija se automatski poziva
// kada stigne jedan red teksta
void serialEvent(Serial port)
{
// Čitanje jednog reda
String data = port.readStringUntil('\n');
if(data!=null)
{
// Uklanjanje znaka novog reda
data = trim(data);
// Pretvaranje primljenog teksta u broj
distance = float(data);
}
}
📌 ESP32 активира TRIG пин.
📌 HC-SR04 емитује ултразвучни талас.
📌 Талас путује до препреке.
📌 Одбијени талас се враћа ка сензору.
📌 ESP32 мери време повратка.
📌 Израчунава се растојање.
📌 Processing приказује резултат у реалном времену.
Истражи различите типове сензора који се користе са ESP32 платформом.
Покушај да направиш Wi‑Fi систем за праћење растојања преко веб прегледача.
1. Шта мери HC-SR04 сензор?
2. Који пин покреће ултразвучни импулс?
3. Која је брзина серијске комуникације?
4. Зашто се сензор у овој вежби напаја са 3.3V?
ESP32 је савремена микроконтролерска платформа која омогућава повезивање електронике, програмирања и бежичне комуникације. Захваљујући уграђеним WiFi и Bluetooth могућностима, ова плоча се користи у бројним пројектима из области аутоматизације, паметних уређаја и Интернета ствари (IoT).
У оквиру наставе примењене електронике ученици ће се упознати са изгледом ESP32 плоче, њеним основним деловима, начином програмирања и повезивањем различитих сензора и актуатора. Постепено ће се прелазити са једноставних експеримената на пројекте који укључују бежичну комуникацију, прикупљање података и управљање уређајима.

Микроконтролерска платформа са WiFi и Bluetooth комуникацијом.

Повезивање електронике са интернетом и паметним системима.
ESP32 је микроконтролер компаније Espressif који је намењен развоју паметних електронских уређаја. Његов задатак је да чита податке са сензора, обрађује их и на основу њих управља различитим компонентама као што су LED диоде, дисплеји, релеји, мотори или други уређаји.
За разлику од многих класичних микроконтролера, ESP32 већ у себи садржи WiFi и Bluetooth модуле. То значи да поред управљања електронским колима може да комуницира са телефоном, веб сервером или другим уређајима у мрежи.
Обједињује програмирање, електронику и бежичну комуникацију.
Током вежби ученици ће постепено упознавати могућности ESP32 платформе. Циљ није само да се напише програм већ да се разуме како функционише комплетан систем који повезује сензоре, микроконтролер и реалне уређаје.
На тај начин ученици стичу знања која се користе у аутоматизацији, паметним кућама, индустријским системима и савременим IoT решењима.
Ученици који су већ радили са Arduino платформом брзо ће се снаћи и на ESP32 плочи јер су основни принципи рада веома слични. Ипак, ESP32 доноси бројне могућности које Arduino Uno нема.
Уколико се први пут сусрећеш са микроконтролерима, препоручује се да најпре погледаш лекцију: Основе Arduino програмирања .
Пре првог програма важно је да препознамо основне елементе развојне плоче и разумемо чему служе.
Упознавање са пиновима, напајањем и комуникационим модулима.
ESP32 располаже великим бројем улазно-излазних пинова који се користе за комуникацију са различитим електронским компонентама. Иако плоча има много пинова, за почетне вежбе потребно је упознати само неколико најважнијих група.
Приликом рада са ESP32 важно је обратити пажњу на распоред пинова јер не подржавају сви пинови исте функције. Због тога се увек користи шема пинова конкретног модела плоче.
GPIO, ADC, PWM и комуникациони пинови.
ESP32 се најчешће програмира у окружењу Arduino IDE. Иако је првобитно развијено за Arduino платформу, данас подржава и велики број других микроконтролера, укључујући ESP32.
Током вежби ученици ће научити како да:
За напредније пројекте могу се користити и друга окружења као што је PlatformIO, али је Arduino IDE најбољи избор за почетнике јер је једноставан и има велики број примера.

Основно окружење за програмирање ESP32 плоча.

Напредније окружење за веће пројекте.
Једна од највећих предности ESP32 платформе је могућност повезивања великог броја различитих сензора и актуатора. На тај начин ученици могу да мере физичке величине из окружења и да на основу добијених података управљају неким системом.
Комбинацијом ових компоненти могуће је реализовати велики број практичних пројеката који се користе у аутоматизацији, надзору и управљању процесима.

Температура, влажност, осветљеност и растојање.

Релеји, мотори и други уређаји за управљање.

Приказ података у реалном времену.
Након упознавања са основним деловима плоче и радом са појединачним компонентама, ученици ће реализовати низ практичних вежби које постепено повезују програмирање, електронику и комуникацију између уређаја.

Мерење температуре и влажности ваздуха.

Праћење осветљености просторије помоћу LDR сензора.

Мерење растојања и детекција препрека.

Контрола положаја и аутоматизованих механизама.

Слање података са сензора преко локалне мреже.

Комуникација са мобилним телефоном и другим уређајима.

Повезивање уређаја и размена података преко интернета.

Комбинација серво мотора и ултразвучног сензора.

Праћење влажности земљишта и аутоматско заливање.

Приказ вредности са сензора у реалном времену.
Данас велики број уређаја око нас комуницира путем интернета: паметни сатови, системи за надзор, паметне куће, метеоролошке станице и индустријски системи. ESP32 омогућава да се на једноставан начин разумеју принципи рада таквих система и да ученици стекну практична знања која су веома тражена у савременом развоју електронских уређаја.
Управо због тога ESP32 представља одличан корак након основног упознавања са Arduino платформом и омогућава улазак у свет IoT технологија.
Иако је ESP32 веома практична и отпорна платформа, неопходно је водити рачуна о правилном повезивању компоненти и напајању.
Добра пракса је да се најпре направи шема кола, затим тестира једноставан програм, а тек након тога додају нове компоненте и функционалности.
Знања стечена кроз рад са ESP32 користе се у настави примењене електронике, роботике, програмирања и IoT система. Она представљају основу за разумевање савремених паметних уређаја и система аутоматизације.

Реализација пројеката и тимски рад на решавању проблема.

Примена знања у реалним и међународним пројектима.
За детаљније упознавање са ESP32 платформом, њеним варијантама и примерима пројеката, препоручује се следећа лекција:
Уколико још увек нисте радили са микроконтролерима, корисно је најпре проћи и лекцију:
Ова категорија садржи практичне вежбе и пројекте засноване на Arduino платформи. Кроз рад са сензорима, актуаторима и различитим електронским компонентама ученици стичу основна знања из програмирања микроконтролера, електронике и STEM области. Вежбе су намењене почетницима и напреднијим корисницима који желе да развијају своје пројекте и истражују свет уграђених система.
У овој лекцији ученици ће научити како ради акцелерометар, један од три сензора који се налазе у оквиру MPU-9250 модула. Акцелерометар мери убрзање по три међусобно нормалне осе (X, Y и Z) и омогућава одређивање нагиба, детекцију покрета и анализу кретања објекта.
Иако назив говори да мери убрзање, акцелерометар може да одреди и оријентацију у односу на Земљину гравитацију. Управо зато се користи у мобилним телефонима, дроновима, паметним сатовима, роботима и бројним STEM пројектима.

MPU-9250 комбинује акцелерометар, жироскоп и магнетометар у једном интегрисаном колу.

Акцелерометар непрекидно мери убрзање по три осе и омогућава одређивање нагиба и кретања уређаја.
Акцелерометар је електронски сензор који мери убрзање. Под убрзањем не подразумевамо само повећање брзине, већ сваку промену кретања: полазак, успоравање, окретање или нагло заустављање.
Када је сензор потпуно миран на столу, он и даље мери приближно 1 g, јер на њега делује Земљина гравитација. Управо захваљујући томе можемо да одредимо како је плочица нагнута у простору.
Региструје промену брзине кретања по свакој оси.
Користи Земљину гравитацију као референтни правац.
Може да препозна пад, тресење, удар или промену положаја.

Акцелерометар мери убрзање по X, Y и Z оси које су везане за сам сензор.
На Земљиној површини сва тела привлачи сила гравитације. Ако је сензор потпуно миран, једино убрзање које региструје потиче управо од гравитације и има вредност приближно:
g ≈ 9.81 m/s²
Када је плочица положена хоризонтално, скоро целокупно гравитационо убрзање пројектује се на Z осу, док су вредности на X и Y осама близу нуле.
При нагињању плочице мењају се пројекције вектора гравитације на све три осе. Управо из тих вредности могуће је израчунати угао нагиба.

Нагињањем сензора мењају се компоненте гравитације по X, Y и Z оси, што омогућава одређивање нагиба.
Акцелерометар мери убрзање по три међусобно нормалне осе које су везане за сам сензор. То значи да се координатни систем увек окреће заједно са плочицом, а не са простором у коме се она налази.
Када окренемо ESP32 или MPU-9250 модул, мења се положај његових оса у односу на Земљину гравитацију. Због тога ће се променити и вредности које очитавамо на X, Y и Z оси.

Приликом окретања плочице окрећу се и координатне осе акцелерометра. Сензор увек мери компоненте убрзања у свом локалном координатном систему.
Док се плочица не креће нагло, највећи део измереног убрзања представља Земљина гравитација. Због тога се из односа компоненти убрзања могу израчунати углови нагиба.
Најчешће се користе два угла:
У пракси се најчешће користе следеће формуле:
Roll = atan2(AY, AZ)
Pitch = atan2(-AX, √(AY² + AZ²))
Функција atan2() враћа угао на основу односа две величине и омогућава исправно одређивање нагиба у свим квадрантима.

Нагиб око X и Y осе израчунава се на основу вредности које мери акцелерометар.
Замислимо да је ESP32 постављен потпуно хоризонтално на сто. Тада ће вредности бити приближно:
Ако затим нагнемо плочицу улево, вредност по X оси почиње да расте или опада, док се вредност по Z оси смањује. Исто важи и за нагиб напред или назад, само што се тада мењају AY и AZ.
AX≈0
AY≈0
AZ≈1g
AX се мења
AZ се смањује
AY се мења
AZ се смањује
Акцелерометар не мери директно угао нагиба, већ компоненте убрзања по свакој оси. Израчунавање угла представља математичку обраду измерених података.
Када се плочица брзо креће, поред гравитације јављају се и додатна убрзања, па мерење нагиба постаје мање прецизно. Због тога се у напреднијим системима акцелерометар комбинује са жироскопом.
| MPU-9250 | ESP32 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO23 |
| SCL | GPIO22 |
U Arduino IDE instalirati biblioteku:
MPU9250_asukiaaa
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
#define SDA_PIN 23
#define SCL_PIN 22
MPU9250_asukiaaa mpu;
void setup() {
Serial.begin(115200);
delay(1000);
Wire.begin(SDA_PIN, SCL_PIN);
mpu.setWire(&Wire);
mpu.beginAccel();
Serial.println("MPU-9250 je spreman.");
}
void loop() {
// Učitavanje novog merenja
mpu.accelUpdate();
// Slanje: AX, AY, AZ i intenzitet ubrzanja
Serial.print(mpu.accelX(),3);
Serial.print(",");
Serial.print(mpu.accelY(),3);
Serial.print(",");
Serial.print(mpu.accelZ(),3);
Serial.print(",");
Serial.println(mpu.accelSqrt(),3);
delay(100);
}
Уколико је све исправно повезано, у Serial Monitor-у добијају се вредности сличне следећим:
AX: 0.01 AY: -0.03 AZ: 0.99
AX: 0.02 AY: -0.04 AZ: 0.98
AX: 0.00 AY: -0.02 AZ: 1.00
Вредност по Z оси је близу 1 g, јер сензор мирује и региструје Земљину гравитацију. Ако нагнете плочицу, приметићете да се вредности по X и Y осама мењају, док се вредност по Z постепено смањује.
Ovaj program u okruženju Processing koristi biblioteku Serial za prijem podataka sa mikrokontrolera (preko serijske komunikacije) i njihov prikaz u 3D prostoru pomoću P3D renderera. Crvena, zelena i plava linija predstavljaju koordinatne ose (X, Y i Z), dok narandžasta linija prikazuje vektor ubrzanja dobijen sa senzora.
import processing.serial.*; // Biblioteka za serijsku komunikaciju
Serial port; // Objekat za komunikaciju preko serijskog porta
// Promenljive za komponente ubrzanja i ukupno ubrzanje
float ax, ay, az, a;
void setup() {
// Kreiranje prozora dimenzija 900x700 sa P3D rendererom
size(900, 700, P3D);
// Otvaranje prvog dostupnog serijskog porta brzinom 115200 bps
port = new Serial(this, Serial.list()[0], 115200);
// Čitanje podataka tek kada stigne novi red ('\n')
port.bufferUntil('\n');
}
void draw() {
// Svetlosiva pozadina
background(240);
// Uključivanje osvetljenja za 3D prikaz
lights();
// Pomeranje koordinatnog sistema u centar prozora
translate(width/2, height/2);
// Blago naginjanje scene radi boljeg prikaza
rotateX(-PI/6);
// Kontinuirana rotacija oko Y ose
rotateY(frameCount * 0.002);
// Debljina linija koordinatnih osa
strokeWeight(3);
// X osa - crvena
stroke(255, 0, 0);
line(0, 0, 0, 150, 0, 0);
// Y osa - zelena
stroke(0, 255, 0);
line(0, 0, 0, 0, 150, 0);
// Z osa - plava
stroke(0, 0, 255);
line(0, 0, 0, 0, 0, 150);
// Deblja narandžasta linija predstavlja vektor ubrzanja
strokeWeight(6);
stroke(255, 120, 0);
// Skaliranje vrednosti senzora radi preglednijeg prikaza
// Negativni znaci kod Y i Z prilagođavaju orijentaciju Processing koordinatnom sistemu
line(0, 0, 0,
ax * 120,
-ay * 120,
-az * 120);
}
// Funkcija se automatski poziva kada stigne novi red podataka
void serialEvent(Serial p) {
// Čitanje jednog reda i uklanjanje praznih karaktera
String s = trim(p.readString());
// Razdvajanje vrednosti po zarezu
String[] v = split(s, ',');
// Očekuje se format:
// ax,ay,az,a
if (v.length == 4) {
// Konverzija tekstualnih vrednosti u decimalne brojeve
ax = float(v[0]);
ay = float(v[1]);
az = float(v[2]);
// Ukupno ubrzanje (trenutno se ne koristi u prikazu,
// ali može poslužiti za ispis ili dodatne analize)
a = float(v[3]);
}
}
Вредности које очитава акцелерометар представљају пројекције вектора гравитације на координатне осе сензора. Из тих вредности могуће је израчунати угао нагиба уређаја.
У овој лекцији користићемо два најважнија угла:
Функција atan2() враћа угао у радијанима, па је потребно резултат претворити у степене множењем са 180/PI.

Из измерених вредности AX, AY и AZ могу се израчунати углови нагиба Pitch и Roll.
Ovaj program koristi biblioteku MPU9250_asukiaaa za komunikaciju sa MPU9250 IMU senzorom preko I²C magistrale. U svakom prolazu kroz glavnu petlju očitavaju se vrednosti ubrzanja po osama X, Y i Z, nakon čega se na osnovu akcelerometra izračunavaju uglovi pitch (nagib napred–nazad) i roll (nagib levo–desno). Dobijeni uglovi se šalju preko serijskog porta u formatu pitch,roll, što omogućava njihovu jednostavnu obradu ili vizuelizaciju u programu Processing.
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
// Kreiranje objekta za rad sa MPU9250 senzorom
MPU9250_asukiaaa imu;
// Promenljive za komponente ubrzanja
float ax, ay, az;
// Promenljive za uglove nagiba
float pitch, roll;
void setup() {
// Pokretanje serijske komunikacije
Serial.begin(115200);
// Pokretanje I2C magistrale
// SDA = GPIO21
// SCL = GPIO22
Wire.begin(21, 22);
// Povezivanje biblioteke sa I2C magistralom
imu.setWire(&Wire);
// Inicijalizacija senzora
imu.beginAccel();
Serial.println("MPU9250 inicijalizovan.");
}
void loop() {
// Očitavanje novih podataka sa akcelerometra
imu.accelUpdate();
// Učitavanje ubrzanja po osama (u jedinicama g)
ax = imu.accelX();
ay = imu.accelY();
az = imu.accelZ();
// Izračunavanje ugla roll
// Određuje nagib oko X ose
roll = atan2(ay, az) * 180.0 / PI;
// Izračunavanje ugla pitch
// Određuje nagib oko Y ose
pitch = atan2(-ax,
sqrt(ay * ay + az * az))
* 180.0 / PI;
// Slanje rezultata preko serijskog porta
// Format:
// pitch,roll
Serial.print(pitch);
Serial.print(",");
Serial.println(roll);
// Očitavanje približno 50 puta u sekundi
delay(20);
}
Program koristi samo podatke sa akcelerometra, zbog čega je veoma jednostavan i pogodan za određivanje statičkog nagiba senzora. Međutim, prilikom brzih pokreta ili vibracija merenja mogu biti manje stabilna, jer akcelerometar registruje i dinamička ubrzanja. Za preciznije određivanje orijentacije u pokretu potrebno je kombinovati podatke akcelerometra i žiroskopa primenom odgovarajućeg filtra (npr. komplementarnog ili Kalmanovog filtra).
Један од најзанимљивијих начина да ученици разумеју рад акцелерометра јесте приказ нагиба на екрану рачунара. Processing ће читати вредности које шаље ESP32 и приказивати линију која се окреће у складу са нагибом плочице.
import processing.serial.*;
Serial port;
float pitch = 0;
void setup()
{
size(600,600);
println(Serial.list());
port = new Serial(this,
Serial.list()[0],
115200);
port.bufferUntil('\n');
}
void draw()
{
background(240);
translate(width/2,height/2);
rotate(radians(pitch));
strokeWeight(8);
line(-150,0,150,0);
fill(0);
ellipse(0,0,20,20);
}
void serialEvent(Serial p)
{
String data = p.readStringUntil('\n');
if(data!=null)
{
data=trim(data);
String vrednosti[] = split(data,',');
if(vrednosti.length==2)
{
pitch=float(vrednosti[0]);
}
}
}

Како ученик помера ESP32 плочицу, линија на екрану ротира и приказује угао нагиба у реалном времену.
Једна од великих предности рада са ESP32 је могућност да се измерени подаци не приказују само као бројеви у Serial Monitor-у, већ и графички. На тај начин много је лакше разумети како се вредности акцелерометра мењају приликом померања сензора.
У овој лекцији направићемо једноставан индикатор нагиба. ESP32 ће преко серијске комуникације слати вредности углова израчунатих на основу акцелерометра, а Processing ће приказати линију која представља тренутни нагиб плоче.

У Processing-у се угао нагиба приказује графички, што омогућава једноставно праћење оријентације ESP32 плоче.
import processing.serial.*;
Serial port;
float angle = 0;
void setup() {
size(600,600);
port = new Serial(this,"COM5",115200);
port.bufferUntil('\n');
}
void draw(){
background(240);
translate(width/2,height/2);
rotate(radians(angle));
strokeWeight(8);
line(0,0,180,0);
fill(255,0,0);
ellipse(0,0,18,18);
}
void serialEvent(Serial p){
String s = trim(p.readString());
angle = float(s);
}
Поставите ESP32 на сто тако да мирује. Запишите вредности AX, AY и AZ. Потом ротирајте плочу за 90° око сваке осе и поново измерите вредности.
Питања:
Напишите програм који приказује угао нагиба око X осе. Полако нагињите плочу и пратите како се угао мења.
Задатак:
Повежите ESP32 са Processing програмом и прикажите линију која прати угао нагиба.
Проширење:
Направити дигиталну либелу која приказује да ли је плоча у хоризонталном положају.
Приказати угао нагиба као казаљку на екрану Processing програма.
Испробати различите брзине освежавања (20 ms, 50 ms и 100 ms) и упоредити како то утиче на глаткоћу приказа.
Акцелерометар је један од најважнијих сензора у савременој електроници. Иако је његова основна намена мерење убрзања, у мировању се може користити и за одређивање нагиба јер региструје Земљину гравитацију.
У овој лекцији научили сте како функционише акцелерометар, како се читају вредности помоћу ESP32 платформе, како се израчунава угао нагиба и како се резултати могу приказати у програму Processing. Ово представља основу за бројне наредне пројекте као што су дигитална либела, баланс роботи, системи стабилизације и управљање покретима.
У претходној лекцији упознали смо се са MPU-9250 сензором и сазнали да он у себи обједињује три различита сензора: акцелерометар, жироскоп и магнетометар. У овој лекцији посветићемо се само магнетометру, који омогућава одређивање правца у односу на Земљино магнетно поље и представља основу за израду дигиталног компаса.
Ученици ће научити како функционише магнетометар, зашто је неопходна његова калибрација и како се добијени подаци могу обрадити на ESP32 платформи. На крају лекције направићемо једноставан дигитални компас, а затим приказати његов рад помоћу графичке визуелизације у програмском окружењу Processing.

Магнетометар омогућава мерење Земљиног магнетног поља и одређивање смера кретања, па се користи као дигитални компас у бројним електронским системима.
Магнетометар је електронски сензор који мери јачину и правац магнетног поља. Он не мери растојање нити положај, већ детектује магнетне силе које делују у његовој околини. Захваљујући томе, магнетометар може да одреди где се налази магнетни север, па се често користи као основа за дигитални компас.
У MPU-9250 модулу магнетометар истовремено мери магнетно поље дуж три просторне осе:
Комбиновањем ова три мерења могуће је одредити оријентацију уређаја у простору и израчунати угао окретања у односу на север.

Магнетометар истовремено мери компоненте магнетног поља по X, Y и Z оси.
Прати магнетно поље у хоризонталном правцу лево–десно.
Мери компоненту магнетног поља у смеру напред–назад.
Одређује вертикалну компоненту магнетног поља.
Да би магнетометар могао да одреди правац, потребно је да постоји природно магнетно поље које ће мерити. Управо то омогућава Земљино магнетно поље. Наша планета се понаша као огроман магнет чије се линије магнетног поља простиру од једног пола до другог.
Игла класичног компаса увек покушава да се поравна са овим линијама, па зато показује приближно ка северу. Дигитални компас не користи механичку иглу већ магнетометар који електронски мери исти ефекат.
Magnetne linije prikazuju oblik Земљиног магнетног поља. У свакој тачки простора постоји вектор магнетног поља B , који је увек тангента на магнетну линију у тој тачки. Магнетометар не мери саме линије, већ компоненте тог вектора по X, Y и Z осама свог координатног система.

Линије магнетног поља окружују Земљу и омогућавају компасу да одреди правац севера.
Птице селице, морске корњаче и неке врсте риба користе Земљино магнетно поље за оријентацију током миграција. Научници сматрају да поседују природни „биолошки компас“ који им омогућава да проналазе пут и након више хиљада километара.
Јачина Земљиног магнетног поља није свуда иста. Она зависи од географске локације и најчешће износи између 25 и 65 μT (микротесла). Управо тако мале вредности магнетометар може веома прецизно да измери.
Мери јачину и правац магнетног поља које делује на сензор.
Магнетно поље се најчешће изражава у микротеслама (μT).
Навигација, роботика, дронови, паметни телефони и аутономни системи.
Класичан компас садржи магнетну иглу која може слободно да се окреће. Пошто је игла магнетисана, она се увек поставља у смеру Земљиног магнетног поља. Један крај игле показује ка магнетном северу, а други ка магнетном југу.
Дигитални компас ради по истом принципу, али уместо механичке игле користи магнетометар. Сензор мери вредности магнетног поља по X и Y оси, а затим микроконтролер израчунава угао у односу на север.

И механички и дигитални компас користе Земљино магнетно поље за одређивање правца.
За израчунавање смера најчешће се користи функција:
ugao = atan2(Y, X)
Функција atan2() израчунава угао на основу односа вредности X и Y осе. Добијени резултат представља смер у степенима:
0° или 360°
90°
180°
270°
Унутар MPU-9250 модула налази се посебан магнетометар под називом AK8963. Овај сензор производи компанија Asahi Kasei Microsystems и комуницира са главним MPU чипом преко интерне I2C магистрале.
AK8963 омогућава мерење магнетног поља по све три осе и има довољну прецизност за израду дигиталног компаса, навигационих система и роботичких пројеката.

Посебан чип унутар MPU-9250 модула задужен за мерење магнетног поља.
14-битни и 16-битни режим рада.
Истовремено мери X, Y и Z компоненту магнетног поља.
Компас, навигација, роботи, дронови и системи оријентације.
За рад магнетометра није потребно посебно повезивање. Пошто је AK8963 део MPU-9250 модула, довољно је повезати цео модул са ESP32 преко I2C комуникације.
| MPU-9250 | ESP32 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO21 |
| SCL | GPIO22 |

За коришћење магнетометра користе се исте I2C везе као и за цео MPU-9250 модул.
Иако у овој лекцији користимо само магнетометар, повезује се комплетан MPU-9250 модул јер су акцелерометар, жироскоп и магнетометар интегрисани у исти уређај.
У каснијим лекцијама користићемо и остале сензоре без икаквих измена у повезивању.
Један од најважнијих корака приликом рада са магнетометром је калибрација. Без калибрације компас може показивати погрешан смер чак и када сензор ради исправно.
На мерења утичу:
Због тога је потребно одредити минималне и максималне вредности које сензор очитава током окретања у свим правцима.

Сензор се полако окреће у облику броја 8 како би се измериле максималне и минималне вредности свих оса.
Овај поступак је стандардна процедура код свих дигиталних компаса, паметних телефона и дронова.
Пре него што започнемо програмирање потребно је припремити Arduino IDE и инсталирати библиотеку која омогућава једноставан рад са MPU-9250 сензором.
Повежите ESP32 плочу USB каблом са рачунаром.
Покрените Arduino IDE и изаберите одговарајућу ESP32 плочу.
Инсталирајте библиотеку MPU9250_asukiaaa преко Library Manager-а.

У Arduino IDE отворити Sketch → Include Library → Manage Libraries и потражити библиотеку MPU9250_asukiaaa.
Следећи програм чита вредности магнетног поља по све три осе и приказује их у Serial Monitor-у. Ово је основа за све наредне пројекте који користе дигитални компас.
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mpu;
void setup() {
Serial.begin(115200);
Wire.begin(21,22);
mpu.setWire(&Wire);
mpu.beginAccel();
mpu.beginGyro();
mpu.beginMag();
Serial.println("MPU9250 Magnetometar");
}
void loop() {
mpu.magUpdate();
Serial.print("X: ");
Serial.print(mpu.magX());
Serial.print(" Y: ");
Serial.print(mpu.magY());
Serial.print(" Z: ");
Serial.println(mpu.magZ());
delay(200);
}
Након покретања програма у Serial Monitor-у појављују се три вредности које представљају јачину магнетног поља по X, Y и Z оси.
X: -32.5 Y: 18.7 Z: 41.9
X: -31.9 Y: 19.3 Z: 42.0
X: -29.4 Y: 20.5 Z: 41.8
...

Очитане вредности магнетног поља приказују се у реалном времену у Serial Monitor-у.
Циљ ове вежбе је да ученици разумеју да магнетометар непрекидно мери магнетно поље које окружује сензор.
Која оса највише мења вредност када ротираш модул лево и десно?
Шта се дешава ако приближиш магнет сензору?
Да ли се вредности враћају када удаљиш магнет?
Саме вредности X и Y осе нису довољне да бисмо знали ка ком правцу је окренут сензор. Због тога се користи математичка функција atan2() која на основу односа X и Y вредности израчунава угао у односу на магнетни север.
У Arduino окружењу функција atan2() враћа угао у радијанима, па је потребно извршити конверзију у степене.
float heading = atan2(mpu.magY(), mpu.magX());
heading = heading * 180.0 / PI;
if (heading < 0)
heading += 360.0;
Следећи програм очитава магнетометар и израчунава смер компаса који се приказује у Serial Monitor-у.
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mpu;
void setup() {
Serial.begin(115200);
Wire.begin(21,22);
mpu.setWire(&Wire);
mpu.beginAccel();
mpu.beginGyro();
mpu.beginMag();
}
void loop() {
mpu.magUpdate();
float heading = atan2(mpu.magY(), mpu.magX());
heading *= 180.0 / PI;
if (heading < 0)
heading += 360;
Serial.println(heading);
delay(100);
}

ESP32 израчунава угао и шаље га у Serial Monitor.
Један од најбољих начина да ученици разумеју рад магнетометра јесте приказ смера компаса на екрану. Processing може директно да чита податке које ESP32 шаље преко серијског порта.
У овом примеру ESP32 шаље само један број — угао компаса, док Processing ротира стрелицу у складу са добијеном вредношћу.

Стрелица се ротира у реалном времену на основу података које шаље ESP32.
import processing.serial.*;
Serial port;
float heading = 0;
void setup() {
size(600,600);
port = new Serial(this, Serial.list()[0],115200);
port.bufferUntil('\n');
}
void draw(){
background(240);
translate(width/2,height/2);
rotate(radians(heading));
strokeWeight(5);
line(0,0,0,-180);
fill(255,0,0);
ellipse(0,-180,18,18);
}
void serialEvent(Serial p){
String s = trim(p.readStringUntil('\n'));
if(s!=null){
heading=float(s);
}
}
Циљ вежбе је да се направи компас који приказује смер у степенима и графички приказује оријентацију на екрану.
Проверити да ли стрелица показује север када је модул окренут ка северу.
Приближити магнет и посматрати како се компас понаша.
Покушати калибрацију и упоредити резултате пре и после ње.
Модификовати ESP32 програм тако да, поред угла, исписује и назив стране света:
У Processing програму додати приказ слова N, E, S и W око кружнице компаса тако да визуелизација буде што сличнија правом дигиталном компасу.
Након што су ученици савладали основе рада са магнетометром и израдили једноставан дигитални компас, могу започети развој сложенијих пројеката. Следећи предлози представљају добру основу за школске, STEM и роботичке пројекте.
Приказ смера на OLED или TFT екрану уз приказ страна света.
Робот користи магнетометар за одређивање смера кретања.
Детекција оријентације и аларм ако се ранац окрене.
Приказ тренутног смера кретања на LCD или OLED дисплеју.
Слање података паметном телефону преко Bluetooth комуникације.
Приказ оријентације сензора у Processing окружењу.
Покушајте да проширите програм тако да компас приказује не само угао већ и назив стране света.
| Угао | Правац |
|---|---|
| 337.5° – 22.5° | Север (N) |
| 22.5° – 67.5° | Североисток (NE) |
| 67.5° – 112.5° | Исток (E) |
| 112.5° – 157.5° | Југоисток (SE) |
| 157.5° – 202.5° | Југ (S) |
| 202.5° – 247.5° | Југозапад (SW) |
| 247.5° – 292.5° | Запад (W) |
| 292.5° – 337.5° | Северозапад (NW) |
Уместо исписивања само угла, измените програм тако да на основу измереног угла исписује и назив стране света.
Шта мери магнетометар?
Која функција се користи за израчунавање угла компаса?
Зашто је потребна калибрација магнетометра?
Који GPIO пинови ESP32 се најчешће користе за I2C комуникацију?
Коју улогу има програм Processing у овој лекцији?
Шта ће се догодити ако магнет приближимо магнетометру?
Магнетометар је један од најважнијих сензора за одређивање оријентације у простору. Иако самостално може да функционише као дигитални компас, у пракси се скоро увек комбинује са акцелерометром и жироскопом како би се добили што прецизнији подаци о положају и кретању уређаја.
У наредним лекцијама ученици ће научити како се комбинују сва три сензора MPU-9250 модула и како се добија потпуна оријентација уређаја у тродимензионалном простору, што представља основу за рад дронова, мобилних робота, паметних уређаја и система за стабилизацију.
У овој вежби ученици упознају рад сензора светлости и његову примену у комбинацији са ESP32 микроконтролером. Помоћу аналогног улаза очитава се ниво осветљења у околини, а затим се та вредност користи за приказ информација у Serial Monitor-у или за управљање LED диодом.
Вежба представља добар увод у рад са аналогним сензорима и повезује:

Основна поставка за мерење нивоа осветљења у околини.
Сензор светлости је електронска компонента која омогућава да се детектује јачина светлости у окружењу. У зависности од врсте сензора, промена осветљења може да доведе до промене отпора, напона или дигиталног сигнала.
У овој вежби користимо сензор који се понаша као део напонског делитеља, а ESP32 затим чита промене на аналогном улазу. На основу тога можемо да проценимо да ли је у просторији јаче светло или је присутан мрак.

Светлосни сензор мења електрична својства у зависности од количине светлости.
Један од најчешћих елемената за мерење светлости је фоторезистор (LDR – Light Dependent Resistor). Његов отпор се мења у зависности од количине светлости која пада на његову површину. Када је светлости више, отпор је мањи, а када је светлости мање, отпор расте.
Више о једноставном мерењу осветљења помоћу light сензора може се видети и на овој страни: мерење осветљења помоћу light сензора и ESP32.
У овој лекцији се акценат ставља на практично очитавање вредности светлости, њихово приказивање у серијском монитору и каснију примену за управљање LED диодом.
Овакав приступ је веома користан у аутоматским системима осветљења, паметним кућама и разним сензорским пројектима.
За реализацију ове вежбе потребно је:
Модул сензора светлости већ садржи LDR сензор и отпорник који формирају напонски делитељ. Аналогни излаз модула (AO) повезује се на аналогни улаз ESP32 плоче, а вредност осветљености очитава се помоћу функције analogRead().
У овој вежби користимо следеће повезивање:
Дигитални излаз DO се у овој вежби не користи.
Kod različitih LDR modula analogna vrednost može da se ponaša različito. Kod nekih modula povećanjem osvetljenosti raste i ADC vrednost, dok kod drugih ona opada.
Razlog nije u fotootporniku, već u načinu na koji su fotootpornik i otpornik povezani u naponskom delitelju.
Preporučuje se da se pre pisanja programa senzor osvetli lampom i zatim prekrije rukom. Posmatranjem vrednosti u Serial Monitor-u lako se utvrđuje da li ADC raste ili opada sa povećanjem osvetljenosti.
Većina LDR modula sa četiri priključka (VCC, GND, AO i DO) pored fotootpornika sadrži i komparator LM393. Analogni izlaz (AO) koristi se za merenje nivoa osvetljenosti, dok je digitalni izlaz (DO) namenjen samo detekciji da li je osvetljenost iznad ili ispod zadatog praga.
Potenciometar na modulu služi za podešavanje praga aktiviranja digitalnog izlaza DO. Njegovo okretanje uglavnom ne utiče na analogni izlaz AO, pa se očitane ADC vrednosti ne menjaju značajno.

Приказ основне шеме за мерење осветљења помоћу ESP32.

Приказ распореда и повезивања са задње стране.

Каснија проширена верзија вежбе са LED диодом.

Задња страна кола које укључује и LED диоду.
ESP32 користи 12-битни ADC, па је важно да аналогни сигнал буде стабилан и правилно доведен на GPIO34.
Код мерног кола је добро да се користе кратке жице и чврста веза на breadboard плочи како би очитавања била што поузданија.
ADC konvertor ESP32 može da meri napone u opsegu od približno 0 V do 3,3 V, što odgovara vrednostima od 0 do 4095. Međutim, to ne znači da će svaki analogni senzor koristiti ceo taj opseg.
Kod većine gotovih LDR modula analogni izlaz (AO) predstavlja napon naponskog delitelja koji formiraju fotootpornik i otpornik na modulu. Zbog njihovih karakteristika izlazni napon često zauzima samo deo mogućeg opsega, pa se u normalnim uslovima mogu dobijati vrednosti, na primer, između 100 i 1200 umesto од 0 до 4095.
To nije greška ESP32 niti senzora, već normalna osobina konkretnog modula.
У овој вежби ESP32 очитава аналогну вредност са сензора светлости, затим ту вредност преводи у погодан опсег за приказивање јачине осветљења. На тај начин ученици виде како се сирови ADC подаци могу обрадити и употребити у даљој примени.
Овде се не користи LED диода. Циљ је да се разуме сам принцип мерења светлости и начин на који се добијена вредност приказује у серијском монитору.

Практично повезивање сензора светлости на breadboard плочи.
Циљ је да се очита вредност са аналогног улаза, затим да се из ње добије процена осветљености. Што је амбијент тамнији, то је очитана вредност другачија, па се преко програма може пратити промена услова у просторији.
// Аналогни улаз на који је доведен сигнал са напонског делитеља
// који чине LDR сензор и отпорник од 10 kΩ
#define LDR_PIN 34
void setup() {
// Покретање серијске комуникације брзином од 115200 bps
// да бисмо могли да пратимо очитане вредности у Serial Monitor-у
Serial.begin(115200);
// ESP32 користи 12-битни ADC,
// па analogRead() враћа вредности од 0 до 4095
analogReadResolution(12);
}
void loop() {
// Очитавање аналогне вредности са GPIO34 пина
int ocitanaVrednost = analogRead(LDR_PIN);
// Превођење ADC вредности у опсег 255–0
// Обрнут распон је користан јер већа вредност
// може да представља слабије осветљење
int nivoOsvetljenosti = map(ocitanaVrednost, 0, 4095, 255, 0);
// Испис оригиналне ADC вредности
Serial.print("LDR: ");
Serial.print(ocitanaVrednost);
// Испис прерачунате вредности осветљења
Serial.print(" brightness: ");
Serial.println(nivoOsvetljenosti);
// Кратка пауза између два мерења
delay(500);
}

Приказ очитаних ADC вредности и израчунате вредности осветљености током рада програма.
nivoOsvetljenosti = map(ocitanaVrednost, 0, 4095, 255, 0);
Ова линија кода омогућава да се сирови ADC подаци лакше тумаче у наставку рада.
Primer u programu koristi teorijski ADC opseg od 0 do 4095. Međutim, kod mnogih LDR modula stvarni opseg može biti znatno manji. Zbog toga je preporučljivo da se najpre očitaju minimalna i maksimalna ADC vrednost u uslovima u kojima će uređaj raditi.
Na primer, ako očitane vrednosti variraju između 120 i 1180, bolje je koristiti:
int brightness = map(ldrValue,120,1180,0,255);
brightness = constrain(brightness,0,255);
Na ovaj način koristi se ceo PWM opseg LED diode, pa promena osvetljenosti postaje znatno uočljivija.
Izmeri:
Na osnovu dobijenih rezultata odgovori:
Неки модули сензора светлости немају аналогни излаз (AO), већ само дигитални излаз (D0). У том случају сензор не мери тачну јачину светлости, већ само детектује да ли је у просторији светло или мрак.
Резултат је бинарни сигнал:
Праг осетљивости се подешава помоћу потенциометра на самом модулу.
// Пин на који је повезан D0 излаз
#define LDR_PIN 34
// LED диода
#define LED_PIN 2
void setup() {
Serial.begin(115200);
pinMode(LDR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int stanje = digitalRead(LDR_PIN);
// Ако је мрак (1) → LED јаче светли
// Ако је светло (0) → LED слабије светли
int jacina = (stanje == 1) ? 255 : 40;
analogWrite(LED_PIN, jacina);
Serial.print("D0: ");
Serial.println(jacina);
delay(100);
}
| Тип сензора | Излаз | Шта мери |
|---|---|---|
| A0 | Аналогни (0–4095) | Јачину светлости |
| D0 | Дигитални (0/1) | Само светло / мрак |
D0 варијанта се користи када није потребно прецизно мерење, већ само детекција услова осветљења. Овај режим је једноставнији и погодан за основне аутоматске системе.
Поред готових модула са аналогним (AO) или дигиталним (DO) излазом, мерење осветљења може се реализовати и употребом самог фотоотпорника (LDR) и фиксног отпорника од 10 kΩ. На овај начин формира се напонски разделник, чији се излаз доводи на аналогни улаз ESP32 микроконтролера.
Ово је један од најчешћих начина повезивања LDR сензора јер омогућава прецизно мерење осветљености без употребе готовог сензорског модула.

Фотоотпорник и отпорник од 10 kΩ повезани као напонски разделник.

Повезивање фотоотпорника и отпорника у Circuit Designer окружењу.

Приказ распореда проводника са задње стране breadboard плоче.
Фотоотпорник мења свој отпор у зависности од количине светлости која пада на његову површину. Заједно са отпорником од 10 kΩ формира напонски разделник чији се излазни напон доводи на аналогни улаз ESP32 микроконтролера.
Фотоотпорник није поларизована компонента, па није важно којом ће страном бити повезан. Важно је само да са отпорником од 10 kΩ формира напонски разделник чији је средишњи чвор повезан на аналогни улаз ESP32.
// Аналогни улаз на који је повезан средишњи чвор
// напонског разделника
#define LDR_PIN 34
void setup() {
Serial.begin(115200);
analogReadResolution(12);
}
void loop() {
// Очитавање напона са разделника
int ldrValue = analogRead(LDR_PIN);
// Пример мапирања.
//По потреби прилагодити опсег стварно измереним ADC вредностима.
int brightness = map(ldrValue, 0, 4095, 255, 0);
brightness = constrain(brightness,0,255);//ограничење да вредност не премаши 255
Serial.print("LDR: ");
Serial.print(ldrValue);
Serial.print(" brightness: ");
Serial.println(brightness);
delay(500);
}
Поред приказа вредности у Serial Monitor-у, могуће је визуелизовати ниво осветљености и у Processing окружењу. ESP32 шаље податке преко серијске комуникације, а Processing их чита и на основу њих исцртава индикатор јачине осветљења. На тај начин промене светлости могу се пратити у реалном времену.
import processing.serial.*;
// Objekat koji predstavlja serijski port
// preko koga Processing komunicira sa ESP32
Serial myPort;
// Promenljiva u kojoj će biti sačuvana
// vrednost osvetljenosti (0-255)
int brightness = 0;
void setup()
{
// Kreiranje prozora dimenzija 600x250 piksela
size(600,250);
// Ispis liste svih dostupnih serijskih portova.
// Na osnovu ove liste bira se odgovarajući port.
println(Serial.list());
// Otvaranje prvog pronađenog serijskog porta
// brzinom od 115200 bps.
// Brzina mora biti ista kao u ESP32 programu.
myPort = new Serial(this,
Serial.list()[0],
115200);
// Funkcija serialEvent() biće pozvana
// svaki put kada stigne jedan red teksta,
// odnosno kada se primi znak '\n'.
myPort.bufferUntil('\n');
// Podešavanje veličine teksta
textSize(20);
}
void draw()
{
// Boja pozadine prozora
background(245);
// Naslov iznad indikatora
fill(0);
text("Ниво осветљености",40,40);
// Iscrtavanje okvira indikatora
noFill();
strokeWeight(2);
rect(40,80,500,40);
// Popunjavanje indikatora.
// Što je brightness veći,
// plavi pravougaonik je duži.
fill(60,160,255);
noStroke();
rect(40,80,brightness*500.0/255.0,40);
// Ispis numeričke vrednosti
fill(0);
text("Brightness: " + brightness,40,170);
}
// Ova funkcija se automatski poziva
// kada Processing primi jedan red teksta
// sa serijskog porta.
void serialEvent(Serial port)
{
// Čitanje jednog reda teksta
// do znaka '\n'
String data = port.readStringUntil('\n');
// Provera da li je tekst uspešno pročitan
if(data!=null)
{
// Uklanjanje znakova novog reda
// i praznih karaktera sa početka i kraja
data = trim(data);
// Pronalaženje dela teksta
// koji počinje rečju "brightness:"
int index = data.indexOf("brightness:");
// Ako je tekst pronađen...
if(index!=-1)
{
// Izdvajanje dela teksta koji dolazi
// iza reči "brightness:"
String vrednost = trim(data.substring(index+12));
// Pretvaranje izdvojenog teksta u ceo broj
brightness = int(vrednost);
}
}
}
У другој вежби истом сензору светлости додаје се LED диода. Када је у околини мање светлости, LED треба да јаче светли, а када је осветљење веће, њен интензитет треба да буде мањи. На тај начин добија се једноставан пример аутоматског ноћног осветљења.

Проширена верзија кола у којој се додаје и LED диода-шема у Circuit designer-у

Проширена верзија кола у којој се додаје и LED диода.
Циљ је да се покаже практична примена мерења светлости. Сензор очитава услове у просторији, а ESP32 на основу тога управља LED диодом тако да она постане јача у мраку, а слабија на јаком светлу.
// Analogni ulaz na koji je povezan LDR senzor
#define LDR_PIN 34
// LED dioda povezana na GPIO2
#define LED_PIN 2
void setup() {
// Pokretanje serijske komunikacije
Serial.begin(115200);
// Postavljanje LED pina kao izlaza
pinMode(LED_PIN, OUTPUT);
// ESP32 koristi 12-bitni ADC,
// pa analogRead() vraća vrednosti od 0 do 4095
analogReadResolution(12);
}
void loop() {
// Očitavanje analogne vrednosti sa LDR senzora
int ocitanaVrednost = analogRead(LDR_PIN);
// Pretvaranje ADC vrednosti (0–4095)
// u PWM opseg (255–0).
// Obrnuto mapiranje omogućava da LED
// jače svetli kada je manje svetlosti.
// Po potrebi opseg 0–4095 može se zameniti
// stvarno izmerenim vrednostima senzora.
int jacinaSvetlosti = map(ocitanaVrednost, 0, 4095, 255, 0);
// Obezbeđuje da PWM vrednost uvek bude
// u dozvoljenom opsegu od 0 do 255.
jacinaSvetlosti = constrain(jacinaSvetlosti, 0, 255);
// Slanje PWM vrednosti LED diodi
analogWrite(LED_PIN, jacinaSvetlosti);
// Kratka pauza pre sledećeg očitavanja
delay(100);
}

Приказ очитаних вредности током рада програма који управља јачином светлења LED диоде.
У овој вежби упознаћемо се са паметним адресабилним ЛЕД диодама у облику прстена (модел WS2812B). За разлику од обичних ЛЕД диода које захтевају додатне отпорнике за ограничење струје, паметни ЛЕД прстенови унутар сваке диоде имају уграђен посебан микрочип (драјвер). Ови чипови самостално регулишу јачину струје и омогућавају нам да преко само једне дигиталне линије (једне жице) контролишемо боју и јачину великог броја диода појединачно. Због уграђене заштите, напајање прстена везује се директно на развојну плочу.

Повезивање WS2812B ЛЕД прстена са DIN стране на ESP32 плочу.
Паметни прстенови могу да се везују у ланац један за другим, па због тога имају две групе жица. Са једне стране се налазе улазни контакти (означени са DIN или IN), а са друге излазни (означени са DO или OUT). За везу са ESP32 плочом користи се искључиво улазна страна (DIN), док излазне жице остају слободне.
Пре интеграције са сензором, потребно је проверити исправност прстена. За контролу ових диода користи се популарна библиотека FastLED (аутор Daniel Garcia), коју је потребно инсталирати кроз Library Manager. Следећи код константно пали и гаси цео прстен од 36 диода у црвеној боји.
#include <FastLED.h>
// Дигитални пин за слање података ка прстену
#define LED_PIN 4
// Број диода на вашем прстену (нпр. 36)
#define NUM_LEDS 36
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
void setup() {
Serial.begin(115200);
Serial.println("--- ТЕСТ ЛЕД ПРСТЕНА ПОКРЕНУТ ---");
// Иницијализација ФастЛЕД библиотеке
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
// Постављање умерене јачине (64 је око 25% снаге ради заштите плоче)
FastLED.setBrightness(64);
}
void loop() {
Serial.println("Палим све диоде у ЦРВЕНУ боју...");
fill_solid(leds, NUM_LEDS, CRGB::Red);
FastLED.show();
delay(1000);
Serial.println("Гасим све диоде...");
FastLED.clear();
FastLED.show();
delay(1000);
}
Изазов: Модификујте претходну Вежбу 2 тако што ћете уместо обичне ЛЕД диоде са отпорником на систем повезати овај паметни ЛЕД прстен од 36 диода. Напишите програм у коме ће прстен реаговати на количину светлости у просторији помоћу LDR сензора (повезаног на GPIO 34), али са обрнутом логиком: што је у просторији мање светлости, прстен треба да светли СЛАБИЈЕ, а када се светлост појача, прстен треба да светли ЈАЧЕ.
⚠️ Упозорење и проблем који ће се јавити: Када спојите код за очитавање фотоотпорника са кодом за ЛЕД прстен унутар исте петље, приметићете да ЛЕД прстен уопште не жели да се упали или да систем константно блокира!
WS2812B чипови захтевају изузетно прецизан пренос података који се мери у наносекундама. С друге стране, стандардна функција analogRead() привремено зауставља рад процесора како би измерила напон на пину сензора. Ова два процеса се међусобно сукобљавају унутар брзе loop() петље. Када процесор застане због читања сензора, прекида се сигнал ка прстену, због чега паметни чипови на прстену не добијају исправне команде и остају угашени.
Да бисте успешно решили овај проблем и завршили задатак, потребно је да у свом коду примените следећа два инжењерска решења:
millis()) који ће очитавати сензор тек на сваких 500 милисекунди (пола секунде), док ће у међувремену прстен добијати константан и несметан сигнал.FASTLED_ALLOW_INTERRUPTS 0), као и наредбу која активира изоловани хардверски блок унутар ESP32 чипа за управљање даљинским сигналима (#define FASTLED_RMT_BUILTIN_DRIVER 1). Овај РМТ драјвер ће самостално слати сигнале на пин 4, остављајући главни процесор слободним за читање фотоотпорника.map() пажљиво ускладите вредности фотоотпорника са излазним опсегом јачине светла за прстен (од 0 до максимално 150). Пазите на редослед бројева како бисте постигли захтевани ефекат (мање амбијенталног светла = слабије светло прстена). Не заборавите да јачину софтверски ограничите на максимално 150 преко функције constrain() како 36 диода не би повукло превише струје са плоче.

Напомена: Слика приказује финални изглед уређаја у реалном раду. Жице повежите пратећи искључиво текстуално упутство и дигиталне ознаке пинова из претходног корака, а не према изгледу са ове фотографије.
Ова вежба показује како се помоћу ESP32 плоче може мерити светлост и користити та информација за даље управљање излазима. На тај начин се једноставни сензорски подаци претварају у користан аутоматски одговор система.
У следећим корацима могуће је да се овај пројекат прошири на паметно осветљење, алармне системе, аутоматско управљање прозорима или приказ података преко интернета.
## 📚 Додатно учење
Детаљније објашњење рада light сензора, фотоотпорника, напонског делитеља и мерења осветљења помоћу ESP32 платформе.
Истражи како функционише ADC конвертор у ESP32 микроконтролеру и на који начин се аналогни напон претвара у дигиталну вредност.
Комбинуј сензор светлости са OLED дисплејом или Wi-Fi комуникацијом и направи систем за праћење осветљења у реалном времену.
1. Која функција очитава аналогну вредност са ESP32?
2. Који GPIO пин је коришћен за LDR сензор у овој вежби?
3. Која је максимална вредност коју враћа 12-битни ADC на ESP32?
4. Шта се дешава у другој вежби када је мање светлости?
MPU-9250 је инерцијална мерна јединица (IMU – Inertial Measurement Unit) која у једном малом интегрисаном колу садржи три различита сензора: троосни акцелерометар, троосни жироскоп и троосни магнетометар. Захваљујући томе могуће је истовремено пратити кретање, нагиб, окретање и оријентацију у простору.
Овакав тип сензора користи се у великом броју савремених уређаја. Налазимо га у мобилним телефонима, паметним сатовима, дроновима, роботима, системима за стабилизацију камера, навигационим уређајима, па чак и у аутомобилима. Захваљујући овим сензорима телефон зна када га окренемо, дрон одржава равнотежу током лета, а паметни сат броји кораке.

MPU-9250 комбинује акцелерометар, жироскоп и магнетометар у једном интегрисаном колу.
MPU-9250 истовремено обезбеђује чак девет различитих мерења, због чега се често назива 9-осни IMU сензор. Сваки од три уграђена сензора мери вредности по три просторне осе: X, Y и Z.
Мери линеарно убрзање по X, Y и Z оси. На основу тих вредности може се одредити нагиб уређаја и детектовати кретање.
Мери угаону брзину, односно колико брзо се уређај окреће око сваке осе.
Мери Земљино магнетно поље и омогућава одређивање смера као дигитални компас.
Да бисмо разумели како ради MPU-9250, потребно је да знамо шта представљају просторне осе. Сензор увек мери вредности у односу на своје координатне осе.

Сва мерења акцелерометра, жироскопа и магнетометра односе се на X, Y и Z осу.
Када окрећемо модул, вредности на појединим осама се мењају. Управо на тим променама заснивају се све касније вежбе и пројекти.
Акцелерометар мери убрзање. Чак и када сензор мирује, он региструје Земљину тежу (гравитацију), па се на основу тога може одредити нагиб уређаја.
Жироскоп не мери положај већ брзину окретања. Ако брзо окренемо модул, добићемо већу вредност него када га окрећемо полако. Управо зато се жироскоп користи за стабилизацију дронова, робота и камера.
Магнетометар мери јачину и правац Земљиног магнетног поља. На основу ових података могуће је израчунати смер кретања (север, исток, југ и запад), због чега се често назива дигиталним компасом.
Сваки од ова три сензора има своје предности и недостатке.
Због тога се у стварним системима користе сва три сензора истовремено. Комбиновањем њихових мерења добија се много прецизнија процена оријентације у простору.

IMU сензори се налазе у дроновима, роботима, мобилним телефонима, паметним сатовима и многим другим електронским уређајима.
На већини MPU-9250 модула налазе се прикључци који омогућавају комуникацију преко I2C или SPI интерфејса. У школским пројектима најчешће се користи I2C јер захтева само две комуникационе линије и веома је једноставан за повезивање са ESP32.

Приказ најважнијих прикључака који се користе приликом повезивања са ESP32 развојном плочом.
За већину школских пројеката довољно је повезати само VCC, GND, SDA и SCL.
INT, AD0, FSYNC и NCS користе се код сложенијих пројеката који захтевају већу брзину или прекиде.
ESP32 и MPU-9250 комуницирају преко I2C магистрале. То значи да су потребне само две сигналне линије: SDA (подаци) и SCL (сат). ESP32 већ има уграђен I2C контролер, па није потребан никакав додатни хардвер.
Подразумевани I2C пинови на већини ESP32 плоча су:
Поред сигналних линија неопходно је повезати и напајање.
| MPU-9250 | ESP32 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO21 |
| SCL | GPIO22 |

Практичан пример повезивања сензора са ESP32 развојном плочом преко I2C интерфејса.

Пример како изгледа повезан сензор приликом израде школских вежби.
I2C (Inter Integrated Circuit) представља серијски комуникациони протокол који омогућава да више уређаја користи исте SDA и SCL линије. Сваки уређај има своју адресу, па ESP32 може да комуницира са више сензора истовремено.
Најчешћа адреса MPU-9250 модула је:
Уколико нисте сигурни коју адресу има ваш модул, можете покренути I2C Scanner програм у Arduino IDE и проверити адресу аутоматски.

У Serial Monitor-у приказује се I2C адреса пронађеног уређаја.
Иако неки MPU-9250 модули имају уграђен стабилизатор напона и могу да се напајају са 5V, за рад са ESP32 препоручује се напајање од 3.3V.
На тај начин су логички нивои идентични и избегава се могућност оштећења микроконтролера или сензора.
Комбиновањем података са акцелерометра, жироскопа и магнетометра могуће је реализовати велики број практичних пројеката. Управо зато се MPU-9250 налази у многим роботима, дроновима, паметним уређајима и индустријским системима.

Од паметних сатова до дронова – овај сензор је један од најчешће коришћених IMU модула.
У овој вежби ученици ће први пут комуницирати са MPU-9250 сензором и научити како да очитавају вредности магнетног поља. Магнетометар ради као дигитални компас и мери јачину Земљиног магнетног поља по три осе (X, Y и Z).
Циљ није да одмах направимо компас, већ да разумемо како изгледају подаци које сензор шаље ESP32 микроконтролеру.

Мери Земљино магнетно поље и омогућава одређивање смера кретања.
Пре покретања програма потребно је инсталирати библиотеку:
Иако у овој вежби користимо само магнетометар, повезује се цео MPU-9250 модул. Магнетометар се налази унутар сензора и није потребно посебно повезивање његових пинова. Довољно је успоставити I2C комуникацију између ESP32 и MPU-9250 модула.
| MPU-9250 | ESP32 | Опис |
|---|---|---|
| VCC | 3.3V | Напајање модула |
| GND | GND | Заједничка маса |
| SDA | GPIO21 | I2C линија за пренос података |
| SCL | GPIO22 | I2C линија такта |
Иако је циљ ове вежбе рад са магнетометром, преко I2C комуникације ESP32 приступа целом MPU-9250 модулу. Програм једноставно користи само део сензора који представља магнетометар.

За очитавање магнетометра користе се само четири жице: VCC, GND, SDA и SCL.

Библиотека омогућава једноставно очитавање свих сензора MPU-9250.
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mpu;
void setup() {
Serial.begin(115200);
Wire.begin(21,22);
mpu.setWire(&Wire);
mpu.beginMag();
}
void loop() {
mpu.magUpdate();
Serial.print("MX: ");
Serial.print(mpu.magX());
Serial.print(" MY: ");
Serial.print(mpu.magY());
Serial.print(" MZ: ");
Serial.println(mpu.magZ());
delay(200);
}

Вредности се непрекидно мењају приликом окретања сензора.
Уместо приказа бројева могуће је направити једноставну графичку визуелизацију. Processing ће читати серијске податке и ротирати стрелицу која представља смер магнетног поља.

Стрелица се ротира у зависности од вредности које шаље MPU-9250.
import processing.serial.*;
Serial port;
float angle = 0;
void setup(){
size(600,600);
port = new Serial(this,"COM5",115200);
}
void draw(){
background(240);
translate(width/2,height/2);
rotate(radians(angle));
strokeWeight(5);
line(0,0,0,-180);
fill(255,0,0);
triangle(-12,-170,12,-170,0,-210);
}
void serialEvent(Serial p){
String s=p.readStringUntil('\n');
if(s!=null){
// Ovde se kasnije može izračunavati ugao
// iz MX i MY vrednosti.
}
}
У овој лекцији још не израчунавамо правац компаса. Processing служи само као пример како се подаци могу графички приказати. Израчунавање угла и правог дигиталног компаса биће тема једне од наредних лекција.
У овој вежби користимо само акцелерометар који се налази унутар MPU-9250 сензора. Акцелерометар мери убрзање по три осе (X, Y и Z), али када сензор мирује, он заправо мери утицај Земљине теже. Управо захваљујући томе можемо одредити нагиб плоче у простору.
Овај принцип користи се у мобилним телефонима, дроновима, паметним сатовима, роботима и многим индустријским системима.
Акцелерометар је такође интегрисан унутар MPU-9250 модула. Ни у овој вежби није потребно посебно повезивање додатних пинова, већ се користи исто I2C повезивање као и код претходне вежбе.
| MPU-9250 | ESP32 | Опис |
|---|---|---|
| VCC | 3.3V | Напајање сензора |
| GND | GND | Маса |
| SDA | GPIO21 | I2C подаци |
| SCL | GPIO22 | I2C такт |
Иако програм користи само акцелерометар, ESP32 комуницира са целим MPU-9250 модулом. Библиотека затим издваја само податке који припадају акцелерометру.

И код рада са акцелерометром користе се иста четири прикључка јер су сви сензори интегрисани у једном модулу.

Мери убрзање по X, Y и Z оси и омогућава одређивање нагиба уређаја.
MPU-9250 није скуп три одвојена сензора већ једно интегрисано коло. Акцелерометар, жироскоп и магнетометар налазе се унутар истог чипа и са ESP32 комуницирају преко заједничке I2C магистрале. Због тога су за све три вежбе потребна иста четири прикључка (VCC, GND, SDA и SCL), док се разлика прави искључиво у програмском коду који одређује који део сензора ће бити коришћен.
#include <Wire.h>
#include <MPU9250_asukiaaa.h>
MPU9250_asukiaaa mpu;
void setup() {
Serial.begin(115200);
Wire.begin(21,22);
mpu.setWire(&Wire);
mpu.beginAccel();
}
void loop() {
mpu.accelUpdate();
Serial.print(mpu.accelX());
Serial.print(",");
Serial.print(mpu.accelY());
Serial.print(",");
Serial.println(mpu.accelZ());
delay(50);
}

Вредности по осама X, Y и Z мењају се приликом нагињања плоче.
Уместо приказа бројева можемо направити електронску либелу. На екрану се приказује круг унутар кога се налази куглица. Како се ESP32 плоча нагиње, тако се куглица помера у одговарајућем смеру.

Куглица прати нагиб сензора у реалном времену.
import processing.serial.*;
Serial port;
float ax=0;
float ay=0;
void setup(){
size(600,600);
port=new Serial(this,"COM5",115200);
}
void draw(){
background(245);
translate(width/2,height/2);
noFill();
strokeWeight(3);
ellipse(0,0,320,320);
fill(0,180,255);
ellipse(ax*120,-ay*120,35,35);
}
void serialEvent(Serial p){
String s=p.readStringUntil('\n');
if(s!=null){
String[] data=split(trim(s),",");
if(data.length==3){
ax=float(data[0]);
ay=float(data[1]);
}
}
}
ESP32 шаље вредности X и Y осе преко серијске комуникације. Processing чита сваки ред података, издваја вредности и на основу њих помера плаву куглицу по екрану. На тај начин добијамо једноставну електронску либелу која приказује нагиб плоче у реалном времену.

Померањем ESP32 плоче помера се и куглица на екрану.
У овој вежби смо научили како се користи акцелерометар за мерење нагиба и како се подаци могу визуелизовати у реалном времену. Овај принцип користи се код електронских либела, баланс робота, паметних телефона и великог броја индустријских уређаја.
Након што сте научили како се читају подаци са акцелерометра, жироскопа и магнетометра, можете почети да правите сопствене пројекте. MPU-9250 је један од најкоришћенијих IMU сензора у роботици, аутоматизацији и IoT системима јер омогућава праћење положаја, кретања и оријентације уређаја у простору.

Од робота и дронова до паметних уређаја и STEM пројеката.
Приказ смера кретања помоћу магнетометра на OLED дисплеју или TFT екрану.
Праћење угла нагиба и активирање аларма ако се предмет превише накрене.
Акцелерометар и жироскоп омогућавају мерење нагиба робота ради одржавања равнотеже.
Управљање игрицом, роботом или презентацијом померањем руке.
Обрада података акцелерометра ради препознавања корака и физичке активности.
Праћење наглих промена убрзања ради препознавања пада особе или предмета.
Једна од најзанимљивијих примена овог сензора јесте приказ мерења у реалном времену. Processing омогућава да податке које ESP32 шаље преко серијске комуникације претворимо у графике, показиваче, инструменте или чак тродимензионалне моделе.

Подаци са ESP32 могу се приказивати као графици, казаљке или 3D модел.
У овој лекцији приказали смо једноставан пример визуелизације магнетометра, али исти принцип може да се примени и за приказ акцелерометра или жироскопа.
Научили смо шта представља инерцијални мерни уређај (IMU).
Повезали смо MPU-9250 и ESP32 преко I2C магистрале.
Очитавали смо вредности са акцелерометра, жироскопа и магнетометра.
Приказивали смо податке на Serial Monitor-у и у Processing окружењу.
MPU-9250 представља један од најкомплетнијих сензора који се користе у образовању, роботици и савременим електронским системима. Захваљујући томе што у једном модулу садржи акцелерометар, жироскоп и магнетометар, омогућава прецизно праћење покрета, нагиба и оријентације уређаја.
У овој лекцији научили сте како се сензор повезује са ESP32, како се читају основни подаци и како се они могу приказати у Arduino IDE и Processing окружењу. То представља основу за израду сложенијих пројеката који ће бити обрађени у наредним лекцијама.
У наставку курса правићемо електронски компас, визуелизацију оријентације у 3D простору, детектор нагиба, систем за препознавање покрета и друге практичне STEM пројекте засноване на MPU-9250 сензору.
У овој вежби ученици ће научити како да управљају SG90 серво мотором помоћу ESP32 микроконтролера. Серво мотор ће се непрекидно померати од 0° до 180° и назад, што представља један од најпознатијих примера за упознавање са радом серво мотора.
Вежба представља одличан увод у управљање актуаторима јер повезује:

Повезивање серво мотора са ESP32 плочом.
SG90 је мали серво мотор који омогућава прецизно позиционирање осовине на одређени угао. За разлику од класичних DC мотора који се непрекидно окрећу, серво мотор може бити постављен на тачно одређен положај.
Најчешће се користи у роботици, моделарству, аутоматским вратима, роботским рукама и STEM пројектима.

Серво мотор се позиционира на тачно одређени угао.
За реализацију ове вежбе потребно је:
Уколико користите развојну плочу са модулом ESP32-WROOM-32E, ову вежбу можете изводити без икаквих измена програмског кода. Није потребно бирати други Board у Arduino IDE нити инсталирати додатне библиотеке – поступак је исти као и за ESP32-WROOM-32D.
Обратите пажњу само на ознаке GPIO пинова на вашој развојној плочи. На појединим моделима пинови могу бити означени као P13, IO13 или GPIO13 (или другом ознаком у зависности од пина који се користи у програму), али представљају исти GPIO пин. Пре повезивања серво мотора проверите распоред и ознаке пинова на својој плочи и повежите сигнални проводник на GPIO који је дефинисан у програму.
Серво мотор SG90 поседује три прикључка:
У овој вежби користимо следеће повезивање:

Повезивање ESP32 плоче и SG90 серво мотора.

Увећан приказ пинова који се користе у пројекту.
Серво мотор током рада може повући већу струју од оне коју ESP32 може обезбедити преко својих GPIO пинова.
Због тога се напајање серво мотора доводи са 5V пина, док се сигнални проводник повезује на GPIO18.
Код сложенијих пројеката препоручује се коришћење посебног извора напајања за серво моторе.
#include <ESP32Servo.h>
Servo myServo;
const int servoPin = 18;
void setup() {
myServo.attach(servoPin);
}
void loop() {
for (int pos = 0; pos <= 180; pos += 1) {
myServo.write(pos);
delay(15);
}
for (int pos = 180; pos >= 0; pos -= 1) {
myServo.write(pos);
delay(15);
}
}
За рад са серво мотором користи се библиотека ESP32Servo.
Вредност:
myServo.write(90);
поставља серво мотор на угао од 90 степени.
На исти начин могуће је поставити било који угао између 0° и 180°.
📌 ESP32 генерише PWM сигнал.
📌 PWM сигнал се шаље серво мотору.
📌 Серво електроника анализира сигнал.
📌 Одређује се жељени угао.
📌 Мотор ротира осовину на задати положај.
📌 Петље омогућавају континуално кретање напред и назад.
Детаљније објашњење рада серво мотора, PWM сигнала, избора GPIO пинова и напајања на ESP32 платформи.
Истражи рад PWM сигнала и начин управљања серво моторима.
Повежи серво мотор са ултразвучним сензором и направи аутоматска врата.
1. Колико прикључака има SG90 серво мотор?
2. Која функција поставља угао серво мотора?
3. Који GPIO пин се користи у овој вежби?
4. Шта ради Sweep програм?
До сада смо видели како се SG90 серво мотор може контролисати помоћу ESP32 платформе. Следећи корак је повезивање серво мотора са сензором који ће доносити одлуку када треба покренути механизам.
У наредне две вежбе комбинујемо HC-SR04 ултразвучни сензор и SG90 серво мотор како бисмо направили систем који реагује на присуство објекта.
У овој вежби комбинујемо HC-SR04 ултразвучни сензор и SG90 серво мотор са ESP32 платформом. ESP32 непрекидно мери растојање до препреке, а када је објекат ближи од задатог прага, серво мотор се помера на угао од 90°. Када се препрека удаљи, серво се враћа на почетни положај од 0°.
Ова вежба је корисна за разумевање аутоматског реаговања система на окружење и често се примењује у моделима аутоматских врата, поклопцима, рампама и једноставним роботичким механизмима.

Приказ комплетне вежбе у раду, са препреком испред сензора.

Увећан приказ пинова на ESP32 плочи и ултразвучном сензору.

Део реалне шеме на коме се јасно виде прикључци сензора.
Циљ ове вежбе је да ученик увиди како се мерење растојања може повезати са конкретном механичком акцијом. Када је препрека довољно близу, ESP32 шаље команду серво мотору да се помери на 90°.
У овој вежби користи се следеће повезивање:

Иста шема се користи и у овој и у следећој вежби.

Приказ кода и резултата мерења у Serial Monitor-у.
HC-SR04 сензор се у овој вежби напаја са 3V3 како би ECHO сигнал био безбедан за ESP32.
SG90 серво мотор се напаја са 5V, а сви GND прикључци морају бити заједнички повезани.
#include <ESP32Servo.h>
// HC-SR04
const int TRIG_PIN = 18;
const int ECHO_PIN = 19;
// Servo motor
const int SERVO_PIN = 23;
// Prag aktivacije
const int DISTANCE_THRESHOLD = 15;
Servo servo;
// Promenljive
float duration_us;
float distance_cm;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
servo.attach(SERVO_PIN);
// Početni položaj
servo.write(0);
}
void loop() {
// Reset TRIG
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
// Slanje impulsa
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Merenje vremena povratka
duration_us = pulseIn(ECHO_PIN, HIGH);
// Izračunavanje rastojanja
distance_cm = duration_us * 0.034 / 2;
// Upravljanje servo motorom
if (distance_cm < DISTANCE_THRESHOLD) {
servo.write(90);
} else {
servo.write(0);
}
// Ispis rezultata
Serial.print("Rastojanje: ");
Serial.print(distance_cm);
Serial.println(" cm");
delay(500);
}
distance_cm = duration_us * 0.034 / 2
Број 0.034 представља брзину звука изражену у cm/μs, а дељење са 2 је потребно јер талас путује до препреке и назад.
📌 ESP32 активира TRIG пин.
📌 HC-SR04 емитује ултразвучни талас.
📌 Талас се одбија од препреке.
📌 Одбијени талас стиже на ECHO пин.
📌 ESP32 израчунава растојање.
📌 Серво мотор се помера на 90° када је објекат близу.
📌 Када се препрека удаљи, серво се враћа на 0°.
У овој вежби користимо исту шему повезивања као у претходној, али се серво мотор не зауставља на једном фиксном углу. Када ESP32 детектује да је препрека ближа од задатог прага, серво мотор изводи Sweep покрет од 0° до 180° и назад.
Ова вежба је добра за демонстрацију кретања серво мотора, а може се користити и у пројектима који симулирају скенер, роботску руку или аутоматски механизам са динамичким одговором на присуство објекта.

Комплетна поставка у раду, са препреком која активира систем.

Иста шема важи и за Sweep варијанту вежбе.

Код и приказ вредности у Serial Monitor-у за Sweep варијанту.
Циљ ове вежбе је да се покаже како ултразвучни сензор може да покрене сложенији покрет серво мотора. Уместо једног положаја, серво изводи целокупно кретање, што је корисно за скенирање простора и анимацију механичких система.
Повезивање је потпуно исто као у претходној вежби:
Пошто је шема повезивања иста, ученик може да користи исто коло, а да промени само логику програма. Ово лепо показује разлику између једноставне реакције (90°) и сложенијег кретања (Sweep).
#include <ESP32Servo.h>
const int TRIG_PIN = 18;
const int ECHO_PIN = 19;
const int SERVO_PIN = 23;
const int DISTANCE_THRESHOLD = 15;
Servo servo;
float duration_us;
float distance_cm;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
servo.attach(SERVO_PIN);
servo.write(0);
}
void loop() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration_us = pulseIn(ECHO_PIN, HIGH);
distance_cm = duration_us * 0.034 / 2;
Serial.print("Rastojanje: ");
Serial.print(distance_cm);
Serial.println(" cm");
if (distance_cm < DISTANCE_THRESHOLD) {
// Sweep 0 -> 180
for (int pos = 0; pos <= 180; pos++) {
servo.write(pos);
delay(10);
}
// Sweep 180 -> 0
for (int pos = 180; pos >= 0; pos--) {
servo.write(pos);
delay(10);
}
}
delay(100);
}
Ако се жели да се Sweep изврши само једном по детекцији, може се додати заставица, на пример activated, која спречава понављање покрета док се објекат не удаљи.
📌 ESP32 мери растојање помоћу HC-SR04 сензора.
📌 Када је објекат ближи од прага, систем покреће серво мотор.
📌 Серво изводи Sweep покрет од 0° до 180° и назад.
📌 Покрет може да се понавља док је објекат испред сензора.
📌 Ово је корисно за скенирање и демонстрацију покрета.
У овој вежби ученици ће научити како да користе HC‑SR04 ултразвучни сензор за мерење растојања до објекта помоћу ESP32 микроконтролера. Добијене вредности биће послате на рачунар преко серијске комуникације и приказане у реалном времену у Processing окружењу.
Вежба повезује рад са сензорима, ESP32 програмирање, серијску комуникацију и визуелизацију података.

Мерење растојања до препреке помоћу ултразвучног сензора.

Приказ измереног растојања у реалном времену.
HC-SR04 је ултразвучни сензор који служи за бесконтактно мерење растојања. Сензор емитује кратак ултразвучни импулс и мери време које је потребно да се одбијени сигнал врати до пријемника.
Пошто је брзина звука позната, микроконтролер може израчунати растојање до препреке. Овај тип сензора често се користи у роботици, паметним системима паркирања и STEM пројектима.
Уколико користите развојну плочу са модулом ESP32-WROOM-32E, ова вежба се изводи на исти начин као и са ESP32-WROOM-32D. Није потребно мењати програмски код, бирати други Board у Arduino IDE нити инсталирати додатне библиотеке.
Једино на шта треба обратити пажњу јесте означавање GPIO пинова на самој развојној плочи. Код појединих ESP32-WROOM-32E плоча пинови могу бити означени као P18, IO18 или GPIO18, као и P19, IO19 или GPIO19. Иако су ознаке различите, реч је о истим GPIO пиновима који се користе у програму. Пре повезивања проверите распоред и ознаке пинова на својој плочи.
У овој вежби користи се следеће повезивање:

Приказ прикључака који се користе на ESP32 плочи.

Приказ прикључака на ултразвучном сензору.
ESP32 користи логичке нивое од 3,3 V. Класичан HC-SR04 се најчешће напаја са 5 V, при чему ECHO пин може враћати сигнал близу 5 V.
Да бисмо избегли додатне компоненте за обарање напона, у овој вежби сензор напајамо директно са 3V3 пина ESP32 плоче. Тако ECHO сигнал остаје у безбедном опсегу за ESP32.
// GPIO pin koji pokreće ultrazvučni impuls
int trigPin = 18;
// GPIO pin na kome se prima povratni impuls
int echoPin = 19;
// Promenljiva u kojoj će biti sačuvano
// trajanje povratnog impulsa (u mikrosekundama)
long duration;
// Izračunato rastojanje u centimetrima
float distance;
void setup() {
// Pokretanje serijske komunikacije
// Brzina mora biti ista kao u Processing programu
Serial.begin(115200);
// TRIG pin je izlaz
pinMode(trigPin, OUTPUT);
// ECHO pin je ulaz
pinMode(echoPin, INPUT);
}
void loop() {
// Kratak LOW impuls kako bi se senzor resetovao
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Slanje ultrazvučnog impulsa
digitalWrite(trigPin, HIGH);
delayMicroseconds(15);
// Završetak impulsa
digitalWrite(trigPin, LOW);
// Merenje trajanja povratnog impulsa
duration = pulseIn(echoPin, HIGH);
// Izračunavanje rastojanja.
// 0.034 predstavlja brzinu zvuka u cm/µs,
// a deljenje sa 2 je potrebno zato što
// talas putuje do prepreke i nazad.
distance = duration * 0.034 / 2;
// Slanje izračunatog rastojanja
// preko serijskog porta.
// Šalju se dve decimale.
Serial.println(distance, 2);
// Kratka pauza između dva merenja
delay(200);
}
distance = duration * 0.034 / 2
Број 0.034 представља брзину звука изражену у cm/μs. Дељење са 2 је неопходно јер талас путује до препреке и назад.
Поред приказа у Serial Monitor-у, измерено растојање може се приказати и графички. Processing прима вредности које шаље ESP32 и приказује хоризонтални индикатор чија се дужина мења у зависности од измереног растојања.
import processing.serial.*;
// Objekat za serijsku komunikaciju
Serial myPort;
// Trenutno izmereno rastojanje
float distance = 0;
void setup()
{
// Kreiranje prozora
size(600,250);
// Prikaz svih dostupnih serijskih portova
println(Serial.list());
// Otvaranje prvog pronađenog porta
// Brzina mora biti ista kao u ESP32 programu
myPort = new Serial(this,
Serial.list()[0],
115200);
// Funkcija serialEvent()
// pozivaće se kada stigne jedan red teksta
myPort.bufferUntil('\n');
textSize(20);
}
void draw()
{
// Boja pozadine
background(245);
// Naslov
fill(0);
text("Измерено растојање",40,40);
// Okvir indikatora
noFill();
strokeWeight(2);
rect(40,80,500,40);
// Popunjavanje indikatora.
// Pretpostavlja se da senzor meri
// do približno 200 cm.
fill(100,200,255);
noStroke();
rect(
40,
80,
map(distance,0,200,0,500),
40
);
// Ispis numeričke vrednosti
fill(0);
text("Distance: " + nf(distance,0,2) + " cm",40,170);
}
// Funkcija se automatski poziva
// kada stigne jedan red teksta
void serialEvent(Serial port)
{
// Čitanje jednog reda
String data = port.readStringUntil('\n');
if(data!=null)
{
// Uklanjanje znaka novog reda
data = trim(data);
// Pretvaranje primljenog teksta u broj
distance = float(data);
}
}
📌 ESP32 активира TRIG пин.
📌 HC-SR04 емитује ултразвучни талас.
📌 Талас путује до препреке.
📌 Одбијени талас се враћа ка сензору.
📌 ESP32 мери време повратка.
📌 Израчунава се растојање.
📌 Processing приказује резултат у реалном времену.
Истражи различите типове сензора који се користе са ESP32 платформом.
Покушај да направиш Wi‑Fi систем за праћење растојања преко веб прегледача.
1. Шта мери HC-SR04 сензор?
2. Који пин покреће ултразвучни импулс?
3. Која је брзина серијске комуникације?
4. Зашто се сензор у овој вежби напаја са 3.3V?
ESP32 је савремена микроконтролерска платформа која омогућава повезивање електронике, програмирања и бежичне комуникације. Захваљујући уграђеним WiFi и Bluetooth могућностима, ова плоча се користи у бројним пројектима из области аутоматизације, паметних уређаја и Интернета ствари (IoT).
У оквиру наставе примењене електронике ученици ће се упознати са изгледом ESP32 плоче, њеним основним деловима, начином програмирања и повезивањем различитих сензора и актуатора. Постепено ће се прелазити са једноставних експеримената на пројекте који укључују бежичну комуникацију, прикупљање података и управљање уређајима.

Микроконтролерска платформа са WiFi и Bluetooth комуникацијом.

Повезивање електронике са интернетом и паметним системима.
ESP32 је микроконтролер компаније Espressif који је намењен развоју паметних електронских уређаја. Његов задатак је да чита податке са сензора, обрађује их и на основу њих управља различитим компонентама као што су LED диоде, дисплеји, релеји, мотори или други уређаји.
За разлику од многих класичних микроконтролера, ESP32 већ у себи садржи WiFi и Bluetooth модуле. То значи да поред управљања електронским колима може да комуницира са телефоном, веб сервером или другим уређајима у мрежи.
Обједињује програмирање, електронику и бежичну комуникацију.
Током вежби ученици ће постепено упознавати могућности ESP32 платформе. Циљ није само да се напише програм већ да се разуме како функционише комплетан систем који повезује сензоре, микроконтролер и реалне уређаје.
На тај начин ученици стичу знања која се користе у аутоматизацији, паметним кућама, индустријским системима и савременим IoT решењима.
Ученици који су већ радили са Arduino платформом брзо ће се снаћи и на ESP32 плочи јер су основни принципи рада веома слични. Ипак, ESP32 доноси бројне могућности које Arduino Uno нема.
Уколико се први пут сусрећеш са микроконтролерима, препоручује се да најпре погледаш лекцију: Основе Arduino програмирања .
Пре првог програма важно је да препознамо основне елементе развојне плоче и разумемо чему служе.
Упознавање са пиновима, напајањем и комуникационим модулима.
ESP32 располаже великим бројем улазно-излазних пинова који се користе за комуникацију са различитим електронским компонентама. Иако плоча има много пинова, за почетне вежбе потребно је упознати само неколико најважнијих група.
Приликом рада са ESP32 важно је обратити пажњу на распоред пинова јер не подржавају сви пинови исте функције. Због тога се увек користи шема пинова конкретног модела плоче.
GPIO, ADC, PWM и комуникациони пинови.
ESP32 се најчешће програмира у окружењу Arduino IDE. Иако је првобитно развијено за Arduino платформу, данас подржава и велики број других микроконтролера, укључујући ESP32.
Током вежби ученици ће научити како да:
За напредније пројекте могу се користити и друга окружења као што је PlatformIO, али је Arduino IDE најбољи избор за почетнике јер је једноставан и има велики број примера.

Основно окружење за програмирање ESP32 плоча.

Напредније окружење за веће пројекте.
Једна од највећих предности ESP32 платформе је могућност повезивања великог броја различитих сензора и актуатора. На тај начин ученици могу да мере физичке величине из окружења и да на основу добијених података управљају неким системом.
Комбинацијом ових компоненти могуће је реализовати велики број практичних пројеката који се користе у аутоматизацији, надзору и управљању процесима.

Температура, влажност, осветљеност и растојање.

Релеји, мотори и други уређаји за управљање.

Приказ података у реалном времену.
Након упознавања са основним деловима плоче и радом са појединачним компонентама, ученици ће реализовати низ практичних вежби које постепено повезују програмирање, електронику и комуникацију између уређаја.

Мерење температуре и влажности ваздуха.

Праћење осветљености просторије помоћу LDR сензора.

Мерење растојања и детекција препрека.

Контрола положаја и аутоматизованих механизама.

Слање података са сензора преко локалне мреже.

Комуникација са мобилним телефоном и другим уређајима.

Повезивање уређаја и размена података преко интернета.

Комбинација серво мотора и ултразвучног сензора.

Праћење влажности земљишта и аутоматско заливање.

Приказ вредности са сензора у реалном времену.
Данас велики број уређаја око нас комуницира путем интернета: паметни сатови, системи за надзор, паметне куће, метеоролошке станице и индустријски системи. ESP32 омогућава да се на једноставан начин разумеју принципи рада таквих система и да ученици стекну практична знања која су веома тражена у савременом развоју електронских уређаја.
Управо због тога ESP32 представља одличан корак након основног упознавања са Arduino платформом и омогућава улазак у свет IoT технологија.
Иако је ESP32 веома практична и отпорна платформа, неопходно је водити рачуна о правилном повезивању компоненти и напајању.
Добра пракса је да се најпре направи шема кола, затим тестира једноставан програм, а тек након тога додају нове компоненте и функционалности.
Знања стечена кроз рад са ESP32 користе се у настави примењене електронике, роботике, програмирања и IoT система. Она представљају основу за разумевање савремених паметних уређаја и система аутоматизације.

Реализација пројеката и тимски рад на решавању проблема.

Примена знања у реалним и међународним пројектима.
За детаљније упознавање са ESP32 платформом, њеним варијантама и примерима пројеката, препоручује се следећа лекција:
Уколико још увек нисте радили са микроконтролерима, корисно је најпре проћи и лекцију: