Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

A to co?

while(digitalRead(przycisk) = HIGH);

Kompilator podaje Ci gdzie jest błąd (dokładny numer linii programu i nawet numer kolumny w której błąd wystąpił).  Co to Twoim zdaniem znaczy:

9 minut temu, ZwiewnyTrzmiel napisał:

C:\Users\Paweł\Documents\Arduino\sketch_may12a\sketch_may12a.ino:29:36: note: in expansion of macro 'HIGH'

Resztę błędów powinieneś już znaleźć sam czytając komunikaty kompilatora.

Link do komentarza
Share on other sites

No dobra coś pokombinowałem i problem który mi wskazałeś zniknął po dodaniu na początku kodu

#define HIGH

Tylko kompletnie nie rozumiem dlaczego to pomogło i czemu to było potrzebne.

Pojawił się jednak inny problem bo teraz kompilator podaje mi błąd:

C:\Users\Paweł\Documents\Arduino\sketch_may12a\sketch_may12a.ino: In function 'void loop()':

sketch_may12a:31:41: error: expected primary-expression before ')' token

sketch_may12a:43:32: error: expected primary-expression before ')' token

sketch_may12a:49:43: error: expected primary-expression before ')' token

sketch_may12a:52:30: error: expected primary-expression before ')' token

sketch_may12a:60:33: error: expected primary-expression before ')' token

sketch_may12a:65:43: error: expected primary-expression before ')' token

exit status 1
expected primary-expression before ')' token

Czegoś mu w tych miejscach brakuje tylko nie mam pojęcia czego. Dla lepszego rozeznania wrzucam jeszcze raz kod.

#define zielona 8
#define zolta 9
#define czerwona 10
#define przycisk 11
#define potencjometr A5
#define HIGH

int wylosowanaLiczba;
int Liczba;
byte szanse;
String podanaLiczba = "";
boolean START = true;

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

void loop() {
  if (START == true) {
    digitalWrite(zielona, LOW);
    digitalWrite(zolta, LOW);
    digitalWrite(czerwona, LOW);

    Serial.println("Nacisnij przycisk i przekręć potencjometr");
    delay(50);
    
    while (digitalRead(przycisk) == HIGH) {}
  }

  wylosowanaLiczba = analogRead(potencjometr);
  Serial.println("Podaj liczbę od 0 do 1000");

  //while(Serial.available() = 0); //Czekamy na podanie liczby
  if (Serial.available() > 0) {
    podanaLiczba = Serial.readStringUntil('\n');
    Liczba = podanaLiczba.toInt();

    if ((wylosowanaLiczba - Liczba <= 50) && (wylosowanaLiczba - Liczba >= -50)) {
      digitalWrite(zielona,HIGH); // zapal zieloną diodę

      Serial.println("Brawo odgadłeś liczbę");
      Serial.println("Jeżeli chcesz  zagrać jeszcze raz naciśnij przycisk");
      delay(50);

      while (digitalRead(przycisk) == HIGH) {}
      START = true;
    } else if (szanse > 0) {
      digitalWrite(zolta,HIGH);

      Serial.println("Źle, podaj inną liczbę!");
      szanse--; //Odejmij szansę
      Serial.println("Posiadasz jeszcze tyle szans");
      Serial.println(szanse);
      START = false;
    } else if (szanse = 0) {
      digitalWrite(czerwona,HIGH); //Zapal czerwoną diodę
      digitalWrite(zolta,LOW);
      Serial.println("Przegrałeś!");
      Serial.println("Jeżeli chcesz zagrać ponownie to naciśnij przycisk");
      delay(50);
      while (digitalRead(przycisk) == HIGH) {}
      START = true;
    }

  }

}

 

Link do komentarza
Share on other sites

6 godzin temu, ZwiewnyTrzmiel napisał:

No dobra coś pokombinowałem i problem który mi wskazałeś zniknął po dodaniu na początku kodu


#define HIGH

Tylko kompletnie nie rozumiem dlaczego to pomogło i czemu to było potrzebne.

Pytania:

Dlaczego wpadłeś na taki pomysł?

Dlaczego uważasz że to pomogło, skoro wskutek umieszczenia owej niewątpliwie genialnej linijki ilość błędów wzrosła do kilkudziesięciu?

6 godzin temu, ZwiewnyTrzmiel napisał:

Czegoś mu w tych miejscach brakuje tylko nie mam pojęcia czego.

To pomyśl:

Zdefiniowałeś HIGH jako 'nic', czyli napis o zerowej długości.

W programie masz przykładowo:

digitalWrite(zielona,HIGH)

Preprocesor dostaje nazwę HIGH, sprawdza, że zamiast niej ma podstawić string o długości zero, i z radością przekazuje kompilatorowi linijkę:

digitalWrite(zielona,);

Jak myślisz, czy tu czegoś nie brakuje?

Przy okazji: czytanie komunikatów błędów nie polega na wyłapywaniu ciągów cyferek oznaczających numer linii (bo niekoniecznie musi być to numer linii z błędem, czasem - jak widać - jest to jakaś linijka zawierająca deklarację przytoczona wyłącznie po to, aby nie trzeba było jej szukać po całym programie). Trzeba niestety czytać wszystko, te takie różne literki również. I nie ma że "nie znam angielskiego". Albo się tego angielskiego (w wersji uproszczonej do jakichś 300 słów) człowiek nauczy, albo zmienia hobby na hodowlę dyni.

Link do komentarza
Share on other sites

Moja propozycja rozwiązania zadania 4.5

Układ:

636987713_zadanie4_5.thumb.jpg.aa3f9186eeb5121340b1762b657017e4.jpg

 

Kod:

#define zielona 8
#define czerwona 9
#define zolta 10
#define potencjometr A5
#define przycisk 11

String wpisanaWartosc = ""; //Wartość wpisana przez gracza
int liczba = 0; //Wartość wpisana przez gracza zamieniona na liczbę
int wartoscUstawiona = 0; //Wartość odczytana z potencjometru
int proba = 0; //Licznik prób

void setup() {
  Serial.begin(9600); //Uruchomienie komunikacji
  
  pinMode(zielona, OUTPUT); //Ustawienie wyjść
  pinMode(czerwona, OUTPUT);
  pinMode(zolta, OUTPUT);

  pinMode(przycisk, INPUT_PULLUP);

  digitalWrite(zielona, LOW); //Wyłącznie diod
  digitalWrite(czerwona, LOW);
  digitalWrite(zolta, LOW);
}

void loop() {
  if (proba<3) { //Jeżeli licznik prób jest mniejszy od 3
    Serial.println("Przekręć potencjometr, a następnie naciśnij przycisk.");

    while (digitalRead(przycisk) == HIGH) {delay(50);} //Poczekaj na wiśnięcie przycisku
    
    wartoscUstawiona = analogRead(potencjometr); //Odczytanie wartości z potenjometru
    Serial.println("Podaj liczbę z zakresu od 0 do 1023."); //Wyświetlenie komunikatu

    while (Serial.available()==0){delay(50);} //Oczekiwanie na wprowadzenie wartości
    
    if (Serial.available()>0) { //Jeżeli wartość została wprowadzona
      wpisanaWartosc = Serial.readStringUntil('\n'); //Przeczytanie wartości wprowadzonej
      liczba = wpisanaWartosc.toInt(); //Konwersja wartości wprowadzonej na liczbę
      if ((liczba<wartoscUstawiona+50) and (liczba>wartoscUstawiona-50)) { //Jeżeli wprowadzona liczba mieści się w zakresie
        digitalWrite(zielona, HIGH); //Włączenie diody zielonej
        Serial.println("Wygrana."); //Wyświetlenie komunikatu informującego o wygranej
        Serial.println(wartoscUstawiona); //Wyświetlenie prawidłowego wyniku
        delay(2000);
        digitalWrite(zielona, LOW); //Wyłączenie diody
        delay(1000);
      } else { //Jeżeli wprowadzona wartość jest spoza zakresu
        digitalWrite(zolta, HIGH); //Włączenie żółtej diody
        Serial.println("Błąd."); //Wyświetlenie komunikatu informującego o błędnej wartośći
        delay(2000);
        digitalWrite(zolta, LOW); //Wyłączenie żółtej diody
        delay(1000);
        proba=proba+1; //Zwiększenie licznika prób
      }    
    }
  } else if (proba == 3) { //Jeżeli osiągnięto limit prób
    digitalWrite(czerwona, HIGH); //Włączenie czerwonej diody
    Serial.println("Przegrana."); //Wyświetlenie komunikatu informującego o przegranej
    Serial.println(wartoscUstawiona); //Wyświetlenie prawidłowego wyniku
    delay(2000);
    digitalWrite(czerwona, LOW); //Wyłączenie czerwonej diody
    delay(1000);
    proba = 0; //Zerowanie licznika prób
  }

}

 

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

@ewgron fajnie że robisz zadania domowe 🙂 

Przejrzałem kod i wygląda na to, że działa i jest całkiem ładnie napisany. Zastanawiam się tylko czy nie dałoby się pominąć jakoś powtórzenie Serial.available(). Tak też przyszłościowo, możesz spróbować napisać taką grę ale bez wykorzystania delay() 😉 może to być ciekawe wyzwanie.

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

1 godzinę temu, Gieneq napisał:

@ewgron fajnie że robisz zadania domowe 🙂 

Przejrzałem kod i wygląda na to, że działa i jest całkiem ładnie napisany. Zastanawiam się tylko czy nie dałoby się pominąć jakoś powtórzenie Serial.available(). Tak też przyszłościowo, możesz spróbować napisać taką grę ale bez wykorzystania delay() 😉 może to być ciekawe wyzwanie.

Dzięki za opinię 🙂

Ciekawa sugestia do przemyślenia 🙂

Przyznam, że na początku sceptycznie podchodziłem do Arduino ale już teraz czuję, że zaczyna mnie wciągać. I moim zdaniem prawdą jest, że trzeba wykonywać dużo ćwiczeń praktycznych - nauka przez rozwiązywanie problemów jest skuteczna i sprawia dużo frajdy 🙂

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

Mam na imię Tobiasz ,mam 9 lat. Mam problem w ćwiczeniu wskażnik na diodach.żadna diody nie chcę działać mino prądu.Oto podłączenie mojego układu.         

                                                                                                                                                                                                                                                                                                                                                  20200707_162304.thumb.jpg.a8fc7d22c4c42e8727ce530b713c354b.jpg    20200707_162307.thumb.jpg.720bdffbda2cc7f7e1ba256969a5271a.jpg                                                             

Link do komentarza
Share on other sites

Witam. Bardzo fajny kurs. Jednakże nie znalazłem obiecanego wyjaśnienia dlaczego pomiar z adc jest "bardzo niedokładny". Że screena widać że odczyty są takie same, nie bujają, są stabilne. Moim zdaniem nie ma powodu dla którego miałby być nie dokładny, chyba że fabrycznie jest słabo zrobiony (nie zaglądałem do datasheet). Proszę o odpowiedź z uzasadnieniem. Pozdrawiam.

Link do komentarza
Share on other sites

Dzień dobry,

mam takie pytanie, bo chciałbym do układu ze sterowaniem częstotliwością migania diody dołączyć 2 potencjometr, który w tym samym czasie regulowałby  moc świecenia tej diody. Dopiąłem do układu 2 potencjometr (środkowa nóżka pod A4), jednak nie za bardzo doszedłem do działającego rozwiązania i mam 2 małe problemy. Po 1, potencjometr z regulacją mocy nie działa płynnie, tylko zero-jedynkowo i zmiana jest na zasadzie "świeci/nie świeci". A 2 rzecz, nie mogę dojść do momentu, by te 2 potencjometry działały równocześnie, albo działa jeden, albo drugi. Będę bardzo wdzięczy za jakiekolwiek wskazówki, jestem początkujący i pewnie coś robię źle.

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

@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
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.