Skocz do zawartości
Komentator

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ć! 😅

Udostępnij ten post


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!

Udostępnij ten post


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

Udostępnij ten post


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ść 🙂

Udostępnij ten post


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 😉

Udostępnij ten post


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 😉

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@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

Udostępnij ten post


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

Udostępnij ten post


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 😉

Udostępnij ten post


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😀

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@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

Udostępnij ten post


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

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Stark Ok, dzięki że wyłapałeś błędy. Przyda się przy rewizji kursu 🙂 

Edytowano przez Gieneq

Udostępnij ten post


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