Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

2 godziny temu, mn860618 napisał:

 czy jest inne rozwiązanie ?

Rozwiazan jest cala masa .wszystko zalezy od tego co konkretnie chcesz osiagnac, w tym podany przykladzie jest tak jak mowisz ,z tym ze jest to wersja blokujaca i nic konkretnego nie zrobisz oprucz bawienia sie tym jednym guzikiem...

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

Po wielkich zmaganiach z Arduino publikuje wreszcie swoja wersje zad 4.5

#define rd 6
#define gn 7
#define yl 8
#define bl 9
#define sw1 10
String odebrane = "";
int odebrane_int = 0;
int wartosc_A5 = 0;
int var = 3;
boolean logika = true;

void setup() {
  Serial.begin(9600);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,INPUT_PULLUP);
  digitalWrite(bl,LOW);
  digitalWrite(yl,LOW);
  digitalWrite(rd,LOW);
  digitalWrite(gn,LOW);
}

void loop() {

      while(Serial.available() == 0)

if((logika == true) && (digitalRead(sw1) == HIGH)){
        digitalWrite(gn,LOW);
        digitalWrite(rd,LOW);
        digitalWrite(yl,LOW);
        delay(500);
        Serial.println("Przekrec potencjometr i nacisnij przycisk");
      while(digitalRead(sw1) == HIGH)
        wartosc_A5 = analogRead(A5);
        logika = false;
        Serial.println("Zgadnij wartosc z potencjometru 0-1023");
}

if((Serial.available() > 0) && (var == 3)){
  odebrane = Serial.readStringUntil('\n');
  odebrane_int = odebrane.toInt();
  
  if((odebrane_int - wartosc_A5 >= -50) && (odebrane_int - wartosc_A5 <= 50)){
        Serial.println("Trafiles wygrales, jesli chcesz zagrac od poczatku nacisnij przycisk.");
        digitalWrite(gn,HIGH);
      while(digitalRead(sw1) == HIGH)
        var = 3;
        logika = true;
        }
  
   else{
        Serial.println("Nie trafiles masz jeszcze 2 proby");
        digitalWrite(yl,HIGH);
        var--;  
        }
}

if((Serial.available() > 0) && (var == 2)) {
  odebrane = Serial.readStringUntil('\n');
  odebrane_int = odebrane.toInt();
  
  if((odebrane_int - wartosc_A5 >= -50) && (odebrane_int - wartosc_A5 <= 50)){
        digitalWrite(gn,HIGH);
        Serial.println("Trafiles wygrales, jesli chcesz zagrac od poczatku nacisnij przycisk.");
      while(digitalRead(sw1) == HIGH)
        var = 3;
        logika = true;
        }
  
  else{
        Serial.println("Nie trafiles masz jeszcze 1 probe");
        var--;  
        }
}

if((Serial.available() > 0) && (var == 1)) {
  odebrane = Serial.readStringUntil('\n');
  odebrane_int = odebrane.toInt();
  
  if((odebrane_int - wartosc_A5 >= -50) && (odebrane_int - wartosc_A5 <= 50)){
        digitalWrite(gn,HIGH);
        Serial.println("Trafiles wygrales, jesli chcesz zagrac od poczatku nacisnij przycisk.");
      while(digitalRead(sw1) == HIGH)
        var = 3;
        logika = true;
        }
  
  else{
        Serial.println("Nie trafiles, nacisnij przycisk by zagrac od poczatku.");
        digitalWrite(rd,HIGH);
        var--;  
        }
}


if(var == 0) {
      while(digitalRead(sw1) == HIGH)
        var = 3;
        logika = true;
        }   

}

 

Edytowano przez mn860618
optymalizacja kodu
  • Lubię! 1
Link do komentarza
Share on other sites

@mn860618 super! Często tkwi się wiele godzin w jednym miejscu aż w końcu udaje się 😄 to wielka radość. Drobna tylko uwaga, wiem że wiesz o co chodzi ale te definy nic nie mówią 😉 taki drobiazg. A tak to super i trzymaj tak dalej 💪

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

