Skocz do zawartości

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

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
Link to post
Share on other sites

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

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

Link to post
Share on other sites
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
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);

 
}

 

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

Link to post
Share on other sites

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

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.

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

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.