Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Cierbo, kod nie jest może najprostszy, ale wygląda poprawnie. Przejrzyściej byłoby gdybyś najpierw zrobił if'a sprawdzającego, na którym fotorezystorze jest większy odczyt i dopiero dalej zajął się odpowiednim wyświetleniem stanu na LEDach. Warto też pamiętać o komentarzach. Masz jakiś konkretny problem? Jeśli tak, to zadaj pytanie, wtedy łatwiej będzie udzielić pomoc.

Link do komentarza
Share on other sites

Cierbo, zacznijmy od tego, czy w terminalu widzisz poprawnie odczytane informacje? Sprawdzałeś, czy możesz sterować samymi diodami (bez tego całego algorytmu) - wyeliminujesz wtedy niepewność, czy układ jest poprawnie połączony i będziemy mogli ruszyć dalej ze sprawdzaniem 🙂

Link do komentarza
Share on other sites

Wybacz, że pisze z taką częstotliwością ale dużo mam na głowie... Wracając, wartości odczytane w terminalu są poprawne, układ również jest poprawnie podłączony 🙂

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

Cierbo, jednak coś musi być źle. Spójrz na swoje warunki - nie ma tam takiej możliwości, aby żadna z diod nie świeciła. Z tego co piszesz wychodzi, że w praktyce wszystkie są wyłączone, więc coś tu nie gra 🙂

Link do komentarza
Share on other sites

Ok. Podłączyłem wszystko jeszcze raz na płytkę i teraz świecą te diody... nie wiem co tam popaprałem xd Teraz układ reaguje następująco, po stronie gdzie jest ciemno tam święcą diody, natomiast tam gdzie występuje silne źródło światła to gasną diody. W zasadzie układ pokazuje po której stronie jest ciemniej. Wychodzi na to, że zrobiłem na odwrót niż w zadaniu było wymagane. Gdybym wiedział w jakim programie robicie te rysunki graficzne z arduino i płytką stykową to bym to lepiej zobrazował 🙂

Wspomniałeś wcześniej o if sprawdzającym, jak się za to zabrać?

Link do komentarza
Share on other sites

Cierbo, w takim razie musisz tylko zamienić podłączenie czujników (zamień fizycznie czujnik lewy z prawym). Wtedy będzie działało i nie będziesz musiał nic już w programie zmieniać 🙂

Link do komentarza
Share on other sites

A to moje rozwiązania zadań. Treker, już mi zwracałeś uwagę na brak komentarzy 🙂 Wiem, że są przydatne, ale w tych kodach wszystko jest wg mnie wystarczająco czytelne 🙂

Zadanie 4.5 (kiepsko, niepełna funkcjonalność)

// ***** DEFINES *****
#define switch 12
#define red 8
#define yellow 7
#define green 6
#define potencjometr A4

// ***** VARIABLES *****
int odczyt = 0;
int liczba = 0;
boolean wcisniety = false;
byte licznik = 0;

// ***** SETUP *****
void setup() {
 Serial.begin(9600);
 pinMode(switch, INPUT_PULLUP);
 pinMode(red, OUTPUT);
 pinMode(yellow, OUTPUT);
 pinMode(green, OUTPUT);
 digitalWrite(red, LOW);
 digitalWrite(yellow, LOW);
 digitalWrite(green, LOW);

 Serial.println("Witaj! Przekrec potencjometr i wcisnij przycisk.");

}

// ***** LOOP *****
void loop() {
 odczyt = analogRead(potencjometr);
 //Serial.println(odczyt);
 //Serial.println(wcisniety);
   if (digitalRead(switch) == LOW) {
   Serial.println("Podaj liczbe: ");
   wcisniety = true;
   delay(500);
   }

    if (wcisniety == true) {
     if (Serial.available() > 0) {
       liczba = Serial.parseInt();
       if ( (abs(liczba - odczyt)) < 50 ) {
         digitalWrite(red, LOW);      
         digitalWrite(yellow, LOW);
         digitalWrite(green, HIGH);
         Serial.println("YOU WIN!");
       } else if (licznik == 2) {
         digitalWrite(red, HIGH);      
         digitalWrite(yellow, LOW);
         digitalWrite(green, LOW);
         Serial.println("Przegrales...");
       } else {
         digitalWrite(red, LOW);      
         digitalWrite(yellow, HIGH);
         digitalWrite(red, LOW);
         Serial.println("Zle, Podaj liczbe: ");
         licznik = licznik + 1;
       }
     }
    }


}

Zadanie 4.6 (To mi całkiem fajnie wyszło 😃)

// ***** DEFINES *****
#define led1 2
#define led2 3
#define led3 4
#define led4 5
#define led5 6
#define goraADC A4
#define dolADC A5

// ***** VARIABLES *****
int gora = 0;
int dol = 0;
int balans = 0;

// ***** SETUP *****
void setup() {
 Serial.begin(9600);
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
 pinMode(led4, OUTPUT);
 pinMode(led5, OUTPUT);
 digitalWrite(led1, LOW);
 digitalWrite(led2, LOW);
 digitalWrite(led3, LOW);
 digitalWrite(led4, LOW);
 digitalWrite(led5, LOW);  
}

// ***** LOOP *****
void loop() {
 gora = analogRead(goraADC);
 dol = analogRead(dolADC);
 balans = gora - dol;
 Serial.println(balans);
 delay(100);

 if (balans > 150) {
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
   digitalWrite(led5, HIGH);
 }

 else if (balans <= 150 && balans > 50) {
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, HIGH);
   digitalWrite(led5, LOW);
 } 

 else if (balans <= 50 && balans >= -50) {
   digitalWrite(led1, LOW);
   digitalWrite(led2, LOW);
   digitalWrite(led3, HIGH);
   digitalWrite(led4, LOW);
   digitalWrite(led5, LOW);
 } 

 else if (balans < -50 && balans >= -150) {
   digitalWrite(led1, LOW);
   digitalWrite(led2, HIGH);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
   digitalWrite(led5, LOW);
 } 

 else if (balans < -150) {
   digitalWrite(led1, HIGH);
   digitalWrite(led2, LOW);
   digitalWrite(led3, LOW);
   digitalWrite(led4, LOW);
   digitalWrite(led5, LOW);
 } 


 }
Link do komentarza
Share on other sites

koba94, dla Ciebie pewnie są teraz jasne, ale gdy publikujesz je w Internecie i piszesz, że coś nie działa. To mi (czy komuś innemu) jest ciężko analizować program, jeśli nie wiemy, co miałeś na myśli. Jakie masz dokładniej problemy w zadaniu 4.5?

Link do komentarza
Share on other sites

int i = 0; //Definicja zmiennych
int odczyt = 0;
int wartosc = 0;

void setup() {
 for (i=8; i<=12; i++) { //pętla definiująca diody na pinach od 8 do 12 jako OUTPUT
   pinMode(i, OUTPUT);
 }
}

void loop() {
 odczyt = analogRead(A5); //pobieranie danych z piny A5
 wartosc = map(odczyt, 0, 1023, 1, 5); //mapowanie wartości
 for (i=8; i<=12; i++) { //kolejna pętla, dzięki której wybieramy piny od 8 do 12
  if ((i-7) == wartosc) { 
/*warunek, jesli pin -7 jest równy zmapowanej wartości, załącza HIGH, w przeciwnym wypadku jest to low. Można skrócić ten krok i w warunku zastosować samo i, ale wtedy w mapowaniu zamiast cyfr od 1-5 musimy zmapować od 8-12*/
    digitalWrite(i, HIGH);
  } else {
    digitalWrite(i, LOW);
  }
 }
 delay(50);
}
Link do komentarza
Share on other sites

Witam mam problem przy zadaniu 4.4, mianowicie w miejscu żeby Arduino wysłało komunikat o napięciu na dzielniku z fotorezystorem TYLKO RAZ. Po zgaszeniu światła lampka się zapala i wysyła jeden komunikat do PC, ale po zgaszeniu lampa nie gaśnie. Dopiero powtórne wgranie programu gasi lampkę. Mój kod:

int prog=0;
int fotorezystor=0;
float napiecie=0;
void setup() {
 // put your setup code here, to run once:
 pinMode(8, OUTPUT);
 digitalWrite(8, LOW);
 Serial.begin(9600);
}
void loop() {
 // put your main code here, to run repeatedly:
 prog=analogRead(A5);
 fotorezystor=analogRead(A4);
   napiecie=5/1023*fotorezystor;
   //Serial.println(odczytanaWartosc1);
   delay(500);
   if (fotorezystor<prog) {
     digitalWrite(8, HIGH);
     Serial.println(fotorezystor);
     while (fotorezystor) {}
   }
   else {
     digitalWrite(8, LOW);
   }
}
Link do komentarza
Share on other sites

  fotorezystor=analogRead(A4);
...
   if (fotorezystor<prog) {
...
     while (fotorezystor) {}
   }

W ifie używasz innego warunku niż w while'u.

napiecie=5/1023*fotorezystor;

To nie jest obliczane jako float, bo żaden z elementów po prawej nie jest typu float.

Poza tym nigdzie nie używasz tej zmiennej.

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.