5 godzin temu, Gieneq napisał:

ale te definy nic nie mówią

Phi! Ja nawet nie wiedząc o czym jest kod, widzę, że to red, green, yellow, blue i switch 1. Chyba że mi się tylko wydaje ;). Na marginesie jednak skłaniałbym się do const niż preprocesora.

  • 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

22 minuty temu, trainee napisał:

 Ja nawet nie wiedząc o czym jest kod, widzę, że to red, green, yellow, blue i switch 1. Chyba że mi się tylko wydaje ;).

No tak..Ty o tym wiesz z doswiadczenia, a przyjdzie jakis Arduinowiec po trzech tygodniach i bedzie sie drapal po glowie co to za "zmienne"🤔 

 

24 minuty temu, trainee napisał:

Na marginesie jednak skłaniałbym się do const niż preprocesora.

Mozesz powiedziec czemu?😉

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

19 minut temu, farmaceuta napisał:

Mozesz powiedziec czemu?😉

Nie wiedziałbym raczej czemu używać preprocesora w miejscu czegokolwiek, co kompilator robi równie dobrze, a nawet lepiej. I w niektórych narzędziach C, gdzie preprocesor działa osobno od kompilatora, chociażby ewentualne błędy są tak nieczytelnie wyświetlane, że nie wiadomo o co chodzi (bo kompilator nic nie wie o kodzie przed filtracją przez preprocesor) i może głowa rozboleć od analizy. Kilka lat temu jeszcze tak było również w gcc. Nie podejrzewałbym co prawda, że szanujący się kompilator radzi sobie gorzej z optymalizacją wielu rozwinięć tego samego literału niż użycie jednej stałej, czyt. nie powinien powielić stringów czy liczb tam gdzie może być potrzeba je ładować z pamięci okazjonalnie (np. w ARM). Ot poczucie smaku, żeby ograniczać ozdabianie kodu preprocesorem.

Edytowano przez trainee
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Jeszcze do rozważania są przeciążenia funkcji w C++. Jeżeli masz dwie funkcje, jedną przyjmującą uint8_t, drugą int, to użycie const uint8_t wywoła odpowiednią do typu, bez wątpliwości czytelnika co się uruchomi dla jakiegoś makra.

Notabene dlatego dodano nullptr, bo makro NULL ma ten problem.

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

Podszedłem do zadania 4.6 od razu i o dziwo wyklarowało się... myślę że o to chodziło.

#define red1 8
#define red2 9
#define yellow 10
#define green1 11
#define green2 12
int wypadkowa = 0;
int read_A5 = 0;
int read_A4 = 0;

 
void setup() {
  Serial.begin(9600);
  pinMode(8, OUTPUT); 
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
}
 
void loop() {
  
    read_A5 = analogRead(A5);
    read_A4 = analogRead(A4);
    read_A5 = map(read_A5, 0, 1024, -2, 2);
    read_A4 = map(read_A4, 0, 1024, 2, -2);
    wypadkowa = read_A5 + read_A4; 
  
    Serial.print("wypadkowa =  ");
    Serial.println(wypadkowa);
  
  if (wypadkowa == -2) { 
      digitalWrite(red1, HIGH); 
      digitalWrite(red2, LOW); 
      digitalWrite(yellow, LOW); 
      digitalWrite(green1, LOW); 
      digitalWrite(green2, LOW); 
  } else if (wypadkowa == -1) { 
      digitalWrite(red1, LOW); 
      digitalWrite(red2, HIGH); 
      digitalWrite(yellow, LOW); 
      digitalWrite(green1, LOW); 
      digitalWrite(green2, LOW);    
  } else if (wypadkowa == 0) { 
      digitalWrite(red1, LOW); 
      digitalWrite(red2, LOW); 
      digitalWrite(yellow, HIGH); 
      digitalWrite(green1, LOW); 
      digitalWrite(green2, LOW);        
  } else if (wypadkowa == 1) {  
      digitalWrite(red1, LOW); 
      digitalWrite(red2, LOW); 
      digitalWrite(yellow, LOW); 
      digitalWrite(green1, HIGH); 
      digitalWrite(green2, LOW);     
  } else {  
      digitalWrite(red1, LOW); 
      digitalWrite(red2, LOW); 
      digitalWrite(yellow, LOW); 
      digitalWrite(green1, LOW); 
      digitalWrite(green2, HIGH);      
  }
  delay(50);   
}

  

  • Pomogłeś! 1
