Skocz do zawartości

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.

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;
    }

  }

}

 

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.

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

@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
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
  • 1 miesiąc później...

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                                                             

@Tobitobiasz44 kod wygląda dobrze. A czy jak wgrasz program który tylko świci diodami, bez mierzenia, funkcji map i tym podobnych to też nie działa? W funkcji setup po prostu napisz pinMode...OUTPUT i digitalWrite z HIGH.

  • Lubię! 1

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.

@Karol_w1985 jest tu porównanie z multimetrem - w porównaniu z nim ADC mikrokontrolera jest dość niedokładne. Nie ma tu żadnego wyrafinowanego filtrowania sygnału, sam przetwornik nie jest bardzo dokładny - 10 bit.

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.

(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
(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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...