Skocz do zawartości

Pomocna odpowiedź

(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

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

(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

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);

 
}

 

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

(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

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

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

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

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...