Skocz do zawartości

Kurs Arduino - #10 - wykresy, liczby losowe, warunki cd.


Pomocna odpowiedź

Zad 10.4

int wylosowanaliczba;

void setup() {
 pinMode(12, OUTPUT);
 pinMode(9, INPUT);
 Serial.begin(9600);
 randomSeed (analogRead(A5));
}

void loop() {
 wylosowanaliczba = random(0, 101);

 Serial.print("Wylosowana liczba: ");
 Serial.println(wylosowanaliczba);
 Serial.print("Czy liczba jest mniejsza od 10 lub wieksza od 90? ");
 Serial.println(odpowiedz1());
 Serial.print("Czy liczba jest wieksza od 50, ale nie jest z przedzialu <70;85>? ");
 Serial.println(odpowiedz2());
 Serial.print("Czy liczba jest rowna 20, 30, 40 lub 50? ");
 Serial.println(odpowiedz3());
 Serial.print("Czy liczba miesci sie w przedziale <10;40> lub <60;100>? ");
 Serial.println(odpowiedz4());
 Serial.println();
 Serial.println();
 delay(1000);
}

String odpowiedz1 () {
 if (wylosowanaliczba < 10 || wylosowanaliczba > 90) {
   return ("TAK");
 }
 else return ("NIE");
}


String odpowiedz2() {
 if (wylosowanaliczba > 50) {
   if (wylosowanaliczba >= 70 && wylosowanaliczba <= 85) {
     return ("NIE");
   }
   return ("TAK");
 }
 else return ("NIE");
}


String odpowiedz3() {
 if (wylosowanaliczba == 20 || wylosowanaliczba == 30 || wylosowanaliczba == 40 || wylosowanaliczba == 50) {
   return ("TAK");
 }
 else return ("NIE");
}


String odpowiedz4() {
 if ((wylosowanaliczba >= 10 && wylosowanaliczba <= 40) || (wylosowanaliczba >= 60 && wylosowanaliczba <= 100)) {
   return ("TAK");
 }
 else return ("NIE");
}

EDIT.

1 PYTANIE:

A propos wykresów! Te wbudowane w arduino IDE są okropne, nie pozwalają na jakiekolwiek skalowanie według własnych preferencji, zatrzymanie, dokładniejsze przeanalizowanie co do wartości, największej i najmniejszej wartości itd. itd. itd. Długo by wymieniać. Czy jest jakiś inny sposób na rysowanie wykresów?

2 PYTANIE:

Czy jest możliwość, aby np. moje arduino zbierało sobie załóżmy dane przez jakiś dłuższy czas i przechowywało je gdzieś w jakiejś pamięci nawet po wyłączeniu?

3 PYTANIE:

Prosty przykład: Zbieram przez całą noc dane dot. temperatury otoczenia. W jaki sposób mogę sprawić, aby moje arduino wysłało mi najwyższą wartość ze wszystkich jakie były do tej pory? Analogicznie również najmniejszą.

Z góry dziękuję za odpowiedzi i za cały kurs. Dzięki wam już nie mam wątpliwości co studiować! 😅

Link to post
Share on other sites
A propos wykresów! Te wbudowane w arduino IDE są okropne, nie pozwalają na jakiekolwiek skalowanie według własnych preferencji, zatrzymanie, dokładniejsze przeanalizowanie co do wartości, największej i najmniejszej wartości itd. itd. itd. Długo by wymieniać. Czy jest jakiś inny sposób na rysowanie wykresów?

Hmm, powiem tak, ja się cieszę, że taka możliwość w ogóle istnieje 😉 Te wykresy z założenia mają być prostą wizualizacją danych. Nie należy ich porównywać do żadnych rozbudowanych aplikacji. Jeśli zależy Ci na szczegółach, to najlepiej wysyłać przez UART dane w formie tekstowej, a następnie wciągnąć je do Excela lub Matlaba. Możesz też zainteresować się programem Processing: https://www.arduino.cc/en/Tutorial/Graph Przykład jego wykorzystania był też pokazny na Forbocie: Pierwsze starcie z Genuino 101 – wizualizacja położenia

Czy jest możliwość, aby np. moje arduino zbierało sobie załóżmy dane przez jakiś dłuższy czas i przechowywało je gdzieś w jakiejś pamięci nawet po wyłączeniu?

Zainteresuje się tematem podłączania kart SD - są do tego gotowe biblioteki 🙂

Prosty przykład: Zbieram przez całą noc dane dot. temperatury otoczenia. W jaki sposób mogę sprawić, aby moje arduino wysłało mi najwyższą wartość ze wszystkich jakie były do tej pory? Analogicznie również najmniejszą.

Informacje na ten temat znajdziesz w kursie Arduino, poziom II: Kurs Arduino II – #7 – termometry analogowe i cyfrowe. Jest tam dokładnie taki przykład.

Powodzenia w dalszej nauce!

Link to post
Share on other sites

zadanie 10.1

jest błąd w przykładzie jest ("") a powinno być ("\n") chyba że specjalnie 😉

#define fotorezystor1 A5
#define fotorezystor2 A4
float napiecie1 = 0;
float napiecie2 = 0;
void setup() {
Serial.begin(9600);

}

void loop() {
 napiecie1 = analogRead(fotorezystor1);
 napiecie2 = analogRead(fotorezystor2);
 napiecie1 = napiecie1 *(5.0/1023.0);
 napiecie2 = napiecie2 *(5.0/1023.0);
 Serial.print(napiecie1);
 Serial.print("\t");
 Serial.print(napiecie2);
 Serial.print("\t");
 Serial.print("\n");
 delay(500);


}

a tak działa (machając rekom)

a tak świecąc latarką

zadanie 10.2

Bedzie w kółko te same liczby pokazywać

zadanie 10.3

Troszkę unowocześnione

#define pomarancz 13// nadaje różnym pina nazwy
#define Pomarancz 12
#define zielony 11
#define zolty 10
#define Zolty 9
#define czerwony 8
#define Czerwony 7
#define przycisk 6
#define buzer 5
int losowy = 0;
int los = 0;
int czas = 0;
void setup() {
 Serial.begin(9600);// połączenie z komputerem
 Serial.println("Wciśnij przycisk by wylosować liczbę");
 randomSeed(analogRead(A0));// ziarno (punkt 1 losowania)
 pinMode(pomarancz, OUTPUT);// ustawiam wejścia wyjścia pinów
 pinMode(Pomarancz, OUTPUT);
 pinMode(zielony, OUTPUT);
 pinMode(zolty, OUTPUT);
 pinMode(Zolty, OUTPUT);
 pinMode(czerwony, OUTPUT);
 pinMode(Czerwony, OUTPUT);
 pinMode(przycisk, INPUT_PULLUP);
 pinMode(buzer, OUTPUT);

}
int losujemy(){
int losowy; 
losowy = random(1,7);// losuje od 1 - 6
delay (500);
return losowy;// podaje wynik    

}

void zadanie(){
 Serial.println("Wylosowana liczba");
 Serial.println(los);
 Serial.println("kolej następnego gracza");
 Serial.println("Wciśnij przycisk by wylosować liczbę");
}
void wyświetlenie(){
 while(czas < 500){
   delay(czas);
   digitalWrite(pomarancz, LOW);
   digitalWrite(Pomarancz, LOW);
   digitalWrite(zielony, LOW);
   digitalWrite(zolty, LOW);
   digitalWrite(Zolty, LOW);
   digitalWrite(czerwony, LOW);
   digitalWrite(Czerwony, LOW);
   los = losujemy();
   switch(los){
     case 1:// wylosowana liczba 1
     digitalWrite(zielony, HIGH);
     delay(czas);
     czas = czas +25;// <-- ustawiam kilka czasów by losował różnie
     break;
     case 2:// wylosowana liczba 2
     digitalWrite(pomarancz, HIGH);
     digitalWrite(Czerwony, HIGH);
     delay(czas);
     czas = czas +30;// <--
     break;
     case 3:// wylosowana liczba 3
     digitalWrite(pomarancz, HIGH);
     digitalWrite(zielony, HIGH);
     digitalWrite(Czerwony, HIGH);
     delay(czas);
     czas = czas +35;// <--
     break;
     case 4:// wylosowana liczba 4
     digitalWrite(pomarancz, HIGH);
     digitalWrite(Pomarancz, HIGH);
     digitalWrite(czerwony, HIGH);
     digitalWrite(Czerwony, HIGH);
     delay(czas);
     czas = czas +40;// <--
     break;
     case 5:// wylosowana liczba 5
     digitalWrite(pomarancz, HIGH);
     digitalWrite(Pomarancz, HIGH);
     digitalWrite(zielony, HIGH);
     digitalWrite(czerwony, HIGH);
     digitalWrite(Czerwony, HIGH);
     delay(czas);
     czas = czas +45;// <--
     break;
     case 6:// wylosowana liczba 6
     digitalWrite(pomarancz, HIGH);
     digitalWrite(Pomarancz, HIGH);
     digitalWrite(zolty, HIGH);
     digitalWrite(Zolty, HIGH);
     digitalWrite(czerwony, HIGH);
     digitalWrite(Czerwony, HIGH);
     delay(czas);
     czas = czas +50;// <--
     break;
   }
  }
}
void glosnik(){
 while(los > 0){
   los = los -1;
   digitalWrite(buzer, HIGH);
   delay(500);
   digitalWrite(buzer, LOW);
   delay(500);
 }
}
void loop() {
 if (digitalRead(przycisk) == LOW){// wciśniecie przycisku
   Serial.println ("Następuje losowanie");
   czas = 0;
   wyświetlenie();
   zadanie();
   glosnik();
}
}

tak wygląda

a tak działa

Link to post
Share on other sites
jest błąd w przykładzie jest ("")

Użyłem tam println, więc było poprawnie, ale dzięki za czujność 🙂

Link to post
Share on other sites

zadanie 10.4

