Skocz do zawartości

Kurs Arduino - #4 - Przetwornik ADC


Pomocna odpowiedź

Dnia 26.07.2021 o 07:56, Gieneq napisał:

w warunkach zrób nawiasy żeby dla pewności odgrodzić porównania wartości


 while (Serial.available() == 0);

Spróbuj się tego pozbyć, albo zamień tylko na odbieranie danych a nie oczekiwanie.

Dzięki za wcześniejsza odpowiedź

Niezbyt rozumiem gdzie dokładnie dołożyć tych nawiasów i jakie to mają być nawiasy.

 

Nie mam też niestety pomysłu na pozbywanie się mojego sposobu na oczekiwanie -

Pomógł byś?

Link to post
Share on other sites

@Jakub_St ciekawe, możesz poczytać o tym jak zamieniać sygnały cyfrowe na analogowe, może to pomoże. Tematy jak "Arduino DAC", "resstor ladder" lub po polsku "drabinka rezystorowa" mogą być trafne 😉 W przypadku drabinki rezystorów każdy rezystor (bit) ma na wyjściu inny rezystor który wnosi swój prąd do sumy we wspólnym węźle. Im bardzie znaczący bit tym większy prąd jest wnoszony.

 

@YURYS coś takiego np:

 //while (Serial.available() == 0);
 // if (pot - stringGracza  <= 50 and pot - stringGracza >= -50) {
 //   Serial.println ("wygrałes");  
 // }

 while (Serial.available() == 0);

  if ((pot - stringGracza  <= 50) && (pot - stringGracza >= -50)) {
    Serial.println ("wygrałes");  
  }

Tak teraz patrzę na nazwy zmiennych, nie wpływa to na logikę ale jest nieczytelne, bo te nazwy są najwidoczniej zamienione:

liczbaGracza = Serial.readStringUntil('\n');
stringGracza = liczbaGracza.toInt(); // zamieniamy zmienną string na int

 

  • Pomogłeś! 1
Link to post
Share on other sites

Moje rozwiązanie zadania 4.5

#define red_LED 8
#define yellow_LED 9
#define green_LED 10
#define button 3

int potentiometerValue; //wartość odczytana z potencjometru
int readValue; //wartość wpisana przez użytkownika
int attempt = 1; //która próba

void setup() {
  Serial.begin(9600);

  pinMode(red_LED, OUTPUT);
  pinMode(yellow_LED, OUTPUT);
  pinMode(green_LED, OUTPUT);
  pinMode(button, INPUT_PULLUP);

  digitalWrite(red_LED, LOW);
  digitalWrite(yellow_LED, LOW);
  digitalWrite(green_LED, LOW);

  Serial.println("Cześć! Zagrajmy w grę!");
  Serial.println("Przekręć potencjometr i wciśnij przycisk");
}

void loop() {
  while (digitalRead(button) == HIGH) {}

  potentiometerValue = analogRead(A5);
  Serial.println("Podaj liczbę od 0 do 1023:");

  digitalWrite(red_LED, LOW);
  digitalWrite(yellow_LED, LOW);
  digitalWrite(green_LED, LOW);

  while (Serial.available() == 0) {} // czekaj, dopóki nie będzie danych

  readValue = Serial.readStringUntil('\n').toInt();

  if ((readValue - 50 <= potentiometerValue) && (readValue + 50 >= potentiometerValue)) {
    digitalWrite(red_LED, LOW);
    digitalWrite(yellow_LED, LOW);
    digitalWrite(green_LED, HIGH);

    Serial.println("Brawo! Wygrana!");
  } else if (attempt == 3) {
    digitalWrite(red_LED, HIGH);
    digitalWrite(yellow_LED, LOW);
    digitalWrite(green_LED, LOW);

    Serial.println("Niestety, przegrana!");
  } else {
    digitalWrite(red_LED, LOW);
    digitalWrite(yellow_LED, HIGH);
    digitalWrite(green_LED, LOW);

    Serial.println("Spróbuj jeszcze raz!");
    Serial.println("Przyciśnij przycisk i wpisz nową liczbę.");
    attempt++;
  }
}

Nie wiem, ile miałam podejść do tego zadania, ale w końcu się udało 🙂

Brave Luulia-Kieran.png

  • Lubię! 2
Link to post
Share on other sites
(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
Link to post
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

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 to post
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 to post
Share on other sites

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

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.