Servo nie reaguje.

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
gall anonim
Młodszy majsterkowicz
Posty: 16
Rejestracja: 30 sty 2015, 18:35

Servo nie reaguje.

Post autor: gall anonim » 20 sty 2016, 16:09

Witam.
Ostatnio zabrałem się za robienie alarmu połączonego zamykaną szafką. I właśnie mam problem w tym że tak servo normalnie reaguje, ale jak program przejdzie przez pętle alarmu i wtedy próbuję otworzyć zamek to nic się nie dzieje. Na ekraniku wszystko się poprawnie wyświetla tylko servo nie reaguje. Czemu?
Ot kod

Kod: Zaznacz cały


    
    #include <Keypad.h> // klawiaturka 4x4
    #include<EEPROM.h>  // zapis szyfru w eeprom
    #include <Servo.h>  // serwo do zamka
    #include <Wire.h>   // do komunikacji po I2c
    #include "PCF8574.h"// Expander 
    #include <LiquidCrystal_I2C.h> // ekranik po Ic2
    

    
    
    // --- zmiennie ------------------------------------------
    const byte wiersze= 4; //ilość wierszy
    const byte kolumny= 4; //ilość kolumn
    //definicja klawiszy (identycznie jak na klawiaturze)
    char mapaklawiszy[wiersze][kolumny]=
    {
    {'1', '2', '3', 'A'},
    {'4', '5', '6', 'B'},
    {'7', '8', '9', 'C'},
    {'*', '0', '#', 'D'}
    };
    byte wiersze_piny[wiersze] = {9,8,7,6}; // wiersze 0-3
    byte kolumny_piny[kolumny]= {5,4,3,2}; // kolumny 0-3
    int pamiec[5]; // pamięc wciśniętych klawiszy - 5 znaków
    volatile int szyfr=0; // szyfr=0 -> brak szyfr=1 jest aktywny
    volatile int l=0; // zmienna pomocnicza, licznik znaków
    volatile int result=0; // rezultat porównania ciągu 5-ciu znaków
    int mykey[5]; // taklica wciśnietych znaków
    boolean running = false;
    boolean stan1 = false;
    boolean stan2 = false;
    boolean stan3 = HIGH;
    int a = 1;
    Servo serw;
    PCF8574 expander;
   LiquidCrystal_I2C lcd(0x38,16,2); 
   
    Keypad myKeypad= Keypad(makeKeymap(mapaklawiszy), wiersze_piny, kolumny_piny,
     wiersze, kolumny);
   char Key = myKeypad.getKey();
    
     // definicja obiektu klasy Keypad
    // --- funkcje programu: ---------------------------------
    void warning_0()
      {
        digitalWrite(12,1);delay(600);digitalWrite(12,0);delay(30);
        warning_1();
      } // bipper dla OK
    void warning_1()
      {
        digitalWrite(12,1);delay(30);digitalWrite(12,0);delay(30);digitalWrite(12,1);delay(30);digitalWrite(12,0);
      } // bipper dla wrong code

    void potwir()
    {
      digitalWrite(12,1);delay(100);digitalWrite(12,0);delay(50);digitalWrite(12,1);delay(100);digitalWrite(12,0);
    } // bipper potwierdzający
    void odczyt_EEPROM() // funkcja sprawdza obecnośc szyfru w pamięci EEPROM
      {
       for (int i=0;i<5;i++) {pamiec[i]=EEPROM.read(i);}
       if(pamiec[0]!=255 && pamiec[1]!=255 && pamiec[2]!=255 && pamiec[3]!=255
       && pamiec[4]!=255) szyfr=1; else szyfr=0;
       // jeśli jest KOD to szyfr =1 else szyfr =0
      }
    void fnowy_kod() // funkcja ustawia nową kombinację dla szyfru
      {
       for(int i=0;i<5;i++)EEPROM.write(i,255); //kasowanie EEPROM
       lcd.clear();
         lcd.print("Kod skasowano");
         delay(500);
         lcd.clear();
         lcd.print("Wpisz nowy kod:");
          a=1;
       while(l<5)
         {
         char keypressed = myKeypad.getKey();
         if (keypressed != NO_KEY)
           {
           EEPROM.write(l,keypressed);l++; // zapis pojedynczego znaku
           lcd.setCursor(a,1);
           lcd.print("*");
           a++;
           warning_1();
           }
         }
       for(int k=0;k<3;k++){
       warning_1();warning_1();warning_1();warning_1();warning_1();delay(300);}
        lcd.clear();
     lcd.print("Kod zapisany");l=0;
     delay(1000);
       
      }
    void dostep() // funkcja sterująca dostępem
      {
          a=1;
         lcd.clear();
      lcd.print("Wpisz kod:");
       while(l<5)
         {
         char keypressed = myKeypad.getKey();
         if (keypressed != NO_KEY)
           {
           mykey[l]=keypressed;l++;  
           warning_1();
           lcd.setCursor(a,1);
           lcd.print("*");
           a++;
           }
         }
       if( mykey[0]==pamiec[0] && mykey[1]==pamiec[1] && mykey[2]==pamiec[2]
       && mykey[3]==pamiec[3] && mykey[4]==pamiec[4] )
         {
         warning_1();warning_1();
        if(stan1==HIGH)
       {
        lcd.clear();
        lcd.print("Alarm Rozbrojony");
          digitalWrite(11, LOW);          // Wyłączenie syreny
          stan1 = LOW;  
          delay(1000); 
          lcd.clear();
          lcd.print("System");
          lcd.setCursor(0, 1);
          lcd.print("Alarmowy");
          digitalWrite(11, LOW);
       
       }
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("Zalogowano");
        delay(1000); 
        lcd.clear();
        lcd.setCursor(0, 1);    
        lcd.print("Witaj :)");  
        delay(1000);      
        lcd.clear();
        running = !running;                
       potwir();
      
       
         run();
         }
       // sprawdzamy czy wybrano specjalny kod do zmiany szyfru
       else
         {
           result++;
           if(mykey[0]=='2' && mykey[1]=='5' && mykey[2]=='1' && mykey[3]=='0'// kod master
           && mykey[4]=='4' )
             {
             // 25104
             for(int k=0;k<3;k++){
             warning_1();warning_1();warning_1();warning_1();warning_1();
             delay(300);}
             
            lcd.clear();
             lcd.print("Zmiana kodu");
             delay(1000);
             lcd.clear();
             lcd.print("Wykonuje");
             delay(1000);l=0;fnowy_kod();
             }
           else result++;
         }
       if(result>1){  lcd.clear();
        lcd.print("Kod niepoprawny");
        delay(500);
       warning_0();delay(500);result=0;}
       l=0;
      }

   void run()                  // Po  wpisaniu kodu
   {       lcd.clear();
          lcd.print("System");
          lcd.setCursor(0, 1);
          lcd.print("Alarmowy");
  while ( running == HIGH ) {
   
   Key = myKeypad.getKey();
      if(Key == 'D'){            // Wylogowanie
         running = !running;
        
            potwir();
           lcd.clear();
           lcd.print("Wylogowano");
            lcd.setCursor(0, 1);
            lcd.print("Do zobaczenia :)");
           delay(1000);
        
     }
       if(Key == 'A'){           // Aktywacja alarmu
          stan1 = HIGH;               
           potwir();
          stan2 = HIGH;
         
          alarm();
       }
       if(Key == 'B'){           // Zamknięcie/otwarcie Zamka
          stan3 = !stan3;
           potwir();
           
          if(stan3 == LOW){
         
          serw.attach(10);                // włącz serwo
          delay(100);                     // czekaj   
          serw. write (0);                // ustaw serwo na pozycji 0
          delay(1000);               // czekaj
          serw.detach();             // wyłącz serwo
          lcd.clear();
          lcd.print("Zamek otwarto");
          delay(1000); 
          lcd.clear();
          lcd.print("System");
          lcd.setCursor(0, 1);
          lcd.print("Alarmowy");
         }
           if(stan3 == HIGH){
     
        
          serw.attach(10);               // włącz serwo
          delay(100);                     // czekaj  
          serw. write (90);               // ustaw serwo na pozycji 90
          delay(1000);                   // czekaj
          serw.detach();              // wyłącz serwo
           lcd.clear();
           lcd.print("Zamek zamkniety");
             delay(1000); 
          lcd.clear();
          lcd.print("System");
          lcd.setCursor(0, 1);
          lcd.print("Alarmowy");
       }
     }
   }
 }

 void alarm()         // Alarm
 {
   
   lcd.clear();
   lcd.print("Do uzbrojenia");
  while(stan2 == HIGH)       
 {
     int licznik1=30;
    boolean alars=LOW;
   
    int licznik=30;
    running = !running;
    pamiec[5] = 0;
    mykey[5] = 00000;
    l=0;
    boolean uzbro= false;
    while(stan1 == HIGH)            // Czas na wyjście z pomieszczenia
    {
         while(licznik>0)
           {
       lcd.setCursor(0, 1);
       lcd.print(licznik);
       lcd.print("  sek");
       
       digitalWrite(12, HIGH);
       delay(100);
       digitalWrite(12, LOW);
        
       delay(1000);
       licznik--;
            }
     
    
     if(uzbro == false)
     {
     lcd.clear();
     lcd.print("Alarm uzbrojony");
     delay(100);
     uzbro = !uzbro;
     }
     boolean CZUJ=digitalRead(13);
     Key = myKeypad.getKey();
          if(Key == 'A')
              {
                lcd.clear();
                lcd.print("Wpisz kod");
                stan2=LOW;
                licznik1=0;
                break;
              }
        if(CZUJ==HIGH)
        {
          alars=HIGH;
         }
        if(alars==HIGH)
         {
            lcd.clear();              // Czas na dezaktywacja alarmu
            lcd.print("Do syreny");
             pamiec[5] = 0;
             mykey[5] = 00000;
             l=0;
                  while(licznik1>0)
                   {
                    lcd.setCursor(0, 1);
                    lcd.print(licznik1);
                     lcd.print("  sek");
                    licznik1--;
                   
                     delay(100);
                    
                   Key = myKeypad.getKey();
                   delay(900);
                   Key = myKeypad.getKey();
                       if(Key == 'A')            // Dezaktywacja alarmu
                         {
                           
                           lcd.clear();
                           lcd.print("Wpisz kod");
                           stan2=LOW;
                           licznik1=0;
                           break;
                          }
                        } 
                    
                    lcd.clear();
                    lcd.print("Syrena aktywna");    // Aktywacja syreny
                   digitalWrite(11, HIGH); 
                   stan2=LOW;
                   
                 
                   break;
     
       }
     }
   }
 }
 
    //-------------------------------------------------------
    void setup()
    //- szyfr 5-cio znakowy
    // - zmiana szyfru po wpisaniu kodu master: 25104 ( lub innej dowolnej
    //  5-cio znakowej - patrz w programie )
     {
      lcd.init();            // Rozpoczęcie ekranika
       pinMode(13, INPUT); // czujnik
       pinMode(11, OUTPUT); // syrena
       pinMode(12, OUTPUT); //buzzer
                            //  serwo pin 10
                            // klawiatura 2-9
                            // exender na pinach A4 i A5
                            // Klawiatura numeryczna 4X4 połączona do pinów 2-9 Arduino
          serw.attach(10);  // zamknięcie zamka po uruchomieniu systemu             
          delay(100);                     
          serw. write (90);               
          delay(1000);                   
          serw.detach();

           
          lcd.clear();                  // Trzeba się przedstawić :)
          lcd.print("Witaj :)");
           for (int positionCounter = 0; positionCounter < 8; positionCounter++) {
             // scroll one position right:
              lcd.scrollDisplayRight();
               // wait a bit:
               delay(250);
           }
             for (int positionCounter = 0; positionCounter <13; positionCounter++) {
             // scroll one position right:
              lcd.scrollDisplayLeft();
               // wait a bit:
               delay(250);
           }
          lcd.clear();
          lcd.print("System ");
          lcd.setCursor(0, 1);
          lcd.print("Alarmowy ");
          delay(1000);
          lcd.clear();
          lcd.print("by ");
          lcd.setCursor(0, 1);
          lcd.print("Wilczur16 ");
          delay(1000);

          
         }
    //--------------------------------------------------------
    void loop()
     {
       odczyt_EEPROM();delay(30);
       if(szyfr==0)fnowy_kod();else dostep();
     }
    // =========== KONIEC ====================================

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
Marhef
Złota rączka
Posty: 1221
Rejestracja: 18 lis 2011, 02:18

