Skocz do zawartości

Pomocna odpowiedź

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

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?

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.

#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'.........?

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.

  • 3 tygodnie później...

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ś ? 🙂

  • 2 tygodnie później...

Siema, dopiero zaczynam przygode z programowaniem 🙂 mogłby ktoś mi powiedzieć gdzie mam błąd ?

tj. zadanie 4.5 lekko przerobione bo sa 3 diody symbolizujące szanse "proby" za każdym razem gdy zle odpowiemy jedna z tych diód gaśnie.

ogólnie program działa tak że jak trafimy to działa poprawnie jak odpowiemy zle to za piewszym razem działa poprawnie natomiast jak odpowiem zle drugi raz to na ekran wywala mi jakbym mail proby 2 i 1 i dodatkowo pisze pokrec potencjometrem :/

//przypisane pinów 
#define led_czerwona1 9
#define led_czerwona2 10
#define led_czerwona3 11
#define led_zielona 8 
#define przycisk 7
#define pin_odczyt A5


int adc=0; // odczyt z potecjonometru
String podana_liczba = ""; //liczba podana przez gracza 
int podana_liczba_int=0; // przskalowanie na  int ? 
byte proby = 3; //ilosc prob
boolean od_nowa = true; 
void setup() {


pinMode(przycisk,INPUT_PULLUP);
pinMode(led_zielona,OUTPUT);
pinMode(led_czerwona1,OUTPUT);
pinMode(led_czerwona2,OUTPUT);
pinMode(led_czerwona3,OUTPUT);
Serial.begin(9600);
}
void loop() {
 if(od_nowa=true) //jesli rozpoczynamy gre od nowa
 {
   proby=3;
   digitalWrite(led_zielona,LOW); //zgaszamy wszystkie diody
   digitalWrite(led_czerwona1,HIGH);
   digitalWrite(led_czerwona2,HIGH);
   digitalWrite(led_czerwona3,HIGH);

   while(!Serial)delay(10); //czekamy na otwarcie serial monitora
   Serial.println("pokreć potencjonometrem");


   adc=analogRead(pin_odczyt); // szczytujemy wartosc z potecjonometru 
  }

 while(Serial.available() ==0); //czekamy na podanie liczby 

 podana_liczba=Serial.readStringUntil('\n');
 podana_liczba_int=podana_liczba.toInt(); // zamieniamy ze String na int 



 if(adc-podana_liczba_int<=50 && adc-podana_liczba_int >= -50)
 {
Serial.println("trafiłeś! udało ci sie wygrać");
digitalWrite(led_zielona,HIGH);
digitalWrite(led_czerwona1,LOW);
digitalWrite(led_czerwona2,LOW);
digitalWrite(led_czerwona3,LOW);
od_nowa=true;
Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk");
while(digitalRead(przycisk)==HIGH); delay(20);

 }
else {
if (proby==3)
{

 od_nowa=false;
 digitalWrite(led_czerwona1,LOW);
 proby --;
 Serial.println("nie udało ci się trafić ale masz jeszcze szanse");
 Serial.println("ilosc szans: ");
 Serial.println(proby);
Serial.println("podaj kolejna liczbe");
while(Serial.available()==0) delay(20);
}
if(proby==2)
{

 od_nowa=false;
 digitalWrite(led_czerwona1,LOW);
 digitalWrite(led_czerwona2,LOW);
 proby--;
Serial.println("nie udało ci się trafić ale masz jeszcze szanse");
 Serial.println("ilosc szans: ");
 Serial.println(proby);
Serial.println("podaj kolejna liczbe");
while(Serial.available()==0) delay(20);
}

if(proby==1)
{

 digitalWrite(led_czerwona1,LOW);
 digitalWrite(led_czerwona2,LOW);
 digitalWrite(led_czerwona3,LOW);

 proby --;
 od_nowa=true;
 Serial.println("nie udało ci się trafić");
 Serial.println("wykorzystales wszystkie swoje szanse");

Serial.println("jesli chcesz zagrać ponownie nacisnij przycisk");
while(digitalRead(przycisk)==HIGH); delay(20);
}

}

delay(5);





}

Dawiddk1, witam na forum 🙂 Nie sprawdziłem całości, bo od razu zatrzymałem się na jednej linii. Pomysł nad tym zapisem:

if(od_nowa=true) //jesli rozpoczynamy gre od nowa 

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