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

tu chyba jest błąd:

zmierzOdleglosc(); //wywolanie funkcji mierzącej odleglosc
double dystans; 

powinno być raczej

double dystans=zmierzOdleglosc(); //wywolanie funkcji mierzącej odleglosc 
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

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

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.