Skocz do zawartości
Komentator

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

Pomocna odpowiedź

html_mig_img
Pora na obiecaną, dodatkową część naszego kursu Arduino. Tym razem zajmiemy się kilkoma rzeczami, które usprawnią programowanie.Mowa między innymi o łączeniu warunków oraz losowaniu liczb. Sprawdzimy również, jak łatwo informacje, które trafiają do PC przedstawić w formie wykresu!

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

Udostępnij ten post


Link to post
Share on other sites

Świetny kurs 😉! Już nie mogę doczekać się kolejnej części!

Wielkie dzięki za inspiracje do uC 😉!

//zadanie 1
int wartosc1;//wartosc pierwszego fotorezystora
int wartosc2;//wartosc drugiego fotorezystora

void setup() {
 // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
 // put your main code here, to run repeatedly:
wartosc1 = analogRead(A0);
wartosc2 = analogRead(A1);
if(wartosc1>1200) wartosc1=1200;
if(wartosc2>1200) wartosc2=1200;
Serial.print(wartosc1);
Serial.print("\t");
Serial.print(wartosc2);
Serial.print("\t");
Serial.println(" ");
delay(100);

}

Jeśli ziarno będzie to samo to i plon się nie zmieni 😉

//zadanie 2
void setup() {
 // put your setup code here, to run once:
Serial.begin(9600);
randomSeed(5);
}

void loop() {
 // put your main code here, to run repeatedly:
int liczbaRandom=random(500);
Serial.println(liczbaRandom);
delay(100);
}
//zadanie 3
#define przycisk 6
int wynik;
void setup() {
Serial.begin(9600);
pinMode(przycisk,INPUT_PULLUP);
randomSeed(analogRead(A0));
while (!Serial) delay(50);
}

void loop() {
if(digitalRead(przycisk)==LOW)
{
wynik=random(6)+1;
Serial.println(wynik);
}
delay(2000);//możliwe losowanie co 2s
}
//zadanie 4
void setup() {
 Serial.begin(9600);
 while (!Serial) delay(50);
 randomSeed(analogRead(A0));
}

void loop() {
 int liczbaLosowana = random(101);
 Serial.print("Twoja liczba to ");
 Serial.println(liczbaLosowana);
 if (liczbaLosowana < 10 && liczbaLosowana > 90)
 {
   Serial.println("Twoja liczba spelnia warunek 1");
 }
 if ((liczbaLosowana > 50 && liczbaLosowana < 70) || (liczbaLosowana > 85 && liczbaLosowana < 90))
 {
   Serial.println("Twoja liczba spelnia warunek 2");
 }
 if (liczbaLosowana == 50 || liczbaLosowana == 40 || liczbaLosowana == 30 || liczbaLosowana == 20)
 {
   Serial.println("Twoja liczba spelnia warunek 3");
 }
 if ((liczbaLosowana >= 10 && liczbaLosowana <= 40) || (liczbaLosowana >= 60 && liczbaLosowana <= 100))
 {
   Serial.println("Twoja liczba spelnia warunek 4");
 }
 Serial.println(" ");
 delay(2000);
}

Udostępnij ten post


Link to post
Share on other sites

Czaro, super! Pilnuj tylko wcięcia, bo czasami zrobiłeś je lepiej, a czasami gorzej 🙂

Wzoruj się na Twoim ostatnim programie, tam wszystko wygląda bardzo dobrze!

Udostępnij ten post


Link to post
Share on other sites

Treker Ctrl+T zapomniałem na końcu dołączyć 😉

Udostępnij ten post


Link to post
Share on other sites

Znając zakres, w którym będziemy dokonywać pomiarów możemy znacznie ograniczyć pojawanie się błędów na wykresie. Wystarczy, że zamiast błędnie zmierzonej wartości wyświetlimy poprzednią.

#define trigPin 12
#define echoPin 11
int zmierzona=0; // zmierzona wartość
int odl=0; // wyświetlana odlagłość
void setup() 
{
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
 pinMode(echoPin, INPUT); //a echo, jako wejści
 pinMode(13, OUTPUT);
}

void loop() 
{
 delay(100);
 zmierzona = zmierzOdleglosc();
 if (zmierzona < 200) // czy zmierzona wartość mieści się w zakresie
 {
   odl = zmierzona;
 }
 Serial.println(odl);
}
int zmierzOdleglosc()
{
 long czas, dystans;
 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW); 
 czas = pulseIn(echoPin, HIGH);
 dystans = czas / 58;
 return dystans;
}

Udostępnij ten post


Link to post
Share on other sites

VVasyl, zgadza się, jest to jedna z form filtrowania. Nie chciałem jednak na tym etapie jeszcze wchodzić w te kwestie, ponieważ w przyszłości przyda się pewnie całkiem osobny odcinek o filtrowaniu różnych wartości 🙂

Udostępnij ten post


Link to post
Share on other sites

10.1

Zmieniając

randomSeed(analogRead(0));

na np.

randomSeed(2);

nie zaobserwowałem żadnej różnicy w działaniu programu. W przypadku, gdy ziarno było jakąś stałą liczbową nie udało mi się znaleźć, żadnego schematu generowania liczb losowych przy kolejnych próbach włączenia programu.

10.2

void setup()
{
Serial.begin(9600);
pinMode(9, INPUT_PULLUP);
randomSeed(analogRead(0));
}

void loop()
{
  while (digitalRead(9) == HIGH)
  {
     //Zatrzymujemy się w pustej pętli
     delay(100); //W pętli wprowadzamy małe opóźnienie, aby niwelować zakłócenia
  }
 Serial.println(random(1,7)); // kostka o polach 1-6
 delay(200); // opóźninienie by nie losować więcej niż jednej liczby na raz
}

Udostępnij ten post


Link to post
Share on other sites
nie zaobserwowałem żadnej różnicy w działaniu programu. W przypadku, gdy ziarno było jakąś stałą liczbową nie udało mi się znaleźć, żadnego schematu generowania liczb losowych przy kolejnych próbach włączenia programu.

Ziarno nie służy do zmiany "schematu generowania liczb". Zerknij do artykułu jeszcze raz. Podpowiem, że odpowiada ono za początek działania generatora. Sprawdź, co dzieje się dla obu przypadków, gdy kilka razy uruchomisz ten sam program.

Udostępnij ten post


Link to post
Share on other sites

Włączyłem program ponownie i działa tak jak można było się tego spodziewać. Nie mam pojęcia, dlaczego wczoraj mimo stałej użytej jako ziarno dostawałem przy każdym włączeniu programu inne wyniki. Bardzo fajny artykuł, udało mi się w końcu przez niego przebrnąć (trzecie podejście!). Fajnie jak w tekście pojawiają się linki (np. do Wikipedii) rozszerzające zagadnienie.

Udostępnij ten post


Link to post
Share on other sites

VVasyl, super - cieszę, ze się udało. Może poprzednio przez przypadek nie skompilowałeś najnowszej wersji programu. Czasami się zdarza. Grunt, abyś pamiętał na przyszłość, jakie jest poprawne zachowanie takiego programu 🙂

Udostępnij ten post


Link to post
Share on other sites

Miałem problem z chińskim HC-SR04, zawieszał się i ciągle otrzymywałem 0 jako odległość.

Na szczęście znalazłem już sposób opisany przez kogoś na wykopie, problem rozwiązuje ten kawałek kodu:

if (dystans == 0) {
   pinMode(echoPin, OUTPUT);
   digitalWrite(echoPin, LOW);
   // mozliwe, ze mozna zejsc do mniejszych wartosci, mi to wystarczy, nie drazylem dalej
   // mozliwe tez, ze musisz ustawic tu wieksza wartosc, aby odwiesic czujnik
   delay(20);
   pinMode(echoPin, INPUT);    
 }

Myślę, że może komuś się przydać.

Udostępnij ten post


Link to post
Share on other sites
Czaro, super! Pilnuj tylko wcięcia, bo czasami zrobiłeś je lepiej, a czasami gorzej 🙂

Wzoruj się na Twoim ostatnim programie, tam wszystko wygląda bardzo dobrze!

Witam, przedstawiam moje zadanie nr.10.4 punkt:1

# define przycisk 8
int liczba;

void setup() {
Serial.begin(9600);
pinMode(przycisk,INPUT_PULLUP);
randomSeed(analogRead(0)); //losowanie liczb od kazdej innej wartosci

}

void loop() {
int liczba = random(100)+1;

       if (digitalRead(przycisk) == LOW) { //jesli przycisk wcisniety

       if(liczba < 10 || liczba > 91){
       Serial.println(liczba);
       Serial.println("liczba jest mniejsza od 10 lub wieksza od 90");

   }
       else if(liczba == 10 ||  liczba == 90){
       Serial.println(liczba);
       Serial.println("Liczba jest rowna 10 lub 90");

   }

       else if(liczba > 11 && liczba < 79){
       Serial.println(liczba);
       Serial.println("Liczba ta jest od przedzialu od 11 do 79");

   }

       Serial.println(" ");
       delay(200); //opóznienie co 2 sekundy

}
}

I tu mam pytanie czy w takiej formie kod może być, i czy wcięcia mam prawidłowe....?

P.S Mam pytanie informacyjne dotyczące odpowiedzi na komentarze, pytanie z działu elektroniki cz.1 (diody). Niekiedy cofam się do elektroniki jak czegoś nie jestem pewny, staram się być na bieżąco z wiedzą. Dałem zapytanie, ale komentarze są z 2015r, a nie chcę dawać zapytań w dziale "Arduino"...

Udostępnij ten post


Link to post
Share on other sites

piotrino, nad wcięciami warto jeszcze popracować. Zobacz jak to wyglądało w kursie 🙂

Jak robisz tak:

    } 

       else if(liczba > 11 && liczba < 79){ 
       Serial.println(liczba); 
       Serial.println("Liczba ta jest od przedzialu od 11 do 79"); 

   } 

To kiedyś rozpędu przy edycji programu dopiszesz sobie coś tutaj:

    } 
       TUATAJ <<
       else if(liczba > 11 && liczba < 79){ 
       Serial.println(liczba); 
       Serial.println("Liczba ta jest od przedzialu od 11 do 79"); 

   } 

I będzie sypało błędami. Lepiej nie zostawiać takich linijek, w które można później przypadkiem "wstrzelić kod". Lepiej robić else w tej samej linii co nawias zamykający:

    } else if(liczba > 11 && liczba < 79){ 
       Serial.println(liczba); 
       Serial.println("Liczba ta jest od przedzialu od 11 do 79"); 
   } 

Od razu widać wtedy też, że warunek ma kontynuację. Nawias zamykający w pustym wierszu sugeruje (wzrokowo), że to koniec tego bloku programu.

P.S Mam pytanie informacyjne dotyczące odpowiedzi na komentarze, pytanie z działu elektroniki cz.1 (diody). Niekiedy cofam się do elektroniki jak czegoś nie jestem pewny, staram się być na bieżąco z wiedzą. Dałem zapytanie, ale komentarze są z 2015r, a nie chcę dawać zapytań w dziale "Arduino"...

Odpowiedziałem już w tamtym temacie 🙂

Udostępnij ten post


Link to post
Share on other sites
piotrino, nad wcięciami warto jeszcze popracować. Zobacz jak to wyglądało w kursie 🙂

Jak robisz tak:

    } 

       else if(liczba > 11 && liczba < 79){ 
       Serial.println(liczba); 
       Serial.println("Liczba ta jest od przedzialu od 11 do 79"); 

   } 

To kiedyś rozpędu przy edycji programu dopiszesz sobie coś tutaj:

    } 
       TUATAJ <<
       else if(liczba > 11 && liczba < 79){ 
       Serial.println(liczba); 
       Serial.println("Liczba ta jest od przedzialu od 11 do 79"); 

   } 

I będzie sypało błędami. Lepiej nie zostawiać takich linijek, w które można później przypadkiem "wstrzelić kod". Lepiej robić else w tej samej linii co nawias zamykający:

    } else if(liczba > 11 && liczba < 79){ 
       Serial.println(liczba); 
       Serial.println("Liczba ta jest od przedzialu od 11 do 79"); 
   } 

Od razu widać wtedy też, że warunek ma kontynuację. Nawias zamykający w pustym wierszu sugeruje (wzrokowo), że to koniec tego bloku programu.

P.S Mam pytanie informacyjne dotyczące odpowiedzi na komentarze, pytanie z działu elektroniki cz.1 (diody). Niekiedy cofam się do elektroniki jak czegoś nie jestem pewny, staram się być na bieżąco z wiedzą. Dałem zapytanie, ale komentarze są z 2015r, a nie chcę dawać zapytań w dziale "Arduino"...

Odpowiedziałem już w tamtym temacie 🙂

Jeszcze raz wielkie DZIĘKI za uwagi i pomoc 🙂

Udostępnij ten post


Link to post
Share on other sites

Mam pytanie.

Na początku artykułu, przy okazji wykresów jest mowa o najnowszej wersji IDE.

Która jest nowsza:

- 1.6.9 z Arduino.cc

- 1.7.10 z Arduino.org

Zainstalowałem większy numerek, ale opcji "Monitor portu szeregowego" w niej nie ma, jest tylko "Monitor szeregowy" czyli zwykły terminal.

Jak zrobić wykres?

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!

Gość
Napisz odpowiedź...

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