Link do komentarza
Share on other sites

W ramach takiego pro tipa mogę zalecić konstrukcje warunków w ten sposób 

if ( -2 == wypadkowa) instrukcja

Często na początku łatwo o błąd i zamiast == wstawiamy =

if ( wypadkowa = 2) instrukcja

Oczywiście kompilator nie zgłosi błędu bo czemu, ale program nie będzie działał poprawnie. Jednak gdy przyzwyczaimy się do takiej formy i zrobimy błąd typu:

if (-2 = wypadkowa)

to już kompilator zgłosi error bo takie wyrażenie nie ma prawa istnieć. 

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

3 godziny temu, Krawi92 napisał:

if ( -2 == wypadkowa) instrukcja

Nie, absolutnie nie i jeszcze raz nie. Obrzydliwe, kojarzy się z Javą i zwyczajem jej programistów na stała.equals(zmienna). Wskaż mi jakikolwiek znany projekt w C lub C++, który używa tak paskudnego stylu.

Dla uniknięcia popełniania tak elementarnych usterek, gdy jeszcze nie nabrałeś odruchów, w których napisanie czegokolwiek innego niż == jest po prostu niemożliwe, a i dla uniknięcia różnych innych, trudniejszych do wychwycenia, błędów, warto używać przełącznika -Wall kompilatora, a na etapie lokalnych testów (ale nie np. w Makefile projektu) również -Werror.

Przykładowo dla kodu:

void f()
{
	int x;
	if (x = 2)
		/* do nothing */;
}

clang z tymi argumentami pokaże:

<source>:4:8: error: using the result of an assignment as a condition without parentheses [-Werror,-Wparentheses]
        if (x = 2)
            ~~^~~
<source>:4:8: note: place parentheses around the assignment to silence this warning
        if (x = 2)
              ^
            (    )
<source>:4:8: note: use '==' to turn this assignment into an equality comparison
        if (x = 2)
              ^
              ==
1 error generated.
Compiler returned: 1

A gcc:

<source>: In function 'void f()':
<source>:4:15: error: suggest parentheses around assignment used as truth value [-Werror=parentheses]
    4 |         if (x = 2)
      |             ~~^~~
cc1plus: all warnings being treated as errors
Compiler returned: 1

clang generalnie jest lepszy jeśli chodzi o zrozumiałe komunikaty kompilatora, ale i tak zawstydzony nim zespół gcc w ostatnich latach mnóstwo poprawił, m.in. dodał kolorki i strzałki wskazujące miejsce błędu.

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

1 godzinę temu, trainee napisał:

a na etapie lokalnych testów (ale nie np. w Makefile projektu) również -Werror.

No, w przypadku Arduino to raczej nierealne z uwagi na niefrasobliwość autorów różnych wielce potrzebnych bibliotek, które sieją warningami na kilkadziesiąt linijek 😉

Link do komentarza
Share on other sites

@Krawi92, odpowiem, choć wnioskując po Twoim dotychczasowym zachowaniu tu i tam, podejrzewam, że ryzykuję, że i tak pójdziesz w zaparte.

Czy kiedykolwiek słyszałeś początek zdania w stylu "Jeśli 2 jest równe x..."? Czy sam w głowie w takim szyku myślałeś, rozważając rozwiązanie danego problemu?

Jeśli formułujesz jakieś tezy odnośnie czegoś, co poznałeś "wczoraj", to może lepiej by tak zacząć od jakiegoś zastrzeżenia, że Ty taką wersję przyjąłeś na początku nauki, że wydaje Ci się wygodne, że może być wygodne dla innych, a nie określać tego mianem "pro tip"?

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.