Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

@ethanak co dokładnie masz na myśli pod jasłem pisania "w trybie normalnym"? Nie sądzę, aby ktoś pisał cały kod programu w edytorze posta na Forbocie i później korzystał z opcji wstawiania kodu. A jeśli ktoś wklei gotowy kod do posta, a później skorzysta z tej opcji to nie powinno być takiego efektu.

Link do komentarza
Share on other sites

Raczej nie ma żadnej popularnej i sensownej meto. Teoretycznie można próbować z podłączeniem bezpośrednio Arduino > fotorezystor > masa, ale takie wyniki raczej nie będą zbyt użyteczne. Mikrokontrolery są dobre w mierzeniu napięcia i w wielu przypadkach dąży się do tego, aby na wyjściu czujnika było napięcie proporcjonalne do odczytu. Tutaj wystarczy akurat jeden rezystor, a czasami jest to znacznie trudniejsze. Wiele zależy też od tego co konkretnie chciałbyś uzyskać 🙂

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

22 minuty temu, Treker napisał:

Raczej nie ma żadnej popularnej i sensownej meto. Teoretycznie można próbować z podłączeniem bezpośrednio Arduino > fotorezystor > masa, ale takie wyniki raczej nie będą zbyt użyteczne. Mikrokontrolery są dobre w mierzeniu napięcia i w wielu przypadkach dąży się do tego, aby na wyjściu czujnika było napięcie proporcjonalne do odczytu. Tutaj wystarczy akurat jeden rezystor, a czasami jest to znacznie trudniejsze. Wiele zależy też od tego co konkretnie chciałbyś uzyskać 🙂

Spróbowałem na płytce stykowej (oczywiście kabelkami) bezpośrednio podłączyć fotorezystor do Arduino, raz jedną "nóżkę" do GND, raz (tę samą "nóżkę") do 5V, a drugą "nóżkę" do I/O analogowego, ale faktycznie wyniki są nieużyteczne - w pierwszym scenariuszu jedynie 0 było zwracane, w drugim 1023. Chyba, że nie taki sposób miałeś na myśli 😄

Link do komentarza
Share on other sites

#define zielona 8
#define zolta 12
#define czerwona 10
#define przycisk 0

int odczytana_wartosc; //liczba z potencjometru
String podana_liczba; //liczba podana przez uzytkownika
int podana_liczba_int; //zamienienie na int
bool sukces;

void setup() {
  Serial.begin(9600);
  pinMode(zielona, OUTPUT);
  pinMode(zolta, OUTPUT);
  pinMode(czerwona, OUTPUT);
  pinMode(przycisk, INPUT_PULLUP);
}

void loop() {
  Serial.println("Ustaw potencjometr. Gdy bedziesz gotowy, nacisnij przycisk.");
  delay(1000);
  while(digitalRead(przycisk) == HIGH){} //program czeka na wcisniecie przycisku
  sukces = false; //jeszcze nie bylo proby, wiec nie bylo sukcesu
  Serial.println("Zgadnij liczbe od 0 do 1023.");
  odczytana_wartosc = analogRead(A5); //pobieranie liczby od potencjometru
    for(int i = 3; i>0; i--){ //petla, ktora powtarza sie 3 razy, bo sa 3 proby
      if(sukces == false){ //jesli uzytkownik dotychczas nie zgadnal liczby
      Serial.println("Podaj liczbe: ");
      while (Serial.available() == 0){} //program czeka na pobranie danych od uzytkownika
      podana_liczba = Serial.readStringUntil('\n'); //pobranie danych od uzytkownika
      podana_liczba_int = podana_liczba.toInt();
        if(podana_liczba_int >= (odczytana_wartosc - 50) && podana_liczba_int <= (odczytana_wartosc + 50)){ //jesli zgadl
          digitalWrite(zielona, HIGH);
          digitalWrite(zolta, LOW);
          sukces = true;
          Serial.println("Gratulacje! Zgadles liczbe! Jesli chcesz zagrac jeszcze raz, wcisnij ponownie przycisk.");
          while(digitalRead(przycisk)==HIGH){} //program czeka na wcisniecie przycisku
          digitalWrite(zielona, LOW);
        }
        else{ //jesli nie zgadl
          Serial.println("Pudlo!");
          digitalWrite(zolta, HIGH);
          digitalWrite(czerwona, HIGH);
          delay(2000);
          digitalWrite(czerwona, LOW);
        }
      }
    }
    if(sukces == false){ //jesli uzytkownik nie zgadl w 3 probach
      digitalWrite(zolta, HIGH);
      digitalWrite(czerwona, HIGH);
      Serial.println("Nie zgadles liczby... Jesli chcesz sprobowac jeszcze raz, wcisnij ponownie przycisk.");
      while(digitalRead(przycisk)==HIGH){} //program czeka na wcisniecie przycisku
      digitalWrite(zolta, LOW);
      digitalWrite(czerwona, LOW);
      }
  }

Cześć 🙂 Bardzo dziękuję za ten kurs, jest genialny. Dotychczas szło mi bardzo sprawnie i przyjemnie, aż dotarłam do zadania domowego 4.5. Tak wygląda mój kod do tego zadania (wiem, że jest strasznie długi i pewnie wyjątkowo nieoptymalny - już dotarłam do innych rozwiązań z forum i je rozumiem, ale chciałam też zrobić swoim własnym sposobem). W każdym razie, wszystko działa jak należy oprócz jednej rzeczy - mój program w pierwszym powtórzeniu pętli for nie pobiera liczby od użytkownika, zamiast tego przyjmując ją jako 0. Zupełnie nie rozumiem dlaczego 😞 Byłabym bardzo wdzięczna za pomoc.

Link do komentarza
Share on other sites

@MAGrz witam na forum 🙂 Cieszę się, że kurs jest pomocny. Odpowiedziałbym wcześniej, ale musiałem złapać Arduino, aby uruchomić kod i... u mnie działa on poprawnie. Nie ma takiego efektu. W ramach eksperymentu dodaj wyświetlanie wartości podanej przez użytkownika, czyli po:

podana_liczba_int = podana_liczba.toInt();

Dodaj:

Serial.println(podana_liczba_int);

Czy faktycznie za pierwszym razem wyświetla Ci, że użytkownik wpisał 0? U mnie nie ma tego efektu:

temp.png

Może nie zrozumiałem jednak na czym polega problem. Jeśli tak było to opisz proszę jak dokładnie odtworzyć Twój błąd.

  • Lubię! 1
Link do komentarza
Share on other sites

Program przy pierwszym obiegu pętli od razu przyjmuje wartość 0 - niczego tam nie wpisywałam (na zdjęcie wynik tego, co zasugerowałeś). Dziwne... Może to kwestia jakiś ustawień w kompilatorze...? Dzięki za odpowiedź, skoro u ciebie działa, to zakładam że z samym kodem wszystko w porządku 😅

Przechwytywanie.PNG

Link do komentarza
Share on other sites

Cześć stworzylem coś takiego do zad.4.5

 

int wartosc = 0;
int prog = 0;
int zycia = 0;


void setup() {
    pinMode(2, OUTPUT); //zielone
    pinMode(3, OUTPUT); //zolte
    pinMode(4, OUTPUT); //czerwone 
    pinMode(5, INPUT_PULLUP); //przycisk test
    pinMode(6, INPUT_PULLUP); //przycisk reset
    Serial.begin(9600);
    Serial.println("Ustaw potencjometr tak aby wskazał liczbe od 450-550");
    delay(500);
    Serial.println("Masz 3 zycia, Powodzenia");
}

void loop() {
  wartosc = analogRead(A5);
  zycia = 3;
  
  if(prog < zycia){
      while (digitalRead(5) == LOW ) delay(20);
      while (digitalRead(5) == HIGH ) delay(20);
      Serial.println(wartosc);
        if(wartosc > 450 && wartosc < 550){
        digitalWrite(2, HIGH); //zielone on
        delay(500);
        Serial.println("Gratulacje Wygrales");
        delay(500);
        Serial.println("Wcisnij Restart aby zagrać jeszcze raz");
          while (digitalRead(6) == LOW ) delay(20);
          while (digitalRead(6) == HIGH ) delay(20);
          digitalWrite(2, LOW);
          prog = 0;
          Serial.println("Restart");
          delay(2000);
        }
        else if(wartosc < 450 || wartosc > 550){
        digitalWrite(3, HIGH); //zolte on
        delay(500);
        Serial.println("Nie  udalo ci sie");
        delay(500);
        Serial.println("Spróbuj jeszcze raz"); 
        digitalWrite(3, LOW);
        prog++;
        Serial.println("Pozostalo Ci");
        Serial.println(zycia - prog);
        delay(500);
        Serial.println("Życia");
        delay(500);
        }
  }
        
  else {
      
        digitalWrite(4, HIGH); //czerwone on
        Serial.println("Przegraleś, zagraj ponownie wciskając RESTART");
        while (digitalRead(6) == LOW ) delay(20);
        while (digitalRead(6) == HIGH ) delay(20);   
        digitalWrite(4, LOW);
        delay(500);
        Serial.println("Restart");
        prog = 0;
        delay(2000);
  }                      
}

niedawno sie zaczalem uczyc, mozna tu cos zmienic na lepiej ?

  • Lubię! 1
Link do komentarza
Share on other sites

