Skocz do zawartości

Sterowanie arduino za pomoca telefonu ( detektor swiatla i czujnik ultradzwiekowy)


Matys169

Pomocna odpowiedź

Witam, mam problem. Zbudowalem robocika mobilnego i aplikacje do sterowania nim.Dodałem oswietlenie i czujniki: ultradzwiekowy i swiatła. Chcialbym aby diody palily sie gdy jest ciemno a gdy przeszkoda jest blisko zaczely mrugac. Problemem jest napisanie tego w programie. Gdy dorzuce pare linijek o swiatłach to przestaje jezdzic a swiatla mrugaja caly czas. Pomoze mi ktos poprawic ten kod?

#include <SoftwareSerial.h>                       //#include (plik nagłówkowy) - implementacja biblioteki SoftwareSerial

#define czujnikZmierzchu A1                       //przypisanie pinów do podzespolów
#define trigPin 2
#define echoPin 3
#define silnikPierwszyDoPrzodu 8
#define silnikPierwszyDoTylu 12
#define silnikDrugiDoPrzodu 4
#define silnikDrugiDoTylu 7
#define rxpin 5
#define txpin 6
#define led 9

SoftwareSerial mySerial(rxpin, txpin);            //przypisanie pinów dla bluetooth

byte button;                                      //definicje zmiennych
byte prevButton;
int foto = czujnikZmierzchu;
int zaciemnienie = 0;
int outzaciemnienie = 0;

int zmierzOdleglosc() {                           //definicje funkcji
 long czas, dystans; 
 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);
 czas = pulseIn(echoPin, HIGH);
 dystans = czas / 58;
 return dystans;
}

int Forward(){
 digitalWrite(silnikPierwszyDoPrzodu, HIGH);
 digitalWrite(silnikPierwszyDoTylu, LOW);  
 digitalWrite(silnikDrugiDoPrzodu, HIGH);
 digitalWrite(silnikDrugiDoTylu, LOW);
}

int Right(){
 digitalWrite(silnikPierwszyDoPrzodu, LOW);
 digitalWrite(silnikPierwszyDoTylu, HIGH);  
 digitalWrite(silnikDrugiDoPrzodu, HIGH);
 digitalWrite(silnikDrugiDoTylu, LOW);
}

int Left(){
 digitalWrite(silnikPierwszyDoPrzodu, HIGH);
 digitalWrite(silnikPierwszyDoTylu, LOW);  
 digitalWrite(silnikDrugiDoPrzodu, LOW);
 digitalWrite(silnikDrugiDoTylu, HIGH);
}

int Stop(){
 digitalWrite(silnikPierwszyDoPrzodu, LOW);
 digitalWrite(silnikPierwszyDoTylu, LOW);  
 digitalWrite(silnikDrugiDoPrzodu, LOW);
 digitalWrite(silnikDrugiDoTylu, LOW);
}

int Backward(){
 digitalWrite(silnikPierwszyDoPrzodu, LOW);
 digitalWrite(silnikPierwszyDoTylu, HIGH);  
 digitalWrite(silnikDrugiDoPrzodu, LOW);
 digitalWrite(silnikDrugiDoTylu, HIGH);
}

void setup()
{
 mySerial.begin(9600);                     //otwarcie SerialPortu dla bluetooth i ustawienie baud rate (pol. Bod - prędkości transmisji danych
 pinMode(rxpin, INPUT);                    //inicjacja pinów
 pinMode(txpin, OUTPUT);
 pinMode(silnikPierwszyDoPrzodu, OUTPUT);
 pinMode(silnikPierwszyDoTylu, OUTPUT);
 pinMode(silnikDrugiDoPrzodu, OUTPUT);
 pinMode(silnikDrugiDoTylu, OUTPUT);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 pinMode(led, OUTPUT);
}

void loop()  /*                               //pętla w której wykonywany jest program robota
{
 zmierzOdleglosc();                        //wywolanie funkcji mierzącej odleglosc
 double dystans;                           
 if (dystans < 30) {                       //instrukcja warunkowa wykonywana jeśli dystans < 30, a w niej:
   while(dystans < 30) {                   //pętla wykonywana tak dlugo jak dystans < 30
       digitalWrite(led, HIGH);            //w kółko zaswieca i gasi ledy w odstępach 25 milisekund
       delay(250);
       digitalWrite(led, LOW);
       delay(250);
   }
 }

 zaciemnienie = analogRead(foto);                      //odczyt z czujki zmierzchu
 outzaciemnienie = map(zaciemnienie, 0, 1023, 0, 100); //przekonwertowanie otrzymanego sygnalu z analogowego na procenty funkcją map
   if (outzaciemnienie > 50) {             //instrukcja warunkowa uruchamiana jeśli outzaciemnienie > 50%
       digitalWrite(led, HIGH);            //zaświeca diody, a dalej w tej instrukcji:
       if (dystans < 30) {                 //zagnieżdżona kolejna instrukcja warunkowa
         while(dystans < 30) {             //diody mrygają po wykryciu przeszkody nawet w ciemnościach
           digitalWrite(led, HIGH);
           delay(250);
           digitalWrite(led, LOW);
           delay(250);
         }
       }
   }
 */
{  if (mySerial.available() > 0) {           //instrukcja warunkowa wykonywana jeśli SerialPort jest aktywny, a w niej:
    button = mySerial.read();              //przypisanie otrzymanej przez bluetooth wartości do zmiennej button
    switch (button) {                      //instrukcja wyboru  switch uruchamia na podstawie wyrażenia wyboru (button)
       case 'R' :                          //warianty (case 'R', case 'F' itd.)
       prevButton = button;                //w naszym przypadku wszystkie warianty są skonstruowane w taki sam sposób
       while (prevButton == button) {      //zmieniają się tylko wywoływane funkcje, dlatego opisze tylko następny
         Right();
         if (mySerial.available() > 0) {
         button = mySerial.read();
         }
       }
       break;

       case 'F' :                          //jeśli robot otrzyma 'F' przez bluetooth
       prevButton = button;                //do zmiennej prevButton (poprzedni wybór) przypisze się dopiero co sczytaną wartość button z początku instrukcji switch
       while (prevButton == button) {      //pętla wykonywana tak dlugo jak prevButton == button (czyli az robot nie dostanie innego polecania niż to poprzednie), a w niej:
         Forward();                        //wywołanie funkcji Forward() - jedź do przodu
         if (mySerial.available() > 0) {   //oraz instrukcja warunkowa uruchomiona jeśli SerialPort jest aktywny
         button = mySerial.read();         //przypisanie otrzymanej przez bluetooth wartości do zmiennej button 
         }                                 //jesli wcisnie sie inny przycisk wartosć button sie zmieni i nie bedzie już równa prevButton i pętla przestanie się wykonywac
       }                                   //na końcu programu masz jeszcze jeden opis
       break;

       case 'B' :
       prevButton = button;
       while (prevButton == button) {
         Backward();
         if (mySerial.available() > 0) {
         button = mySerial.read();
         }
       }
       break;

       case 'L' :
       prevButton = button;
       while (prevButton == button) {
         Left();
         if (mySerial.available() > 0) {
         button = mySerial.read();
         }
       }
       break;

       case 'S' :
       prevButton = button;
       while (prevButton == button) {
         Stop();
         if (mySerial.available() > 0) {
         button = mySerial.read();
         }
       }
       break;
       default : Stop();                   //default domyślnie jeśli robot nie dostal polecenia wywołuje funkcję Stop()
    }
 }
}

Pozdrawiam 🙂

__________

Komentarz dodany przez: Treker

Kod programu, dla lepszej czytelności, należy umieszczać w tagach .

Proszę to poprawić.

Link do komentarza
Share on other sites

Pętla llop rozpoczyna Ci się warunkiem

if (dystans<30)
{
     while(dystans < 30) 
     { //pętla wykonywana tak dlugo jak dystans < 30 
           digitalWrite(led, HIGH); //w kółko zaswieca i gasi ledy w odstępach 25 milisekund 
           delay(250); 
           digitalWrite(led, LOW); 
           delay(250); 
     } 
}

Jeśli dystans będzie mniejszy niż 30 zostaniesz na zawsze w while mrugając diodą. Z żaden sposób nie zmieniasz dystansu

Link do komentarza
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.