zad.4.6
Największym problemem jest dobranie fotorezystorów i ich dzielników tak, aby wskazania były przynajmniej podobne dla podobnego oświetlenia. Niestety, fotorezystory z zestawu mają bardzo duży rozrzut parametrów. Ale dość narzekania:
#define zielona 2 // przypisanie kolorów diod do pinów,
#define Lzolta 4 // wybór pinów został uależniony
#define Lczerwona 7 // od metody obliczeń,
#define Pzolta 6 // prosta formuła wybiera nam
#define Pczerwona 5 // odpowiednią diodę
#define niebieska 3 // sygnalizacja braku oświetlenia
int leweOko = 0; // Zmienna do przechowywania odczytu ADC
int praweOko = 0; // Zmienna do przechowywania odczytu ADC
int czulosc = 100; // współczynnik przeskalowania wartości z ADC
float prog = 10.0; // dolny próg oświetlenia jako procent maksymalnej jasności
int kierunek = 0; // ustalenie kierunku 0 - na wprost, 1 - lewo, 3 - prawo (3 dla uproszczenia obliczeń)
int wielkosc = 0; // wielkość kąta odchylenia od osi 0 - brak, 1 - małe (do np.20 stopni), 2 - duże (np. 45 stopni)
void setup()
{
for( int i = 1; i < 7; i++) // po kolei
{
pinMode(i, OUTPUT); // ustawiamy piny jako wyjścia
digitalWrite(i, LOW); // wygaszamy podpięte do nich diody
}
Serial.begin(9600); // ustawienie prędkości transmisji
prog = (prog * czulosc) / 100.0; // próg czułości układu fotorezystorów
}
void loop()
{
leweOko = analogRead(A1); // odczyt z lewego oka
leweOko = map(leweOko, 0, 1023, 0, czulosc);
praweOko = analogRead(A2); // odczyt z prawego oka
praweOko = map(praweOko, 0, 1023, 0, czulosc);
if ((leweOko + praweOko) <= prog) // jeżeli jest bardzo ciemno
{
digitalWrite(niebieska, HIGH); // sygnalizujemy to i program czeka aż będzie jaśniej
}
else // mamy dość światła do działania
{
Serial.print("lewe = ");
Serial.println(leweOko);
Serial.print("prawe = ");
Serial.println(praweOko);
int roznica = leweOko - praweOko; // ustalenie kierunku
if (roznica == 0) // sygnały są równe
{
kierunek = 0; // kierunek na wprost
wielkosc = 0; // odchylenie zero
}
else if (roznica < 0 && roznica < (czulosc/3)) // różnica ujemna ale mniejsza niż 30%
{
kierunek = 3; // kierunek prawo
wielkosc = 1; // odchylenie małe
}
else if (roznica < 0 && roznica > -(czulosc/3)) // różnica ujemna ale większa niż 30%
{
kierunek = 3; // kierunek prawo
wielkosc = 2; // odchylenie duże
}
else if (roznica > 0 && roznica < (czulosc/3)) // różnica dodatnia ale mniejsza niż 30%
{
kierunek = 1; // kierunek lewo
wielkosc = 1; // odchylenie małe
}
else if (roznica > 0 && roznica > -(czulosc/3)) // różnica dodatnia ale większa niż 30%
{
kierunek = 1; // kierunek lewo
wielkosc = 2; // odchylenie duże
}
digitalWrite((2 + kierunek + wielkosc), HIGH); // zapalenie odpowiedniej diody z zależności od kierunku i odchylenia
delay(500);
for( int i = 1; i < 7; i++) // po kolei
{
digitalWrite(i, LOW); // wygaszamy diody
}
}
}
I jak to wygląda?