@MatriX98PL witam na forum 🙂 Każdy program da się jakoś ulepszyć, ale nie ma też co popadać w skrajności. Można pokusić się o trochę więcej komentarzy lub używanie #define to określenia pinów, ale to tylko kosmetyka. Powodzenia w dalszych eksperymentach!

  • Lubię! 1
Link do komentarza
Share on other sites

Dlaczego dioda skrajna po prawej stronie świeci mocno, a pozostałe tylko widać kropeczki? Reagują prawidłowo z kodem, ale tylko ta maksymalnie po prawo świeci wyraziście...

// Wykorzystaj dwa fotorezystory w roli osobnych dzielników napięcia. Umieść je po skrajnych stronach płytki stykowej. Najlepiej będzie, gdy odchylisz je nawet minimalnie na zewnątrz. 
// Wyświetl wartości obu czujników w terminalu. Co się dzieje, gdy machasz ręką przed płytką (robiąc cień) lub świecisz w nią latarką?

// Czy analizując różnicę między pomiarami z dwóch czujników jesteś w stanie napisać program, który określi, po której stronie płytki znajduje się silniejsze źródło światła? 
// Spróbuj wskazać kierunek na 5 diodach (bardziej w lewo, środek, bardziej w prawo itd.)!

int wartosc_fotorezystor_lewy = 0;
int wartosc_fotorezystor_prawy = 0;

int dioda_jeden = 4; 
int dioda_dwa = 6;
int dioda_trzy = 8;
int dioda_cztery = 10;
int dioda_piec = 12;


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

  pinMode(dioda_jeden, OUTPUT);
  pinMode(dioda_dwa, OUTPUT);
  pinMode(dioda_trzy, OUTPUT);
  pinMode(dioda_cztery, OUTPUT);
  pinMode(dioda_piec, OUTPUT);
}

void loop() 
{
  wartosc_fotorezystor_lewy = analogRead(A5);
  wartosc_fotorezystor_prawy = analogRead(A4);

  if (abs(wartosc_fotorezystor_lewy - wartosc_fotorezystor_prawy) <= 50)
  {
    digitalWrite(dioda_trzy, HIGH);
  }

  if (abs(wartosc_fotorezystor_lewy - wartosc_fotorezystor_prawy) <= 200 && abs(wartosc_fotorezystor_lewy - wartosc_fotorezystor_prawy) > 50 && wartosc_fotorezystor_lewy < wartosc_fotorezystor_prawy)
  {
    digitalWrite(dioda_dwa, HIGH);
  }

  if (abs(wartosc_fotorezystor_lewy - wartosc_fotorezystor_prawy) <= 700 && abs(wartosc_fotorezystor_lewy - wartosc_fotorezystor_prawy) > 200 && wartosc_fotorezystor_lewy < wartosc_fotorezystor_prawy)
  {
    digitalWrite(dioda_jeden, HIGH);
  }

  if (abs(wartosc_fotorezystor_lewy - wartosc_fotorezystor_prawy) <= 200 && abs(wartosc_fotorezystor_lewy - wartosc_fotorezystor_prawy) > 50 && wartosc_fotorezystor_lewy > wartosc_fotorezystor_prawy)
  {
    digitalWrite(dioda_cztery, HIGH);
  }

  if (abs(wartosc_fotorezystor_lewy - wartosc_fotorezystor_prawy) <= 700 && abs(wartosc_fotorezystor_lewy - wartosc_fotorezystor_prawy) > 200 && wartosc_fotorezystor_lewy > wartosc_fotorezystor_prawy)
  {
    digitalWrite(dioda_piec, HIGH);
  }

  else
  {
    digitalWrite(dioda_jeden, LOW);
    digitalWrite(dioda_dwa, LOW);
    digitalWrite(dioda_trzy, LOW);
    digitalWrite(dioda_cztery, LOW);
    digitalWrite(dioda_piec, LOW);
  }

  Serial.println("Lewy: " + String(wartosc_fotorezystor_lewy));
  Serial.println("Prawy: " + String(wartosc_fotorezystor_prawy));

}

 

20231015_214259.jpg

20231015_214249.jpg

20231015_214253.jpg

Link do komentarza
Share on other sites

@Krigor tak tera patrze, nie chce straszyć ale może masz coś upalone. Niechcący ominąłeś rezystory - włożyłeś je obiema nóżkami w jedną serię dziurek na płytce stykowej. Przełóż je po dolne nóżki i kableki na drugą stronępłytki stykowej i zobacz czy jest poprawa. Możesz też pomierzyć napięcia pomiędyz wyjściami Arduino a masą. Jak na jakimś bedzie znacznie mniejsze zapięcie to zły znak.

Dla testu napisz program gdzie ustawiasz 1 na wszystkich wyjsciach, a później twój kod z zadania.

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.