Fotootpornik
Fotootpornik (LDR) mijenja otpor sa svjetlom: koliko, djelilo napona za Arduino, izbor otpornika i program koji pali svjetlo u mraku.

Što je fotootpornik?
Fotootpornik je otpornik čiji se otpor mijenja sa svjetlom:
- više svjetla ⇒ manji otpor, pa struja lakše teče;
- manje svjetla ⇒ veći otpor, pa struja teže teče.
Često ga zovemo i LDR, od engleskog light dependent resistor, otpornik ovisan o svjetlu. Nije važno kako ga okreneš, jer nema plusa ni minusa, kao ni običan otpornik.

Na vrhu fotootpornika vidi se vijugava crta. To je tanki sloj tvari koja se zove kadmijev sulfid. U mraku ona slabo vodi struju. Kad na nju padne svjetlo, ono u njoj oslobodi nosioce naboja, pa vodi bolje. Sivi dijelovi s obje strane crte metalni su i spojeni s nožicama. Crta je vijugava da bi bila što dulja i što šira, pa je fotootpornik osjetljiviji na svjetlo.
Na simbolu fotootpornika dvije strelice pokazuju svjetlo koje pada na otpornik.
Koliko mu se mijenja otpor?
Mnogo. Svjetlo se mjeri u luksima (lx). U osvijetljenoj učionici je oko 300 do 500 lx, vani za oblačna dana nekoliko tisuća, a na suncu i više od 50 000 lx. Graf pokazuje otpor fotootpornika GL5528 kakav koristimo:

| Svjetlo | Otpor |
|---|---|
| 1 lx (sumrak) | oko 60 kΩ |
| 10 lx (slabo osvijetljena soba) | oko 15 kΩ |
| 100 lx (soba sa svjetlom) | oko 3,8 kΩ |
| 1000 lx (pokraj prozora po danu) | oko 950 Ω |
Na objema osima svaka oznaka je deset puta veća od prethodne. Tako na jednom grafu stanu i jako i slabo svjetlo. Kad je posve mračno, otpor naraste na više od 1 MΩ.
Brojevi su za jedan model. Dva fotootpornika iste vrste mogu se razlikovati i dvostruko, pa svaki prvo izmjerimo, na primjer multimetrom na mjerenju otpora.
Gdje ga koristimo?
- Ulična rasvjeta se sama upali kad padne mrak, a mnoge noćne lampice u utičnici rade isto.
- Na Arduino radionici fotootpornik upoznajemo u lekciji Arduino - korak po korak: najprije s tranzistorom pali LED-icu u mraku, a zatim svjetlo čita Arduino.
- Micro:bit nema fotootpornik, ali svjetlo mjeri svojim LED-icama. Blok light level daje broj od 0 (mrak) do 255 (jako svjetlo).
Fotootpornik na Arduino radionici
Od ovog mjesta stranica je za Arduino radionicu.
Djelilo napona
Arduino ne mjeri otpor, nego napon. Fotootpornik zato spajamo u djelilo napona, s još jednim otpornikom:

analogRead(A0) daje 614. Kad se smrači, otpor fotootpornika raste i napon raste prema 5 V. Kad je svjetlije, napon pada prema 0 V.Zamijeniš li im mjesta, tako da je otpornik prema GND, a fotootpornik prema 5 V, sve se obrne: tada je napon velik na svjetlu. Oba su spoja dobra, samo program mora znati koji je.
Koji otpornik uz fotootpornik?
Graf pokazuje napon na A0 za otpornik od 1 kΩ, 10 kΩ i 100 kΩ:

- 100 kΩ razlikuje noćne razine svjetla, ispod 1 lx;
- 10 kΩ razlikuje sumrak i slabo osvijetljenu sobu, oko 20 lx;
- 1 kΩ razlikuje dnevno svjetlo, oko 900 lx. U mraku i u sobi s njim je napon gotovo 5 V.
Otpornik zato biramo prema svjetlu koje nas zanima. U lekciji Arduino - korak po korak umjesto stalnog otpornika je potenciometar, pa granicu namještamo okretanjem.
Program: svjetlo koje se pali u mraku
Program čita A0 i pali ugrađenu LED-icu Arduina kad se smrači:
// C++
const int senzor = A0; // djelilo napona: 10 kΩ prema 5V, fotootpornik prema GND
const int PRAG_TAMNO = 650; // iznad ovoga je tamno: upali LED-icu
const int PRAG_SVIJETLO = 550; // ispod ovoga je svijetlo: ugasi LED-icu
bool tamno = false; // je li LED-ica sada upaljena
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
}
void loop() {
int ocitano = analogRead(senzor); // 0 do 1023: što je tamnije, to je broj veći
float napon = ocitano * 5.0 / 1023; // isti broj u voltima
if (!tamno && ocitano > PRAG_TAMNO) {
tamno = true; // smračilo se
} else if (tamno && ocitano < PRAG_SVIJETLO) {
tamno = false; // razdanilo se
}
if (tamno) {
digitalWrite(LED_BUILTIN, HIGH);
} else {
digitalWrite(LED_BUILTIN, LOW);
}
Serial.print(ocitano);
Serial.print(" ");
Serial.print(napon);
Serial.println(" V");
delay(200);
}
Zašto dvije granice? S jednom granicom, recimo 600, LED-ica bi u sumraku treperila. Kad je svjetlo baš oko granice, broj skače malo iznad i malo ispod nje, pa bi se LED-ica stalno palila i gasila. S dvije granice LED-ica se upali kad broj prijeđe 650 (oko 8 lx), a ugasi tek kad padne ispod 550 (oko 15 lx). Između njih ostaje kakva je bila. Isto rade Hallov senzor i ulična rasvjeta, koja se ne pali i gasi svaki put kad oblak prekrije sunce.
Otvori Serial Monitor i prekrij fotootpornik dlanom, pa ga osvijetli svjetiljkom mobitela. Koji broj daje u tvojoj učionici? Granice namjesti prema svojim brojevima.
Fotootpornik je spor
Kad se svjetlo naglo promijeni, fotootporniku treba nekoliko desetaka milisekundi da promijeni otpor. Za sobno svjetlo to nije važno. Kuglica flipera zaklanja zraku svjetla samo desetak milisekundi, pa je fotootpornik ne bi primijetio. Za to su infracrveni senzori, koji reagiraju za manje od milisekunde.
Zašto ih je sve manje?
Kadmij u fotootporniku je otrovan. Pravila Europske unije (RoHS) ograničavaju ga u novim uređajima, pa tvornice umjesto fotootpornika sve češće koriste fototranzistore i fotodiode, koji su i brži. Neki moduli, kao BH1750, svjetlo mjere sami i Arduinu javljaju broj luksa preko I2C-a. Fotootpornik u ruci nije opasan, ali ga nikad ne bacamo u kućni otpad, nego s elektroničkim otpadom.
Što smo naučili?
- Fotootpornik (LDR) ima manji otpor kad je svjetlije, a veći kad je tamnije. Nema plusa ni minusa.
- Otpor se mijenja mnogo: od više od 1 MΩ u mraku do stotinjak Ω na suncu.
- Arduino mjeri napon, pa fotootpornik spajamo u djelilo napona s otpornikom.
- Otpornik uz fotootpornik biramo tako da ima otpor kakav fotootpornik ima pri svjetlu koje nas zanima.
- Dvije granice sprječavaju treperenje oko granice. Fotootpornik je spor, pa za brze promjene koristimo infracrvene senzore.
Mali kviz
1. Što se događa s otporom fotootpornika kad ga prekriješ dlanom?
2. Zašto fotootpornik ne spajamo na Arduino sam, nego s još jednim otpornikom?
3. Fotootpornik je između A0 i GND, a 10 kΩ između 5V i A0. Ima li A0 veći napon u mraku ili na svjetlu?
4. Fotootpornik pri 10 lx ima 15 kΩ. Koliki je napon na A0 s otpornikom od 10 kΩ?
analogRead(A0) daje oko 614.5. Želiš da robot prepozna razliku između sobe i sunčanog dvorišta. Koji otpornik uzimaš: 1 kΩ, 10 kΩ ili 100 kΩ?
6. Zašto program ima dvije granice, 650 i 550, a ne jednu?