Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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

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

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
Link do komentarza
Share on other sites

@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
Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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