Re: Servo nie reaguje.

Post autor: Marhef » 20 sty 2016, 16:22

Źle się to czyta. Pokaż, w którym miejscu nie działa poprawnie.
gall anonim
Młodszy majsterkowicz
Posty: 16
Rejestracja: 30 sty 2015, 18:35

Re: Servo nie reaguje.

Post autor: gall anonim » 20 sty 2016, 16:47

sterowanie servem

Kod: Zaznacz cały

 if(Key == 'B'){           // Zamknięcie/otwarcie Zamka
          stan3 = !stan3;
           potwir();
           
          if(stan3 == LOW){
         
          serw.attach(10);                // włącz serwo
          delay(100);                     // czekaj   
          serw. write (0);                // ustaw serwo na pozycji 0
          delay(1000);               // czekaj
          serw.detach();             // wyłącz serwo
          lcd.clear();
          lcd.print("Zamek otwarto");
          delay(1000);
          lcd.clear();
          lcd.print("System");
          lcd.setCursor(0, 1);
          lcd.print("Alarmowy");
         }
           if(stan3 == HIGH){
     
       
          serw.attach(10);               // włącz serwo
          delay(100);                     // czekaj 
          serw. write (90);               // ustaw serwo na pozycji 90
          delay(1000);                   // czekaj
          serw.detach();              // wyłącz serwo
           lcd.clear();
i pętla alarmu

Kod: Zaznacz cały

void alarm()         // Alarm
 {
   
   lcd.clear();
   lcd.print("Do uzbrojenia");
  while(stan2 == HIGH)       
 {
     int licznik1=30;
    boolean alars=LOW;
   
    int licznik=30;
    running = !running;
    pamiec[5] = 0;
    mykey[5] = 00000;
    l=0;
    boolean uzbro= false;
    while(stan1 == HIGH)            // Czas na wyjście z pomieszczenia
    {
         while(licznik>0)
           {
       lcd.setCursor(0, 1);
       lcd.print(licznik);
       lcd.print("  sek");
       
       digitalWrite(12, HIGH);
       delay(100);
       digitalWrite(12, LOW);
       
       delay(1000);
       licznik--;
            }
     
   
     if(uzbro == false)
     {
     lcd.clear();
     lcd.print("Alarm uzbrojony");
     delay(100);
     uzbro = !uzbro;
     }
     boolean CZUJ=digitalRead(13);
     Key = myKeypad.getKey();
          if(Key == 'A')
              {
                lcd.clear();
                lcd.print("Wpisz kod");
                stan2=LOW;
                licznik1=0;
                break;
              }
        if(CZUJ==HIGH)
        {
          alars=HIGH;
         }
        if(alars==HIGH)
         {
            lcd.clear();              // Czas na dezaktywacja alarmu
            lcd.print("Do syreny");
             pamiec[5] = 0;
             mykey[5] = 00000;
             l=0;
                  while(licznik1>0)
                   {
                    lcd.setCursor(0, 1);
                    lcd.print(licznik1);
                     lcd.print("  sek");
                    licznik1--;
                   
                     delay(100);
                   
                   Key = myKeypad.getKey();
                   delay(900);
                   Key = myKeypad.getKey();
                       if(Key == 'A')            // Dezaktywacja alarmu
                         {
                           
                           lcd.clear();
                           lcd.print("Wpisz kod");
                           stan2=LOW;
                           licznik1=0;
                           break;
                          }
                        }
                   
                    lcd.clear();
                    lcd.print("Syrena aktywna");    // Aktywacja syreny
                   digitalWrite(11, HIGH);
                   stan2=LOW;
                   
                 
                   break;
     
       }
     }
   }
 }
rumunn95
Majsterkowicz
Posty: 174
Rejestracja: 12 mar 2015, 18:32

Re: Servo nie reaguje.

Post autor: rumunn95 » 20 sty 2016, 20:28

Jakie serwo i jak je zasilasz?

Wysłane z mojego LG-D802 przy użyciu Tapatalka
ODPOWIEDZ

Strony partnerskie: