Skocz do zawartości

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){
  }
 }
} 
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.

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ć

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.

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.

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 ? 🙂

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
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 🙂

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)

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. 🙂

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ć.

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ć :/

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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!

Anonim
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.