Skocz do zawartości

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ę 🙂

  • 1 miesiąc później...

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

  • 5 miesiące później...

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.

  • 2 tygodnie później...

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!

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
  • 2 tygodnie później...

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

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

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.

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.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...