Arduino Polska Forum
If nie działa (a tak poza tym to laser dla kota) - Wersja do druku

+- Arduino Polska Forum (https://forum.arduinopolska.pl)
+-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino)
+--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica)
+--- Wątek: If nie działa (a tak poza tym to laser dla kota) (/watek-if-nie-dzia%C5%82a-a-tak-poza-tym-to-laser-dla-kota)



If nie działa (a tak poza tym to laser dla kota) - Fl1p3r3k - 09-12-2019

Dzień dobry,
Mam problem, a dokładniej chodzi o to, że chciałem zrobić sterowany laser dla kota działający z kontrolerem na telefonie (bluetooth). Zbudowałem go, a kiedy zacząłem go programować, okazało się, że nie umiem tego zrobić. Dzięki diagnostyce udało mi się ustalić, że komendy if nie działają i najzwyczajniej if nie wykrywa w odpowiednim momencie, że musi odpalić inne komendy. Czy mógłby ktoś mi pomóc? Załączam plik z (dotychczasowym) kodem. [attachment=915]


Kod:
#define Speed 3 //określenie pinu do definiowania szybkości silnika
#define output1 5 // określenie pierwszego pinu silnika
#define output2 6 // określenie drugiego pinu silnika
#define laser 11 // określenie pinu lasera

#include <Servo.h> // biblioteka serwomachanizmów
Servo laserek; // definiowanie nowego serwa

int moc = 170; //moc lasera (przy zbyt dużym napięciu laser się przegrzewa)
int c = 0; // odbieranie informacji od bluetooth

void setup() {
  pinMode(output1,OUTPUT);
  pinMode(output2,OUTPUT);
  pinMode(Speed, OUTPUT);
  pinMode(laser, OUTPUT);

  laserek.attach(9);

  digitalWrite(laser, moc);

  laserek.write(0);

  Serial.begin(9600);

 
}

void loop() { 

  digitalWrite(laser, moc);
  Serial.write(c);// część diagnostyki


  if (Serial.available()){ //if od wykrywania wiadomości z kontrolera (działa)
    c = Serial.read();
    Serial.write(c); // część diagnostyki
    }
 
  if (c == 1){ //wykrycie pierwszego przycisku (nie działa)
      laserek.write(laserek.read() + 1);
      Serial.write("KK"); //część diagnostyki
    }
    if (c == "2"){ //if od drugiego przycisku (nie działa)
      laserek.write(laserek.read() - 1);
      Serial.write("KK"); //część diagnostyki
    }
    if (c == 3){ //if od trzeciego przycisku (nie działa)
      digitalWrite(Speed, 255);
      digitalWrite(output1,LOW);
      digitalWrite(output2,HIGH);
      Serial.write("KK"); //część diagnostyki
      delay(500);
    }
    if (c == 4){ //if od czwartego przycisku (nie działa)
      digitalWrite(Speed, 255);
      digitalWrite(output1,HIGH);
      digitalWrite(output2,LOW);
      Serial.write("KK"); // część diagnostyki
      delay(500);
    }
    if (c == 5){ //if od piątego przycisku (nie działa)
      if(moc > 120){
        moc = 0;
        Serial.write("KK"); //część diagnostyki
      }else{
        moc = 170;
        Serial.write("KK"); //część diagnostyki
      }
    }
}



RE: If nie działa (a tak poza tym to laser dla kota) - Agregacik - 09-12-2019

Podejrzewam, że to co otrzymujesz nie jest zmienną int tylko char i stąd problem.


RE: If nie działa (a tak poza tym to laser dla kota) - semi - 09-12-2019

Gwarantuję, że if działa! Dział tak jak każesz.
Możesz wytłumaczyć, dlaczego czasem w kodzie porównujesz z liczbą
Kod:
if (c == 1){ //wykrycie pierwszego przycisku (nie działa)
a czasem z kodem znaku
Kod:
if (c == "2"){ //if od drugiego przycisku (nie działa)
?
Co wyświetla serial monitor gdy wykonuje się fragment
Kod:
if (Serial.available()){ //if od wykrywania wiadomości z kontrolera (działa)
    c = Serial.read();
    Serial.write(c); // część diagnostyki
    }
?


RE: If nie działa (a tak poza tym to laser dla kota) - Robson Kerman - 09-12-2019

Pierwsza sprawa:
Kod:
digitalWrite(laser, moc);
Tak nie reguluje się mocy lasera. Podejrzewam, że chodziło Ci o sygnał PWM, więc powinno to wyglądać tak:
Kod:
analogWrite(laser, moc);

Druga sprawa, to jak wyglądają komendy wysyłane z telefonu?

Tak naprawdę to wysyłasz kody ASCII, a c=Serial.read() przypisuje te kody do zmiennej c.
Więc jeśli wyślesz char '1', to c=49 i za chwilę c=10 bo jeszcze mamy '\n' co w ASCII jest decymalnie równe 10.
Proponuję:
Kod:
  if (Serial.available())
   {
      c = Serial.parseInt(SKIP_WHITESPACE,'\n');
   }



RE: If nie działa (a tak poza tym to laser dla kota) - Fl1p3r3k - 09-12-2019

(09-12-2019, 20:28)semi napisał(a): Gwarantuję, że if działa! Dział tak jak każesz.
Możesz wytłumaczyć, dlaczego czasem w kodzie porównujesz z liczbą
Kod:
  if (c == 1){ //wykrycie pierwszego przycisku (nie działa)
a czasem z kodem znaku
Kod:
    if (c == "2"){ //if od drugiego przycisku (nie działa)
?
Co wyświetla serial monitor gdy wykonuje się fragment
Kod:
if (Serial.available()){ //if od wykrywania wiadomości z kontrolera (działa)
    c = Serial.read();
    Serial.write(c); // część diagnostyki
    }
?
Robiłem raz z liczbą, a raz ze znakiem, bo testy robiłem i zapomniałem usunąć. A gdy wykonuje ten fragment, to wyświetla to, co się wyślę z telefonu.


RE: If nie działa (a tak poza tym to laser dla kota) - Fl1p3r3k - 09-12-2019

(09-12-2019, 20:33)Robson Kerman napisał(a): Pierwsza sprawa:
Kod:
digitalWrite(laser, moc);
Tak nie reguluje się mocy lasera. Podejrzewam, że chodziło Ci o sygnał PWM, więc powinno to wyglądać tak:
Kod:
analogWrite(laser, moc);

Druga sprawa, to jak wyglądają komendy wysyłane z telefonu?

Tak naprawdę to wysyłasz kody ASCII, a c=Serial.read() przypisuje te kody do zmiennej c.
Więc jeśli wyślesz char '1', to c=49 i za chwilę c=10 bo jeszcze mamy '\n' co w ASCII jest decymalnie równe 10.
Proponuję:
Kod:
  if (Serial.available())
   {
      c = Serial.parseInt(SKIP_WHITESPACE,'\n');
   }
Sprawdzałem i nie wysyła ascii tylko to co na telefonie wpisywałem. I nie chodziło mi o regulacje mocy, tylko o to, żeby można było wyłączyć, a 5V z pinu było za dużo i laser się przegrzewał, więc trzeba było zmienić PWN i wszystko działa z digitalRead.


RE: If nie działa (a tak poza tym to laser dla kota) - Robson Kerman - 09-12-2019

(09-12-2019, 21:55)Fl1p3r3k napisał(a): Sprawdzałem i nie wysyła ascii tylko to co na telefonie wpisywałem.

A jak to sprawdziłeś? Bo jeśli tak:

Kod:
  if (Serial.available()){ //if od wykrywania wiadomości z kontrolera (działa)
    c = Serial.read();
    Serial.write(c); // część diagnostyki
    }

to uwierz mi, ale gdy wyślesz z telefonu 1, to c przyjmie wartość 49.
Zrób taki eksperyment i napisz program:

Kod:
void setup() {
  Serial.begin(9600);
  Serial.write(49);
}

void loop() { 
}

I powiedz co się wyświetliło? 49 czy 1?
Albo w swoim kodzie zamiast
Kod:
Serial.write(c)
, wpisz
Kod:
Serial.print(c)
, to się przekonasz.

Albo zamiast if(c==1) napisz if(c==49), to gwarantuję, że warunek zadziała.


RE: If nie działa (a tak poza tym to laser dla kota) - Fl1p3r3k - 09-12-2019

(09-12-2019, 22:50)Robson Kerman napisał(a):
(09-12-2019, 21:55)Fl1p3r3k napisał(a): Sprawdzałem i nie wysyła ascii tylko to co na telefonie wpisywałem.

A jak to sprawdziłeś? Bo jeśli tak:

Kod:
  if (Serial.available()){ //if od wykrywania wiadomości z kontrolera (działa)
    c = Serial.read();
    Serial.write(c); // część diagnostyki
    }

to uwierz mi, ale gdy wyślesz z telefonu 1, to c przyjmie wartość 49.
Zrób taki eksperyment i napisz program:

Kod:
void setup() {
  Serial.begin(9600);
  Serial.write(49);
}

void loop() { 
}

I powiedz co się wyświetliło? 49 czy 1?
Albo w swoim kodzie zamiast
Kod:
Serial.write(c)
, wpisz
Kod:
Serial.print(c)
, to się przekonasz.

Albo zamiast if(c==1) napisz if(c==49), to gwarantuję, że warunek zadziała.
Po poprawce program zadziałał, dzięki za pomoc. Ten write był przez przypadek, nie pomyślałem i jakoś przepisałem część komendy od serwa do Seriala. Działa tak jak napisałeś. Jeszcze raz dzięki za pomoc.