Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Dlaczego na tym schemacie rezystory są przed diodami, tzn. przed anodą? Na wszystkich wcześniejszych schematach rezystory były za diodami, pomiędzy katodą a uziemieniem. Czy to błąd? Nie znam się, ale z tego co rozumiem, to tutaj jest dobrze, a na wszystkich wcześniejszych było źle. Czy to może nie ma znaczenia po której stronie diody jest rezystor?

image.thumb.png.282a8dc21c4f31dcde595306baa37e3b.png

 

 

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

Pytanie:
Jakie wartość zwróci przetwornik zbudowany na jednobitowym przetworniku A/C?

Odpowiedz:
Stosując opisaną w kursie metodę dzielę napięcie 5V przez 2. Dlaczego przez 2?
10-bitowy przetwornik zwraca 1024 różne liczby a 1 bitowy zwraca dwie. Tam podzielono 5V na 1024 ja analogicznie dzielę na 2.

5V / 2 daje wartość 2,5V

Mamy więc:
0*2,5V = 0 
1*2,5V = 2,5V
I to wszystko innych wartości jak 0 lub 1 taki przetwornik nie zwróci. w Tym skrajnym przypadku uciekło nam 2,5V.
Dla przetwornika 10 bitowego ta różnica na szczęście jest dużo mniejsza i w przykładach z tego kursu pewnie jest bez znaczenia ale z definicji skazuje nas na niemożność pomiaru napięcia równego 5V i wprowadza systematyczny błąd pomiaru.

 

Link do komentarza
Share on other sites

Dnia 19.01.2022 o 11:48, farmaceuta napisał:

Bo nie sprawdzasz pinu analogowego w petli while...gdy zaswiecisz swiatlo to wartosc wzrosnie, ale Ty caly czas znajdujesz sie w while bo sprawdzasz wartosc ktora zostala zapisana przed wejsciem w while...poprostu tworzysz petle nieskonczona...raz wpadniesz i juz nigdy nie wyjdziesz...

if(dane < 200){
  digitalWrite(6, HIGH);
  Serial.println(dane);
  while(analogRead(A5) < 200) {}

Tak to ma byc

Dobra działa. Dzięki. Przyznaję nie kumam wszystkiego. Zależy mi na sprawdzeniu napięcia w momencie zapalenia diody. Gubi mnie ta pętla while. Dlaczego uzależniamy ją od fotorezystora a nie od zapalenia się diody? Rozumiem że można "wypluć" informację i tak i tak (chyba). Czy mógłby ktoś podesłać kod pod diodę a nie fotorezystor? (Mój kod uzależniony jest jeszcze od potencjometru. Mało to zmienia poza definicją prog zamiast konkretnej sztywnej wartości.)

int odczytWartosci = 0;
int prog = 0;
float napiecie = 0;

void setup() {
 Serial.begin(9600); //uruchomienie połączenia USART
 pinMode(8, OUTPUT); //dioda wyjście
}
void loop() {
  odczytWartosci = analogRead(A5); //odczytanie wartosci z fotorezystora
  prog = analogRead(A4); //potencjometr
  napiecie = odczytWartosci * (5.0/1024.0);

  if (odczytWartosci < prog) {
    digitalWrite(8, HIGH); //włączenie diody
    Serial.println(napiecie); //wysłanie napięcia na monit
    delay(1000);
    while(analogRead(A5) < prog){}
  }
  else {
    digitalWrite(8, LOW); //wyłączenie diody
       delay(25);
      
    }  
  
}

 

image.png

Link do komentarza
Share on other sites

@farmaceuta Śliczne dzięki! Fotorezystor wykrywa zmianę -> puszcza info na diodę -> dioda świeci się. Wydaje mi się ale chyba w kodzie powyżej to zmiana na fotorezystorze determinuje odczytanie wartości napięcia a nie zapalenie się diody. Chyba że to że Serial.pintln jest zaraz po digitalWrite(8, HIGH) to właśnie świadczy o tym że to moment zapalenia diody jest momentem odczytania wartości V. A drugi temat (jakby Ci się chciało) dlaczego pętla while jest w segmencie if a nie po wszystkim (na końcu) po else? I dlaczego tam jest (odczyt z A5 < wartość ustalona)? Jakoś to dla mnie nie jest intuicyjne. Nie da się tego jakoś inaczej zatrzymać?:) Czasami do zatrzymania używamy delay a czasami while. Siwy dym:D Przydałby się w tym szkoleniu jeden dodatkowy temat o zatrzymywaniu i o tym gdzie w kodzie ładować konkretne pętle i co w tedy uzyskujemy, jaki jest efekt (na początku, na końcu, środku, przed, po itd..)

Link do komentarza
Share on other sites

19 godzin temu, farmaceuta napisał:

@binsswanger napisz konkretnie co chcesz napisać to coś się napisze 😉

Śliczne dzięki! Fotorezystor wykrywa zmianę -> puszcza info na diodę -> dioda świeci się. Wydaje mi się ale chyba w kodzie powyżej to zmiana na fotorezystorze determinuje odczytanie wartości napięcia a nie zapalenie się diody. Chyba że to że Serial.pintln jest zaraz po digitalWrite(8, HIGH) to właśnie świadczy o tym że to moment zapalenia diody jest momentem odczytania wartości V. A drugi temat (jakby Ci się chciało) dlaczego pętla while jest w segmencie if a nie po wszystkim (na końcu) po else? I dlaczego tam jest (odczyt z A5 < wartość ustalona)? Jakoś to dla mnie nie jest intuicyjne. Nie da się tego jakoś inaczej zatrzymać?:) Czasami do zatrzymania używamy delay a czasami while. Siwy dym:D Przydałby się w tym szkoleniu jeden dodatkowy temat o zatrzymywaniu i o tym gdzie w kodzie ładować konkretne pętle i co w tedy uzyskujemy, jaki jest efekt (na początku, na końcu, środku, przed, po itd..)

Link do komentarza
Share on other sites

1 godzinę temu, binsswanger napisał:

 to właśnie świadczy o tym że to moment zapalenia diody jest momentem odczytania wartości V.

Nie jest tak...napięcie jest obliczenie zanim wejdziesz w if'a ale dzie się to tak szybko że można przyjąć że obliczenie napięcia jest wtedy kiedy i zmiana stanu LED... 

 

1 godzinę temu, binsswanger napisał:

 A drugi temat (jakby Ci się chciało) dlaczego pętla while jest w segmencie if a nie po wszystkim (na końcu) po else?

A to już zależy czego aktualnie potrzebujemy...czasem pętlę są zagnieżdżone (pętla w pętli itp) bo tego wymaga sposób działania kodu, a czasem nie...

 

1 godzinę temu, binsswanger napisał:

Nie da się tego jakoś inaczej zatrzymać?:)

Raczej tak się pisze kod żeby właśnie nie zatrzymywać się w miejscu, a ewentualnie omijać kawałki kodu które aktualnie nie mają się wykonywać...

 

1 godzinę temu, binsswanger napisał:

 Przydałby się w tym szkoleniu jeden dodatkowy temat o zatrzymywaniu i o tym gdzie w kodzie ładować konkretne pętle i co w tedy uzyskujemy, jaki jest efekt (na początku, na końcu, środku, przed, po itd..)

Hehe😉 to by było trudne do uzyskania bo krótko mówiąc jest to sztuka budowania kodu...to programista ma wiedzieć jak, czego i gdzie używać...ktoś może Ci doradzić, pokazać parę trików, ale i tak to Ty musisz się sam nauczyć "czarować" tym wszystkim co dostarcza Ci konkretny język 👍 

Generalnie ta pętla while nie jest tutaj do niczego potrzebna...w kodzie chodzi tylko o odczytanie napięcia i zapalenie diody, więc nic się nie stanie jeśli program będzie chodził w "kółko" gdy wartość fotorezystora < prog... 

if (odczytWartosci < prog) {
    digitalWrite(8, HIGH); //włączenie diody
    Serial.println(napiecie); //wysłanie napięcia na monit
    delay(1000);
    
  }
  else {
    digitalWrite(8, LOW); //wyłączenie diody
       delay(25);
      
    }  

 

1 godzinę temu, binsswanger napisał:

 I dlaczego tam jest (odczyt z A5 < wartość ustalona)? Jakoś to dla mnie nie jest intuicyjne. 

Musi tak być żeby pętla while była skończona...zwróć uwagę że jest tam w warunku funkcja analogRead()..dzięki temu podczas każdego sprawdzania warunku pętli jest pobierana AKTUALNA! wartość z pinu analogowego i jeśli jego wartość osiągnie > prog pętla będzie mogła się zakończyć...gdyby tam była zmienna która nie jest aktualizowana w while, to wtedy while nigdy się nie zakończy, wpadniesz raz i już tam zostaniesz...może trochę zawile tłumaczę..jak coś to pytaj dalej

Link do komentarza
Share on other sites

Moje solucje. Zapewne nie najlepsze 😛

Zadanie 4.5:
 

#define GREEN_LED 8
#define YELLOW_LED 9
#define RED_LED 10
#define BUTTON 13

int readValuePotent = 0;
int userTries = 0;
String userInput = "";
bool isOver = false;
bool isPotent = false;


void setup() {
  pinMode(GREEN_LED, OUTPUT);
  pinMode(YELLOW_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  pinMode(BUTTON, INPUT_PULLUP);
  Serial.begin(9600);

  digitalWrite(GREEN_LED, LOW);
  digitalWrite(YELLOW_LED, LOW);
  digitalWrite(RED_LED, LOW);
}

void loop() {

  if (digitalRead(BUTTON) == LOW){
    digitalWrite(GREEN_LED, LOW);
    digitalWrite(YELLOW_LED, LOW);
    digitalWrite(RED_LED, LOW);
    readValuePotent = analogRead(A4);
    Serial.println(readValuePotent);
    isPotent = true;
    }
  
  if(isPotent){
      Serial.println("Podaj liczbę: ");
      while(Serial.available() == 0){}
      if (Serial.available() > 0){
        userInput = Serial.readStringUntil('/n');
      }

      while(!isOver){
        if (readValuePotent - userInput.toInt() <= 50 && readValuePotent - userInput.toInt() >= -50){
          digitalWrite(GREEN_LED, HIGH);
          digitalWrite(YELLOW_LED, LOW);
          isOver = true;
        }else if ((readValuePotent - userInput.toInt() >= 50 || readValuePotent - userInput.toInt() <= -50) && userTries < 2){
          digitalWrite(YELLOW_LED, HIGH);
          Serial.println("Podaj liczbę: ");
          userTries = userTries + 1;
          while(Serial.available() == 0){};
          userInput = Serial.readStringUntil('/n');
        }else if (userTries == 2){
          digitalWrite(YELLOW_LED, LOW);
          digitalWrite(RED_LED, HIGH);
          isOver = true;
        }

      }
   }

  isPotent = false;
  isOver = false;
  userTries = 0;
  delay(50);

}

Zadanie 4.6:

 

#define LEFT_RED_LED 9
#define LEFT_YELLOW_LED 10
#define CENTER_GREEN_LED 11
#define RIGHT_YELLOW_LED 12
#define RIGHT_RED_LED 8

float readLeftPSensor = 0;
float readRightPSensor = 0;
int mapLeftPSensor = 0;
int mapRightPSensor = 0;

void setup() {
  Serial.begin(9600);
  pinMode(LEFT_RED_LED, OUTPUT);
  pinMode(LEFT_YELLOW_LED, OUTPUT);
  pinMode(CENTER_GREEN_LED, OUTPUT);
  pinMode(RIGHT_YELLOW_LED, OUTPUT);
  pinMode(RIGHT_RED_LED, OUTPUT);

  digitalWrite(LEFT_RED_LED, LOW);
  digitalWrite(LEFT_YELLOW_LED, LOW);
  digitalWrite(CENTER_GREEN_LED, LOW);
  digitalWrite(RIGHT_YELLOW_LED, LOW);
  digitalWrite(RIGHT_RED_LED, LOW);
}

void loop() {
  mapLeftPSensor = map(readLeftPSensor, 0, 910, 1, 100);
  mapRightPSensor = map(readRightPSensor, 0, 910, 1, 100);
  readLeftPSensor = analogRead(A5);
  readRightPSensor = analogRead(A4);

  if(mapLeftPSensor > mapRightPSensor && (mapLeftPSensor >= 0 && mapLeftPSensor < 50)){
    digitalWrite(LEFT_YELLOW_LED, HIGH); // Turn on the main LED for this condition

    // Clear other LEDs
    digitalWrite(LEFT_RED_LED, LOW);
    digitalWrite(CENTER_GREEN_LED, LOW);
    digitalWrite(RIGHT_RED_LED, LOW);
    digitalWrite(RIGHT_YELLOW_LED, LOW);
    
  }else if(mapLeftPSensor > mapRightPSensor && (mapLeftPSensor > 50 && mapLeftPSensor <= 100)){
    digitalWrite(LEFT_RED_LED, HIGH); // Turn on the main LED for this condition

    digitalWrite(LEFT_YELLOW_LED, LOW);
    digitalWrite(CENTER_GREEN_LED, LOW);
    digitalWrite(RIGHT_RED_LED, LOW);
    digitalWrite(RIGHT_YELLOW_LED, LOW);
  }else if(mapRightPSensor > mapLeftPSensor && (mapRightPSensor > 0 && mapRightPSensor <= 50)){
    digitalWrite(RIGHT_YELLOW_LED, HIGH);  // Turn on the main LED for this condition
     
    // Clear other LEDs
    digitalWrite(RIGHT_RED_LED, LOW);
    digitalWrite(CENTER_GREEN_LED, LOW);
    digitalWrite(LEFT_YELLOW_LED, LOW);
    digitalWrite(LEFT_RED_LED, LOW);
  }else if(mapRightPSensor > mapLeftPSensor && (mapRightPSensor > 50 && mapRightPSensor <= 100)){
    digitalWrite(RIGHT_RED_LED, HIGH); // Turn on the main LED for this condition

    // Clear other LEDs
    digitalWrite(RIGHT_YELLOW_LED, LOW);
    digitalWrite(CENTER_GREEN_LED, LOW);
    digitalWrite(RIGHT_YELLOW_LED, LOW);
    digitalWrite(LEFT_RED_LED, LOW);
  }else if(mapRightPSensor == mapLeftPSensor){
    digitalWrite(CENTER_GREEN_LED, HIGH); // Turn on the main LED for this condition

    // Clear other LEDs
    digitalWrite(LEFT_RED_LED, LOW);
    digitalWrite(LEFT_YELLOW_LED, LOW);
    digitalWrite(RIGHT_RED_LED, LOW);
    digitalWrite(RIGHT_YELLOW_LED, LOW);
  }

  Serial.println("Left Sensor: " + String(readLeftPSensor));
  Serial.println("map Left Sensor: " + String(mapLeftPSensor));
  Serial.println("Right Sensor: " + String(readRightPSensor));
  Serial.println("map Right Sensor: " + String(mapRightPSensor));

  delay(1000);

}

 

  • Lubię! 1
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.