Skocz do zawartości
Komentator

Kurs Arduino - #4 - Przetwornik ADC

Pomocna odpowiedź

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);
 }
}

Udostępnij ten post


Link to post
Share on other sites

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

Udostępnij ten post


Link to post
Share on other sites

Dzięki Treker za podpowiedź.

Poradzi ktoś jak poprawnie zapisać takie coś, tutaj akurat ze zmienną float... jak to jest przy innych zmiennych?

Serial.println("wlaczono diode przy napieciu" + napiecie + "V");

Udostępnij ten post


Link to post
Share on other sites

Dzięki, mój angielski jest mniej niż średni, ale z tego co zrozumiałem z kodu to powinienem utworzyć zmienną którą zdefiniuję w programie, a następnie wykorzystam w String.println(zmienna).

Tak się to robi?

Udostępnij ten post


Link to post
Share on other sites

SOYER, tak, to jedna z możliwości 😉

Udostępnij ten post


Link to post
Share on other sites

O gdzie moje maniery, zapomniałem się przywitać. Witam i dzięki za powitanie.

W sumie masz racje bo nie mam w ogóle nawyku komentarzy, a potem sam się będę zastanawiał o co chodzi.

Udostępnij ten post


Link to post
Share on other sites

zioloiso, super, to pamiętaj o nich przy następnych programach i na pewno będzie wtedy czytelniej 🙂

Udostępnij ten post


Link to post
Share on other sites
#include <Servo.h> //Biblioteka odpowiedzialna za serwa

Servo serwomechanizm;  //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa 
int pozycja = 0; //Aktualna pozycja serwa 0-180
String wpis ="";
boolean wstep = false;
#define led1 10 
#define led2 12
#define led3 9
#define led4 11 
#define led5 8

void setup() 
{ 
 serwomechanizm.attach(6);
 Serial.begin(9600);//Serwomechanizm podłączony do pinu 9
 pinMode(led1, OUTPUT); 
 pinMode(led2, OUTPUT); 
 pinMode(led3, OUTPUT); 
 pinMode(led4, OUTPUT); 
 pinMode(led5, OUTPUT); 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, LOW);
} 

void loop() 
{  
 if(wstep == false){
   Serial.println("Wpisz pozycje serwa w stopniach (1-180)");
   wstep = true;
 }
 if (Serial.available()>0) {
   wpis = Serial.readStringUntil('\n');
   pozycja = wpis.toInt();
   serwomechanizm.write(pozycja);
   if(pozycja<=110 && pozycja>=70){
     digitalWrite(led3, HIGH);
   }
     else{
       digitalWrite(led3, LOW);
     }
   if(pozycja<70 && pozycja>35){
   digitalWrite(led2, HIGH);
   }
     else{
   digitalWrite(led2, LOW);
     }
   if(pozycja<=35 && pozycja>=1){
   digitalWrite(led1, HIGH);
   }
     else{
   digitalWrite(led1, LOW);
     }
   if(pozycja>110 && pozycja<155){
     digitalWrite(led4, HIGH);
   }
   else{
       digitalWrite(led4, LOW);
     }
   if(pozycja<=180 && pozycja>=155){
     digitalWrite(led5, HIGH);
   }
   else{
     digitalWrite(led5, LOW);
   }
 } else { 
   pozycja = 0;
 }    


}

dlaczego kiedy zamiast kolejnych if włączających diody próbuję wstawić else if to pyta mnie o nawias } przed else??? Np.

 if(pozycja<=110 && pozycja>=70){
     digitalWrite(led3, HIGH);
   }
     else{
       digitalWrite(led3, LOW);
     }
   else if(pozycja<70 && pozycja>35){
   digitalWrite(led2, HIGH);
   }
     else{
   digitalWrite(led2, LOW);
     }

Expected } before 'else'.........?

Udostępnij ten post


Link to post
Share on other sites

Bo te if-y już mają swoje else. Każdy if może mieć tylko dwie drogi: przez if albo przez else.

Kompilator opisując napotkany błąd dodaje numer linii - korzystaj z tego, bo to precyzuje miejsce wystąpienia.

Nie zawsze jednak komunikat wskazuje rzeczywiste miejsce błędu i nie zawsze opis jest zgodny z faktycznie popełnionym błędem. Jeśli błąd nie jest ewidentny (np. użycie niezadeklarowanej zmiennej lub swicz zamiast switch), kompilator próbuje sobie "radzić" i zajeżdża z kompilacją tak daleko jak to tylko możliwe. Dopiero tam gdzie już rozkłada ręce, wysyła komunikat. Jeśli np. zapomnisz o nawiasie zamykającym definicję funkcji, cała dalsza część programu będzie traktowana jak treść tej funkcji i dopiero 100 linijek dalej może się okazać, że pewna konstrukcja kodu jest w funkcji niedopuszczalna. Lawina absurdalnych komunikatów będzie wtedy zaskoczeniem, trzeba nabyć wprawy w rozumieniu ich prawdziwych znaczeń. Punkt widzenia kompilatora na kod jest troszkę inny niż nasz.

Udostępnij ten post


Link to post
Share on other sites

Cześć wszystkim,

napotkałem pierwszy problem z kursem a mianowicie zadanie 4.4. Posiłkując się podpowiedziami wyczarowałem coś takiego

int wartosc5 = 0; // ADC 5
int prog = 0; //Próg włączenia światła - ustawiany potencjometrem ADC 4 
float napiecie = 0; //Napiecie na dzielniku
boolean stan = 0; // Stan diody pin 8
void setup() {
 Serial.begin(9600);
 pinMode(8, OUTPUT); // LED
}

void loop() {
 wartosc5 = analogRead(A5);//Odczytanie wartości z ADC
 prog = analogRead(A4);//Odczytanie wartości z ADC 

 if( wartosc5<prog){
   digitalWrite(8, HIGH);
   stan=1;
   napiecie=wartosc5*(5/1023.0);
   Serial.print(napiecie);
 }
 else{
   digitalWrite(8,LOW);
   stan=0;
 }

 delay(50);
}

Program działa tylko wskazania w UART są w jednym wierszu a nie jak w innych zadaniach że wiadomość jest w kolumnie. Ktoś coś ? 🙂

Udostępnij ten post


Link to post
Share on other sites

Przyjrzyj się więc dokładniej tej linii kodu która wypisuje wartość. Skoro w innych programach działa inaczej, musi być jakaś różnica.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

A no faktycznie 😃. Stwierdziłem że jak program uznaje samo print to znaczy że jest ok. Najwyraźniej jest print i println. Dzięki !

Udostępnij ten post


Link to post
Share on other sites

println wzięło się od print line....

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