• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Problem z kodem sterowania oświetleniem z czujnikiem odległości
#1
Dzień dobry,

zbudowałem sobie prosty układ sterujący pracą pasków ledowych, mamy jako mikrokontroler ATTiny na digisparku, jeden MOSFET i czujnik ultradźwiękowy. Najpierw użyłem kodu który po prostu włącza ledy jeśli ktoś znajduje się w odległości mniejszej niż... jednak chciałem rozbudować działanie układu o stopniowe rozjaśnianie/ściemnianie w taki sposób, że gdy stoimy bliżej to szybciej się rozjaśnia i na odwrót, jak odejdziemy to po chwili zgaśnie. Jednak kod który napisałem działa tak, że np. rozjaśnia się stopniowo i gdy dojdzie do maksymalnego wypełnienia to wraca do jakichś 20% wypełnienia i znowu narasta. Co zrobiłem nie tak?

Kod:
#define trig 0
#define echo 2
#define led1 1
byte PWM = 0;

void setup() {
pinMode (trig, OUTPUT);
pinMode (echo, INPUT);
pinMode (led1, OUTPUT);
}

void loop() {
int czas, dist, dist1;
dist = constrain(dist, 0, 200);

digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite (trig, LOW);
czas=pulseIn(echo, HIGH);

dist=(czas/2)/29.1;
dist1 = map(dist, 0, 200, 200, 0); //odwrócenie wartości dystansu

if (dist < 150) {
PWM = PWM+((dist1)/10); //zwiększanie wartości zmiennej PWM - im mniejszy dystant tym szybciej rozjaśnia ledy;
delay(100);
}
else{
PWM = PWM-((dist)/10);
delay(50);
}
analogWrite(led1,PWM); //ustalenie jasności ledów
delay(10);
}
 
Odpowiedź
#2
Zmienna typu BYTE przechowuje liczby od 0 do 255. Po przekroczeniu maksymalnej wartości zeruje się i liczy od początku. W Twoim programie nie przewidziałeś sytuacji, kiedy przekraczasz maksymalną wartość BYTE. Wykonaj, dla przykładu, poniższy program, otwórz serial monitor i zobacz efekt.
Kod:
byte PWM = 0;

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.println(PWM);
delay(20);
PWM++;
}
Właśnie dlatego program wyświetla 'mruga' Ci diodą od zera po przekroczeniu wartości maksymalnej.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości