Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

(edytowany)
int odczytanaWartosc = 0;
int prog = 0;
String a = "ustawione";
void setup()
{
  pinMode(8, OUTPUT);
  Serial.begin(9600);

}

void loop()
{
odczytanaWartosc = analogRead(A5);
prog = analogRead(A4);
Serial.println(a  +  prog ) ;

Serial.println( "odczyt= " + odczytanaWartosc   );

  
  delay(6000);
if(odczytanaWartosc < prog)
  {
    digitalWrite(8, HIGH);
  }else{ digitalWrite(8, LOW);}
  
}

Witam.

Natrafiłem na taki oto problem z wyświetleniem komunikatu, otóż, podłączyłem potencjometr, fotorezystor i diodę i chciałem zobaczyć, jak wygląda sprawy regulacji i aktualne wskazania z fotorezystora. Zatem wyświetlać miało tak:

Ustawione = tutaj wartość

odczyt= tutaj wartość

 

I teraz jeżeli słowo przypisze do zmiennej i wstawię j/w, to wyświetla poprawnie, natomiast gdy wpiszę po println("słowo" + zmienna); , to wyświetla mi krzaczki w monitorze portu szeregowego.

Gdzie popełniam błąd? Czego nie wiem?

Pozdrawiam serdecznie

Edytowano przez AndrzejWi

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@AndrzejWi w Arduino nie można robić takich uproszczeń, często zapis Strina i zmiennej przy wypisywaniu wygląda tak:

Serial.print("Wartosc to: "); Serial.println(zmienna);

Więcej o Stringach możesz poczytać w dokumentacji ze strony Arduino. Masz tam przykład tego co można robić. W przypadku połączenia z wartością mógłbyś zamienić zmienną na String i ją połączyć z poprzednim, ale tak skomplikowane operacje na dynamicznym obiekcie nie są w Arduino zbyt dobre.

 

Edytowano przez Gieneq
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Cześć.

Mam taki oto problem, przy podłączeniu fotorezystora(ćwiczenie fotorezystor, dioda, potencjometr). Dioda mocno mruga gdy mam wartość na granicy, wskazania wartości na pinie do którego podłączony jest fotorezystor wartości w małym zakresie często się zmieniają. Wydaje mi się to raczej normalne, ale wolę was spytać.

Jeśli nienormalne, to co może być nie tak?

Jeśli normalne, to chyba tylko odpowiednim programem można to ogarnąć?

Żeby było jasne, nie chcę konkretnego rozwiązania problemu(chyba że to może być z podłączeniami coś nie tak, albo z płytką). Jeśli program, to wolę sam powalczyć. 🙂

Pozdrawiam serdecznie.

Udostępnij ten post


Link to post
Share on other sites

@AndrzejWi tak, to normalne i oczywiście możesz to "naprawić" programowo.

Udostępnij ten post


Link to post
Share on other sites

Pogubiłem się trochę w zadaniu 4.5. Cały czas wyskakuje błąd. Dopiero gdy usunę: 

Serial.println("Masz jeszcze " + proby + " proby");

program można uruchomić. Po wciśnięciu przycisku na ekranie pojawia się komunikat podaj liczbę. Po wprowadzeniu liczby i wciśnięciu enter nic się nie dzieje i program już dalej nie działa. Oto mój program:

#define czerwona 10
#define zolta 9
#define zielona 8
#define przycisk 7

int ustalonaWartosc=0;
String wybranaLiczba_string="";
int wybranaLiczba=0;
int proby=2;

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

 digitalWrite(czerwona,LOW);
 digitalWrite(zolta,LOW);
 digitalWrite(zielona,LOW);

}

void loop() {
  while(digitalRead(przycisk)==LOW)
  {
    ustalonaWartosc=analogRead(A5);
    Serial.println("Podaj liczbe:");
    
    delay(1000);
    
    if(Serial.available()>0)
    {      
      wybranaLiczba_string=Serial.readStringUntil('\n');
      wybranaLiczba=wybranaLiczba_string.toInt();
      
      if(wybranaLiczba<=ustalonaWartosc+50 && wybranaLiczba>=ustalonaWartosc-50)
      {
        digitalWrite(czerwona,LOW);
        digitalWrite(zolta,LOW);
        digitalWrite(zielona,HIGH);

        Serial.println("Wygrales!");
      }
      else
      {
        while(wybranaLiczba<=ustalonaWartosc+50 && wybranaLiczba>=ustalonaWartosc-50)
        {
        digitalWrite(czerwona,HIGH);
        digitalWrite(zolta,LOW);
        digitalWrite(zielona,LOW);

        delay(1000);

        proby=2;
        
        while(proby==0)
        {         
          digitalWrite(czerwona,LOW);
          digitalWrite(zolta,HIGH);
          digitalWrite(zielona,LOW);
          proby--;
          
          Serial.println("Masz jeszcze " + proby + " proby");
        }
        
        }
        
      }
    }
  }
}

 

Udostępnij ten post


Link to post
Share on other sites

@Davis testowanie od razu dużego kodu to spory problem. Ja zawsze obieram 2 drogi:

  • jestem przekonany, że wiem jak zrobić zadanie na 110% - pisze cały kod, sprawdzam, odpalam w 90% działa...
  • mam wątpliwości czy rozumiem temat - piszę funkcję, test samej logiki której nie rozumiem i przechodzę etapami kompilując i testując co chwilę, żeby mieć pewność, że dodana treść nic nie psuje.

Jeżeli coś u Ciebie nie działa, to najłatwiej wyizolować to co stwarza problem i sprawdzić w prostszym wariancie. Czyli 🌶️ (chilli?) w tym przypadku napisz prostszy program, gdzie po wpisaniu komendy dostajesz odpowiedź i dojdź do momentu gdzie będzie się to odbywać w kółko. Np, czy ten fragment umieszczony w loop(), dopełnimy żeby się kompilował i z printem do wypisywania liczby będzie działać?