void setup() {
Serial.begin(9600);
randomSeed(analogRead(A0));
Serial.println("Losowanie liczb od 0 do 100");
}
int losowanie(){
int los;
los = random(101);
delay(1000);
return los;
}
void loop() {
 losowanie();
 int los = losowanie();
 if((los < 10)||(los > 90)){
 Serial.println("opcja 1");
 Serial.println(los);
 }
 if((los > 50)&&(los < 70)||(los > 85)){
   Serial.println("opcja 2");
   Serial.println(los);
 }
 if ((los == 50)||(los == 40)||(los == 30)||(los == 20)){
   Serial.println("opcja 3");
   Serial.println(los);
 }
 if ((los > 10)&&(los < 40)||(los > 60)&&(los < 100)){
   Serial.println("opcja 4");
   Serial.println(los); 
 }


}

i Koniec zaczynam lekcję 2 😉

Link to post
Share on other sites

mistus, powodzenia w dalszej nauce! Pamiętaj na przyszłość o dodawaniu komentarzy do programów - będzie czytelniej dla każdego 😉

Link to post
Share on other sites

Zadanie 10.3

void setup() 
{
  Serial.begin(9600);
  pinMode(7, INPUT_PULLUP);
  randomSeed(analogRead(A0));
}
 
void loop() 
{
  if(digitalRead(7) == LOW)
  {
    Serial.println(random(1,7));
    delay(300);
  }
}

 

  • Lubię! 1
Link to post
Share on other sites

@ceiem super, rysowanie kilku wykresów działa i logika kosatki do gry też jest 🙂 Możesz jeszcze popróbować zapisać program tak, żeby po przytrzymaniu przycisku nie losowało cały czas nowych liczb - w zwykłej grze pewnie by to było uciążliwe 😞 ale tak to super, fajnie że robisz zadania dodatkowe! 🙂 

Edytowano przez Gieneq
  • Lubię! 2
Link to post
Share on other sites

"Takie tam" urządzenie do gry w Backgammona na zakończenie kursu - jako owoc kilkunastu świetnie spędzonych wieczorów. Zastępuje wiecznie spadające ze stołu "analogowe" kostki. Bardzo dziękuję za ten kurs (oraz inne kursy). Naprawdę, kawał dobrej roboty no i wartość edukacyjna jest nie do przecenienia. Szacun!

IMG_7625.jpg

IMG_7627.jpg

  • Lubię! 2
Link to post
Share on other sites

@Misioo gratuluję projektu i dziękuję za miłe słowa - cieszę się, że kurs był dla Ciebie pomocny i zachęcam do dalszych eksperymentów 😉

Link to post
Share on other sites

mam krótkie pytanie czyli jak połączyć warunki w funkcji sliczy przy komędzie "case x:"? czy to będzie coś w rodzaju "case 1 || 2:"?czy jak. bo arduino mam już podpięte do dosyć skomplikowanego układziku (autko na blutooth)  i nie wiem jak to trzeba zrobić.

Z góry dziękuje za odpowiedz😀

Link to post
Share on other sites

@pawomik2 witam na forum 🙂

Sprawdź czy coś z tego będzie pomocne. Pierwsze 2 casy to alternatywa, a ten w środku przedział dla warunków 2 lub 3 lub... lub 6.

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  int Answer = 0;
  switch ((Answer - 1) / 4)
  {
    case 0: case 1:
      pinMode(LED_BUILTIN, OUTPUT);
      break;
    case 2 ... 6:
      pinMode(LED_BUILTIN, OUTPUT);
      break;
    default:
      pinMode(LED_BUILTIN, OUTPUT);
  }
}

 

Edytowano przez Gieneq
Link to post
Share on other sites

Witajcie,

Znalazłem drobne błędy:

- połączenie dwóch wyrazów ze sobą funkcjarandom(); (Lokalizacja: Tekst pod niebieską ramką, pod obrazkiem z kostkami do gry)

Cytat

Za zwracanie losowej wartości odpowiedzialna jest funkcjarandom();, która może przyjąć dwa argumenty. Dzięki nim kształtujemy zakres, z jakiego losowane są liczby.

- złe komentarze w ostatecznym kodzie do programu z łączenia warunków; powinno być w zaznaczonych miejscach "Włącz/wyłącz diodę czerwoną" (Lokalizacja: kod programu nad nagłówkiem Praktyczny przykład - czujnik odległości)

void loop() {
  if (digitalRead(9) == LOW || digitalRead(10) == LOW) { //Jeśli przycisk pierwszy lub drugi
    digitalWrite(8, HIGH); //Włącz diodę zieloną
  } else {
    digitalWrite(8, LOW); //Wyłącz diodę zieloną
  }

  if (digitalRead(9) == LOW && digitalRead(10) == LOW) { //Jeśli przycisk pierwszy i drugi
    digitalWrite(7, HIGH); //Włącz diodę zieloną                                                  <--- BŁĄD
  } else {
    digitalWrite(7, LOW); //Wyłącz diodę zieloną                                                  <--- BŁĄD
  }
}

 

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

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.