Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

Cześć, zaczynam dopiero przygodę z programowaniem:

starałem się używać instrukcji, które do tej pory poznałem podczas kursu:

// definiowanie

  #define red_1 2
  #define yellow_1 3
  #define green 4
  #define yellow_2 5
  #define red_2 6 


// zmienne

  int fotorez_1 = 0; // wartość fotorezystora pierwszego A4
  int fotorez_2 = 0; // wartość fotorezystora drugiego A5
  int fotorez; // wynik dzielenia
  int prog_1 = 2; // próg dla załaczenia pierwszej diody
  int prog_2 = 4; // próg dla załaczenia drugiej diody


void setup() {
  
  // przypisanie zdefiniowanych wyżej pinów jako WYJŚCIA
  
  pinMode(red_1, OUTPUT);
  pinMode(yellow_1, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(yellow_2, OUTPUT);
  pinMode(red_2, OUTPUT);
  
  Serial.begin(9600); // prędkość przesyłania

}

void loop() {
  
  fotorez_1 = analogRead(A5); // przypisz wartość wejścia A4 do zmiennej
  fotorez_2 = analogRead(A4); // przypisz wartość wejścia A5 do zmiennej

  Serial.print(fotorez_1); //wartości wyswietlone na monitorze
  Serial.print("     "); //dla lepszej czytelności
  Serial.print(fotorez_2);
  Serial.print("     ");
  Serial.println(fotorez);
  delay(200); 

// FOTOREZYSTOR 1

if (fotorez_1 > fotorez_2) { // WARUNEK OGÓLNY 1  Jeżeli wartość pierwszego fotorezystora większa.

      fotorez = fotorez_1 / fotorez_2; // Obliczenie wartości zmiennej dla powyższego przypadku
      
      digitalWrite(yellow_2, 0); //jeżeli fotorezystor 1 ma większę wartość diody po prawej muszę zgasnąć
      digitalWrite(red_2, 0); 

     if (fotorez < prog_1) { //ZIELONA

      digitalWrite(green, 1);
      digitalWrite(yellow_1, 0);
      digitalWrite(red_1, 0);
   
     }
     
     if (fotorez < prog_2 & fotorez >= prog_1) { //ZIELONA, ŻÓŁTA

      digitalWrite(green, 1);
      digitalWrite(yellow_1, 1);
      digitalWrite(red_1, 0);
     
     }

     if (fotorez >= prog_2) { //ZIELONA, ŻÓŁTA, CZERWONA

      digitalWrite(green, 1);
      digitalWrite(yellow_1, 1);
      digitalWrite(red_1, 1);
    
     }
}

// FOTOREZYSTOR 2

if (fotorez_2 > fotorez_1) { // WARUNEK OGÓLNY 2  Jeżeli wartość pierwszego fotorezystora większa.

      fotorez = fotorez_2 / fotorez_1; // Obliczenie wartości zmiennej dla powyższego przypadku
  
      digitalWrite(yellow_1, 0);
      digitalWrite(red_1, 0);  

     if (fotorez < prog_1) { //ZIELONA

      digitalWrite(green, 1);
      digitalWrite(yellow_2, 0);
      digitalWrite(red_2, 0);

     }
     
     if (fotorez < prog_2 & fotorez >= prog_1) { //ZIELONA, ŻÓŁTA

      digitalWrite(green, 1);
      digitalWrite(yellow_2, 1);
      digitalWrite(red_2, 0);
    
     }

     if (fotorez >= prog_2) { //ZIELONA, ŻÓŁTA, CZERWONA

      digitalWrite(green, 1);
      digitalWrite(yellow_2, 1);
      digitalWrite(red_2, 1);
    
     }
}

}

 

Udostępnij ten post


Link to post
Share on other sites

@Tangman, witam na forum 😉
Widzę, że to Twoje pierwsze kroki na Forbocie, jeśli chcesz przywitać się z innymi członkami naszej społeczności skorzystaj z tego tematu: Powitania użytkowników

Dnia 13.09.2018 o 21:16, Tangman napisał:

starałem się używać instrukcji, które do tej pory poznałem podczas kursu:

I jakie jest twoje pytanie 😉?

Udostępnij ten post


Link to post
Share on other sites

Mam pytanie odnośnie podstawowych błędów w trakcie programowania.

Czy są praktyki, których powinno się unikać, a nie są tak oczywiste na pierwszy rzut oka? Pytanie przyszło mi na myśl kiedy zastosowałem tą samą instrukcję kilkukrotnie. Wydaje mi się, że są lepsze sposoby (poza switch case), ale mam za małe doświadczenie żeby to stwierdzić jednoznacznie.

Udostępnij ten post


Link to post
Share on other sites

Jestem nowy na forum, bardzo podoba mi się kurs. Nie rozumiem w jaki sposób mierzone jest napiecie, napewno wynika to z jakies kompromitujacej niewiedzy w prawie ohma (ale chyba nie ma głupich pytań). Jeżeli spada opór to czy napiecie nie powinno tez proporcjonalnie spadać?  U= R * I

image.png

 

Udostępnij ten post


Link to post
Share on other sites

Nie. 

I = U/R

Z tego co wiem tak to powinno wyglądać. Prąd tutaj jest wynikowy, a nie napięcie. Tzn. zmieni się tylko prąd w warunkach idealnych. Proszę mnie poprawić jeżeli się mylę...

Udostępnij ten post


Link to post
Share on other sites

@Tangman, jeśli chodzi o Twój program to na ten etap kursu wszystko jest napisane całkiem ładnie i nie masz się czym przejmować. Jedyne co może warto zmienić to dostosować się do "niepisanej" zasady, że nazwy definicji powinno pisać się wielkimi literami, aby łatwo odróżniać je od zmiennych, czyli np.: #define green 4 => #define GREEN 4. Nie jest to jednak żaden błąd - tylko taka popularna metoda zapisu.

@mdybko, witam na forum 😉
Widzę, że to Twoje pierwsze kroki na Forbocie, jeśli chcesz przywitać się z innymi członkami naszej społeczności skorzystaj z tego tematu: Powitania użytkowników. W tym wypadku pomiar napięcia jest możliwy, ponieważ mamy tam układ dzielnika napięcia. Więcej na ten temat znajdziesz tutaj: Kurs elektroniki – prawa Ohma i Kirchhoffa

Udostępnij ten post


Link to post
Share on other sites

Witam, dlaczego w woltomierzu na początku programu "odczytanaWartosc"  przypisana jest wartość 0? Dlaczego akurat 0 i w jakim to jest celu w kontekście pomiaru sygnału napięcia?

int odczytanaWartosc = 0;//Odczytana wartość z ADC
float napiecie = 0;//Wartość przeliczona na napięcie w V
 
void setup() {
  Serial.begin(9600);//Uruchomienie komunikacji przez USART
}
 
void loop() {
  odczytanaWartosc = analogRead(A5);//Odczytujemy wartość napięcia
  napiecie = odczytanaWartosc * (5.0/1024.0); //Przeliczenie wartości na napięcie
  Serial.println(napiecie);//Wysyłamy zmierzone napięcie
  delay(200);//Czekamy, aby wygodniej odczytywać wyniki  
}

 

Udostępnij ten post


Link to post
Share on other sites

@Karliko, to po prostu taki nawyk, aby zawsze przy deklaracji zmiennych ustawiać ich wartość na początku na zero (aby nie miały losowych wartości). Wszystko zależy od typu zmiennych oraz używanego języka (bo czasami zmienne domyślnie są zerowane podczas deklaracji). W każdym razie takie ręczne "zerowanie" na pewno nie zaszkodzi. Akurat w tym programie początkowa wartość zmiennej nie ma żadnego znaczenia, ale w innym przypadku mogłoby to być ważne dlatego z "automatu" bez większego zastanowienia ustawiłem ją na zero.

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

@Adi, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.

Dnia 25.12.2018 o 21:11, Adi napisał:

Jak zmierzyć mniejsze napięcia np: 0.21?

Z czym dokładnie masz problem? Przetwornik ADC w Arduino UNO ma 10 bitów, więc teoretycznie możesz mierzyć napięcie z dokładnością do 4.9 mV. Jeśli zależy Ci na większej precyzji to rozejrzyj się za zewnętrznymi przetwornikami ADC np. na I2C.

Udostępnij ten post


Link to post
Share on other sites

Można przełączyć napięcie referencyjne na wewnętrzne 1.1V - wtedy raster będzie na poziomie miliwolta.

Tutaj masz więcej informacji.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Treker chodzi mi jak na monitorze portu szeregowego odczytać wartość 0,20V 

bo jak podłączam i wgrywam program to piesze mi na monitorze portu szeregowego 0.00 

Udostępnij ten post


Link to post
Share on other sites

Co podłączasz do czego? Co wgrywasz? Skąd bierzesz sygnał 200mV i czy zmierzyłeś multimetrem, że w czasie pracy programu na odpowiednim pinie procesora (tym którego używa Twój kod) jest rzeczywiście takie napięcie względem masy procesora?

Udostępnij ten post


Link to post
Share on other sites
20 godzin temu, Adi napisał:

@Treker chodzi mi jak na monitorze portu szeregowego odczytać wartość 0,20V 

bo jak podłączam i wgrywam program to piesze mi na monitorze portu szeregowego 0.00 

Wklej swój program, bez tego raczej nie uzyskasz żadnej sensownej pomocy 😉

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