if(Serial.available()>0)
    {      
      wybranaLiczba_string=Serial.readStringUntil('\n');
      wybranaLiczba=wybranaLiczba_string.toInt();
  //......

Dobra spojrzałem jeszcze raz i to nie ten problem... 😄 ale masz ciekawy wywód o testowaniu kodu.

Serial.println("Masz jeszcze " + proby + " proby");

Takich krzaczków nie robimy, to nie Java czy Python. Nie mieszamy springów z intami. Jak chcesz wypisać teki cudo to robisz to:

Serial.print("Masz jeszcze "); Serial.print(proby); Serial.println(" proby");

Możesz poczytać w stringach w dokumentacji Arduino, są tam przykłady użycia poprawnego i takiego który powoduje problemy.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Cześć. Postanowiłem również podzielić się moim rozwiązaniem w związku z tym, że zadania są coraz dłuższe a ja z chęcią posłucham podpowiedzi i uwag.

Mam też pytanie. Widzę u niektórych, że mają takie króciutkie kabelki do wykonywania połączeń. W jaki sposób mogę sobie taki kabelek/złączkę wykonać? 🙂 

 

Poniżej rozwiązanie zadania nr 4.5: 

#define zielona 5
#define zolta 6
#define czerwona 7
#define przycisk 4
#define potencjometr A5

int proba = 0;
int liczba = 0; //zamieniony na int wybor gracza
int wartosc = 0; //pobrana wartosc z potencjometru
String wybor = "";
int pozostaleProby = 3; 

void setup() {
  Serial.begin(9600); //rozpoczęcie komunikacji przez USART

  pinMode(zielona, OUTPUT);
  pinMode(zolta, OUTPUT);
  pinMode(czerwona, OUTPUT);
  pinMode(przycisk, INPUT_PULLUP);

  digitalWrite(czerwona, LOW);
  digitalWrite(zielona, LOW);
  digitalWrite(zolta, LOW);
}

void loop() {
  if (proba < 3) {
    Serial.println("Pozostała liczba prób wynosi: ");
        Serial.println(pozostaleProby); 
    Serial.println("Przekręć pokrętło i wciśnij przycisk gdy będziesz gotowy");

    while (digitalRead(przycisk) == HIGH) {
      delay(50);
    }

    wartosc = analogRead(potencjometr);

    Serial.println("Podaj liczbę od 0 do 1023: ");

    while (Serial.available() == 0) {
      delay(50);
    }
    if (Serial.available() > 0) { //oczekiwanie na dane
      wybor = Serial.readStringUntil('\n');
      liczba = wybor.toInt();

      if ((wartosc - liczba <= 50) and (wartosc - liczba >= -50)) {
        digitalWrite(zielona, HIGH);
        Serial.println("WYGRAŁEŚ! Dokładna wartość to: ");
        Serial.println(wartosc);
        delay(2000);
        digitalWrite(zielona, LOW);
        delay(1000);
        pozostaleProby = 3; 
      } else {
        digitalWrite(zolta, HIGH);
        Serial.println("Spróbuj jeszcze raz! Poprawna wartość to: ");
        Serial.println(wartosc);
        delay(1000);
        digitalWrite(zolta, LOW);
        delay(1000);
        proba++ ;
        pozostaleProby = pozostaleProby - 1; 
      }
    }
  }

  else if (proba = 3) {
    digitalWrite(czerwona, HIGH);
    Serial.println("Przegrales! Poprawna wartość to: ");
    Serial.println(wartosc);
    delay(1000);
    digitalWrite(czerwona, LOW);
    Serial.println("Zaczynamy od nowa!");
    delay(1000);
    proba = 0;
    pozostaleProby = 3; 
  }
}

A tutaj zadanie 4.6: 

In progress, ponieważ mimo iż 2 razy napisałem kod to na samym urządzeniu dalej nie widzę zamierzonego efektu. 

int FotoLewy = 0;  //przechowuje przechwycona wartosc z lewego fotorezystora
int FotoPrawy = 0;  // -//- z prawego fotorezystora
float NapiecieLewy = 0; 
float NapieciePrawy = 0; 
// int prog = 0; //próg włączenia światła

void setup() {
Serial.begin(9600); //komunikacja przez USART
  
  pinMode(9, OUTPUT); //prawa dioda
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT); //środkowa dioda
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT); //lewa dioda

  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  digitalWrite(7, LOW);
  digitalWrite(6, LOW);
  digitalWrite(5, LOW); 
}


void loop() {
  // prog = analogRead(A3); 
  FotoLewy = analogRead(A4);
  FotoPrawy = analogRead(A5); 

  FotoLewy = map(FotoLewy, 0, 1023, 1, 3); //wartość skalowana z 0-1023 na 1-3 
  FotoPrawy = map(FotoPrawy, 0, 1023, 1, 3); 

  Serial.println("Wartość odczytana z lewego fotorezystora: "); Serial.println(FotoLewy);
  Serial.println("Wartość odczytana z prawego fotorezystora: "); Serial.println(FotoPrawy); 

  if(NapieciePrawy == 2) {
    digitalWrite(9, LOW);
    digitalWrite(8, HIGH); 
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
  } else if(NapieciePrawy == 3) { 
    digitalWrite(9, HIGH);
    digitalWrite(8, LOW); 
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
  } else if(NapiecieLewy == 3) {
    digitalWrite(9, LOW);
    digitalWrite(8, LOW); 
    digitalWrite(7, LOW);
    digitalWrite(6, LOW);
    digitalWrite(5, HIGH);
  } else if(NapiecieLewy == 2) {
    digitalWrite(9, LOW);
    digitalWrite(8, LOW); 
    digitalWrite(7, LOW);
    digitalWrite(6, HIGH);
    digitalWrite(5, LOW);
  } else {
    digitalWrite(9, LOW);
    digitalWrite(8, LOW); 
    digitalWrite(7, HIGH);
    digitalWrite(6, LOW);
    digitalWrite(5, LOW);
  }
  delay(1000); 
}

