Program Spadająca kropla Problem

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Program Spadająca kropla Problem

Post autor: decimus » 5 sie 2015, 18:48

W tym programie jest spadająca kropla[ona się powoli rozjaśnia i w końcu spada] ,która się kilka razy odbija od dna i osiada jako świecąca ostatnia dioda na dole.
Chciałbym ,aby przy następnej spadającej kropli ta dioda dalej się paliła [a,nie gasła] i to kolejne odbicie będzie właśnie już od niej i osiądzie jako świecąca kolejna dioda[ jako już druga],czyli takie zbieranie się kropli [ledów świecących],aż osiągnie szczyt.

Niestety dioda ta gaśnie i w koło jest spadanie.Oczywiście przy kolejnej pętli mogę zapalić już na dole drugą diodę ,ale nie wiem jak utrzymać palenie się diody pierwszej i kolejnych przy wykonywaniu następnych pętli spadania kropli,aby osiągnąć efekt napełniania.

Czy,może ktoś pomóc w tym temacie.

KOD:

Kod: Zaznacz cały

    #include <Adafruit_NeoPixel.h>
     
    #define PIN 6
    #define LICZBADIOD 60
     
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LICZBADIOD, PIN, NEO_GRB + NEO_KHZ800);
     
    void setup()
    {
      pixels.begin(); // Inicjalizacja biblioteki
      pixels.setBrightness(50);//Moc ledów
 
      
    }
     
    void loop()  
    {
         
  
    for(int i=59; i<255; i++) {    //dioda powoli się rozjaśnia i spada  odbijając się od dna      
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show(); 
    delay(10);
    }
    //////////////////
    for(int i=59; i>-1; i--)
      
      
      {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
        pixels.show(); 
        delay(5);
      }
      //////////
       for(int k=-1; k<10; k++)
       { 
        
         pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         
        pixels.show(); 
        delay(10);
        ///////////
       }
       for(int k=10; k>5; k--)
       { 
        pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         
        pixels.show(); 
        delay(10);
        /////////
       }
        for(int k=6; k>-1; k--)
       { 
        pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         
        pixels.show(); 
        delay(10);
        ///////////////
       }
        for(int k=-1; k<4; k++)
       { 
        pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         
        pixels.show(); 
        delay(10);
        //////////
       }
        for(int k=4; k>-1; k--)
       { 
        pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         
        pixels.show(); 
        delay(10);
     }
    }
Ostatnio zmieniony 5 sie 2015, 20:32 przez decimus, łącznie zmieniany 2 razy.

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


kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Program Spadająca kropla Problem

Post autor: kazzik87 » 5 sie 2015, 20:09

Wklej kod w znaczniki < code > kod < /code >!
---
Jeżeli pomogłem to kliknij "Pomógł".
kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Program Spadająca kropla Problem

Post autor: kazzik87 » 6 sie 2015, 08:54

Widzisz od razu lepiej.

Na początek, tak nie robimy:
decimus pisze:for(int i=59; i>-1; i--)
decimus pisze:for(int k=-1; k<10; k++)
decimus pisze:for(int k=6; k>-1; k--)
decimus pisze: for(int k=-1; k<4; k++)
decimus pisze:for(int k=4; k>-1; k--)
Nie stosuj wartości ujemnych jeżeli nie jest to uzasadnione, u Ciebie nie jest! Chyba że uda Ci się wytłumaczyć dlaczego zrobiłeś tak:
decimus pisze:for(int i=59; i>-1; i--)
a nie tak:

Kod: Zaznacz cały

for(int i = 60; i >= 0; i--)
Co do Twojego pytania to wydaje mi się że wystarczy jak będziesz zwiększał dolne ograniczenie pierwszej pętli for(). Tzn.:

Kod: Zaznacz cały

void setup()
    {
      pixels.begin(); // Inicjalizacja biblioteki
      pixels.setBrightness(50);//Moc ledów
      
      int maxDown = 0;
      
    }
void loop()  
{
    for(int i=59; i<255; i++) 
    {    //dioda powoli się rozjaśnia i spada  odbijając się od dna      
         pixels.setPixelColor(59, pixels.Color(0, 0, i));
         pixels.show(); 
         delay(10);
    }
    //////////////////
    for(int i=60; i >= maxDown; i--)
    {
         ...
    }
    maxDown++;
   if(maxDown == 60)
        maxDown = 0;
}
Dodatkowo trzeba wyłączyć czyszczenie:

Kod: Zaznacz cały

pixels.clear();
Ogólnie trochę brzydko napisany kod. Postaraj się to jakoś może w funkcje popakować. Ja by inaczej to napisał.
---
Jeżeli pomogłem to kliknij "Pomógł".
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 6 sie 2015, 12:20

Kod jest brzydko napisany ,ale jak zobaczysz post tej lampy z plexi ,która jest od wczoraj na majsterkowo to tam jest ponad 10' efektów jeszcze gorzej napisanych dla widoku profesjonalnego programisty.Różnica jest taka ,że ja sprawdzam to w praktyce i ważne jest nie to jak piękny jest program tylko czy chodzi jak należy,a mój chodzi i wiedza moja jest prawie zerowa.
Chciałem do tej lampy dorobić właśnie taki efekt,ale to co podałeś wyrzuca mi błąd tej deklaracji 'maxDown'.
http://majsterkowo.pl/lampa-rgb-na-diodach-led-ws2812b/

Kod: Zaznacz cały

   #include <Adafruit_NeoPixel.h>
     
    #define PIN 6
    #define LICZBADIOD 60
     
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LICZBADIOD, PIN, NEO_GRB + NEO_KHZ800);
     
    void setup()
    {
      pixels.begin(); // Inicjalizacja biblioteki
      pixels.setBrightness(50);//Moc ledów
 
      
 int maxDown = 0;
    } 
     
    
void loop() 


   {
    for(int i=59; i<255; i++)
    {    //dioda powoli się rozjaśnia i spada  odbijając się od dna     
         pixels.setPixelColor(59, pixels.Color(0, 0, i));
         pixels.show();
         delay(10);
    }
    //////////////////
    for(int i=60; i >= maxDown; i--)
    {
         ...
    }
    maxDown++;
   if(maxDown == 60)
        maxDown = 0;
}

kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Program Spadająca kropla Problem

Post autor: kazzik87 » 6 sie 2015, 14:28

Nie chciałem Cię obrazić ...

Lampa LED jako projekt jest rewelacyjna. Kodu nie widziałem to nie mogę nic na ten temat powiedzieć.

Co do deklaracji to mój błąd. Za szybko napisałem.

Kod: Zaznacz cały

int maxDown = 0;
Daj przed funkcją setup().
---
Jeżeli pomogłem to kliknij "Pomógł".
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 6 sie 2015, 15:04

Ja się nie gniewam i trudno mnie do tego doprowadzić tylko tak pisałem i sam się śmieje z tego chaosu,ale na razie chodzi.
Mówię o lampie.

Niestety tutaj dioda rozjaśnia się [ok.] i spada ,ale wszystkie po kolei się zapalają i ta u samej góry rozjaśnia się dalej natomiast wszystkie świecą na stałe.,a tu potrzeba aby spadła jedna i jak druga kropla będzie spadać to ta na samym dole musi się już palić ciągle[to mam po swojemu,ale przy kolejnym spadku nie wiem jak utrzymać palenie się diody tej która spadła,bo gaśnie] i odbicie będzie już od niej i zapali się druga na dole,aż zapełni się do samej góry.
Moja jeszcze się odbija jak w naturze widać 2x ping-pong i dopiero opada.

Tak napisałem wg.Twojego:

Kod: Zaznacz cały

       #include <Adafruit_NeoPixel.h>
         
        #define PIN 6
        #define LICZBADIOD 60
         
        Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LICZBADIOD, PIN, NEO_GRB + NEO_KHZ800);
        
        int maxDown = 0; 
        
        void setup()
        {
          pixels.begin(); // Inicjalizacja biblioteki
          pixels.setBrightness(50);//Moc ledów
    
        }
         
       
    void loop()


       {
        for(int i=59; i<255; i++)
        {    //dioda powoli się rozjaśnia i spada  odbijając się od dna     
             pixels.setPixelColor(59, pixels.Color(0, 0, i));
             pixels.show();
             delay(10);
        }
        //////////////////
        for(int i=60; i >= maxDown; i--)
        {
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
        pixels.show(); 
        delay(5);
        }
        maxDown++;
        if(maxDown == 60)
        maxDown = 0;
    }

Ostatnio zmieniony 6 sie 2015, 15:07 przez decimus, łącznie zmieniany 1 raz.
kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Program Spadająca kropla Problem

Post autor: kazzik87 » 6 sie 2015, 15:06

Daj schemat połączenia.
---
Jeżeli pomogłem to kliknij "Pomógł".
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 6 sie 2015, 15:09

Nie rozumiem jaki schemat połączenia?
kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Program Spadająca kropla Problem

Post autor: kazzik87 » 6 sie 2015, 15:22

Układu na jakim pracujesz.
Dobra zerknąłem na bibliotekę ...
Musisz dodać dodać funkcję która będzie zapalała już pokazane diody (te od dołu). Na chwilę obecną masz wstawione delay() między zapalaniem się kolejnych diod w efekcie spadania. Ty musisz zadbać o to aby dodatkowo zapalać tyle diod od dołu ile wynosi w danym momencie.

Zerknij na kod: link
---
Jeżeli pomogłem to kliknij "Pomógł".
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 6 sie 2015, 16:50

Właśnie ja zbierałem taką drobnicę programową i łączyłem lub zmieniałem np: wstawiłem w równanie ^[tylda] i program nabrał całkowicie innego znaczenia,czyli nowy efekt itp. Trochę też napisałem po swojemu lub transformowałem z programów na Timerach do swojego niesynchronicznego co dla laika nie jest łatwe.Dzięki za link ,bo akurat tego nie miałem.

Problem polega na tym ,że Twój program zapala diody wszystkie,a mój sygnalizuje spadek jednej.U Ciebie worek się rozsypał do dołu u mnie się natychmiast zwija oko to widzi jako lecąca kropla.
https://www.youtube.com/watch?v=_wkTtAk2V_k

Ja natomiast chcę napełnić butelkę po jednej kropli na Full.
kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Program Spadająca kropla Problem

Post autor: kazzik87 » 6 sie 2015, 20:10

A może takie coś:

Kod: Zaznacz cały

#include <Adafruit_NeoPixel.h>
 
#define PIN 6
#define LICZBADIOD 60
 
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LICZBADIOD, PIN, NEO_GRB + NEO_KHZ800);

int maxDown = 0;	// zmienna globalna
 
void setup()
{
	pixels.begin(); // Inicjalizacja biblioteki
	pixels.setBrightness(50);//Moc ledów 
}
 
void loop()  
{
	rozjasnij();
	kap();
}
 
// Funkcja ma za zadanie rozjaśnić pierwszą kroplę :-) 
void rozjasnij()
{
	for(int i=59; i<255; i++) 
	{ 
		pixels.setPixelColor(59, pixels.Color(0, 0, i));
		pixels.show(); 
		delay(10);
	}
}

// Funkcja ma za zadanie kapanie kroplmi
void kap()
{
	for(int i = 60; i >= maxDown; i--)
	{
		pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
		pokaz_ile_spadlo(maxDown); // Fukcja załaduje tyle kropli ile już spadlo
		pixels.show(); 
		delay(5);
	}
	
	maxDown++;
	if(maxDown == 60)
		maxDown = 0;
}

// Fnckaj ma za zadanie wyświetlić tyle kropli ile spadło
void pokaz_ile_spadlo(int _ilosc)
{
	for(int i = 0; i <= _ilosc; i++)
	{
		pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
	}
}
---
Jeżeli pomogłem to kliknij "Pomógł".
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 6 sie 2015, 20:37

Tak samo jak poprzednio.Tu trzeba mieć diody,a ja właśnie sobie kupiłem pasek i wtedy widać w naturze co się dzieje.
Na oko to ciężko to zrobić.
No, nic będę się jeszcze męczył może coś urodzę.
kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Program Spadająca kropla Problem

Post autor: kazzik87 » 6 sie 2015, 20:46

Dziwne ...
Muszę sobie kupić taki pasek bo ciekaw jestem.
Zdradź tajemnice jaki to i gdzie kupiłeś.
---
Jeżeli pomogłem to kliknij "Pomógł".
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 6 sie 2015, 21:03

Na Allegro wpisz nazwę WS2812 .Nie dopisuj B ,gdyż on tak oznaczył w tytule zamiast WS2812B.
Ten sam ma też sklep Elty.pl
Niekiedy mają też inni,ale teraz tylko on miał 60ledów na 1m.
Ja kupiłem czarną ,ale ma też białe paski.
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 7 sie 2015, 21:06

Znalazłem rozwiązanie i chodzi jak chciałem!!! na razie do 10 leda ,ale to kwestia dopisania analogicznie kodu.
KOD

Kod: Zaznacz cały

    #include <Adafruit_NeoPixel.h>
     
    #define PIN 6
    #define LICZBADIOD 60
     
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LICZBADIOD, PIN, NEO_GRB + NEO_KHZ800);
     
    void setup()
    {
      pixels.begin(); // Inicjalizacja biblioteki
      pixels.setBrightness(50);//Moc ledów
 
      
    }
     
    void loop()  
    {
         
  
    for(int i=59; i<255; i++) {    //dioda powoli się rozjaśnia i spada        
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show(); 
    delay(10);
    }
    //////////////////
    for(int i=59; i>-1; i--)
      
      
      {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
        pixels.show(); 
        delay(5);
      
      //////////
      
        /////////
         }
        for(int k=-1; k<4; k++)
       { 
        pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         
        pixels.show(); 
        delay(50);
        ///////////////
       }
        for(int k=3; k>-1; k--)
       { 
        pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         
        pixels.show(); 
        delay(10);
        //////////
       }
        for(int k=-1; k<2; k++)
       { 
        pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         
        pixels.show(); 
        delay(60);
       }
       for(int k=0; k>-1; k--)
       { 
        pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         
        pixels.show(); 
        delay(20);
       
   
       }
       /////////////////////////////////////////////////////////////////////////////////////////////
       //2-ga kropla
    for(int i=59; i<255; i++) {    //dioda powoli się rozjaśnia i spada        
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show(); 
    delay(10);
     //////////////////////////////////////////

    }
     for(int i=59; i>0; i--) 
    {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
        pixels.setPixelColor(0, pixels.Color (0, 0, 255 ));
        pixels.show(); 
        delay(5);
   
   
    //ping
    }
      
   
    
        for(int k=0; k<5; k++)
    { 
        pixels.clear();
        pixels.setPixelColor(k, pixels.Color (0, 0, 255));
        pixels.setPixelColor(0, pixels.Color (0, 0, 255 ));
        pixels.show(); 
        delay(30);
        
   
     }
     //pong
       for(int k=4; k>0; k--)
      { 
         pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
          pixels.setPixelColor(0, pixels.Color (0, 0, 255 ));
          pixels.show(); 
          delay(10);                     
    
      }
          /////////////////////////////////////////////////////////////////////////////////////////////
       //3-a kropla
    for(int i=59; i<255; i++) {    //dioda powoli się rozjaśnia i spada        
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show(); 
    delay(10);
    
    }
     for(int i=59; i>1; i--) 
      for(int x=0; x<2; x++)
    {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
        for(int x=0; x<2; x++)
        pixels.setPixelColor(x,0, 0, 255); 
        pixels.show(); 
        delay(3);
    //ping//
    }
        for(int k=1; k<5; k++)
    { 
        pixels.clear();
        pixels.setPixelColor(k, pixels.Color (0, 0, 255)); 
          
        for(int x=0; x<2; x++)
        pixels.setPixelColor(x,0, 0, 255); 
        pixels.show(); 
        delay(30);
      //pong//
            
       }
       for(int k=5; k>-2; k--)
       { 
        pixels.clear();
        pixels.setPixelColor(k, pixels.Color (0, 0, 255));
        for(int x=0; x<3; x++)
        pixels.setPixelColor(x,0, 0, 255); 
        pixels.show(); 
        delay(10);
        }
///////4K///////

    for(int i=59; i<255; i++) {    //dioda powoli się rozjaśnia i spada        
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show(); 
    delay(1);
    }
     
     for(int i=59; i>2; i--) 
    {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 )); 
        for(int x=0; x<3; x++)
        pixels.setPixelColor(x,0, 0, 255); 
        pixels.show(); 
        delay(5);
        
    }
      //5K//
      
    for(int i=59; i<255; i++) {    //dioda powoli się rozjaśnia i spada        
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show(); 
    delay(1);
    }
     
     for(int i=59; i>3; i--) 
    {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));  
       for(int x=0; x<4; x++)
        pixels.setPixelColor(x,0, 0, 255); 
        pixels.show(); 
        delay(5);        
     
    }
      //6K//
       
    for(int i=59; i<255; i++) {    //dioda powoli się rozjaśnia i spada        
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show(); 
    delay(5);
    }
     for(int i=59; i>4; i--) 
    {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
        for(int x=0; x<5; x++)
        pixels.setPixelColor(x,0, 0, 255); 
        pixels.show(); 
        delay(5);
        
    }
      //ping//
      for(int k=3; k<8; k++)
       { 
        pixels.clear();
        pixels.setPixelColor(k, pixels.Color (0, 0, 255));  
       for(int x=0; x<5; x++)
        pixels.setPixelColor(x,0, 0, 255); 
        pixels.show(); 
        delay(50);
      
      
     
     
     //pong// 
       }
        for(int k=5; k>4; k--)
       { 
         pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         for(int x=0; x<6; x++)
          pixels.setPixelColor(x, 0, 0, 255); 
          pixels.show(); 
          delay(2);
        
      }
       
        //7K//
       
    for(int i=59; i<255; i++) {          
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show(); 
    delay(10);
    }
     for(int i=59; i>5; i--) 
    {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
         for(int x=0; x<6; x++)
         pixels.setPixelColor(x, 0, 0, 255); 
        pixels.show(); 
        delay(5);
      
      }
      //8K//
       
    for(int i=59; i<255; i++) {          
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show(); 
    delay(10);
    }
    
     for(int i=59; i>6; i--) 
    {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
         for(int x=0; x<7; x++)
         pixels.setPixelColor(x, 0, 0, 255); 
        pixels.show(); 
        delay(5);
        }
    
         //9K//
       
    for(int i=59; i<255; i++) {          
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show(); 
    delay(1);
    }
    
     for(int i=59; i>7; i--) 
    {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
        for(int x=0; x<8; x++)
        pixels.setPixelColor(x, 0, 0, 255);
        pixels.show(); 
        delay(1);
   
      
    }
        //ping//
        for(int k=8; k<12; k++)
       { 
        pixels.clear();
        pixels.setPixelColor(k, pixels.Color (0, 0, 255));
        for(int x=0; x<8; x++)
        pixels.setPixelColor(x, 0, 0, 255);
        pixels.show(); 
        delay(30);
  
      //pong// 
      
       }
        for(int k=11; k>7; k--)
       { 
         pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         for(int x=0; x<8; x++)
          pixels.setPixelColor(x, 0, 0, 255); 
         
        pixels.show(); 
        delay(10);
     
       }     
         //10K//
       
    for(int i=59; i<255; i++) {          
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show(); 
    delay(1);
    }
    
     for(int i=59; i>8; i--) 
    {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
         for(int x=0; x<9; x++)
          pixels.setPixelColor(x, 0, 0, 255); 
        
        pixels.show(); 
        delay(1);
    
    }
    
        //ping//
        for(int k=9; k<12; k++)
       { 
        pixels.clear();
        pixels.setPixelColor(k, pixels.Color (0, 0, 255));
        for(int x=0; x<9; x++)
        pixels.setPixelColor(x, 0, 0, 255); 
        pixels.show(); 
        delay(30);
 
       }
       //pong// 
        for(int k=11; k>8; k--)
       { 
         pixels.clear();
         pixels.setPixelColor(k, pixels.Color (0, 0, 255));
         for(int x=0; x<10; x++)
          pixels.setPixelColor(x, 0, 0, 255); 
        pixels.show(); 
        delay(10);
        
    
       } 
       }










    


    
kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Program Spadająca kropla Problem

Post autor: kazzik87 » 7 sie 2015, 21:42

Zauważyłeś że kod Ci się powtarza? Teraz trzeba to ładnie ubrać w funkcje. Bo za dużo kodu.

Patrz tu:

Kod: Zaznacz cały

 for(int i=59; i>1; i--) 
      for(int x=0; x<2; x++) // Tu daj coś podobnego do mojego maxDown :-)
    {
        pixels.clear();
        pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
        for(int x=0; x<2; x++) // Tu też możesz wykorzystać maxDown :-)
             pixels.setPixelColor(x,0, 0, 255); 
        pixels.show(); 
        delay(3);
    //ping//
    }
---
Jeżeli pomogłem to kliknij "Pomógł".
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 7 sie 2015, 22:07

Ja programuje liniowo i wiem o tym,że można to skrótem napisać. Spróbuję jutro wg. Twojej rady ,bo mózg mi od tego paruje dzisiaj.
Właśnie chciałem się nauczyć jak myśleć wg, tego co proponujesz,ale mam małą wiedzę.
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 8 sie 2015, 18:36

Według mnie po analizie programu to tylko sekwencja rozjaśniania jest od początku do końca taka sama.

Reszta,czyli pętla for która spada jako kropla jest za każdym razem inna o jedną cyfrę oraz pętla for która zapala i podtrzymuje świecenie kolejnych spadających diod o co walczyłem jest też zmienna za każdą kroplą która później świeci na dole o jeden.
Tak więc to są za każdym razem inne w sumie programy one są tylko podobne.

Możliwe,że i to można napisać inaczej,ale tego nie umiem tylko udało mi się zniwelować non stop pisanie rozjaśniania.
Poza tym program chodzi nie synchronicznie czasowo lub bez ping pong lub 2 krople naraz i itp. będę chciał, aby nie było schematu kapania.Ma się powiększać o jedną diodę w górę za każdym rozjaśnianiem i spadkiem leda,a nie wszystko na raz.Chyba,że coś pomożesz w tym temacie.

Kod: Zaznacz cały

        #include <Adafruit_NeoPixel.h>
         
        #define PIN 6
        #define LICZBADIOD 60
         
        Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LICZBADIOD, PIN, NEO_GRB + NEO_KHZ800);
      

        
        void setup()
        {
          pixels.begin(); // Inicjalizacja biblioteki
          pixels.setBrightness(50);//Moc ledów
     
        }
         
        void loop() 
        {
           
          rozjasnij();  
          kap();
          rozjasnij();
          kap1();
          rozjasnij();
          kap2();
          kap3();  
        }    
          
        // Funkcja ma za zadanie rozjaśnić pierwszą kroplę :-)
         void rozjasnij()
        {
        for(int i=59; i<255; i++)     //dioda powoli się rozjaśnia i spada  
        {     
        pixels.setPixelColor(59, pixels.Color(0, 0, i));
        pixels.show();
        delay(3);
        
       }
       }
        
        // Funkcja ma za zadanie kapanie kroplmi
        void kap()
      
      { 
        for(int i=59; i>-1; i--)
      {
       
            pixels.clear();
            pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
            
            pixels.show();
            delay(5);
            }
            //ping//
              
            for(int k=-1; k<3; k++)
           {
            pixels.clear();
            pixels.setPixelColor(k, pixels.Color (0, 0, 255));
             
            pixels.show();
            delay(40);
           }
             //pong//
            
            for(int k=3; k>-1; k--)
           {
            pixels.clear();
            pixels.setPixelColor(k, pixels.Color (0, 0, 255));
             
            pixels.show();
            delay(10);
            
           
      }
      }
      
         // Funkcja ma za zadanie kapanie kroplmi
        void kap1()
         
      { 
        for(int i=59; i>0; i--)                                      // Tu ma >0 a niżej kap2() już ma 1 ,więc się zmienia
      { 
           pixels.clear();
           pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));     
           pixels.setPixelColor(0, pixels.Color (0, 0, 255 ));

           
           pixels.show();
           delay(3); 
      }
       //ping//
              
            for(int k=-1; k<3; k++)                     
           {
            pixels.clear();
            pixels.setPixelColor(k, pixels.Color (0, 0, 255));
            pixels.setPixelColor(0, pixels.Color (0, 0, 255 ));
            pixels.show();
            delay(40);
           } 
             //pong//
            
            for(int k=3; k>-1; k--)
           {
            pixels.clear();
            pixels.setPixelColor(k, pixels.Color (0, 0, 255));
           for(int x=0; x<2; x++)
           
            pixels.setPixelColor(x,0, 0, 255);
            pixels.show();
            delay(10); 
      }
      } 
      // Funkcja ma za zadanie kapanie kroplmi
        void kap2()
         
      { 
        for(int i=59; i>1; i--)
      { 
           pixels.clear();
           pixels.setPixelColor(i, pixels.Color (0, 0, 255 )); 
        for(int x=0; x<2; x++)                                   //Podtrzymanie świecenia leda na dole i też się zmienia.
           
           pixels.setPixelColor(x,0, 0, 255);
           pixels.show();
           delay(3);  
      
      }
      } 
      // Funkcja ma za zadanie kapanie kroplmi
        void kap3()
      
         { 
        for(int i=59; i>2; i--)
        {    
        
           pixels.clear();
           pixels.setPixelColor(i, pixels.Color (0, 0, 255 )); 
        for(int x=0; x<3; x++)                                    //podtrzymanie leda na dole tu ma <3 a wyżej <2
           
           pixels.setPixelColor(x,0, 0, 255);
           pixels.show();
           delay(3); 
           
      }
      }
      
 
         
    
        
kazzik87
Starszy majsterkowicz
Posty: 440
Rejestracja: 14 lip 2014, 21:54
Lokalizacja: Lublin

Re: Program Spadająca kropla Problem

Post autor: kazzik87 » 8 sie 2015, 21:40

Spróbuj tak:

Kod: Zaznacz cały

 #include <Adafruit_NeoPixel.h>
 
#define PIN 6
#define LICZBADIOD 60
 
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LICZBADIOD, PIN, NEO_GRB + NEO_KHZ800);

int nrDiody = 0;	// zmienna globalna
 
void setup()
{
	pixels.begin(); // Inicjalizacja biblioteki
	pixels.setBrightness(50);//Moc ledów 
}
 
void loop()  
{
	rozjasnij();
	kap();
	ping();
	pong();
	
	nrDiody++;
	if(nrDiody == 54)
		nrDiody = 0;
}
 
// Funkcja ma za zadanie rozjaśnić pierwszą kroplę :-) 
void rozjasnij()
{
	for(int i=59; i<255; i++) 
	{ 
		pixels.setPixelColor(59, pixels.Color(0, 0, i));
		pixels.show(); 
		delay(10);
	}
}

// Funkcja ma za zadanie kapanie kroplmi
void kap()
{
	for(int i = 59; i >= nrDiody; i--)
	{
		pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
		pokaz_ile_spadlo(nrDiody); // Fukcja załaduje tyle kropli ile już spadlo
		pixels.show(); 
		delay(5);
	}
}

// Fnckaj ma za zadanie wyświetlić tyle kropli ile spadło
void pokaz_ile_spadlo(int _ilosc)
{
	for(int i = 0; i <= _ilosc; i++)
	{
		pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
	}
}

void ping()
{
	for(int k = nrDiody; k < (nrDiody + 5); k++)
	{ 
		pixels.clear();
		pixels.setPixelColor(k, pixels.Color (0, 0, 255));
		// Można tak:
		pokaz_ile_spadlo(nrDiody)
		// Lub tak
		/*	for(int x = 0; x < nrDiody; x++)
				pixels.setPixelColor(x,0, 0, 255);	*/
		pixels.show(); 
		delay(50);
	}
}

void pong()
{
	for(int k = (nrDiody + 5 ); k > nrDiody; k--)
	{ 
		pixels.clear();
		pixels.setPixelColor(k, pixels.Color (0, 0, 255));
		// Można tak:
		pokaz_ile_spadlo(nrDiody)
		// Lub tak
		/*	for(int x = 0; x < nrDiody; x++)
				pixels.setPixelColor(x,0, 0, 255);	*/
		pixels.show(); 
		delay(10);
	}
}
---
Jeżeli pomogłem to kliknij "Pomógł".
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 8 sie 2015, 22:09

Wywala błąd.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
stiven
Złota rączka
Posty: 1625
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Program Spadająca kropla Problem

Post autor: stiven » 9 sie 2015, 00:10

Kod: Zaznacz cały

      pokaz_ile_spadlo(nrDiody)
      // Lub tak
      /*   for(int x = 0; x < nrDiody; x++)
            pixels.setPixelColor(x,0, 0, 255);   */
      pixels.show(); 
Średnika brakuje po

Kod: Zaznacz cały

pokaz_ile_spadlo(nrDiody)
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 9 sie 2015, 06:50

https://www.youtube.com/watch?v=_wkTtAk2V_k

Po poprawce kod faktycznie jest podobny do tego co wyżej i zbiera wodę do góry jak chciałem.

Różnica jest jednak dalej zasadnicza tam kropla jak i w moim kodzie spada jako pojedyncza ,a w Twoim programie rozwija "ogon" do samej góry za każdym kapnięciem i nie pomoże zmniejszenie delay w kapaniu.Po prostu zapalają się wszystkie diody do dołu na moment.Oko musi widzieć jak na filmie lekko ogon się ciągnie,ale to oko ludzkie i kamera zostaje oszukane co też daje fajny efekt ,ale bliższy prawdy.W programie powinno być jednak spadanie "pojedynczej" diody za każdym razem,a nie rozwijanie ogona na całej długości do dołu.

Twój program mówi:Jak zapalić po kolei wszystkie diody do dołu,a nie jak ma spaść tylko jedna dioda [kropla].

Obrazowo: w toto lotku spada jedna piłeczka do pojemnika,a w Twoim wszystkie?!,a tylko jedna zostaje-o co mi chodziło.
Musi po jednej kapać.

Prawie jest....Chociaż jako inny efekt też wyszło coś innego i właśnie tak do tej lampy z przypadku sporo zrobiłem.Chciałem coś,a wyszło coś innego.Też dobre,ale może by to poprawić.Ja nie bardzo jeszcze rozumiem tego kodu.

P>S> Ta druga wersja odsłoniłem do kodu,ale ma feler, bo na chwilę jak spada kropla to ta dioda w którą uderza na moment gaśnie w momencie uderzenia kropli,ale ta pierwsza wersja chodzi jak trzeba,czyli zbiera wodę.
stiven
Złota rączka
Posty: 1625
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Program Spadająca kropla Problem

Post autor: stiven » 9 sie 2015, 10:41

A zobacz coś takiego, przerobiłem twój kod. Dodałem głównego fora i potem wartości w forach w funkcjach zależą od wartości w tym głównym forze. Kopiuje wartość ze zmiennej j do zmiennej globalnej l, bo j nie byłoby widoczne w innych funkcjach poza loop. Zrobiłem funkcję spadanie i do niej przekazuje w parametrach dwie zmienne, numer diody i opóźnienie. Tak trochę przejrzyściej jest.

Kod: Zaznacz cały

#include <Adafruit_NeoPixel.h>
#define PIN 6
#define LICZBADIOD 60
 
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LICZBADIOD, PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  pixels.begin(); // Inicjalizacja biblioteki
  pixels.setBrightness(50);//Moc ledów
}

int z = 1;
int l;

void loop() 
{
  for(int j = 0; j < 50; j++)
  {
    l = j;
    rozjasnij();
    if((z == 1) || (z == 2)) kap();
    if((z == 3) || (z == 4)) kap2();
	
    z++;
    if(z == 5) z = 1;
  }
}

void rozjasnij()
{
  for(int i=59; i<255; i++)     //dioda powoli się rozjaśnia i spada  
  {     
    pixels.setPixelColor(59, pixels.Color(0, 0, i));
    pixels.show();
    delay(3);
  }
}

void kap()
{ 
  for(int i=59; i>(l-1); i--) spadanie(i, 5);
  
  //ping//
  for(int k=(l-1); k<(l+3); k++) spadanie(k, 40);

  //pong//
  for(int k=(l+3); k>(l-1); k--) spadanie(k, 10);
}

void kap2()
{ 

  for(int i=59; i>1; i--)
  { 
    pixels.clear();
    pixels.setPixelColor(i, pixels.Color (0, 0, 255 )); 
    for(int x=l; x <(l+2); x++) pixels.setPixelColor(x,0, 0, 255);
    pixels.show();
    delay(3);  
  }
} 

void spadanie(int x1, int x2)
{
  pixels.clear();
  pixels.setPixelColor(x1, pixels.Color (0, 0, 255 ));
  pixels.show();
  delay(x2);
}
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 9 sie 2015, 16:26

Program przesuwa się i spada po jednej kropli ,ale coś tam dziwacznie to jest, bo na początku spada do samego dołu,a następnie przesuwa się po jednej do góry, ale nie zapełnia świecenia tych co spadły na dół i jeszcze coś dziwaczy z tym spadaniem niekiedy dwie po środku zapala itp. Później tylko do trzeciej na dole spada albo po środku.

Na sucho to ciężko nie masz jak zobaczyć wtedy korekta i jest.

Ja nie mam pojęcia o programowaniu ,ale mając to przed sobą jestem w stanie tak zrobić aby chodziło,ale bardziej liniowo czyli dużo pisania i w końcu wpadnę na trop lub inny efekt wyjdzie.

Zajmuje to pamięć,ale tą lampę rgb co jest na majsterkowo to mam ponad 10' efektów i jeszcze zostało ok.40% pamięci.
Za bardzo nie zwracam na to uwagę grunt że chodzi.Chciałem tylko zobaczyć jak można to zrobić skrótem czyli bardziej fachowo tylko brakuje mi wiedzy.

