Skocz do zawartości

Pomocna odpowiedź

  • 2 tygodnie później...

Jako laika w temacie nurtuje mnie jedno pytanie. Dlaczego fotorezystor podłączony jest do arduino jako dzielnik napięcia? W moim naiwnym rozumowaniu wygląda to tak. Arduino pracuje z napięciem 5V (pomijamy jakieś małe wachania). Podpinam fotorezystor bezpośrednio do +5V i pinu analogowego. Fotorezystor w swych skrajnych zakresach podaje na pin analogowy albo 0V albo 5V. Po co więc jest dzielnik napięcia?

@Ilona witam na forum 🙂

1 godzinę temu, Ilona napisał:

Fotorezystor w swych skrajnych zakresach podaje na pin analogowy albo 0V albo 5V.

I tu Cię zaskoczę, fotorezystor w Twojej konfiguracji zawsze podaje 5V, ponieważ niewielkie zmian rezystancji nic tu nie zmieniają. Arduino rejestruje zmiany napięcia czyli potrzebny jest dzielnik napięcia 🙂 

  • Lubię! 1

@Ilona pamiętaj, że fotorezystor działa podobnie jak rezystor - a rezystor ogranicza prąd, a nie napięcie. Dopiero korzystając z prawa Kirchhoffa, po zbudowanie dzielnika napięcia możemy właśnie wykorzystać rezystory do zmiany napięcia. Zerknij na poniższe dwa filmy:

 

 

  • Lubię! 1
  • 3 tygodnie później...
(edytowany)

@Treker Przespałam się z tym problemem i ogarnęłam sprawę. Teraz potrafiłabym to wyjaśnić takiemu laikowi jak ja, nawet lepiej niż robią to znawcy tematu 🙂

Edytowano przez Ilona

Cześć wszystkim. Namęczyłem się z zadaniem 4.6. Działa, ale znając życie, błędy czy niedopatrzenia są więc proszę o sugestie.

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  Serial.begin(9600);
}

// zmienne do odczytu wartosci z fotorezystorow
int fotoLewy;
int fotoPrawy;

void loop() {

  for (int i = 2; i <= 6; i++){
    digitalWrite(i, LOW); // gaszenie diod
  }
  
  fotoLewy = analogRead(A4);
  fotoPrawy = analogRead(A5); 

  // usredniona wartosc odczytow z fotorezystorow, bo u mnie byly spore roznice
  int sredniaFoto = (fotoLewy + fotoPrawy) / 2;

  int jednaDioda; // przechowa wartosc potrzebna do zaswiecenia jednej diody
  jednaDioda = sredniaFoto/3; 
  // kazdy fotorezystor ma "swoje" 2 diody plus jedna "wspolna"
  // wiec beda trzy przedzialy i w zaleznosci... 

  int roznicaOdczytow = fotoLewy - fotoPrawy; // ...od roznicy odczytow z fotorezystorow...

  // ...obliczymy numer diody do zapalenia
  int ktoraDioda = roznicaOdczytow / jednaDioda;

  if (ktoraDioda == 0) 
    digitalWrite(4, HIGH); // srodkowa dioda
    
  if (ktoraDioda == 1)
    digitalWrite(5, HIGH); // pierwsza w lewo od srodkowej
    
  if (ktoraDioda > 1)
    digitalWrite(6, HIGH); // skrajna lewa
    
  if (ktoraDioda == -1)
    digitalWrite(3, HIGH); // pierwsza w prawo od srodkowej
    
  if (ktoraDioda < -1)
    digitalWrite(2, HIGH); // skrajna prawa
}

foto.thumb.JPG.554b031ed2b2824f190a6d112866eb6d.JPG

Czy w ogóle mój tok myślenia jest opdowiedni?

  • Lubię! 1
(edytowany)

@badbit fajnie że kombinujesz z różnicą sygnałów, idziesz w dobrą stronę. Choć nie do końca rozumiem po co ta średnia, chyba lepiej działać na staych wartościach (progach), bo nie jestem pewny czy możesz teraz ustalić przybliżoną odległość (czy jest coś blisko/daleko).

Możesz spróbować obliczyć dla każdej diody odległość (cos jak odległość 2 punktów na płaszczyźnie i na tej podstawie dla każdej diody wyznaczyć świecenie (a nawet jasność jak dasz PWM). Możesz też pozbyć się warunków jak zapakujesz dane w tablice - o tym możesz poczytać w sieci, albo przeszukać komentarze pod tym wątkiem 😉 

Edytowano przez Gieneq
  • Lubię! 1
  • 2 tygodnie później...

Cześć,

Mam stałe skoki napięcia na Fotorezystorze czy to jest normalne? 

Wartości skaczą mi w zakresie 150-400 przechodząc powoli od 150 do 400 i odwrotnie przy normalnym świetle. Po zasłonięciu fotorezystora niewiele się zmienia, wartości skaczą wtedy 100-350.

Co może być powodem?

#define zielonaD 7

int wartoscFoto = 0;


void setup() {
  pinMode(zielonaD, OUTPUT);

  digitalWrite(zielonaD, LOW);
  Serial.begin(9600);
}

void loop() {
  wartoscFoto = analogRead(A5);

  if (wartoscFoto < 200) {
    digitalWrite(zielonaD, HIGH);
  } else {
    digitalWrite(zielonaD, LOW);
  }
  Serial.println(wartoscFoto);
  delay(50);
}

 

Pozdrawiam

IMG-5844.JPG

@Achtenbob nie powinieneś mieć aż takich skoków. Sprawdź dla pewności czy problemem nie jest płytka stykowa (może gdzieś jest słabe połączenie). Oprócz tego, jeśli masz miernik to sprawdź proszę czy rezystor działa poprawnie tj. czy zmienia się jego opór względem oświetlenia.

  • Pomogłeś! 1
  • 2 tygodnie później...

Witajcie,

do dzisiaj nie znalazłem odpowiedzi na zadane przeze mnie tutaj pytanie 21 sierpnia. Ponawiam więc pytanie - dlaczego pętla wykonuje się dwa razy?

Odnośnik do postu: 

 

@Stark wybacz brak odpowiedzi - musiało nam umknąć 🙂 Problem wynika prawdopodobnie  z ustawień Twojego terminala - miałeś tam wybraną opcję, że na końcu danych wysyłany jest znak nowej linii. Jeśli ustawisz tam, aby terminal nie dodawał żadnych znaków na końcu linii to problem zniknie.

  • Lubię! 1

@Treker super, dziękuję!

Oczywiście nic się nie stało - otrzymałem wtedy odpowiedzi na mój post, jednak nie otrzymałem odpowiedzi na to konkretne pytanie.

Czy mógłbyś przybliżyć w jaki sposób to działa? Rozumiem to tak, że pobierana zostaje wartość, którą wpisałem tj. dana liczba po czym wykonuje się pętla i zostaje pobrana kolejna wartość tj. nic przez to, że nastąpiło przejście do kolejnej linii?

@Stark tak, mniej więcej tak to działa, bo w tym przypadku to przejście do nowej linii jest traktowane jako coś odebranego przez UART 🙂 

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...