Skocz do zawartości

Pomocna odpowiedź

(edytowany)

@karolina-S super, wygląda bardzo czytelnie 🙂 

Możesz jeszcze spróbować włożyć ustawienia LED do tablic. Jest to co prawda w innym kursie ale w ramach dodatku warto żebyś na to spojrzała 😉 

Edytowano przez Gieneq
  • 3 tygodnie później...

Cześć, zaczynam z arduino dzięki waszym kursom i mam pytanie odnośnie warstwy "programowej" - czy są jakieś sposoby na debuggowanie kodu step-by-step jak c++? "Kompilacja" w arduino nie pozwala na stwierdzenie czy np zmienna lokalna w środku kodu ma prawidłowo przypisaną wartość i nie ma wglądu do tego co się dzieje po kolei co jest (w moim odczuciu) strasznym utrudnieniem. Z kursu i tak korzystam bardziej pod kątem sprzętowym, trochę programowania było na studiach i samo napisanie programu nie stanowi problemu, niemniej prześledzenie go już tak. Pozdrawiam autorów kursu za sporo cennej wiedzy.

@Snerg witam na forum 🙂 

Niestety nie ma takiej opcji. Debugowanie wymaga jakiegoś sposobu wglądu w pamięć, co wiąże się z dodatkowym układem peryferyjnym i interfejsem komunikacyjnym, którego proste 8biotwe AVRy nie mają.

Jeżeli potrzebujesz debuggera to pozostają32b mikrokontorlery jak np STM32LSTM32L4 4 do którego niedawno wydaliśmy kurs.

  • 2 tygodnie później...
(edytowany)

4.5 Działa, ale nie zupełnie tak jak bym chciał, i skończyły mi się pomysły jak to rozwiązać. Chodzi o moment włączania diody czerwonej - jednocześnie wykonuje mi się cały kod do włączania diody żółtej. Próbowałem wpisać warunek do diody żółtej else if (proba < 3), co miało zapobiec wykonywaniu dane go kodu, gdy wykorzystano więcej niż 2 "szanse"  ale nic to nie dało🤔

#define zielona  2
#define zolta  3
#define czerwona  4
#define swicz  7

int proba = 0; // Szansa
String liczbaWpisana = ""; // Komunikat w terminalu
int los = 0; // Wartosc odczytana z potencjometru
int liczba = 0;

void setup() {
  Serial.begin(9600); // Komunikacja z terminalem USART
  pinMode(2, OUTPUT); // Konfiguracja wyjsc
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(7, INPUT_PULLUP);

  digitalWrite(zielona, LOW); // Zadna z diod nie swieci
  digitalWrite(zolta, LOW);
  digitalWrite(czerwona, LOW);
}

void loop() {
  if (digitalRead(swicz) == LOW) { // Gdy swicz zotał wcisniety
    Serial.println("Podaj liczbe"); // Wyswietl komunikat
    delay(500); // Niwelacja zaklucen
  }
  if (Serial.available() > 0) { // Gdy liczba zostala podana
    liczbaWpisana = Serial.readStringUntil('\n'); // Odczyt i zapis jako "liczba"
    liczba = liczbaWpisana.toInt(); //Rzutowanie tekstu na liczbe
    los = analogRead(A5); // Odczyt wartosci z ADC (potencjometr)
    Serial.println(liczba); // Wyswietl podana liczbe w terminalu

    if (liczba - los <= 50 && liczba - los >= -50) { // Gdy odczyt z potecjometru i podana liczba mieszcza sie w zakresie tolerancji 50
      digitalWrite(zielona, HIGH); // Wlacz diode zielona na 1,5 sek
      delay(1500);
      digitalWrite(zielona, LOW);
      Serial.println("Gratulacje, gramy dalej !\n Wylosoana liczba to"); // Wyswietl komunikaty w monitorze szerogowym
      Serial.println(los);
      proba = 0; // Zerujemy licznik szans

    } else { // W przeciwnym wypadku gdy masz jesz szanse do wykorzystania wlaczdiode zolta na 1,5 sek
      digitalWrite(zolta, HIGH);
      delay(1500);
      digitalWrite(zolta, LOW);
      Serial.println("Nie trafiles\n Wylosoana liczba to"); // Wyswietl odpowiedni kmunikaty w monitorze
      Serial.println(los);
      proba = proba + 1; // Rejestracja wykorzystania jednej szansy
      delay(50); // Niwelacja zaklucen

    } if (proba == 3) { // Gdy zostana wykorzystane 3 proby
      digitalWrite(czerwona, HIGH); // Wlacz diode czerwona na 1.5 sek
      delay(1500);
      Serial.println("Przegrales, zacznij od nowa"); // Wyswietl odpowiedni komunikat w monitorze
      digitalWrite(czerwona, LOW);
      delay(50); // Niwelacja zaklucen

      while (digitalRead(swicz) == HIGH) {} // Czakamy na wcisniecie przycisku
      delay(50); // Niwelacja zaklucen
    }
  }
}

 

