Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

@tenacious jest dokładnie w tej części kursu. Pisząc tego miałem na myśli ten do które linkuje ten temat na forum.

Schemat masz w akapicie "Regulacja pracy programu dzięki ADC".

Udostępnij ten post


Link to post
Share on other sites
int odczytanawartosc = 0; //liczba zmienna
float napiecie = 0; //wartosc przeliczona na napiecie w woltach

void setup(){ //uruchamiane
Serial.begin(9600); //inicjacja transmisjii
Serial.println("Cyfrowy woltomierz do napięcia 5[V}");
delay(5000); //opoznienie by kazdy mogl przeczytac
}

void loop() //rozpoczecie programu
{
  odczytanawartosc = analogRead(A0); //odczytujemy wartosc napiecia
  napiecie = odczytanawartosc * (5.0/1024.0); //przeliczanie wartosci na wolty 
  Serial.println("Aktualnie napięcie wynosi"); //napis z napieciem
  Serial.println(napiecie + String("[V]"));  //napiecie wraz z jednostka
  delay(200); //opoznienie dla odczytania wynikow
  
}

Bardzo dobrze zrobiony kurs na temat przetworników ADC!

Najbardziej spodobał mi się miernik napięcia który myślę że przyda się mi przez jakiś czas. 

Przesyłam mój projekt i lekko zmodyfikowany kod 🙂20200413_232146.thumb.jpg.c8b5d2800f1e1feb326ef78aadf2bd11.jpg

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

@Lorenzini witam na forum i cieszę się, że forma kursu się podoba! Powodzenia podczas kolejnych eksperymentów 😉

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Gieneq  zrobiłem tak jak mówiłeś. Dodałem licznik który za każdym razem rozpoczęcia kodu zwiększa się o jeden, małe opóźnienie i warunek który wyświetla wartości fotorezystorów po osiągnięciu zadanej wartości. Po wszystkim zeruję licznik. Wszystko działa tak jak chciałem 🙂 

Edytowano przez Wojtas002424
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Od paru dni zacząłem przygodę z Arduino i kursem. Miałbym pytanie o funkcję map(), wcześniej w kursie aby otrzymać liczbę zmiennoprzecinkową trzeba było napięcie zadeklarować jako float i dzielić/mnożyć przez .0. 

napiecie = odczytanawartosc * (5.0/1024.0); //przeliczanie wartosci na wolty

Czy można za pomocą funkcji map() otrzymać liczbę zmiennoprzecinkową ? Próbuje w poniższy sposób ale nie wychodzi. Liczba jest typu float ale nie ma wartości po przecinku (jest 2.0; 3.0 itd)

float napiecie = 0;    napiecie = map(odczytanaWartosc,0,1023,1.0,5.0); //Skalowanie wartosci

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
12 godzin temu, Bono napisał:

Czy można za pomocą funkcji map() otrzymać liczbę zmiennoprzecinkową

Nie - funkcja map działa na long int. Możesz zrobić podobną funkcję dla float/double:

double fmap(double x, double in_min, double in_max, double out_min, double out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

W opisanym przypadku można jednak skorzystać z map() zmieniając np. zakres:

float napiecie = map(odczytanaWartosc, 0, 1023, 0, 500) / 100.0;

lub np. mierzyć napięcie w miliwoltach lub decywoltach:

int napiecie = map(odczytanaWartosc, 0, 1023, 0, 5000);

Polecam ten drugi sposób.

Edytowano przez ethanak
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

U mnie 4.6 wyszło tak: 

float odWarL = 0; //Zmienna do przechwytywania lewego
float odWarP = 0; //Zmienna do przechwytywania prawego 
int suma;
float wynik;


void setup() {
  Serial.begin(9600); //uruchomienie komuniukacji
  pinMode(7, OUTPUT); //lewa
  pinMode(8, OUTPUT); 
  pinMode(9, OUTPUT); 
  pinMode(10, OUTPUT); 
  pinMode(11, OUTPUT); //prawa
  
}

void loop() {
  odWarL = analogRead(A4); // odczytuj wartości fotorezystorow
  odWarP = analogRead(A5);
  suma= odWarL + odWarP;
  wynik = (odWarL/suma);
  Serial.println(odWarL);
  Serial.println(odWarP);
  Serial.println(suma);
  Serial.println(wynik); //sprawdzanie próbkowania
  if (wynik <= 0.20){
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, HIGH);
  }   else if (wynik <= 0.40){
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, HIGH);
      digitalWrite(11, LOW);
  } else if (wynik <= 0.60){
      digitalWrite(7, LOW);
      digitalWrite(8, LOW);
      digitalWrite(9, HIGH);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
  } else if (wynik <= 0.80){
      digitalWrite(7, LOW);
      digitalWrite(8, HIGH);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
  } else {
      digitalWrite(7, HIGH);
      digitalWrite(8, LOW);
      digitalWrite(9, LOW);
      digitalWrite(10, LOW);
      digitalWrite(11, LOW);
  }
 delay(100);

 
}

 

