Skocz do zawartości
Komentator

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

Pomocna odpowiedź

piret, niestety w chwili obecnej mamy jakby dwa równoległe środowiska - wszystko za sprawą rozłamu w ekipie Arduino. Opcja wykresów jest tylko w edytorze ze strony ".cc" - możesz śmiało używać tę wersję 🙂

Udostępnij ten post


Link to post
Share on other sites

Zadanie nr 1

float read1 = 0, read2 = 0;

void setup() {
Serial.begin(9600); // transmission start
while(!Serial) {};
}

void loop() {
 delayMicroseconds(2);
 read1=analogRead(A0)/204.8; // left fotoresistor(V)
 read2=analogRead(A1)/204.8; // right fotoresistor (V)
 Serial.print(read1); 
 Serial.print('\t');
 Serial.println(read2);
 delay(50);
}

I zdjątko monitora:

Zadanie 2. - dla niezmiennego seed'a nie zmienia się kolejność "randomowych" liczb. Jeśli ręcznie zmieniać seed'y - to oczywiście wszystko się zmienia.

Zadanie 3.

#define button 2
int x;
void setup() {
 Serial.begin(9600);
 pinMode(button, INPUT_PULLUP);
 randomSeed(analogRead(A0));
 while(!Serial);
}

void loop() {
 Serial.println("Push the button");
 while (digitalRead(button)!=LOW) {};
 x = random(1, 7);
 Serial.println(x);
 delay(1000);
}

Zadanie nr 4.1

int x = 0;

void setup() {
 Serial.begin(9600);
 randomSeed(analogRead(A0)); 
}

void loop() {
 x = random(0, 101);
 Serial.println(x);
 if (x<10 || x>90) {
 Serial.println("Number's meeting assumption");
 while(1) {};
 }
 else {
   Serial.println("Number isn't meeting assumption. Next try");
   delay(1000);
 }
}

Zadanie nr 4.2

if (x>50 && !(x<85 && x>70))

- zmiana warunku, reszta kodu identyczna

Zadanie nr 4.3

if (x==50 || x==40 || x==30 || x==20)

Zadanie nr 4.4

 if ((x>=10 && x<=40) || (x>=60 && x<=100))

Udostępnij ten post


Link to post
Share on other sites

PrimeSoul, super, życzę powodzenia w dalszej nauce kodowania 🙂

Udostępnij ten post


Link to post
Share on other sites
Dlatego zdecydowanie łatwiej będzie, gdy poznamy dwa operatory logiczne:

Suma logiczna – &&

Iloczyn logiczny – ||

Zdaje się, że w artykule są zamienione nazwy operatorów logicznych.

Udostępnij ten post


Link to post
Share on other sites

grg0, dziękuję za zawrócenie uwagi, zamienione 🙂

Udostępnij ten post


Link to post
Share on other sites

Dzień dobry,
w najnowszej wersji IDE nie ma Monitora Portu Szeregowego,
ale za to jest "Kreślarka".

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

krecik, witam na forum 🙂 Faktycznie, wprowadzono taką zmianę, ale aktualizację w kursie zrobię dopiero za jakiś czas - czekam, aż "uspokoi" się sytuacja z IDE Arduino. Liczę, że wreszcie znów będzie tylko jedna wersja IDE, wtedy odświeżę informacje w całym kursie.

Udostępnij ten post


Link to post
Share on other sites

Zadanie 10.4. Napisałem trochę inny kod dla tego zadania niż koledzy wcześniej. Ponieważ są wartości losowej, które spełniają kilka warunków. Do tego spełnione warunki są przedstawiane za pomocą diod. kod programu poniżej:

#define dioda1 8 //definiujemy piny dla diod
#define dioda2 9
#define dioda3 10
#define dioda4 11
int losowa, fotorezystor = 0; //tworzymy argument losowa i fotorezystor 

void setup() {
 Serial.begin(9600);
 pinMode(dioda1, OUTPUT); //opisujemy piny na wyjscia i gasimy diody
 digitalWrite(dioda1, LOW);
 pinMode(dioda2, OUTPUT); 
 digitalWrite(dioda2, LOW);
 pinMode(dioda3, OUTPUT); 
 digitalWrite(dioda3, LOW);
 pinMode(dioda4, OUTPUT); 
 digitalWrite(dioda4, LOW);

 fotorezystor = analogRead(A5); 
 fotorezystor = map(fotorezystor, 0, 1023, 1, 99); //skalujemy na wartosc od 1 do 99
 randomSeed(fotorezystor); //przypisujemy wartosc ziarna w zaleznosci od natezenia swiatla
 Serial.print("Ziarno: ");
 Serial.println(fotorezystor);
}

void loop() {
 zgasDiody(); //gasimy diody
 zakres(1, 101); //wylosuj liczbe w zadanym zakresie
 Serial.print("Wylosowana liczba: "); //komunikat o losowej
 Serial.println(losowa);
 sprawdzenie(); //kategoryzujemy losowa
 delay(500);
}

int zakres(int a, int b) { //funkcja zwracajaca wartosc losowa
 losowa = random(a, b);

 return losowa;
}

void sprawdzenie() { //funkcja sprawdzajaca przedzial wylosowanej liczby
 if(losowa <= 10) { //jezeli losowa bedzie w przedziale 0 - 10 pali sie tylko dioda 1
   digitalWrite(dioda1, HIGH);
   Serial.println("Liczba spelnia warunki punktu 1.");

 } else if (losowa >= 90) { //losowa wyzsza niz 90 spelnia warunki punktu 1, 2 i 4
   digitalWrite(dioda1, HIGH);
   digitalWrite(dioda2, HIGH);
   digitalWrite(dioda4, HIGH);
   Serial.println("Liczba spelnia warunki punktu 1, 2, 4.");

 } else if (losowa > 50 && losowa < 60) { //losowa w tym przedziale spelnia warunek 2
   digitalWrite(dioda2, HIGH);
   Serial.println("Liczba spelnia warunki punktu 2.");

 } else if (losowa >= 60 && losowa < 70) { //losowa spelnia warunek 2, 4
   digitalWrite(dioda2, HIGH);
   digitalWrite(dioda4, HIGH);
   Serial.println("Liczba spelnia warunki punktu 2, 4.");

 } else if((losowa >= 70 && losowa <= 85) || (losowa > 10 && losowa < 20) || (losowa > 20 && losowa < 30) || (losowa > 30 && losowa < 40)) { //wartosci losowej tylko dla warunku 4
   digitalWrite(dioda4, HIGH);
   Serial.println("Liczba spelnia warunki punktu 4.");

 } else if (losowa == 20 || losowa == 30 || losowa == 40) { //losowa spelnia warunek 3 i 4
   digitalWrite(dioda3, HIGH);
   digitalWrite(dioda4, HIGH);
   Serial.println("Liczba spelnia warunki punktu 3, 4.");

 } else if (losowa == 50) { //losowa wartosci 50 spelnia tylko warunek 3
   digitalWrite(dioda3, HIGH);
   Serial.println("Liczba spelnia warunki punktu 3.");
 } else {
   Serial.println("Liczba nie spelnia zadnego z warunkow.");
 }
}

void zgasDiody() {
 digitalWrite(dioda1, LOW);
 digitalWrite(dioda2, LOW);
 digitalWrite(dioda3, LOW);
 digitalWrite(dioda4, LOW);
}

Zastanawiam się też czy można ten kod (funkcję: sprawdzenie) uprościć, ponieważ najpierw musiałem ręcznie ustalić jakie są przedziały spełnionych warunków, a później dodawać kolejne else if 😉

Pozdrawiam!

Udostępnij ten post


Link to post
Share on other sites

szmajdzik, na pewno jakoś by się dało, ale przy tej ilości warunków prawdopodobnie Twoja metoda będzie znacznie szybsza w implementacji. Ciężko znaleźć życiowy przykład, gdzie coś takiego byłoby naprawdę potrzebne - może wtedy na takim bardziej rozbudowanym urządzeniu możliwe byłoby znalezienie optymalnego rozwiązania. Na ten moment raczej warto potraktować to jako ćwiczenie pisania długich i rozbudowanych warunków 🙂

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Treker, bardzo dziękuję za przygotowanie kursu. Kurs bardzo fajny. Raz jeszcze dziękuję i pozdrawiam.

[ Dodano: 23-03-2017, 12:39 ]

Nie rozumie tylko jednej rzeczy z całego kursu a mianowicie.

"długość świecenia ma wahać się od około 100ms do 990ms. Natomiast czas, gdy dioda jest wyłączona będzie w granicach 50-490ms. Obie wartości powinny zmieniać się w odstępach, co 10 ms."

nie rozumie gdzie program ma czekać te 10ms?

czy jest to czas:

dioda świeci przez czas t1-10ms;

ale przez te 10ms program nie przechodzi do wiersza poniżej

dioda gasnie na czas t2-10ms;

ale przez te 10ms program nie przechodzi do wiersza poniżej

Udostępnij ten post


Link to post
Share on other sites

Rutusowiec, chodzi o to, aby zmiany czasu w podanych zakresach np. "50-490 ms" zmieniały się co 10 ms, czyli 50, 60, 70, a nie co 1 ms, czyli 51, 51, 53 itd. 🙂 Zerknij na umieszczony kod programu, powinien wszystko wyjaśnić.

Udostępnij ten post


Link to post
Share on other sites

oki, chyba rozumie...chodziło Ci o coś jak by zaokrąglenie tego czasu do najbliższej krotności dziesiątki?!

Udostępnij ten post


Link to post
Share on other sites

Rutusowiec, można tak to nazwać 🙂

Udostępnij ten post


Link to post
Share on other sites

Witam, mam małe pytanie odnośnie zadania 10.3. Próbowałem zrobić tak, by wylosowaną liczbę pokazać na LEDach, tzn jeśli wylosowało 4 to zapalają się 4 LEDy itd. Problem jest taki, że diody pokazują tylko stan poprzedni, tzn. najpierw wylosowało 6 - nie pali się żaden LED, następnie wylosowało 4 - pali się 6 LEDów itd. Czyżbym coś przeoczył?

#define d1 2
#define d2 3
#define d3 4
#define d4 5
#define d5 6
#define d6 7
#define przycisk 13
int wynik; 
void setup() { 
Serial.begin(9600); 
pinMode(przycisk,INPUT_PULLUP); 
pinMode(d1,OUTPUT);
digitalWrite(d1,LOW);
pinMode(d2,OUTPUT);
digitalWrite(d2,LOW);
pinMode(d3,OUTPUT);
digitalWrite(d3,LOW);
pinMode(d4,OUTPUT);
digitalWrite(d4,LOW);
pinMode(d5,OUTPUT);
digitalWrite(d5,LOW);
pinMode(d6,OUTPUT);
digitalWrite(d6,LOW);
randomSeed(analogRead(A0)); 
//while(!Serial);
} 

void loop() { 
while (digitalRead(13)!=LOW){}
wynik=random(1,7);
Serial.println(wynik);
delay(4000);

switch(wynik)
{
 case 1:
 //delay(150);
 digitalWrite(d1,HIGH);
 digitalWrite(d2,LOW);
 digitalWrite(d3,LOW);
 digitalWrite(d4,LOW);
 digitalWrite(d5,LOW);
 digitalWrite(d6,LOW);
 break;
 case 2:
 //delay(150);
 digitalWrite(d1,HIGH);
 digitalWrite(d2,HIGH);
 digitalWrite(d3,LOW);
 digitalWrite(d4,LOW);
 digitalWrite(d5,LOW);
 digitalWrite(d6,LOW);
 break;
 case 3:
 //delay(150);
 digitalWrite(d1,HIGH);
 digitalWrite(d2,HIGH);
 digitalWrite(d3,HIGH);
 digitalWrite(d4,LOW);
 digitalWrite(d5,LOW);
 digitalWrite(d6,LOW);
 break;
 case 4:
 //delay(150);
 digitalWrite(d1,HIGH);
 digitalWrite(d2,HIGH);
 digitalWrite(d3,HIGH);
 digitalWrite(d4,HIGH);
 digitalWrite(d5,LOW);
 digitalWrite(d6,LOW);
 break;
 case 5:
 //delay(150);
 digitalWrite(d1,HIGH);
 digitalWrite(d2,HIGH);
 digitalWrite(d3,HIGH);
 digitalWrite(d4,HIGH);
 digitalWrite(d5,HIGH);
 digitalWrite(d6,LOW);
 break;
 case 6:
 //delay(150);
 digitalWrite(d1,HIGH);
 digitalWrite(d2,HIGH);
 digitalWrite(d3,HIGH);
 digitalWrite(d4,HIGH);
 digitalWrite(d5,HIGH);
 digitalWrite(d6,HIGH);
 break;
 default:
 //delay(150);
 digitalWrite(d1,LOW);
 digitalWrite(d2,LOW);
 digitalWrite(d3,LOW);
 digitalWrite(d4,LOW);
 digitalWrite(d5,LOW);
 digitalWrite(d6,LOW); 
}
}

Inna sprawa, że próbując samemu rozwiązać to zadanie, albo nawet biorąc gotowe z komentarzy to żadne mi nie działa tak jak powinno, czyli dopiero po naciśnięciu przycisku powinna losować się liczba, u mnie losuje cały czas niezależnie czy przycisk jest wciśnięty czy nie.

Pozdrawiam.

Udostępnij ten post


Link to post
Share on other sites

Prześledź uważnie jak wygląda - krok po kroku - przebieg pracy Twojego programu z punktu widzenia osoby obsługującej przycisk i patrzącej na diodki. Pewne rzeczy wykonują się w mgnieniu oka a inne (delay) trwają długo. Obsługując jakieś urządzenie tworzymy sobie w głowie jakiś jego model a reakcje na przyciski powinny być raczej szybkie, nawet jeśli urządzenie coś tam w tle robi. Niefortunne miejsce wstawienia opóźnienia (np. po wykryciu naciśnięcia przycisku) może bardzo zaburzyć to "współodczuwanie" bo zwykle zwisy programu traktujemy jak "namyślanie się" przed jakąś akcją lub co gorsza uszkodzenie.

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