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

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

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.

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!

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

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

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.

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.

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.