Udostępnij ten post


Link to post
Share on other sites

@LuigiSu witam na forum 🙂 Można i tak, najważniejsze, że działa! Pamiętaj tylko, że podczas programowania tak małych mikrokontrolerów warto unikać operacji na liczbach zmiennoprzecinkowych (np. typu float) i stosować je tylko w ostateczności, bo pochłaniają stosunkowo dużo zasobów. Oczywiście w takim przypadku nie robi to wielkiej różnicy, ale jeśli się da to warto z nich rezygnować 🙂

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Treker Dziękuję za powitanie 🙂 Starałem się zrealizować zadanie bez podglądania kodu innych użytkowników. Naturalnie zwrócę uwagę na inne możliwe rozwiązania i optymalizacje. 

 

Ps. Dzięki za ten kurs! Genialna robota, plus dzięki Tobie rozważam powrót na mechatronike 🙃

Edit:

Przy pisaniu funkcji sprawdzałem też odczyty i wartości jakie są podawane przez fotorezystory i zauważyłem, że czasami wartości są bardzo małe, stąd też chyba taka funkcja nie spełniłaby swojego zadania przy np słabym oświetleniu

int FotorezLewy = 0;
int FotorezPrawy = 0;
float NapiecieLewy = 0;
float NapieciePrawy = 0;

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

 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(12, OUTPUT);

 digitalWrite(8, LOW);
 digitalWrite(9, LOW);
 digitalWrite(10, LOW);
 digitalWrite(11, LOW);
 digitalWrite(12, LOW);


}

void loop() {

 FotorezLewy = analogRead(A4);
 FotorezPrawy = analogRead(A5);

 FotorezLewy = map(FotorezLewy, 0, 1023, 1, 3);
 FotorezPrawy = map(FotorezPrawy, 0, 1023, 1, 3);

 Serial.println(FotorezLewy);
 Serial.println(FotorezPrawy);

 if (NapiecieLewy == 2) {
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, HIGH);
  digitalWrite(12, LOW);
} else if (NapiecieLewy == 3) {
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
   digitalWrite(10, LOW);
   digitalWrite(11, LOW);
   digitalWrite(12, HIGH);
 } else if (NapieciePrawy == 2) {
   digitalWrite(8, LOW);
   digitalWrite(9, HIGH);
   digitalWrite(10, LOW);
   digitalWrite(11, LOW);
   digitalWrite(12, LOW);
 } else if (NapieciePrawy == 3) {
   digitalWrite(8, HIGH);
   digitalWrite(9, LOW);
   digitalWrite(10, LOW);
   digitalWrite(11, LOW);
   digitalWrite(12, LOW);
 } else {
   digitalWrite(8, LOW);
   digitalWrite(9, LOW);
   digitalWrite(10, HIGH);
   digitalWrite(11, LOW);
   digitalWrite(12, LOW);
 }
 delay(500);
}

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu

Udostępnij ten post


Link to post
Share on other sites

@LuigiSu miło słyszeć, że kurs się podoba 🙂

Jeśli wartości są za małe to zawsze można jeszcze pokombinować z rezystorami, które są wpinane do dzielnika napięcia razem z fotorezystorami - zmiana wartości tych rezystorów powinna podbić wartości odczytywane przez Arduino.

Udostępnij ten post


Link to post
Share on other sites

@Treker Jasne, chętnie spróbuje, tylko czy nie będzie to dalej ustawiona wartość "na sztywno"? Mam tu na myśli, że zakładamy cały czas stały poziom naświetlenia.

Stąd też mój pomysł na proporcje pomiędzy odczytami aby układ reagował niezależnie od mocy oświetlenia.

Udostępnij ten post


Link to post
Share on other sites

@LuigiSu ok, teraz rozumiem 🙂 To możesz sobie dorobić np. jakiś system kalibracji takiego urządzenia - na początku badasz aktualny stan oświetlenia i uznajesz go za maksimum.

Udostępnij ten post


Link to post
Share on other sites

@Treker Naturalnie 🙂 Czy tego typu funkcje wykorzystuje się też przy poważniejszych projektach czy są to jedynie zagadnienia wprowadzające do tematu Arduino? 

Mam na myśli wykorzystanie np w takich urządzeniach 

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@LuigiSu to są trochę bardziej rozbudowane układy, ale ogólna zasada działania jest podobna. Tutaj masz np. pośredni projekt: Arduino pomaga zwiększyć efektywność instalacji słonecznej, czyli coś bardziej rozbudowanego od tego z kursu, ale jednocześnie prostsze od projektu z Twojego filmiku.

  • Lubię! 1

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