Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

Witam, na podstawie poprzednich kursów złożyłem cos takiego i o ile w poprzednim kursie to działało przy użyciu pętli while to tu nie do końca. Napięcie jest wysyłane 1 raz po zaświeceniu się diody ale dioda nie chce zgasnąć tak jakby program nie mógł wyjść z tej ostatniej części mimo iż czujnik jest naświetlany. Co jest tego powodem ?

int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC
int prog = 0; //Próg włączenia światła - ustawiany potencjometrem
float napiecie = 0; 


void setup() {
Serial.begin(9600); //rozpoczęcie komunikacji przez USART
pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED

}

void loop() {
 odczytanaWartosc = analogRead(A5);
 prog = analogRead(A4);
 napiecie = odczytanaWartosc *(5.0/1023.0);


 if(odczytanaWartosc > prog){
   digitalWrite(8, LOW);
 }
 else{
   digitalWrite(8, HIGH);
   Serial.println(napiecie);
   delay(50);
   while(odczytanaWartosc < prog){
  }
 }
} 

Udostępnij ten post


Link to post
Share on other sites
while(odczytanaWartosc < prog){}

A tak konkretnie to jak ma się zmienić wartość zmiennej odczytanaWartosc? Magicznie?

Wewnątrz pętli powinieneś jeszcze odczytywać ADC mam wrażenie.

Udostępnij ten post


Link to post
Share on other sites

ale po naświetleniu czujnika światła odczytanaWartość już nie jest < niż prog

dopisałem "odczytanaWartosc = analogRead(A5);" do tej pętli i jakoś magicznie działa 😋

pytanie tylko po co 2 raz to trzeba pisać

Udostępnij ten post


Link to post
Share on other sites

tarkki, Jak jest inna? Gdzie się ona zmienia?

odczytanaWartosc jest zmienia w kodzie z pierwszego postu tylko raz, tutaj:

odczytanaWartosc = analogRead(A5);

w pierwszej linijce pętli głównej.

W tym while o którym mówimy nie jest wykonywany żaden kod, nie ma więc co zmieniać wartości zmiennej.

Może powinieneś powtórzyć sobie podstawy C a później brać się za Arduino?

I proszę, pisz poprawnie po polsku. Wielkie litery oraz interpunkcja są ważne dla przejrzystości przekazu.

[ Dodano: 30-12-2015, 01:10 ]

Zauważ drobną różnicę pomiędzy:

while (digitalRead (10 ) == HIGH) {

a

while(odczytanaWartosc < prog) {

W pierwszym przykładzie wywołujesz funkcję która dokonuje odczytu, w drugim sprawdzasz jedynie wartość zmiennej.

Udostępnij ten post


Link to post
Share on other sites

tarkki, w poniższym przypadku:

while(odczytanaWartosc < prog){ 
/*************/
} 

Jeśli przed wejściem do pętli odczytanaWartosc jest mniejsza od progu, to program utyka w miejscu gdzie wstawiłem gwiazdki. Cała reszta programu nie jest wykonywana. Aby działało to cały czas, w najprostszej wersji, musisz po prostu w pętli aktualizować zawartość zmiennej odczytanaWartosc.

Udostępnij ten post


Link to post
Share on other sites

Treker, Albo jeszcze prościej użyć odczytywania w warunku pętli:

while(analogRead(A5) < prog) { 
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Witam zatrzymałem się w martwym punkcie mianowicie mój program z zad 4.4 on stop przesyła wynik do terminalu bez względu na to czy dioda się świeci czy nie


int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC
int prog = 0; //Próg włączenia światła - ustawiany potencjometrem
float napiecie = 0;
void setup() {
 pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED
 Serial.begin(9600);
}

void loop() {
 odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC
 prog = analogRead(A4);//Odczytanie wartości z ADC  
 napiecie = odczytanaWartosc * (5.0/1023.0); //Przeliczenie wartości na napięcie
 if (odczytanaWartosc < prog) { //Czy jest ciemniej od ustawionego progu?
    digitalWrite(8, HIGH);//Włączenie diody    
 } else {
    digitalWrite(8, LOW);//Wyłączenie diody      
 }
 if (digitalRead (8),HIGH);{
 Serial.println(napiecie);}
 delay(50);
}

Ktoś pomoże ? 🙂

Udostępnij ten post


Link to post
Share on other sites
  if (digitalRead (8),HIGH);{
 Serial.println(napiecie);}

Nie powinieneś umieszczać średnika po nawiasie warunku.

Średnik oznacza zakończenie instrukcji. Taki "if" nie posiada ciała, które się wykona w razie prawdziwości warunku, a punkt wykonania programu bezwarunkowo przejdzie do kolejnej instrukcji.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

PatrykOSK, tak jak wspomniał draghan, masz problem z jednym if'em. Zarówno, jeśli chodzi o formatowanie wcięć jak i zbędny średnik. Sprawdź bez niego 🙂

Udostępnij ten post


Link to post
Share on other sites

Niestety nawet i bez średnika jest i to samo :/ Dodam że robiąc to na początku udało mi się chociaż spowodować to że wartość napięcia była przesyłana do terminalu,co prawda nie raz ale to zawsze krok dalej.

Udało mi się wrócić do lepszego ustawienia

 if (digitalRead(8) == HIGH){
 Serial.println(napiecie);}

Zmieniłem z (digitalRead(8),HIGH)

Udostępnij ten post


Link to post
Share on other sites

PatrykOSK, ok to zacznijmy od początku. Pokaż cały aktualny kod i powiedz, co się dzieje 🙂

Udostępnij ten post


Link to post
Share on other sites
int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC 
int prog = 0; //Próg włączenia światła - ustawiany potencjometrem 
float napiecie = 0; 
void setup() { 
 pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED 
 Serial.begin(9600); 
} 

void loop() { 
 odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC 
 prog = analogRead(A4);//Odczytanie wartości z ADC  
 napiecie = odczytanaWartosc * (5.0/1023.0); //Przeliczenie wartości na napięcie 
 if (odczytanaWartosc < prog) { //Czy jest ciemniej od ustawionego progu? 
    digitalWrite(8, HIGH);//Włączenie diody    
 } else { 
    digitalWrite(8, LOW);//Wyłączenie diody      
 } 
 if (digitalRead (8)== HIGH){ 
 Serial.println(napiecie);} 
 delay(50); 
} 

Oto cały poprawiony kod i działa w ten sposób że gdy zasłonie fotorezystor info o napięciu jest przesyłne lecz nie raz a kilka/kilkanaście.Nie mogę wymyślić niczego żeby info. była wysłana tylko raz. 🙂

Udostępnij ten post


Link to post
Share on other sites

PatrykOSK, ok teraz wszystko jasne. Program działa poprawnie. Nie napisałeś nic, co miałoby sprawić, że wysłanie komunikatu nastąpi raz. Wysyłasz go, gdy tylko dioda świeci. Musisz dorobić mechanizm pamiętający, czy wysłano już komunikat.

Sprawdź jak zrobiłem to w tej części kursu Arduino:

Kurs Arduino – #3 – UART (komunikacja z PC), zmienne

Masz tam rozwiązany prawie identyczny przykład wraz z opisem 🙂

Dodatkowo traktowanie pinu z diodą jako wejście (bo sprawdzasz jego stan) nie jest zbyt eleganckim rozwiązaniem. Warto byłoby to zmienić.

Udostępnij ten post


Link to post
Share on other sites

Kombinowałem kombinowałem i nic nie wychodzi. Dodałem pętle While ale program zawsze mi w tej pętli zostaje diod nie gaśnie a napiecie na terminalu się zatrzymuje.

int odczytanaWartosc = 0; //Zmienna do przechowywania odczytu ADC 
int prog = 0; //Próg włączenia światła - ustawiany potencjometrem 
float napiecie = 0; 
void setup() { 
 pinMode(8, OUTPUT); //Konfiguracja wyjść pod diodę LED 
 Serial.begin(9600); 
} 

void loop() { 
 odczytanaWartosc = analogRead(A5);//Odczytanie wartości z ADC 
 prog = analogRead(A4);//Odczytanie wartości z ADC  
 napiecie = odczytanaWartosc * (5.0/1023.0); //Przeliczenie wartości na napięcie  
 if (odczytanaWartosc < prog) { //Czy jest ciemniej od ustawionego progu? 
    digitalWrite(8, HIGH);//Włączenie diody    
 } else { 
    digitalWrite(8, LOW);//Wyłączenie diody 
    Serial.println(napiecie);     
 } 
 while (digitalRead (8)== HIGH){
 delay(50); 
 }} 

Rozumiem idee tego że wysłanie wartości do terminala ma być przed pętlą while i że jak wejdzie do niej ma tam zostać dopóki nie zostanie spełiony odpowiedni warunek ale nie potrafie tego zrealizować i zaczeło mnie to wkurzć :/

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...