logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega8][C]automatyczna roleta

killerwo 23 Gru 2008 11:43 3432 24
REKLAMA
  • #1 5893806
    killerwo
    Poziom 10  
    Witam.

    Jestem jednym z waszych cichych bywalców na elektroda.pl i postanowiłem zrobić automatyczne zamykanie rolety i otwierania w zależności czy jest jasno czy ciemno ;] Zrobiłem układ oparty na Atmega8, komparator LM324, foto-tranzystor(mierzy natężenie na zewnątrz okna, i CNY70 jako krańcówka ( jak wykryje małą łatkę czarna na rolecie to się zatrzyma roleta). Wszystko pod względem elektrycznym działa i buczy;] Natomiast mam problem z kodem;/ wynikający z tego ze zaczynam zabawę z AVRami oto Kod:


    {
    
    
          if bit_is_clear(PINC,4)   // wyjscie z komparatora (FOTO)
    
    		{    for (i=0;i<1;i++)
    			
    				{
    					delay(z);
    					}
    			if bit_is_clear(PINC,4)
    				{
    
    						{  
    						PORTB &= ~_BV(4); //wyłaczenie Mostka H
    						PORTB |= _BV(1); //właczenie przekaznika zasilania silnika
    	    				a=0;
    						}
    
    
       				if (bit_is_clear(PINC,5)&&(a==0))//krańcówka
    						{
    							PORTB &=~_BV(1);
    							a=1;
    						}
    
    				}
    		}
    
    
    
    
    		if bit_is_set(PINC,4)		// sprawdzanie 2 razy warunku po czasie z
    
    			{    for (i=0;i<1;i++)
    			
    				{
    					delay(z);
    					}
    
    
    					if bit_is_set(PINC,4)
    				{
    					{
    		
    						PORTB |= _BV(4); // Mostek H włączony
    	  
    			 		    PORTB |= _BV(1); //właczenie przekaznika zasilania silnika
    						a=1;
    					}
    
    						if (bit_is_clear(PINC,5)&&(a==1))
    						{
    							PORTB &=~_BV(1);
    							a=0;
    						}
    		
    				}
    		
    			}
    		
    }



    problem mianowicie jest taki ze gdy roleta się zamyka(robi się ciemno) i natrafi na krańcówkę silnik się wyłącza i jest ok. Natomiast gdy chcemy przejść do następnego stanu( jest jasno) a krańcówka na PINC,5 ciągle wykrywa koniec rolety ( bo tam się zatrzymała co jest oczywiste) jak zrobić żeby zostawił ten warunek co jest spełniony z krańcówką i przeszedł do if bit_is_set(PINC,4) bo nie chce do tego przejść gdy widzi krańcówke:(? proszę o pomoc w kodzie
  • REKLAMA
  • #2 5893908
    dawid512
    Poziom 32  
    Musisz wykorzystać podwójny warunek czyli np. krańcówka naciśnięta- obwód otwarty a na pinie uc jest stan wysoki oraz stan niski z komparatora. Muszą być spełnione obydwa warunki.
  • #3 5893971
    killerwo
    Poziom 10  
    Dzięki za zainteresowanie

    Ale chyba nie bardzo rozumiem;/ tzn ze komparator nie może podać różnych stanów niskiego z krańcówki i wysokiego z foto-tranzystora?
    Jak mogę to poproszę przykład w Kodzie będzie mi łatwiej zrozumieć:)Pozdrawiam
  • REKLAMA
  • #4 5893985
    dawid512
    Poziom 32  
    To znaczy że musisz podać na jeden pin stan wysoki a na drugi niski. Zrobić warunek typu:
    
    if(bit_is_set(PINC, 4))
    {
     if(bit_is_clear(PINC, 5))
      {
    
    instrukcje
    
     }
    }
    
  • #5 5894082
    killerwo
    Poziom 10  
    Zmieniłem tak jak kolega napisał i wyciągnąłem przed główny warunek ale efekt ten sam;/ jakies sugestie? Pozdrawiam

    Dodano po 46 [sekundy]:

    Zmieniłem tak jak kolega napisał i wyciągnąłem przed główny warunek ale efekt ten sam;/ jakies sugestie? Pozdrawiam


      {
    			
    			if (bit_is_clear(PINC,4))
    						{
    						if (bit_is_clear(PINC,5))
    
    							PORTB &=~_BV(1);
    							
    						}
    
    			
    			if (bit_is_set(PINC,4))
    						{
    						if (bit_is_clear(PINC,5))
    
    							PORTB &=~_BV(1);
    							
    						}
    
    
    
    
    
          if bit_is_clear(PINC,4)  // wyjscie z komparatora (FOTO)
    
    		{    for (i=0;i<1;i++)
    			
    				{
    					delay(z);
    					}
    			if bit_is_clear(PINC,4)
    				{
    
    						{  
    						PORTB &= ~_BV(4); //wyłaczenie Mostka H
    						PORTB |= _BV(1); //właczenie przekaznika zasilania silnika
    	    				a=0;
    						}
    
    /*
       						if (bit_is_clear(PINC,5))
    						{
    							PORTB &=~_BV(1);
    							
    
    						}
    */
    				}
    		}
    
    
    
    
    		if bit_is_set(PINC,4)		// sprawdzanie 2 razy warunku po czasie z
    
    			{    for (i=0;i<1;i++)
    			
    				{
    					delay(z);
    					}
    
    
    					if bit_is_set(PINC,4)
    				{
    					
    		
    						PORTB |= _BV(4); // Mostek H włączony
    	  
    			 		    PORTB |= _BV(1); //właczenie przekaznika zasilania silnika
    						a=1;
    					}
    /*
    					 if (bit_is_clear(PINC,5)&&(a==1))
    						{
    							PORTB &=~_BV(1);
    							a=0;
    						}
    		*/
    				}
    		
    			}
    		
    }
    }
  • #6 5894261
    dawid512
    Poziom 32  
    if (bit_is_clear(PINC,4))
                      {
                      if (bit_is_clear(PINC,5))
    
                         PORTB &=~_BV(1);
                         
                      }
    
             
             if (bit_is_set(PINC,4))
                      {
                      if (bit_is_clear(PINC,5))
    
                         PORTB &=~_BV(1);
                         
                      }


    Dwa różne warunki a instrukcja taka sama...
  • #7 5894265
    killerwo
    Poziom 10  
    wydaje mi sie ze właśnie taka instrukcja jest i ona działa bo wykrywa krańcówkę natomiast ( widzi ja cały czas i nie pozwala iść programowi dalej)gdy sie zrobi np jasno
  • #8 5894283
    dawid512
    Poziom 32  
    Troszkę mnie nie rozumiesz ale ok, zrób inaczej. Gdy krańcówka zostanie naciśnięta to przerwa w obwodzie i stan wysoki na pinie uc. Wtedy ustaw sobie jakąś flagę. Wtedy wiesz że krańcówka zadziałała i wtedy możesz przystąpić do wykonywania dalszej części programu.
  • #9 5894296
    killerwo
    Poziom 10  
    tak zgadza się bo


    
    if (bit_is_clear(PINC,4))   // jak jest ciemno 
                      {
                      if (bit_is_clear(PINC,5))// jak pojawi si krancowka wyłacz silnik (zeby roleta stała )
    
                         PORTB &=~_BV(1);//  wyłacza silnik
                         
                      }
    
             
             if (bit_is_set(PINC,4))// jak jest jasno 
                      {
                      if (bit_is_clear(PINC,5))// gdy pojawi sie krancowka 
    
                         PORTB &=~_BV(1);// wyłacz silnik
                         
                      }



    i program wyłaczy silnik i jest ok tylko pozniej jak robi sie jasno/ciemno nie chce sie ustawic PORTB &=~_BV(1) na PORTB |=_BV(1) zeby roleta sie zawijala lub odwrotnie
  • #10 5894318
    dawid512
    Poziom 32  
    Zaraz zaraz trochę cię nie rozumiem gdy jest ciemno/jasno to wyłączasz silnik ale czemu? Wg. mnie musisz ustalić czy jak jest jasno to włączasz silnik czy jak jest ciemno.
  • #11 5894363
    killerwo
    Poziom 10  
    jest jasno: se
    roleta jest otwarta
    jest ciemno:
    czujnik wykrywa ( ze jest ciemno clear(PC4)) następuje włączenie silnika PB(1)
    program czeka az na krancowce PC(5) pojawi się stan niski i ma wyłączyć silnik PB(1)program czeka aż będzie set PC(4)robi sie jasno:) ustawiamy PB(4) (zmiana obrotów silnika) i PB(1) żeby dać zasilanie silnikowi tak dlugo będzie sie zawijac az na krańcówce pojawi sie stan niski i zatrzyma silnik później czekanie aż będzie ciemno. Może coś zagmatwałem?pozdro


    a problem polega na tym ze przy zmianie z jasno na ciemno krańcówka blokuje dzialanie programu i roleta zamiast startowac czeka krancowke
  • Pomocny post
    #12 5894721
    BoskiDialer
    Poziom 34  
    Masz jedną krańcówkę na wykrywanie obu końców?
    Może po prostu po wykryciu że jest ciemno załączyć silnik, odczekać 1 sekundę żeby krańcówka się wyłączyła i dopiero wtedy czekać na ponowne załączenie krańcówki?
  • REKLAMA
  • #13 5894905
    kaktus_c++
    Poziom 18  
    witam
    ja wyobrażam to sobie tak że potrzebne są dwie krańcówki
    jedna się włącza gdy roleta jest rozwinięta a druga gdy roleta jest zwinięta

    a w takim przypadku kod wyglądałby w zarysie, w przybliżeniu tak (nie zagłębiałem się w szczegóły sprawdzania pinów) :

    
    bool jest_jasno();// jasno i ciemno to w sumie prawie taka sama funkcja, tylko watrość przeciwna jest zwracana
    bool jest_ciemno();
    bool roleta_rozwinięta();//sprawdza krańcówkę 1
    bool roleta_zwinięta();//sprawdza krańcówkę 2
    void krec_silnikiem(int w_ktora_strone);// 1==prawo, 2==lewo
    void zwijaj_rolete(void)
    {
     krec_silnikiem(1);
    }
    void rozwijaj_rolete(void)
    {
     krec_silnikiem(2);
    }
    
    main()
    {
        
      while(1)
      {
        if ( jest_jasno() && roleta_rozwinieta())
           {
              zwijaj_rolete();  //kręć silnikiem w jedną stronę
           }
        if ( jest_ciemno() && roleta_zwinieta())
          {
              rozwijaj_rolete(); //kręć silnikiem w drugą stronę
          }
      }
     return;
    }
    


    // no chyba ze masz tylko jedną krańcówkę, to trzeba trochę inaczej rozwiązać
  • REKLAMA
  • #14 5895110
    killerwo
    Poziom 10  
    Witam.

    tak mam jedną krańcówkę zaraz bede analizował kod i moze mi sie uda :] jednak prosiłbym o przykladowy kod na jedna krancowke

    Dodano po 11 [minuty]:

    BOSKI DIALER :) jesteś boski;d faktycznie delay pomógł ehhh banalne ale siedzialem nad tym z 5h nie ma to jak pierwszy program w C :]dzieki wszystkim za pomoc i zainteresowanie , teraz pewnie czas na jakies kolejne problemy.Pozdrawiam

    Dodano po 3 [godziny] 54 [minuty]:

    Mam kolejny problem z kodem

    if (z==1)	
    		
    			
    		{
    			PORTB &= ~_BV(4); //wyłaczenie Mostka H
    			PORTB |= _BV(1); //właczenie przekaznika 	
    		
                                if (bit_is_clear(PINC,5))
    					{
    					   	
    					   	PORTB |=_BV(1);
    					for(k=0; k<30;k++)
    						{
    							delay(1200);
    						}
    						a=1;
    						z=0;
    				}
    		}


    Problem jest taki ze program przelatuje doslownie przez drugiego IFa a winny w tym jest delay lub/oraz w petli for , gdy go nie ma wszystko jest ok . Jak rozwiazać problem zeby było opóźnienie?
  • #15 5908542
    Sledge
    Poziom 11  
    Zabawa z jedna krancowka ma jedna wade, jesli na starcie jestes na ktoryms koncu to nie ma jak sprawdzic na ktorym.

    Kompletny, nie sprawdzany kod :) Powpisuj tylko te 6 funkcji i powinno dzialac.

    /*silnik wlaczony*/
    void EngineOn(void)
    
    /*silnik wylaczony*/
    void EngineOff(void)
    
    /*kierunek silnika w gore*/
    void Up(void)
    
    /*kierunek silnika w dol*/
    void Down(void)
    
    /*  koniec==1  gdziespomiedzy==0  */
    unsigned char CheckEnd(void)
    
    /*  ciemno==0, jasno==1  */
    unsigned char CheckLight(void)
    
    unsigned char CurrentPosition;  /*rozwiniete==0 zwiniete==1*/
    /*Na jednej krancowce pozycja na starcie musi byc znana*/
    
    int main(void){
    
    	if(CheckEnd()==0){ /*Na starcie jestesmy "gdzies pomiedzy" mozna wiec rolowac*/
    		if(CheckLight()==1){
    			Up();
    			EngineOn();
    			while(CheckEnd()==0);
    			EngineOff();
    			CurrentPosition=1;
    		}else{
    			Down();
    			EngineOn();
    			while(CheckEnd()==0);
    			EngineOff();
    			CurrentPosition=0;
    		}
    		
    		while(1){ /*Wlasciwa petla*/
    		
    			if(CheckLight()==1 && CurrentPosition==0){/*jasno a okno zasloniete*/
    				Up();	/*rolety w gore*/
    				EngineOn();
    				while(CheckEnd()==1);/*czekanie az zjedzie z krancowki*/
    				_delay_ms(5);/*dodatkowe czekanie na wypadek poszarpanych krawedzi*/
    				while(CheckEnd()==0);/*czekanie na nastepny kraniec*/
    				EngineOff();
    				CurrentPosition=1;/*roleta zostala zwinieta*/
    			}
    			
    			else if(CheckLight()==0 && CurrentPosition==1){
    				Down();
    				EngineOn();
    				while(CheckEnd()==1);
    				_delay_ms(5);
    				while(CheckEnd()==0);
    				EngineOff();
    				CurrentPosition=0;
    			}
    		
    		}
    	}
    	else while(1);/*Jestesmy na ktoryms koncu wiec odpuszczamy sobie i nie ryzykujemy uszkodzenia silnika*/
    
    }
    
    


    Uwagi kolegi ponizej uwzglednione
  • #16 5910114
    BoskiDialer
    Poziom 34  
    Sledge: Wyraźnie widać, że nie sprawdzony - "==" to porównania a nie przypisania: [CurrentPosition==0;]. Co do rozruchu - owszem jedna krańcówka to za mało, żeby można było określić czy roleta jest rozwinięta czy zwinięta - ale można dać na początek pewien krótki algorytm, który ustawia roletę w pozycji nie-krańcowej: jeśli nie-kraniec, to przerwij; odczekanie 3 sekund (przy rozruchu niczemu to nie szkodzi, a w razie ciągłego resetowania się procesora silnik będzie mniej obciążony), załączenie rozwijania w dół na 300ms, jeśli nie-koniec, to przerwij, w przeciwnym przypadku 300ms w drugą stronę. Wtedy jesteśmy w pozycji środkowej i możemy przejść do właściwego ustawiania rolety. Oczywiście założeniem jest, że roleta nie może się bardziej zwinąć lub bardziej rozwinąć, co nie zawsze jest prawdą. Lepiej było by dać dwie niezależne krańcówki.
  • #17 5918775
    killerwo
    Poziom 10  
    Witam

    Kod działa i roleta gdy ma się zamykać to robi i tak samo z otwieraniem działa włącznie z przyciskami. Natomiast jest problem typu że przy zamykaniu lub otwieraniu program czeka na krańcówkę i wyłącza silnik jest ok tylko czasami nie zauważy tej krańcówki ( czarna taśma izolacyjna) nawet jak zwiększę jej wymiar ze powinna reagować to i tak czasami ja "przejedzie" jak pisałem wcześniej CNY70 jest podpięty do komparatora LM324 przez dzielnik napięcia 2x 220 ohm i idzie wysterować (drugie wejscie komparatora) potencjometrem żeby wysterować czy widzi jasne czy ciemne barwy natomiast przy jasnym komparator daje 1,3V a przy ciemnym 0,3V różnice pomiędzy stanami są widoczne przez atmege tylko tak jakby za późno reagował komparator powinien dawać 0 lub 5V a mi tu cyrki takie robi;/, jest to możliwe?chyba że jest to błąd w kodzie i jak program przechodzi przez kod to zanim dojdzie do warunku gdzie jest krańcówka omija ją??jest to możliwe??:]
    Sorry jak są to retoryczne pytania:)

    Kod:

    
    #define F_CPU 8000000L
    #include <avr/io.h>
    
    
    
    void delay(unsigned int ms)	//na 8MHz działa w symulatorze z dokładnością 0.1%
    {
    unsigned int i;
    unsigned int j;
    for (i=0;i<ms;i++)
    	{
    	for (j=0;j<398;j++) 
    		{
    		asm volatile (
                            "WDR"::);	//reset watchdoga
    	
    		}
    	}
    }
    
    
    
    
    int main(void)
    
    
    {   //PINB , 5 na przyscik
     
       DDRB = 0xFF;  // wyjscia
       DDRC = 0x00;   //wejscie portu C i D
       PORTC = 0xff;
       DDRD = 0x00;
       PORTD = 0xFF;
    
    	int z=0;
    	int k=0, b=0;
    	int a=0;
    
       while(1)
       {
       
       
       if (b==0);
      
       {				
    					//robi sie ciemno z tej pozycji musimy zaczynać program aby działał
    			if (bit_is_clear(PINC,4)&&(a==0))// wejscie z komparatora foto 
    			{
    				{	
    						
    						PORTB &= ~_BV(4); //wyłaczenie Mostka H
    						PORTB |= _BV(1); //właczenie przekaznika zasilania silnika
    						}
    						delay(1800);
    						if bit_is_clear(PINC,5)// sprawdzenie krańcówki
    					{
    						   	PORTB &=~_BV(1);// wyłacz silnik
    							a=1;
    					}
    			}						
    		
    		if (bit_is_set(PINC,4)&&(a==1))		// sprawdza czy jest jasno
    			
    		{
    			{   
    							
    						PORTB |= _BV(4); // Mostek H włączony (odrócenie obrotów silnika)
    	  
    			 		    PORTB |= _BV(1); //właczenie przekaznika zasilania silnika
    				        }		
    						delay(1800);
    						if bit_is_clear(PINC,5)// sprawdzenie krańcówki
    				{		
    						   	PORTB &=~_BV(1);// wyłącz silnik
    							a=0;
    				}				
    		
    		}			
    		//przyciski
    		if bit_is_set(PIND,2)
    		z=1;
    		{ 
    		 if ((z==1)&&(a==0))	//zamykanie rolety gdy jest jasno
    		
    			
    		{
    			PORTB &= ~_BV(4); //wyłaczenie Mostka H
    			PORTB |= _BV(1); //właczenie przekaznika zasilania silnika						
    			delay(1800);
    			
    			if (bit_is_clear(PINC,5))
    					{
    					   	
    					   	PORTB &=~_BV(1);
    						for (k=0; k<430; k++) // czekaj 2 godziy i otwieraj rolete
    						{
    						delay(5000);
    						}
    						a=1;
    						z=0;
    				}
    	
    			}
    			
    		if ((z==1)&&(a==1))// otwieranie rolety gdy jest ciemno
    			
    		{	
    			PORTB |= _BV(4); //wyłaczenie Mostka H
    			PORTB |= _BV(1); //właczenie przekaznika zasilania silnika						
    			delay(1800);
    		if (bit_is_clear(PINC,5))
    					{
    					   	
    					   	PORTB &=~_BV(1);
    						for (k=0; k<30; k++) // czekaj 2 godziy i zamykaj
    						{
    						delay(2500);
    						}
    						a=0;
    						z=0;
    				}
    	
    	
    		}
    
    }
    
    }
    }
    }
    
    
  • #18 5923857
    Sledge
    Poziom 11  
    Problemem prawdopodobnie są delay'e - trochę ich za dużo i za długie, włączasz silnik i raz na 1,8s próbkujesz czy roleta się rozwinęła[imo trochę za rzadko]

    Problem "gdzie ja jestem" można by częściowo rozwiązać za pomocą EEPROMU. Rozwiązanie to działałoby pod warunkiem że rolety nie byłyby otwierane ręcznie (w sensie z pominięciem sterowania procesorem), będzie potrzeba to dopiszę.

    @killerwo
    Popracuj trochę nad wyglądem kodu, ułożony kod łatwiej się czyta i łatwiej w nim znaleźć błędy. Nie żałuj też komentarzy do zmiennych, albo nazywaj chociaż je bardziej opisowo.

    Ten kod powinien działać, kompiluje się i jeśli dobrze odszyfrowałem który port jak czym steruje to wystarczy go załadować i odpalić.
    Zmieniłem trochę program tak by nie blokował się gdy na starcie nie może się odnaleźć - można mu pomóc przesuwając roletę na "gdzieś pomiędzy", mały kuksaniec(szarpnięcie) i roleta znów z nami gada :)
    #include <avr\io.h>
    
    void _delay_ms(unsigned int ms)   //na 8MHz działa w symulatorze z dokładnością 0.1%
    {
    unsigned int i;
    unsigned int j;
    for (i=0;i<ms;i++)
       {
       for (j=0;j<398;j++)
          {
          asm volatile (
                            "WDR"::);   //reset watchdoga
       
          }
       }
    }
    
    inline void _wdr(void){
    	asm volatile ("WDR"::);
    }
    
    /*silnik wlaczony*/
    inline void EngineOn(void){
    	PORTB |= _BV(1);
    }
    
    /*silnik wylaczony*/
    inline void EngineOff(void){
    	PORTB &= ~_BV(1);
    }
    
    /*kierunek silnika w gore*/
    inline void Up(void){
    	PORTB |= _BV(4);
    }
    
    /*kierunek silnika w dol*/
    inline void Down(void){
    	PORTB &= ~_BV(4);
    }
    
    /*  koniec==1  gdziespomiedzy==0  */
    inline unsigned char CheckEnd(void){
    	return ( bit_is_clear(PINC,5) ? 1 : 0 );
    }
    
    /*  ciemno==0, jasno==1  */
    inline unsigned char CheckLight(void){
    	return ( bit_is_set(PINC,4) ? 1 : 0 );
    }
    
    inline unsigned char IsButtonPressed(void){
    	return ( bit_is_set(PIND,2) ? 1 : 0 );
    }
    
    unsigned char CurrentPosition;  /*rozwiniete==0 zwiniete==1*/
    /*Na jednej krancowce pozycja na starcie musi byc znana*/
    
    int Delayer;
    
    int main(void){
    
    	DDRB = 0xFF;  // wyjscia
    	
    	DDRC = 0x00;   //wejscie portu C i D
    	PORTC = 0xff;
    	
    	DDRD = 0x00;
    	PORTD = 0xFF;
    
    	while(1)
    	{
    		if(CheckEnd()==0){ /*Na starcie jestesmy "gdzies pomiedzy" mozna wiec rolowac*/
    			if(CheckLight()==1){
    				Up();
    				EngineOn();
    				while(CheckEnd()==0)_wdr();
    				EngineOff();
    				CurrentPosition=1;
    			}else{
    				Down();
    				EngineOn();
    				while(CheckEnd()==0)_wdr();
    				EngineOff();
    				CurrentPosition=0;
    			}
    			while(1){ /*Wlasciwa petla*/
    				if(IsButtonPressed()==1){
    					if( CurrentPosition==0 ){
    						Up();	/*rolety w gore*/
    						EngineOn();
    						while(CheckEnd()==1)_wdr();/*czekanie az zjedzie z krancowki*/
    						_delay_ms(5);/*dodatkowe czekanie na wypadek poszarpanych krawedzi*/
    						while(CheckEnd()==0)_wdr();/*czekanie na nastepny kraniec*/
    						EngineOff();
    						CurrentPosition=1;/*roleta zostala zwinieta*/
    						for (Delayer=0; ( Delayer<4300 && (~IsButtonPressed()) ) ; Delayer++) // czekaj 2 godziy i otwieraj rolete
    						{
    							_delay_ms(500);
    						} 
    					}else{
    						Down();
    						EngineOn();
    						while(CheckEnd()==1)_wdr();
    						_delay_ms(5);
    						while(CheckEnd()==0)_wdr();
    						EngineOff();
    						CurrentPosition=0;
    						for (Delayer=0; ( Delayer<4300 && (~IsButtonPressed()) ) ; Delayer++) // czekaj 2 godziy i otwieraj rolete
    						{
    							_delay_ms(500);
    						} 
    					}
    				}else
    				{
    					if(CheckLight()==1 && CurrentPosition==0){/*jasno a okno zasloniete*/
    						Up();	/*rolety w gore*/
    						EngineOn();
    						while(CheckEnd()==1)_wdr();/*czekanie az zjedzie z krancowki*/
    						_delay_ms(5);/*dodatkowe czekanie na wypadek poszarpanych krawedzi*/
    						while(CheckEnd()==0)_wdr();/*czekanie na nastepny kraniec*/
    						EngineOff();
    						CurrentPosition=1;/*roleta zostala zwinieta*/
    					}
    					else if(CheckLight()==0 && CurrentPosition==1){
    						Down();
    						EngineOn();
    						while(CheckEnd()==1)_wdr();
    						_delay_ms(5);
    						while(CheckEnd()==0)_wdr();
    						EngineOff();
    						CurrentPosition=0;
    					}
    				}
    			}
    		}
    		_delay_ms(1);
    	}
    }
    
    
  • #19 5923879
    sylwunia35
    Poziom 18  
    Witam
    A ja mam prośbę o jakieś foto rolety z mechaniką. Jaki silnik jaka przekładnia itp.
  • #20 5924833
    killerwo
    Poziom 10  
    Wielkie dzięki Sledge

    Program działa swietnie:) szkoda że nie do końca mojego autorstwa ale co zrobić to pierwsze zetknięcie z C i pierwszy projekt pozostaje jeszcze testowanie i w razie potrzeb upgrad'y:) co do zasady moja wersja programu tez powinna działać chyba:P ale faktycznie bardziej przemyślany kod i uporządkowany lepiej działa, pozostaje tylko pogłębiać wiedze:] dzięki za pomoc wszystkim. Jak będą jakieś problemy to się zgłoszę:]. Pozdro

    Zdjęcia moge dać na forum jak wszystko bedzie skończone bo narazie mam wszedzie kable;] a teraz jest goracy okres swieta i sylwester natomias silnik to Link model 250 (75zl) dlatego ze nie chcialem bawic sie w serwo a ten model wydawał mi sie odpowiedni i trwały
  • #21 5926329
    Seba319
    Poziom 24  
    Robiłem kiedyś programowalny wyłącznik zmierzchowy i chce Ci zadać pytanie. Co jeśli ktoś przypadkiem oświetli twój czujnik? Np jadący w nocy samochód, czy wtedy sie nie otworzy roleta? W swoim projekcie uwzględniłem czas zwłoki na reakcje po zmianie natężenia oświetlenia, można też dodać zegar i w pewnych przedziałach czasu zablokować możliwość otwierania/zamykania rolety.
  • #22 5927461
    killerwo
    Poziom 10  
    Tak zgadza sie przypadkowo oświetlony czujnik powoduje ze program juz wchodzi w petle i roleta sie otwiera ( np petarda modna teraz:P jak i własnie samochody) mam zamiar wyeliminować to poprzez podwójne sprawdzanie warunku w odstepie czasowym
  • #23 5928093
    Seba319
    Poziom 24  
    To już lepsze rozwiązanie jednak nadal może sie trafić że przypadkowo dokonasz pomiaru w chwili oświetlenia czujnika. Szansa na to jest mała jeśli jednak mieszkasz przy ulicy gdzie często jeżdżą auta, może sie trafić iż będzie się otwierała w nocy. Ja zorganizowałem to w ten sposób że pomiaru dokonywałem często i w pewnym odcinku czasu (dajmy na to około minuty) sprawdzałem czy choć raz poziom oświetlenia spadnie poniżej bariery. Jeśli spadł oznaczało to, że oświetlenie było przypadkowe. Dopiero gdy czujnik przez całą minutę był oświetlony to wtedy urządzenie sie załączało/wyłączało.
  • #24 5930014
    Sledge
    Poziom 11  
    Zabezpieczenie przeciwko przypadkowemu włączeniu.

    Przez download aby nie rozciągać dalej strony.

    BTW Pomysł dla administracji
    Może by tak code okrasić elementem java script tak aby można go było zwijać/ukrywać. Mogę dać takie coś bo wykorzystuje taki bajer na własnych stronach :)
REKLAMA