Mój program w końcu chodzi ,czyli kapie po jednej i to nie synchronicznie oraz zapełnia dół po kapnięciu dioda musi już świecić.
Tylko do każdej diody będę musiał pisać program. Oprócz "rozjaśniania" co udało mi się zrobić jednym wpisem i później tyko sterować na przemian tym void.

W sumie jak z Wami rozmawiam to też wyciągam jakieś wnioski i porady dlatego stworzyłem kod,ale pojęcia o tym naprawdę nie mam tylko na "czuja".
decimus
Młodszy majsterkowicz
Posty: 39
Rejestracja: 27 gru 2014, 09:18

Re: Program Spadająca kropla Problem

Post autor: decimus » 9 sie 2015, 17:49

Jest!!!!
Dzięki za pomoc.W sumie dzięki temu mogłem uczestniczyć w udziale wszystkich w programowaniu.
Kazzik87 trafił z tym ostatnim kodem,ale z uporem nie chciał pisać i sam sugerował ,aby to pominąć.Jednak zaskoczyłem,że trzeba i jest.

Kod: Zaznacz cały

            pixels.clear();
Inaczej,zapalają się po kolei wszystkie,a tak to spada jako jedna.

Musiałem jednak wpisać:

Kod: Zaznacz cały

nrDiody = -1;
a nie 0 dlatego, że pierwsza dioda na dole już się paliła,a tak to i ona spada i dopiero się zapala.Jak się pisze kod od 0-59_tej diody to wszystko gra ale odwrotnie ,czyli 59-0 to właśnie muszę stosować w for minus aby pierwsza też się zapaliła.Natomiast bez for jako sama dioda ma się zapalić to piszę 0.Nie wiem dlaczego tak jest i nie pojmuję.

Po wpisaniu kasowania leda po jego zapaleniu mam co chciałem jedynie to to ,że program jest synchroniczny,ale nad tym aby pracował losowo myślę ,że też coś wskóram.Chodzi o to jak u mnie liniowo programując np: spadły mi 2-ie krople szybciej ,albo bez odbicia ping pong lub czas można zmienić i inne parametry.

Fajnie ,bo krótki bez zbędnego pisania.

Kod: Zaznacz cały

     #include <Adafruit_NeoPixel.h>
     
    #define PIN 6
    #define LICZBADIOD 60
     
    Adafruit_NeoPixel pixels = Adafruit_NeoPixel(LICZBADIOD, PIN, NEO_GRB + NEO_KHZ800);

    int nrDiody = -1;   // zmienna globalna
     
    void setup()
    {
       pixels.begin(); // Inicjalizacja biblioteki
       pixels.setBrightness(50);//Moc ledów
    }
     
    void loop() 
    {
       rozjasnij();
       kap();
       ping();
       pong();
      
       
       
       nrDiody++;
       if(nrDiody == 58)
          nrDiody = -1;
    }
     
    // Funkcja ma za zadanie rozjaśnić pierwszą kroplę :-)
    void rozjasnij()
    {
       for(int i=59; i<255; i++)
       {
          pixels.setPixelColor(59, pixels.Color(0, 0, i));
          pixels.show();
          delay(2);
       }
    }

    // Funkcja ma za zadanie kapanie kroplmi
    void kap()
    {
       for(int i = 59; i >= nrDiody; i--)
       { 
          pixels.clear();
          pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
          pokaz_ile_spadlo(nrDiody); // Fukcja załaduje tyle kropli ile już spadlo
          pixels.show();
          delay(5);
       }
    }

    // Funkcja ma za zadanie wyświetlić tyle kropli ile spadło
    void pokaz_ile_spadlo(int _ilosc)
    {
       for(int i = 0; i <= _ilosc; i++)
       {
          pixels.setPixelColor(i, pixels.Color (0, 0, 255 ));
       }
    }

    void ping()
    {
       for(int k = nrDiody; k < (nrDiody + 5); k++)
       {
          pixels.clear();
          pixels.setPixelColor(k, pixels.Color (0, 0, 255));
          // Można tak:
          pokaz_ile_spadlo(nrDiody);
          // Lub tak
          /*   for(int x = 0; x < nrDiody; x++)
                pixels.setPixelColor(x,0, 0, 255);   */
          pixels.show();
          delay(30);
       }
    }

    void pong()
    {
       for(int k = (nrDiody + 5 ); k > nrDiody; k--)
       {
          pixels.clear();
          pixels.setPixelColor(k, pixels.Color (0, 0, 255));
          // Można tak:
          pokaz_ile_spadlo(nrDiody);
          // Lub tak
          /*   for(int x = 0; x < nrDiody; x++)
                pixels.setPixelColor(x,0, 0, 255);   */
          pixels.show();
          delay(10);
       }
    }
ODPOWIEDZ

Strony partnerskie: