Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

(edytowany)
2 godziny temu, Gieneq napisał:

@ZwiewnyTrzmiel witam na forum 🙂 

Ciężko coś powiedzieć, co na pewno rzuciło mi się w oczy to nieprawidłowy warunek:


if (START = true)

Tu trzeba zamienić na operator porównania ==, ale nie jest to powód do nieskompilowania kodu.

A możesz przekopiować cały wynik? Przycisk znajdziesz na pomarańczowym tle tak ja na screenshocie:

image.thumb.png.790e400f1ce51d0a3f8f4226387b7a98.png

Albo po prostu

if (START)
{
}

Dla wyjaśnienia - if "wchodzi" w kod, jeśli to co w nawiasie nie wyjdzie 0, czyli jeśli bedzie START jako false to będzie 0 i "pomija", a jeśli jako true, to będzie 1 i wykonuje. Tak możesz na przyszłość uniknąć takich błędów 😜

Edytowano przez BananWszyscy
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
Dnia 13.05.2020 o 07:17, Gieneq napisał:

@ZwiewnyTrzmiel witam na forum 🙂 

Ciężko coś powiedzieć, co na pewno rzuciło mi się w oczy to nieprawidłowy warunek:


if (START = true)

Tu trzeba zamienić na operator porównania ==, ale nie jest to powód do nieskompilowania kodu.

A możesz przekopiować cały wynik? Przycisk znajdziesz na pomarańczowym tle tak ja na screenshocie:

image.thumb.png.790e400f1ce51d0a3f8f4226387b7a98.png

Zmieniłem operator na porównanie i nadal nic 😟 Błąd który mi wyrzuciło wygląda tak.

Cytat

 

Arduino:1.8.12 (Windows 8.1), Płytka:"Arduino Uno"

D:\Arduino\arduino-builder -dump-prefs -logger=machine -hardware D:\Arduino\hardware -tools D:\Arduino\tools-builder -tools D:\Arduino\hardware\tools\avr -built-in-libraries D:\Arduino\libraries -libraries C:\Users\Paweł\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=0X2341_0X0043 -ide-version=10812 -build-path C:\Users\PAWE~1\AppData\Local\Temp\arduino_build_107931 -warnings=none -build-cache C:\Users\PAWE~1\AppData\Local\Temp\arduino_cache_382737 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino5.path=D:\Arduino\hardware\tools\avr -verbose C:\Users\Paweł\Documents\Arduino\sketch_may12a\sketch_may12a.ino
D:\Arduino\arduino-builder -compile -logger=machine -hardware D:\Arduino\hardware -tools D:\Arduino\tools-builder -tools D:\Arduino\hardware\tools\avr -built-in-libraries D:\Arduino\libraries -libraries C:\Users\Paweł\Documents\Arduino\libraries -fqbn=arduino:avr:uno -vid-pid=0X2341_0X0043 -ide-version=10812 -build-path C:\Users\PAWE~1\AppData\Local\Temp\arduino_build_107931 -warnings=none -build-cache C:\Users\PAWE~1\AppData\Local\Temp\arduino_cache_382737 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.arduinoOTA.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.arduinoOTA-1.3.0.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.avrdude-6.3.0-arduino17.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc.path=D:\Arduino\hardware\tools\avr -prefs=runtime.tools.avr-gcc-7.3.0-atmel3.6.1-arduino5.path=D:\Arduino\hardware\tools\avr -verbose C:\Users\Paweł\Documents\Arduino\sketch_may12a\sketch_may12a.ino
Using board 'uno' from platform in folder: D:\Arduino\hardware\arduino\avr
Using core 'arduino' from platform in folder: D:\Arduino\hardware\arduino\avr
Detecting libraries used...
"D:\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-ID:\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "C:\\Users\\PAWE~1\\AppData\\Local\\Temp\\arduino_build_107931\\sketch\\sketch_may12a.ino.cpp" -o nul
Generating function prototypes...
"D:\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-ID:\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "C:\\Users\\PAWE~1\\AppData\\Local\\Temp\\arduino_build_107931\\sketch\\sketch_may12a.ino.cpp" -o "C:\\Users\\PAWE~1\\AppData\\Local\\Temp\\arduino_build_107931\\preproc\\ctags_target_for_gcc_minus_e.cpp"
"D:\\Arduino\\tools-builder\\ctags\\5.8-arduino11/ctags" -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives "C:\\Users\\PAWE~1\\AppData\\Local\\Temp\\arduino_build_107931\\preproc\\ctags_target_for_gcc_minus_e.cpp"
Kompilowanie szkicu...
"D:\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10812 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-ID:\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-ID:\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "C:\\Users\\PAWE~1\\AppData\\Local\\Temp\\arduino_build_107931\\sketch\\sketch_may12a.ino.cpp" -o "C:\\Users\\PAWE~1\\AppData\\Local\\Temp\\arduino_build_107931\\sketch\\sketch_may12a.ino.cpp.o"
In file included from C:\Users\PAWE~1\AppData\Local\Temp\arduino_build_107931\sketch\sketch_may12a.ino.cpp:1:0:

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

D:\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:40:14: error: lvalue required as left operand of assignment

 #define HIGH 0x1

              ^

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

D:\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:40:14: error: lvalue required as left operand of assignment

 #define HIGH 0x1

              ^

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

D:\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:40:14: error: lvalue required as left operand of assignment

 #define HIGH 0x1

              ^

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

exit status 1
Błąd kompilacji dla płytki Arduino Uno.

 

 

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
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;
    }

  }

}

 

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

@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

Udostępnij ten post


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

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

@Tobitobiasz44 wygląda dobrze, a czy mógłbyś wysłać kod programu?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Mój kod to 20200709_103534.thumb.jpg.839a8b9f0e8cd62ea7d418b8493cca7f.jpg20200709_103521.thumb.jpg.def3ee7a42376a0d713dd528c3181845.jpg

Edytowano przez Tobitobiasz44

Udostępnij ten post


Link to post
Share on other sites

@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

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


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

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