Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

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

Link do komentarza
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 do komentarza
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

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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
Share on other sites

32 minuty temu, LuigiSu napisał:

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

Jeśli chcesz dorobić sobie "system kalibracji" - ustawiania minimalnego i natężenia światła, na które reaguje układ to ja coś na podobę robiłem tu:

Może się przyda 🙂

  • Lubię! 2
Link do komentarza
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.