Posiłkowałem się za drugim razem rozwiązaniem innych użytkowników bo kompletnie zgłupiałem przy moim 1 podejściu. 

Możliwe, że problem tkwi w podłączeniu układu. 

(niewyraźne zdjęcie z Xiaomi in 3.. 2.. 1..) 

117181715_1027429604437073_5676760673079963864_n.thumb.jpg.2d0734133e9aafb488f152c7d7fb6cf5.jpg117229166_1027529141002195_6442187816310228788_n.thumb.jpg.550a9efb96bef49a4420a42d371199e2.jpg117024106_786171208795313_5447308737951164306_n.thumb.jpg.f95e6aaad4b864eb30d3719739f59e05.jpg117069676_624635951523728_2268486139179357852_n.thumb.jpg.2c8ae26883a41d3429d9908533167414.jpg117104910_311029479950653_4191768513491342568_n.thumb.jpg.2fde1eb3bd6e289b7e3ceba4dda78ccc.jpg

Udostępnij ten post


Link to post
Share on other sites

@samemilerzeczy fajnie że pochwaliłeś się zadaniami 🙂 4.5 wygląda dobrze, choć "and" raczej bym zamienił na &&, nie używałem nigdy czegoś takiego ale jest to synonim.

4.6 początek masz dobry - trzeba określić wartośc liczbową napięcia, niekoniecznie musi to być rzeczywista wartość ale może być jakaś wartość przeskalowana dla większej elastyczności czułości. Ale co jest takie podejrzane to że masz 2 wartości liczbowe, a w warunkach masz else if czyli jeden warunek dla jednej wartości prawo/lewo wyklucza inny.

Żeby tego uniknąć musisz zrobić jedną zmienną która wiąże oba odczyty, np odejmij je od siebie i wtedy prawy-lewy to jeżeli prawy ma większą wartość to najpewniej źródło światła będzie po jego stronie, a jak lewy to na odwrót.

Zmapuj to na wartości 0-4 i gotowe 🙂 Jak uda się, to poczytaj o tablicach, stwórz 2 wymiarową tablicę ze stałymi reprezentującymi zapalone ledy i pozbędziesz się ogromnego bloku warunków. Ale narazie działająca wersja kudu, powodzenia!

Udostępnij ten post


Link to post
Share on other sites

Poprawiłem trochę, ale na diodach dalej nie widać efektu mimo tego, że patrząc na UART widać, że w miarę zmiany oświetlenia na odpowiednich fotorezystorach wartość napięcia odczytywana jest poprawnie i zmienia się na bieżąco gdy zmieniam kąt padania/natężenie latarki. 

Aktualny kod do 4.6 prezentuje się tak:

#define CzerwonaL 5
#define ZoltaL 6
#define Zielona 7
#define ZoltaP 8
#define CzerwonaP 9

int i = 0; //dla funkcji for
int FotoLewy = 0;  //przechowuje przechwycona wartosc z lewego fotorezystora
int FotoPrawy = 0;  // -//- z prawego fotorezystora

void setup() {
  Serial.begin(9600); //komunikacja przez USART

  for (i = 5; i <= 9; i++) { //pętla definiująca diody na pinach 5-9 jako OUTPUT
    pinMode(i, OUTPUT);
  }

  for (i = 5; i <= 9; i++) { //pętla przypisująca diodom na pinach 5-9 stan NISKI
    digitalWrite(i, LOW);
  }
}

void loop() {
  FotoLewy = analogRead(A4);  //zczytanie wartości z fotorezystorów
  FotoPrawy = analogRead(A5);

  delay(1000);

  FotoLewy = map(FotoLewy, 0, 1000, 1, 4); //wartość skalowana z 0-1000 na 1-4
  FotoPrawy = map(FotoPrawy, 0, 1000, 1, 4);

  Serial.println("Wartość odczytana z lewego fotorezystora: "); Serial.println(FotoLewy);
  Serial.println("Wartość odczytana z prawego fotorezystora: "); Serial.println(FotoPrawy);

  if ((FotoLewy == 1) == (FotoPrawy == 1))
  {
    digitalWrite(Zielona, HIGH);
    digitalWrite(ZoltaL, LOW);
    digitalWrite(CzerwonaL, LOW);
  }
  if (FotoPrawy == 2)
  {
    digitalWrite(Zielona, LOW);
    digitalWrite(ZoltaL, HIGH);
    digitalWrite(CzerwonaL, LOW);
  }
  if (FotoPrawy == 3)
  {
    digitalWrite(Zielona, LOW);
    digitalWrite(ZoltaL, LOW);
    digitalWrite(CzerwonaL, HIGH);
  }
  else
  { if ((FotoLewy == 1) == (FotoPrawy == 1))
    {
      digitalWrite(Zielona, HIGH);
      digitalWrite(ZoltaP, LOW);
      digitalWrite(CzerwonaP, LOW);
    }
    if (FotoLewy == 2) {
      digitalWrite(Zielona, LOW);
      digitalWrite(ZoltaP, HIGH);
      digitalWrite(CzerwonaP, LOW);
    }

    if (FotoLewy == 3) {
      digitalWrite(Zielona, LOW);
      digitalWrite(ZoltaP, LOW);
      digitalWrite(CzerwonaP, HIGH);
    }
  }
}

Możliwe, że problem tkwi w moim podłączeniu układu. Będę tu zaglądał może ktoś wstawi swojego rozwiązanie ze schematem i zauważę swój błąd. 

W międzyczasie ruszam z 5 częścią 😄 

Dzięki bardzo za pomoc! 

 

 

 

Udostępnij ten post


Link to post
Share on other sites

@samemilerzeczy no to postaramy się jakoś to ruszyć 😉 

Pierwsze co mi się rzuciło to warunek, niestety operator porównania, po głębszym zastanowieniu jest to akceptowalne ale lepiej trzymać się zapsu z && (AND) i || (OR) lub ich synonimami.

if ((FotoLewy == 1) && (FotoPrawy == 1))

Nawiasy na około warunków nie będą potrzebne.

17 godzin temu, samemilerzeczy napisał:

w miarę zmiany oświetlenia na odpowiednich fotorezystorach wartość napięcia odczytywana jest poprawnie

A jakie są to wartości? Możesz tu wkleić kilka przykładów, bo: jeżeli różnice sa duże to zrób to co sugerowałem, tj. odejmij jedno od drugiego i uzyskasz taki jakby wektor informujący o kierunku. W sumie opisanie tego wektorem czyli strzałką informującą w którą stronę jest skierowanie światła to nie jest zły pomysł (ale to tak odchodząc od istoty tematu).

Masz więc strzałkę, której znak informuje czy światło jest po lewej czy po prawej. Dlaczego? Odejmując wartości w takim układzie:

wynik = prawe - lewe, gdzie im jaśniej tym większa wartość od 0 do 1023,

to jeżeli po prawej jest jasno, to wynik będzie dodatni, jeżeli po lewej jest jasno (mniejsze - większe) to wynik ujemny czyli po lewej jaśniej.

Ok, to  teraz sprawdź jakie są te różnice, czy wynik odejmowania mieści się w przedziale -500;+500, czy może -10;+10. Następnie wpisz te wartości przy skalowaniu, a jeżeli boisz się to możesz ograniczyć wartość do konkretnego przedziału (choć funkcja map chyba to też robi, trzeba sprawdzić w kodzie).

Na razie wystarczy, daj znać czy napisałem zrozumiale 🙂 

 

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
42 minuty temu, Gieneq napisał:

funkcja map chyba to też robi, trzeba sprawdzić w kodzie)

Nie robi, wystarczy zerknąć do dokumentacji. Do ograniczania jest constrain.

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

@Gieneq

Dobra, więc tak: 

1)  Wartości prezentują się następująco, widać momenty w których świeciłem bezpośrednio na prawy fotorezystor i na lewy: 

SDASDASDA.thumb.png.ea7248a5c40a63dd35d51d73b3165ff7.png

2) Tak jak napisałeś stworzyłem jedną zmienną, która wiąże odczyty z obu fotorezystorów. Nazwałem ją StosunekNapiec i znajduje się ona też w instrukcjach warunkowych.

3) Warunki też zależą teraz (Tak jak o to prosiłeś) od różnic między wartościami odczytanymi z Lewego i Prawego fotorezystora i na tej podstawie powinny się świecić konkretne diody. 

Kod aktualnie wygląda tak:
 

#define ZielonaL 12  //zadeklarowanie zmiennych diód i przypisanie do nich pinów
#define ZoltaL 11
#define Czerwona 10
#define ZoltaP 9
#define ZielonaP 8

int FotoLewy = 0;    //zadeklarowanie potrzebnych zmiennych
int FotoPrawy = 0;
float NapiecieLewy = 0;   //float, ponieważ mnożenie przez 5/1023 w 99,9% przypadków da nam liczbę zmiennoprzecinkową
float NapieciePrawy = 0;
float StosunekNapiec = 0;
int i = 0;           //zmienna wykorzystana przy funkcji for

void setup() {

  Serial.begin(9600);

  pinMode(ZielonaP, OUTPUT);
  pinMode(ZielonaL, OUTPUT);
  pinMode(Czerwona, OUTPUT);
  pinMode(ZoltaL, OUTPUT);
  pinMode(ZoltaP, OUTPUT);

  digitalWrite(ZoltaL, LOW);
  digitalWrite(ZoltaP, LOW);
  digitalWrite(Czerwona, LOW);
  digitalWrite(ZielonaP, LOW);
  digitalWrite(ZielonaL, LOW);
}

void loop() {
  FotoLewy = analogRead(A4); //odczytanie wartości z lewego fotorezystora
  FotoPrawy = analogRead(A5); //odczytanie natezenia oswietlenia z prawego fotorezystora

  NapiecieLewy = FotoLewy * (5.0 / 1023.0); //przeksztalczenie odczytu w napiecie
  NapieciePrawy = FotoPrawy * (5.0 / 1023.0);
  StosunekNapiec = (NapiecieLewy / NapieciePrawy);

  if ((NapiecieLewy > NapieciePrawy) && (StosunekNapiec > 1.2)) {
    digitalWrite(ZielonaP, LOW);
    digitalWrite(ZoltaP, LOW);
    digitalWrite(Czerwona, LOW);
    digitalWrite(ZoltaL, HIGH);
    digitalWrite(ZielonaL, HIGH);
  }

  if ((NapieciePrawy > NapiecieLewy) && (StosunekNapiec < 0.8)) {
    digitalWrite(ZielonaP, HIGH);
    digitalWrite(ZoltaP, HIGH);
    digitalWrite(Czerwona, LOW);
    digitalWrite(ZoltaL, LOW);
    digitalWrite(ZielonaL, LOW);
  }

  if ((StosunekNapiec > 0.7) && (StosunekNapiec < 1.3)) {
    digitalWrite(ZielonaP, LOW);
    digitalWrite(ZoltaP, LOW);
    digitalWrite(Czerwona, HIGH);
    digitalWrite(ZoltaL, LOW);
    digitalWrite(ZielonaL, LOW);
  }

  Serial.print("\nAktualne wartości napięcua");
  Serial.print("\nNapięcie na prawym fotorezystorze: "); Serial.print(NapieciePrawy);
  Serial.print("\nNapięcie na lewym fotorezystorze: "); Serial.print(NapiecieLewy);
  delay(3000);

}

I tu pojawia się problem.. 

te diody nadal nie świecą  😞  Aktualnie pobieram program Fritzing żeby stworzyć schemat połączeń jak u mnie na płytce bo na zdjęciu tego nie widać. 

Udostępnij ten post


Link to post
Share on other sites

@samemilerzeczy ojj idziesz w krzaki 😞 to pomogę trochę bardziej, zróbmy tak:

const int[] leds = {4,5,6,7,10,11};
int roznica = adc_lewe - adc_praw;
//sprawdz jakie sa maksymalne i minimalne watosci roznicy, dajmy na to ze 100, jak nie to przeskaluj
#define DIFF_SCALE 2
roznica *= DIFF_SCALE;
//teraz obetnij jak za duze
roznca = constrain(roznica, WARTOSC_MIN, WARTOSC_MAX);//np -200, 200
led_index = map(roznica, -200, 200, 0, 5);
//jak jest ujemne czyli adc prawe ma wiekszy odcyt to swieci sie led 0, jak dodatnie to zaswieci sie ktorys z konca zakresu 4 lub 5 itp.
for(int i = 0; i < 6;++i){
  if(i == led_index)
    digitalWrite(leds[i], HIGH);
  else
    digitalWrite(leds[i], LOW);
    



Kod jest orientacyny, na pewnie nie skompiluje się, ale mam nadzieje że zrozumiesz idę. Występuje to funkcja constrains i tabilca. Możesz poczytać o nich w dokumentacji. W razie problemów będziemy myśleć co dalej.

Tablic nie ma w kursie za wyjątkiem klawiatury, ale tu bardzo pomaga. Jeżeli jednak nie chcesz ich używać to możesz zrealizować zawartość pętli przy pomocy bloków warunkowych/switch-case.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Gieneq

#define PotencjometrL A4              //przypisanie fotorezystorów do odpowiednich pinów
#define PotencjometrP A5

int ValueL = 0;        //początkowe wartości fotorezystorów
int ValueP = 0;
int leds[] = {5, 6, 7, 8, 9}; //utworzenie tablicy o rozmiarze 4 (czyli posiadającej 5 elementów, ponieważ tablice są zero indeksowe)
int roznica = 0;
int led_index = 0;
int i = 0;             //zmienna wykorzystana przy funkcji for

void setup() {
  Serial.begin(9600);  //rozpczęcie komunikacji przez UART;

  for (i = 5; i <= 9; i++) { //pętla definiująca diody na pinach 5-9 jako OUTPUT
    pinMode(i, OUTPUT);
  }

  for (i = 5; i <= 9; i++) { //pętla przypisująca diodom na pinach 5-9 stan NISKI
    digitalWrite(i, LOW);
  }
}

void loop() {
  ValueL = analogRead(PotencjometrL);   //odczytanie wartosci z potencjometrow
  ValueP = analogRead(PotencjometrP);

  roznica = ValueL - ValueP;
  led_index = map(roznica, -519 , 482, 0, 5); //zmapowanie zakresu wartosci roznicy na wartosci 0-5 (łatwiejsze warunki)
  led_index = constrain(led_index, 0, 5); //ograniczenie wartosci led_index zeby nie wychodzila poza zakres
  
  for (int i = 0; i < 6; ++i) {        //instrukcja warunkowa przypisujaca odpowiedniej diodzie stan wysoki w zaleznosci od wartosci roznicy
    if (i == led_index)
      digitalWrite(leds[i], HIGH);
    else
      digitalWrite(leds[i], LOW);
  }
  Serial.println(roznica);
}

Sprawdziłem poprzez monitor portu szeregowego: 

  • mapowanie działa;
  • constrain spełnia swoją funkcję; 

Wartości zmiennych roznica i led_index mieszczą się w zadanych przedziałach i ograniczeniach. 
Możliwe, że coś mam źle umieszczone ale sam po paru próbach/zmianach już tego nie widzę 😕 

 

@ethanak Poprawione zgodnie z sugestią 🙂 
Chociaż może teraz ograniczyć to już na wartościach po zmapowaniu czyli od 0 do 5? 

Edytowano przez samemilerzeczy

Udostępnij ten post


Link to post
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...