Skocz do zawartości

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

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

@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
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
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
(edytowany)
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
(edytowany)

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

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

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
(edytowany)
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
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 😉

9 minut temu, ethanak napisał:

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 😉

Oh, well! 🙂

@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"?

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