Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Witam serdecznie..., takie coś mi wyszło z zadania 4.4, być może było, ale działa..., postaram się powalczyć z 4.5

#define dioda 8 //definiowanie pinu 8
int swiatlo = 0; //zmienna czujnika swiatla
float prog = 0; //zmienna potencjometru
String v = ""; //zmienna napięcia
boolean swieci = false; //sprawdzamy czy swieci
void setup() {
 pinMode(dioda, OUTPUT); //inicjujemy diode
 Serial.begin(9600); //inicjujemy UART
}
void loop() {
 swiatlo = analogRead(A5); //odczyt swiatla
 prog = analogRead(A4); //odczyt napięcia
 v = (prog * (5.0 / 1023.0)); // przeliczenie voltów
 if (swieci == false) { //sprawdzmy czy swieci
   if (swiatlo < prog) { //jesli wartosc napiecia na dzielniku jest mniejsza od wartosci potencjometru
     digitalWrite(dioda, HIGH); //dioda wlaczona
     Serial.println(v); // wyswietl na monitorze napiecie
     swieci = true; //wlaczona czyli prawda
     delay(250); // opoznienie 250
   }
 }
 else if (swiatlo > prog)  { //jeszcze jesli wartosc napiecia na dzielniku jest wieksza od potencjometru
   digitalWrite(dioda, LOW); //dioda wylaczona
   swieci = false; //wylaczona czyli falsz
 }
}

Pozdrawiam

PS Swietny kurs 🙂.

Link do komentarza
Share on other sites

int foto1 = 0; //zmienna do przechowywania adc fotorezystora1
int foto2 = 0; //zmienna do przechowywania adc fotorezystora2

byte foto1map = 0;
byte foto2map = 0;

void setup() {
 for(int x=2; x<=6; x++) { pinMode(x, OUTPUT); } //ustawienie portów od 2 do 6 jako wyjscia

   for(int x=2; x<=6; x++) { digitalWrite(x, HIGH); } //ustawienie wyjsc na stan wysoki

      Serial.begin(9200);
}
void loop() {

 foto1 = analogRead(A5);// wartosc czujnika swiatla
  foto2 = analogRead(A4); // wartosc potencjometru

     Serial.print("Napiecie czujnika1 :  ");
       Serial.println(foto1*(5.0/1023.0));
         Serial.print("Napiecie czujnika2 :  ");
           Serial.println(foto2*(5.0/1023.0)); //wyswietlenie wartosc napiecia czujnikow
      delay(200);

           foto1map = map(foto1, 100, 700, 4, 2);
           foto2map = map(foto2, 100, 700, 4, 6); //mapowanie czujnikow

            Serial.print("mapowanie czujnika1 :  ");   
               Serial.println(foto1map);
                 Serial.print("mapowanie czujnika2 :  ");
                   Serial.println(foto2map);  //wyswietlenie wartosc mapowania czujnikow
               delay(200);

         if(foto1map == foto2map) { 
             digitalWrite(4, LOW); 
                 for(int x=2; x<=6; x++) { digitalWrite(x, HIGH); }} 

 if((foto1map <= 4) && (foto1map <= foto2map)) { //ustawienie linijki w prawo
             for(int a=4; a>=2; a--) { digitalWrite(a, HIGH); }
                     digitalWrite(foto1map, LOW); }


 if((foto2map >= 4) && (foto2map >= foto1map)) {  //ustawienie linijki w lewo
             for(int b=4; b<=6; b++) { digitalWrite(b, HIGH); }
                     digitalWrite(foto2map, LOW); }    

}

Witam, nie rozumiem dlaczego w (ustawienie linijki w prawo) dioda led 4 nie jest w stanie wysokim, a w (ustawienie linijki w lewo) jest w ok.

Link do komentarza
Share on other sites

peter-wawa1, trochę ciężko analizować Twój program przy takim formatowaniu i braku komentarzy. Możesz dokładniej opisać jakiego efektu się spodziewałeś, a co dokładnie się dzieje inaczej?

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

Może ktoś powiedzieć mi jaka jest odpowiedź do zadania 4.1 bo nie znalazłem w komentarzach. Zauważyłem, że jak potencjometr je na "maxa" obrócony i delay wynosi 0 to dioda świeci słabiej tylko nie wiem dlaczego tak się dzieje.

Link do komentarza
Share on other sites

Przy okazji możecie sprawdzić moje pozostałe zadania. Chyba jedyny problem jaki z nimi mam to z 4.6 gdyż dioda najbardziej po lewej czyli na pinie 12 nie chce mi się zaświecić. Nie wiem czy to problem z programem czy po prostu nie osiągnąłem takiej różnicy na dzielnikach, żeby się zaświeciła. Z góry bardzo dziękuję

4.4

int odczytanaWartosc = 0;
int naszLimit = 0;
float napiecie = 0;

void setup() {
 pinMode(8, OUTPUT);
 Serial.begin(9600); 
}

void loop() {
 odczytanaWartosc = analogRead(A5);
 naszLimit = analogRead(A4);
 napiecie = odczytanaWartosc * (5.0/1023.0);
 if (odczytanaWartosc < naszLimit) {
    digitalWrite(8, HIGH);
    Serial.println(napiecie);
    while (odczytanaWartosc < naszLimit){
     odczytanaWartosc = analogRead(A5);
     naszLimit = analogRead(A4);
     delay(50);
     }
 } else {
    digitalWrite(8, LOW);      
 }

 delay(50);
}

4.5

#define zielona 8
#define zolta 9
#define zolta2 10
#define czerwona 11
#define przycisk 7
String odebraneDane = "";
int naszaLiczba = 0;
boolean reset = true;
int proby = 0;
int liczba = 0; 


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

 pinMode(zielona,OUTPUT);
 pinMode(zolta,OUTPUT);
 pinMode(zolta2,OUTPUT);
 pinMode(czerwona,OUTPUT);
 pinMode(7,INPUT_PULLUP);

}
void loop () {
 if(reset == true){
   reset = !reset;
   proby = 0;
   Serial.println("Przekręć potencjometr i wciśnij przycisk");
   liczba = analogRead(A5);
   while(digitalRead(przycisk) == HIGH) {}
   digitalWrite(zielona,LOW);
   digitalWrite(zolta,LOW);
   digitalWrite(zolta2,LOW);
   digitalWrite(czerwona,LOW);
   Serial.println("Podaj liczbę:");
 }
 if(Serial.available()>0){
   odebraneDane = Serial.readStringUntil('\n');
   naszaLiczba = odebraneDane.toInt();
   if(naszaLiczba>liczba-50 and naszaLiczba<liczba+50){
     digitalWrite(zielona,HIGH);
     digitalWrite(zolta,LOW);
     digitalWrite(zolta2,LOW);
     reset = !reset;
   }
   if(naszaLiczba<liczba-50 or naszaLiczba>liczba+50){
     proby = proby+1;
     if(proby==1)
       digitalWrite(zolta,HIGH);
     if(proby==2)
       digitalWrite(zolta2,HIGH);
     if(proby==3){
       digitalWrite(czerwona,HIGH);
       reset = !reset;
     }
   }
 }
}

4.6

void setup(){
 Serial.begin(9600);
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(12,OUTPUT);
}
void loop(){
 czujnikLewy = analogRead(A3);
 czujnikPrawy = analogRead(A5);
 roznica = czujnikLewy - czujnikPrawy;
 naszaSkala = map(roznica,-1023,1023,1,5);
 digitalWrite(8,LOW);
 digitalWrite(9,LOW);
 digitalWrite(10,LOW);
 digitalWrite(11,LOW);
 digitalWrite(12,LOW);
 if(naszaSkala == 1) //1 oznacza ze duzo wiecej swiatla po prawej stronie
   digitalWrite(8,HIGH);
 if(naszaSkala == 2)
   digitalWrite(9,HIGH);
 if(naszaSkala == 3)
   digitalWrite(10,HIGH); // 3 oznacza ze mniej wiecej po rowno swiatla
 if(naszaSkala == 4)
   digitalWrite(11,HIGH);
 if(naszaSkala == 5) //5 oznacza ze duzo wiecej swiatla po lewej stronie
   digitalWrite(12,HIGH);
 delay(50); 
}
Link do komentarza
Share on other sites

Daggett, układ nie radzi sobie zbyt dobrze z pomiarem napięcia, gdy jest one bliskie napięciu zasilania (5V). Mogą wtedy wystąpić pewne zakłamania w odczytach przy maksymalnie skręconym potencjometrze. Jeśli chodzi o pozostałe programy to pamiętaj na przyszłość o większej liczbie komentarzy - będzie wtedy jeszcze lepiej 😉 Powodzenia w dalszej nauce!

Link do komentarza
Share on other sites

Ciekawostka co do układu: "Lampka uruchamiana w ciemności", śmiesznym efekt otrzymamy gdy wygniemy diodę w stronę fotorezystora (w nocy to piszę gdy panuje ciemność) otrzymamy migającą diodę. Niby bzdura a cieszy, bo dioda sama daje światło które ją wyłącza a później fotorezystor sam ja włącza 😉

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

Iwanow, witam na forum!

Dokładnie tak, dlatego podkreślam zawsze, że warto robić wiele własnych eksperymentów (również tych nieopisane w kursie) - zawsze można znaleźć coś ciekawego. Gratuluję spostrzegawczości!

Link do komentarza
Share on other sites

Może jest już gdzies odpowiedź na moje pytanie ale nawet nie wiem gdzie jej szukać. Wykonując kolejne ćwiczenia z Arduino składam układ z płytką potem wpisuję program na komputerze, podłączam Arduino do komputera, kompiluję i wgrywam. Mam pytanie czy można tak robić cały czas? Czy nie trzeba by zresetować Arduino po zakończonym jednym ćwiczeniu? Arduino ma wgrany poprzedni program a połączenia układu z kolejnego ćwiczenia. Czy nie trafi się tak, że się coś uszkodzi?

Link do komentarza
Share on other sites

Masz rację, trzeba na to zwracać uwagę. Szczególnie zagrożone są projekty w których procesor może zrobić coś poważnie głupiego sterując swoimi wyjściami w nieprawidłowy (w sensie układu) sposób. Oczywistym przykładem jest prosty driver silnika, w którym żądanie jednoczesnej jazdy w prawo  i w lewo powoduje zwarcie zasilania i spalenie tranzystorów. Niemiła będzie też sytuacja w której wyjście procesora w dawnym układzie jest wejściem w nowym. Sygnał doprowadzony np. z przycisku czy innego scalaka napotyka wtedy sygnał z procesora i mamy konflikt, w którym nikt nie wygrywa a duży prąd może zniszczyć delikatną strukturę krzemową chipu. Robiąc też coraz większe konstrukcje istnieje możliwość, że nawet poprawne elektrycznie sygnały, ale wysyłane do innego układu spowodują uszkodzenia mechaniczne, np. ramię robota wyposażone w serwa może połamać im tryby gdy procesor sterowany dziwnym programem zacznie wysyłać komendy ustawiania poszczególnych stawów w położenia nieprzewidziane projektem.

Masz dwa wyjścia - albo wgrywać nowy program zanim zmontujesz kolejny układ, albo po zakończeniu zabawy z jednym wgrywać pusty kod. Możesz po prostu zażądać w IDE pusty program (tylko setup i loop nie robiące nic), skompilować to i wgrać. Coś takiego nie aktywuje żadnego pinu procesora i na to nowy układ powinien być odporny.

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

Cześć, zaczynam dopiero przygodę z programowaniem:

starałem się używać instrukcji, które do tej pory poznałem podczas kursu:

// definiowanie

  #define red_1 2
  #define yellow_1 3
  #define green 4
  #define yellow_2 5
  #define red_2 6 


// zmienne

  int fotorez_1 = 0; // wartość fotorezystora pierwszego A4
  int fotorez_2 = 0; // wartość fotorezystora drugiego A5
  int fotorez; // wynik dzielenia
  int prog_1 = 2; // próg dla załaczenia pierwszej diody
  int prog_2 = 4; // próg dla załaczenia drugiej diody


void setup() {
  
  // przypisanie zdefiniowanych wyżej pinów jako WYJŚCIA
  
  pinMode(red_1, OUTPUT);
  pinMode(yellow_1, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(yellow_2, OUTPUT);
  pinMode(red_2, OUTPUT);
  
  Serial.begin(9600); // prędkość przesyłania

}

void loop() {
  
  fotorez_1 = analogRead(A5); // przypisz wartość wejścia A4 do zmiennej
  fotorez_2 = analogRead(A4); // przypisz wartość wejścia A5 do zmiennej

  Serial.print(fotorez_1); //wartości wyswietlone na monitorze
  Serial.print("     "); //dla lepszej czytelności
  Serial.print(fotorez_2);
  Serial.print("     ");
  Serial.println(fotorez);
  delay(200); 

// FOTOREZYSTOR 1

if (fotorez_1 > fotorez_2) { // WARUNEK OGÓLNY 1  Jeżeli wartość pierwszego fotorezystora większa.

      fotorez = fotorez_1 / fotorez_2; // Obliczenie wartości zmiennej dla powyższego przypadku
      
      digitalWrite(yellow_2, 0); //jeżeli fotorezystor 1 ma większę wartość diody po prawej muszę zgasnąć
      digitalWrite(red_2, 0); 

     if (fotorez < prog_1) { //ZIELONA

      digitalWrite(green, 1);
      digitalWrite(yellow_1, 0);
      digitalWrite(red_1, 0);
   
     }
     
     if (fotorez < prog_2 & fotorez >= prog_1) { //ZIELONA, ŻÓŁTA

      digitalWrite(green, 1);
      digitalWrite(yellow_1, 1);
      digitalWrite(red_1, 0);
     
     }

     if (fotorez >= prog_2) { //ZIELONA, ŻÓŁTA, CZERWONA

      digitalWrite(green, 1);
      digitalWrite(yellow_1, 1);
      digitalWrite(red_1, 1);
    
     }
}

// FOTOREZYSTOR 2

if (fotorez_2 > fotorez_1) { // WARUNEK OGÓLNY 2  Jeżeli wartość pierwszego fotorezystora większa.

      fotorez = fotorez_2 / fotorez_1; // Obliczenie wartości zmiennej dla powyższego przypadku
  
      digitalWrite(yellow_1, 0);
      digitalWrite(red_1, 0);  

     if (fotorez < prog_1) { //ZIELONA

      digitalWrite(green, 1);
      digitalWrite(yellow_2, 0);
      digitalWrite(red_2, 0);

     }
     
     if (fotorez < prog_2 & fotorez >= prog_1) { //ZIELONA, ŻÓŁTA

      digitalWrite(green, 1);
      digitalWrite(yellow_2, 1);
      digitalWrite(red_2, 0);
    
     }

     if (fotorez >= prog_2) { //ZIELONA, ŻÓŁTA, CZERWONA

      digitalWrite(green, 1);
      digitalWrite(yellow_2, 1);
      digitalWrite(red_2, 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.