Edytowano przez Vova

@Vova  po szybkim przejrzeniu potencjalnie dwa problemy:

pamiętaj, że "if ... else" to jest jeden blok. Ale kolejny "if" (nawet napisany w tej samej linijce tuż po nawiasie, czyli "...} if (..." to już kolejny blok, i warunki sprawdzane są niezależnie od poprzedniego "if ... else"

może prościej przykładem

    if (liczba - los <= 50 && liczba - los >= -50) { // Gdy odczyt z potecjometru i podana liczba mieszcza sie w zakresie tolerancji 50
      ... // to się wykona jeżeli prawdziwy jest powyższy warunek
    } else { // W przeciwnym wypadku gdy masz jesz szanse do wykorzystania wlaczdiode zolta na 1,5 sek
      ... // to się wykona w przeciwnym przypadku
    } if (proba == 3) { 
      ... // ale to się wykona jeżęli jest spełniony TYLKO warunek proba == 3, bez wzlędu na to się wydażyło w poprzednim if
    }
  

być może chodziło Ci jednak o konstrukcję "if ... else if ... else"

 

Drugi problem: zmienną "proba" na 0 ustawiasz tylko:

 - jeden raz przy ładowaniu programu

 - po odgadnięciu

i w żadnym innym przypadku. Pomyśl, czy nie powinieneś ustawiać też na końcu (po "Przegrales, zacznij od nowa"), bo bez tego od nowa nie zaczyna (ciągle wykonuje się tylko to co w "loop").

  • Lubię! 2

@pawelmb Dziękuję za za odpowiedź. Faktycznie proba = 0;  była w If(proba == 3)  tylko tyle razy przerabiałem ten kod że w końcu go zabrakło. 

9 godzin temu, pawelmb napisał:

} if (proba == 3) { ... // ale to się wykona jeżęli jest spełniony TYLKO warunek proba == 3, bez wzlędu na to się wydażyło w poprzednim if }

 No własnie o to mi chodzi że w tym if-ie wykonuje się też poprzedni else, czyli :

22 godziny temu, Vova napisał:

} else { // W przeciwnym wypadku gdy masz jesz szanse do wykorzystania wlaczdiode zolta na 1,5 sek digitalWrite(zolta, HIGH); delay(1500); digitalWrite(zolta, LOW); Serial.println("Nie trafiles\n Wylosoana liczba to"); // Wyswietl odpowiedni kmunikaty w monitorze Serial.println(los); proba = proba + 1; // Rejestracja wykorzystania jednej szansy delay(50); // Niwelacja zaklucen

  a według mnie nie powinien 🤔. Może nie do końca umiem przekazać o co mi chodzi...

  • 4 tygodnie później...

Cześć,

Przesyłam rozwiązanie zadania 4.4.

[code]
int odczytanaWartosc = 0; //zmienna do przechowywania odczytu ADC
int prog = 0; //Prog wlaczenia swiatla - ustawiamy potencjometrem
float napiecie = 0; //Wartosc przeliczana na napiecie w V


void setup() {
  // put your setup code here, to run once:
  pinMode(8, OUTPUT); //Konfiguracja wyjsc pod diode LED
  Serial.begin(9600); //Uruchomienie USART
}

void loop() {
  // put your main code here, to run repeatedly:
  odczytanaWartosc = analogRead(A5); //Odczytanie wartosci z ADC
  napiecie = odczytanaWartosc * (5.0 / 1024.0); //Przeskalowanie wartosci
  prog = analogRead(A4); //Odczytanie wartosci z ADC

  if (odczytanaWartosc < prog) { //czy jest ciemniej od ustawionego progu?+-
    digitalWrite(8, HIGH); //Wlaczenie diody
    Serial.println(napiecie);// Wysyłamy zmierone napiecie
    while (analogRead(A5) < prog) { //Zaprzestanie wysylania wskazania napiecia; wyslanie tylko jeden raz
    }
  } else {
    digitalWrite(8, LOW); //Wylaczenie diody
  }
  delay(25);
}
[/code]

Chyba wszystko działa jak trzeba, jednak miałem z jednym elementem (pętla while) mały problem. Chyba dzięki niemu lepiej zrozumiałem ten aspekt.

Po analizie wpisów na tym forum mam czasem wrażenie, że być może program jest zbyt "łopatologiczny" i zastanawiam się, czy ten kurs jest do przejścia dla osoby, która nigdy nie miała styczności z programowaniem, szczególnie, że w jednej z wiadomości autor odpowiedzi wprost napisał, że bez znajomości C nie ma sensu brać się za Arduino.

18 minut temu, ebucior napisał:

że bez znajomości C nie ma sensu brać się za Arduino.

Jest sens bo pisanie na arduino to wkoncu pisanie w C/C++ z tym ze arduino dostarcza roznych prostych funkcji i "skrutow"...co nie zmienia faktu ze przeczytac jakas dobra ksiazke o C i tak trzeba bedzie w przyszlosci zeby zapchac wszystkie luki o ktorych rzadko sie wspomina, lub wcale w kontekscie Arduino...a informacje te beda niezbedne do dalszego dzialania...

Powiem tak: na początek wystarcza znajomość podstaw C/C++ (no, ale programowanie pralki też wymaga podstawowej wiedzy o tym, w jakiej temperaturze pierze się gacie i skarpetki, i czy można prać razem).

Reszta przychodzi z czasem.

  • 2 tygodnie później...

Hej, oto fragment kodu:

void loop() {
  A = analogRead(A0);
  V=map(A, 0, 1023, 0, 5);
  Serial.println(V);
  Serial.println(A);

A to przykładowo otrzymane informacje przez UART:

845
4.00
848
4.00
848
4.00
847
4.00
847

Pytanie czy funkcja map() zawsze zwraca liczby całkowite?

Pozdrawiam.

(edytowany)

map() wewnętrznie działa na long int. W bibliotece nie ma odpowiednika dla floatów, ale możesz znaleźć kod funkcji map i stworzyć własną fmap. Kiedyś coś na ten temat było na forum, ale teraz nie mogę znaleźć.

Potraktuj to jako dodatkowe ćwiczenie - na pewno znajomość rozwiązania kiedyś się przyda.

Edytowano przez ethanak
  • Pomogłeś! 1

Czy to nie powinno być coś w tym stylu:

float mapFloat(float value, float fromLow, float fromHigh, float toLow, float toHigh) {
  return (value - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow; 
}

Nie mam jak sprawdzić, czy na pewno działa, bo jestem u teściow bez dostępu do komputera... 

  • Lubię! 1
1 godzinę temu, ethanak napisał:

Ćwiczenie miało polegać na znalezieniu kodu źródłowego funkcji. 

Ćwiczenie nadal można wykonać. 😉

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