Skocz do zawartości

Pomocna odpowiedź

  • 4 tygodnie później...

zadanie 4.6.

#define DiodaLL 12 //definicja diody skrajnej lewej
#define DiodaL 11 //definicja diody lewej
#define DiodaS 10 //definicja diody środkowej
#define DiodaP 9 //definicja diody prawej
#define DiodaPP 8 //definicja diody skrajnej prawej
#define FotoL A0 //definicja fotorezystora lewego
#define FotoP A1 //definicja fotorezystora prawego
int FRezL = 0; //odczyt fotorezystora lewego
int FRezP = 0; //odczyt fotorezystora prawego
int Wynik = 0; //różnica odczytów
void setup() {
digitalWrite(DiodaLL, LOW); //wyłączenie diod
digitalWrite(DiodaL, LOW);
digitalWrite(DiodaS, LOW);
digitalWrite(DiodaP, LOW);
digitalWrite(DiodaPP, LOW);
}
void loop() {
 FRezL = analogRead(FotoL); //zmienna otczytu lewej strony
 FRezL = map(FRezL, 40, 740, 1, 3); //mapowanie odczytu lewej strony
 FRezP = analogRead(FotoP); //zmienna odczytu prawej strony
 FRezP = map(FRezP, 40, 740, 1, 3); //mapowanie odczytu prawej strony
 Wynik = FRezP - FRezL; //różnica zmapowanych odczytów
 if(Wynik == 2){ //jeśli z prawej jest dużo więcej światła to
   digitalWrite(DiodaPP, HIGH); //zapal skrajnie prawą diodę
   digitalWrite(DiodaP, LOW); 
   digitalWrite(DiodaS, LOW);
   digitalWrite(DiodaL, LOW);
   digitalWrite(DiodaLL, LOW);
 } else if(Wynik == 1){ //jeśli jest więcej światła z prawej to
   digitalWrite(DiodaPP, LOW);
   digitalWrite(DiodaP, HIGH); //zapal prawą diodę
   digitalWrite(DiodaS, LOW);
   digitalWrite(DiodaL, LOW);
   digitalWrite(DiodaLL, LOW);
 } else if(Wynik == 0){ //jeśli jest tyle samo światła to
   digitalWrite(DiodaPP, LOW);
   digitalWrite(DiodaP, LOW);
   digitalWrite(DiodaS, HIGH); //zapal środkową diodę
   digitalWrite(DiodaL, LOW);
   digitalWrite(DiodaLL, LOW);
 } else if(Wynik == -1){ //jeśli jest więcej światła z lewej to
   digitalWrite(DiodaPP, LOW);
   digitalWrite(DiodaP, LOW);
   digitalWrite(DiodaS, LOW);
   digitalWrite(DiodaL, HIGH); //zapal lewą diodę
   digitalWrite(DiodaLL, LOW);
 } else if(Wynik == -2){ //jeśli jest dużo więcej światła z lewej to
   digitalWrite(DiodaPP, LOW);
   digitalWrite(DiodaP, LOW);
   digitalWrite(DiodaS, LOW);
   digitalWrite(DiodaL, LOW);
   digitalWrite(DiodaLL, HIGH); //zapal skrajnie lewą diodę
   }
   delay(100); // opóźnienie żeby układ nie wariował
}

i działa 🙂

  • 2 tygodnie później...

W ogóle to troszkę byłem zaskoczony po pierwszych próbach napisania czegokolwiek. Język jest bardzo intuicyjny (zaczynam z zerowym pojęciem o programowaniu) i widzę, że programowanie wymaga diabelskiej precyzji tego co muszę napisać- jeśli zostawię lukę w programie czyli warunki nie pokrywają 100% spektrum działania albo warunki nakładają się na siebie to program głupieje. I dodam jeszcze jedną uwagę- mi łatwiej jest najpierw cokolwiek zaprojektować jako komentarze do linii a potem przerabiać na kod. Po pierwsze łatwiej jest poskładać wszystko w całość a po drugie łatwiej wyszukać błąd w rozumowaniu programu. To dobry nawyk czy zaniechać? Z doświadczenia wiem, że jeśli od początku ktoś uczy się fuszerki to mu potem zostaje...

Praca domowa:

void setup() {
 pinMode(5, OUTPUT);
 Serial.begin(9600);

}


void loop() {

 odczyt = analogRead(A0);

 if (odczyt >= analogRead(A1)) {
   if (digitalRead(5) == LOW) {
     Serial.println(analogRead(A0));
   }
   digitalWrite(5, HIGH);
 }
 else {
   digitalWrite(5, LOW);
 }
 delay(200);
}
I dodam jeszcze jedną uwagę- mi łatwiej jest najpierw cokolwiek zaprojektować jako komentarze do linii a potem przerabiać na kod. Po pierwsze łatwiej jest poskładać wszystko w całość a po drugie łatwiej wyszukać błąd w rozumowaniu programu. To dobry nawyk czy zaniechać? Z doświadczenia wiem, że jeśli od początku ktoś uczy się fuszerki to mu potem zostaje...

Dość oryginalna taktyka, ale jeśli Tobie pomaga, to dobrze 😉 Zawsze możesz też rozpisywać działanie programu najpierw na kartce i dopiero później przerabiać to na kod. Oczywiście masz racje - programowanie, to bardzo precyzyjne zajęcie. Najlepszą nauką jest tutaj praktyka 😉

blazejszycz, witam na forum. Dzięki za podzielenie się Twoim kodem. Pamiętaj, aby stosować wcięcia w programie (tabulacje) i komentarze, bez tego innym może być ciężko analizować Twoje programy 😉

Cześć Wszystkim! Dzięki wielkie za kursy Forbota! Mam za sobą Elektronikę I i II. Teraz jadę z Arduino.

Poniżej propozycja zadania domowego 4.5. Jakie błędy robię, czego unikać, co zmienić? Będę wdzięczny za pomocną krytykę 🙂

 //Gra polega na odgadnięciu napięcia dzielnika. Gracz ma dwie próby symbolizowane przez 2 żółte LED. Kolor czerwony lub zielony LED oznacza odpowiednio przegraną lub wygraną. 


#define BUTTON          7
#define LED_YELLOW_1    8
#define LED_YELLOW_2    9
#define LED_RED         10
#define LED_GREEN       11
#define POTENTIOMETER   A5
String INTRO ="If you want to start a new game, please, press the button.";
String INSTRUCTION = "Change the potentiometer position and confirm the change by pushing the button.";
String ATTEMPT ="The number of atempts left: ";
String GIVE_NUMBER = "Please type a number from 0 to 1023. You win when you estimate the number set on the potentiometer with +/- 50 points of accuracy";
String CONGRATS ="Congratulations, you won!";
String FAILURE ="Sorry, you lost! Maybe you will be more lucky next time!";
String THE_RIGHT_VALUE = "The number from the potentiometer is ";
String WRONG_NUMBER ="Sorry, you typed the wrong number.";
String TYPED_NUMBER;
int TYPED_NUMBER_INT;
int WINNING_NUMBER=0;
int COUNTER=0;
int ATTEMPT_NUMBER=2;

void setup() // Start settings.
{
Serial.begin(9600);
pinMode(BUTTON,INPUT_PULLUP);
pinMode(LED_YELLOW_1,OUTPUT);
pinMode(LED_YELLOW_2,OUTPUT);
pinMode(LED_GREEN,OUTPUT);
pinMode(LED_RED,OUTPUT);
}

void loop() 
{
 while(COUNTER==0) //Starting the game, waiting for the confirmation.
 {
 Serial.println(INTRO);
 digitalWrite(LED_YELLOW_1,HIGH);
 digitalWrite(LED_YELLOW_2,HIGH);
 digitalWrite(LED_GREEN,LOW);
 digitalWrite(LED_RED,LOW);
 while (digitalRead(BUTTON)==1){};
 if (digitalRead(BUTTON)==0){COUNTER++;delay(1000);}
 }

 while (COUNTER==1)// Giving info on the game rules.
 {
 Serial.println(INSTRUCTION);
 while (digitalRead(BUTTON)==1){};
 if (digitalRead(BUTTON)==0){COUNTER++;delay(1000);}
 }

 while (COUNTER==2) // First attempt.
 { 
 int ATTEMPT_NUMBER=2;
 WINNING_NUMBER=analogRead(POTENTIOMETER);
 Serial.println(GIVE_NUMBER);
 delay(1000);
 Serial.println(ATTEMPT + ATTEMPT_NUMBER);
 while (Serial.available()==0){};

   if(Serial.available()>0) {TYPED_NUMBER=Serial.readStringUntil("\n");}
   TYPED_NUMBER_INT=TYPED_NUMBER.toInt();
   if((TYPED_NUMBER_INT<(WINNING_NUMBER+50))&&(TYPED_NUMBER_INT>(WINNING_NUMBER-50))) // Win at first try.
       {
       digitalWrite(LED_YELLOW_1,HIGH);
       digitalWrite(LED_YELLOW_2,HIGH);
       digitalWrite(LED_GREEN,HIGH);
       Serial.println(CONGRATS);
       delay(1000);
       Serial.println(THE_RIGHT_VALUE + WINNING_NUMBER);
       delay (3000);
       COUNTER=0;
       }
       else 
       {
       ATTEMPT_NUMBER--; //First mistake.
       digitalWrite(LED_YELLOW_1,HIGH);
       digitalWrite(LED_YELLOW_2,LOW);
       digitalWrite(LED_GREEN,LOW);
       digitalWrite(LED_RED,HIGH); 
       Serial.println(WRONG_NUMBER);
       delay(1000);
       Serial.println(GIVE_NUMBER);
       delay(1000);
       Serial.println(ATTEMPT + ATTEMPT_NUMBER);
       delay(1000);
       digitalWrite(LED_RED,LOW);
       while (Serial.available()==0){};

           if(Serial.available()>0) {TYPED_NUMBER=Serial.readStringUntil("\n");} //Second try.
           TYPED_NUMBER_INT=TYPED_NUMBER.toInt();
           if((TYPED_NUMBER_INT<(WINNING_NUMBER+50))&&(TYPED_NUMBER_INT>(WINNING_NUMBER-50)))// Win at second try.
           {
           digitalWrite(LED_YELLOW_1,HIGH);
           digitalWrite(LED_YELLOW_2,LOW);
           digitalWrite(LED_GREEN,HIGH);
           Serial.println(CONGRATS);
           delay(1000);
           Serial.println(THE_RIGHT_VALUE + WINNING_NUMBER);
           delay (3000);
           COUNTER=0;
           } 
           else //Second mistake. End of the game.
           {
           ATTEMPT_NUMBER--;
           digitalWrite(LED_YELLOW_1,LOW);
           digitalWrite(LED_YELLOW_2,LOW);
           digitalWrite(LED_GREEN,LOW);
           digitalWrite(LED_RED,HIGH); 

           Serial.println(WRONG_NUMBER);
           delay(1000);
           Serial.println(ATTEMPT + ATTEMPT_NUMBER);
           delay(3000);
           Serial.println (FAILURE);
           delay(1000);
           Serial.println(THE_RIGHT_VALUE + WINNING_NUMBER);
           COUNTER=0;
           }    
       }
 }
}

Gregorio, witam na forum 🙂 Cieszę się, że kursy są pomocne.

Jeśli chodzi o Twój program, to warto popracować nad kosmetyką, tzn.:

- WIELKIE_LITERY najlepiej zostawić na nazwy stałych. Nazwy zmiennych lepiej pisać małymi literami.

- Przydałoby się jeszcze więcej wcięć. Przykładowo zamiast:

  while (COUNTER==1)// Giving info on the game rules. 
 { 
 Serial.println(INSTRUCTION); 
 while (digitalRead(BUTTON)==1){}; 
 if (digitalRead(BUTTON)==0){COUNTER++;delay(1000);} 
 } 

Czytelniej będzie tak:

  while (COUNTER==1)// Giving info on the game rules. 
 { 
   Serial.println(INSTRUCTION); 
   while (digitalRead(BUTTON)==1){}; 
   if (digitalRead(BUTTON)==0){COUNTER++;delay(1000);} 
 } 

- Komentarze opisują ogólne zachowanie programu, a nie mówią co dokładnie robisz w danym miejscu. Za jakiś czas możesz zapomnieć, co dokładnie robi poniższa linia (a komentarz tego nie wyjaśnia):

if((TYPED_NUMBER_INT<(WINNING_NUMBER+50))&&(TYPED_NUMBER_INT>(WINNING_NUMBER-50))) // Win at first try. 

Oczywiście są to kwestie tylko kosmetyczne i nie wpływają na działanie programu 😉

Hej, czy ktoś mógłby mi wytłumaczyć działanie i zasady używania zmiennej boolean? Na prostym przykładzie z początków Arduino.

Dziękuję.

SOYER, a czego dokładnie nie rozumiesz? Boolean działa tak samo jak każda inna zmienna. Ten konkretny typ pozwala na wpisanie do niego tylko dwóch wartości 1 (PRAWDA) oraz 0 (FAŁSZ). W którym miejscu pojawia się problem 😉?

Kod użytkownika IGOR, mam nadzieję, że się nie obrazi (post z 20.05.2015):

#define zielona 8

#define czerwona 9

String odebraneDane = "";

boolean stanCzerwonej = false;

boolean stanZielonej = false;

void setup() {

Serial.begin(9600);

pinMode(zielona, OUTPUT);

pinMode(czerwona, OUTPUT);

digitalWrite(zielona, LOW);

digitalWrite(czerwona, LOW);

}

void loop() {

if(Serial.available() > 0) {

odebraneDane = Serial.readStringUntil('\n');

if (odebraneDane == "zielona") {

stanZielonej = !stanZielonej;

}

if (odebraneDane == "czerwona") {

stanCzerwonej = !stanCzerwonej;

}

if (odebraneDane != "czerwona" && odebraneDane != "zielona") {

Serial.println("Nieprawidlowy kolor! Wpisz 'zielona' lub 'czerwona'.");

}

digitalWrite(zielona, stanZielonej);

digitalWrite(czerwona, stanCzerwonej);

}

}

i teraz: skąd program wie, że "stanZielonej" odnosi się do pinu nr. 8, skoro pin nr. 8 ma zdefiniowany jako "zielona".

Więc jakim cudem wie w pierwszej pętli, że pin8 to "stanZielonej" i zmienia go na przeciwny(!stanZielonej)?

Czy żeby stosować zapis "stanZielonej = !stanZielonej" musi być stosowana zmienna boolean bo inaczej taki zapis nie będzie działał?

Rozumiem, że nazwa zmiennej boolean musi się różnić od nazwy zdefiniowanej pinowi, tak?

Po co i dlaczego na końcu programu jest zapis:

digitalWrite(zielona, stanZielonej);

digitalWrite(czerwona, stanCzerwonej);

czy to to samo co digitalWrite(czerwona, false(ew. LOW)) ???

bez tego wpisu program nie działa, co robi ten zapis? On jest w nawiasie pierwszego if-a, tego który pyta czy był jakiś wpis w konsoli, jeśli nie było wpisu (czyli kolejne if nic nie robią) ustawia piny zielona i czerwona tak jak zdefiniowano w zmiennej boolean czyli na false(LOW).

Ale jeśli był wpis w konsoli i wchodzą do gry kolejne if-y to skąd u licha program wie, że po wpisaniu stanZielonej = !stanZielonej odnosi się to do pinu 8?????

Stan na 11:12 10.11.2017:-) zaskoczyłem:-))

Program w if-ach działa tylko na zmiennych boolean, jeśli jest spełniony warunek to zmienia stan zmiennej, a dopiero po sprawdzeniu warunków i ustawieniu zmiennych przechodzi do sterowania diodami i każe im ustawić się według stanu zmiennych. TAK??

Kolejne moje pytanie, prosicie żeby korzystać z innego rodzaju zmiennych, char, int. Jak je odczytywać z konsoli bo komenda readStringUntil działa tylko na zmienną String.???

Jeszcze jedno:

Trochę zmodyfikowałem program:

#define zielona 8

#define czerwona 10

boolean zielona1 = false;

boolean czerwona1 = false;

String odebraneDane = ""; //Pusty ciąg odebranych danych

void setup() {

Serial.begin(9600); //Uruchomienie komunikacji

pinMode(zielona, OUTPUT); //Konfiguracja wyjść

pinMode(czerwona, OUTPUT);

digitalWrite(zielona, LOW); //Wyłączamy diody

digitalWrite(czerwona, LOW);

}

void loop() {

if(Serial.available() > 0) { //Czy Arduino odebrano dane

//Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane

odebraneDane = Serial.readStringUntil('\n');

if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona"

zielona1 = !zielona1;

delay(1000);

zielona1 = !zielona1;

}

if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"

czerwona1 = !czerwona1;

delay(1000);

czerwona1 = !czerwona1;

}

}

digitalWrite(zielona, zielona1);

digitalWrite(czerwona, czerwona1);

}

Dlaczego po dopisaniu delay 1000ms i ponownej zmianie stanu diody program przestał w ogóle zapalać diody. Po zapaleniu powinien poczekać 1s i ją zgasić, a kolejne wpisanie komendy powinno ją znów odpalić. Czemu tak nie działa, a przed dopisaniem opóźnienia i drugiego zaprzeczenia stanu, działało...

Ok po zrozumieniu zasad boolean poprawiłem powyższy kod i już działa:-):

#define zielona 8

#define czerwona 10

boolean zielona1 = false;

boolean czerwona1 = false;

String odebraneDane = ""; //Pusty ciąg odebranych danych

void setup() {

Serial.begin(9600); //Uruchomienie komunikacji

pinMode(zielona, OUTPUT); //Konfiguracja wyjść

pinMode(czerwona, OUTPUT);

digitalWrite(zielona, LOW); //Wyłączamy diody

digitalWrite(czerwona, LOW);

}

void loop() {

if(Serial.available() > 0) { //Czy Arduino odebrano dane

//Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane

odebraneDane = Serial.readStringUntil('\n');

if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona"

zielona1 = !zielona1;

digitalWrite(zielona, zielona1);

delay(1000);

zielona1 = !zielona1;

digitalWrite(zielona, zielona1);

}

if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"

czerwona1 = !czerwona1;

digitalWrite(czerwona, czerwona1);

delay(1000);

czerwona1 = !czerwona1;

digitalWrite(czerwona, czerwona1);

}

}

}

__________

Komentarz dodany przez: Treker

Kody programów należy umieszczać przez narzędzie KOD (znajdziesz je w edytorze pod ikonką "<>"). Dzięki niemu składania programów jest automatycznie kolorowana, a wtedy wszystkim znacznie łatwiej analizować wklejone programy. Proszę to poprawić - z góry dziękuję za zrozumienie i pomoc przy utrzymaniu porządku na forum.

Program w if-ach działa tylko na zmiennych boolean, jeśli jest spełniony warunek to zmienia stan zmiennej, a dopiero po sprawdzeniu warunków i ustawieniu zmiennych przechodzi do sterowania diodami i każe im ustawić się według stanu zmiennych. TAK??

Dokładnie wszystko się zgadza 🙂 Pamiętaj, aby wszystkie programy umieszczać na forum w tagach - bez tego ciężko analizować wklejane programy.

Moja prostacka gra, ale działa 😃

4.5

#define green 5
#define yellow 6
#define red 7
#define button 2

int pote = 0;
String liczba="";
int liczba2 = 0;


void setup() {
 pinMode(green,OUTPUT);
 pinMode(yellow,OUTPUT);
 pinMode(red,OUTPUT);
 pinMode(button,INPUT_PULLUP);
 Serial.begin(9600);
}

void loop() {
   digitalWrite(yellow,LOW);
   digitalWrite(red,LOW);
   digitalWrite(green,LOW);

   Serial.println("Witaj w mojej grze, ustaw pote i wciśnij przycisk");
   pote = analogRead(A4);
   while(digitalRead(button) == HIGH){}
   delay(1000);
   Serial.println("Podaj Liczbę od 0 do 1023");
   Serial.println("Masz trzy próby");
   while(Serial.available() == 0){}
   liczba = Serial.readStringUntil('\n');
   liczba2 = liczba.toInt();
     if(liczba2-50 <=pote && liczba2+50 >=pote){
     Serial.println("Wygrałeś!!!");
     digitalWrite(green,HIGH);
     Serial.println(pote);


     }else{
       digitalWrite(yellow,HIGH);
       Serial.println("Zła liczba, masz jeszcze dwie próby");
       while(Serial.available() == 0){}
       liczba = Serial.readStringUntil('\n');
       liczba2 = liczba.toInt();
       if(liczba2-50 <=pote && liczba2+50 >=pote){
       digitalWrite(yellow,LOW);
       delay(3000);
       Serial.println("Wygrałeś!!!");
       digitalWrite(green,HIGH);
       Serial.println(pote);


       }else{
         digitalWrite(yellow,LOW);
         delay(3000);            
         Serial.println("Zła liczba, masz jeszcze jedną próbę");
         digitalWrite(yellow,HIGH);
         while(Serial.available() == 0){}
         liczba = Serial.readStringUntil('\n');
         liczba2 = liczba.toInt();
         if(liczba2-50 <=pote && liczba2+50 >=pote){
           digitalWrite(yellow,LOW);
           delay(3000);            
           Serial.println("Wygrałeś!!!");
           digitalWrite(green,HIGH);
           Serial.println(pote);


         }else{
           digitalWrite(yellow,LOW);
           delay(3000);
           digitalWrite(red,HIGH);
           Serial.println("Koniec Gry, Przegrałeś");




         }

       }

       }
          Serial.println("Wciśnij Przycisk aby zagrać ponownie");
        while(digitalRead(button) == HIGH){}
        delay(1000);
   }

Jutro pobije się może z dwoma fotorezystorami.

@Edit

Udało się, jupi. Prostym językiem, ale działa:D

#define red1 12
#define red2 10
#define yellow 8
#define green1 6
#define green2 4

int foto1 = 0;
int foto2 = 0;


void setup() {
 Serial.begin(9600);
 pinMode(red1,OUTPUT);
 pinMode(red2,OUTPUT);
 pinMode(yellow,OUTPUT);
 pinMode(green1,OUTPUT);
 pinMode(green2,OUTPUT);
 digitalWrite(red1,LOW);
 digitalWrite(red2,LOW);
 digitalWrite(yellow,LOW);
 digitalWrite(green1,LOW);
 digitalWrite(green2,LOW);

}

void loop() {
 foto1 = analogRead(A4);
 foto2 = analogRead(A5);

 delay(25);
 Serial.println("Lewa Strona:");
 Serial.println(foto1);
 delay(25);
 Serial.println("Prawa Strona:");
 Serial.println(foto2);
 delay(25);
 if(foto1-150<=foto2 && foto1+150>=foto2){
   digitalWrite(yellow,HIGH);
 }else{
   digitalWrite(yellow,LOW);
 }
 if(foto1>=foto2+150){
   digitalWrite(red2,HIGH);
   if(foto1>=foto2+300){
     digitalWrite(red1,HIGH);
   }else{
     digitalWrite(red1,LOW);
   }
 }else{
   digitalWrite(red2,LOW);
   digitalWrite(red1,LOW);
 }
 if(foto2>=foto1+150){
   digitalWrite(green1,HIGH);
   if(foto2>=foto1+300){
     digitalWrite(green2,HIGH);
     }else{
       digitalWrite(green2,LOW);
     }
 }else{
   digitalWrite(green1,LOW);
   digitalWrite(green2,LOW);
 }
}

SOYER, wystarczy wkleić program do wiadomości i objąć go tagami .

zioloiso, witam na forum 🙂 Super, że programy działają - pamiętaj o komentarzach. Warto opisywać nimi kod, aby był czytelniejszy dla innych i dla Ciebie (gdy wrócisz do niego w przyszłości).

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