• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Odliczanie diodami ws2812b
#1
Witam, program składa się z pięciu diod. Po załączeniu zasilania 3 razy błyskają wszystkie diody i program czeka na wciśniecie przycisku. Po wciśnięciu przycisku zapalają się wszystkie diody na kolor niebieski potem jedna gaśnie i cztery świecą się na zielono --- na koniec zapala się jedna czerwona dioda i po upływie 5 sekund wszystkie diody migają 3 razy na kolor czerwony.
W ten sposób to działa - jednak chciałbym, aby w przypadku naciśnięcia przycisku przed upływem 5 sekund wszystkie diody mignęły 3 razy i program ponownie czekał, aż wciśnie się ponownie przycisk.

Proszę o pomoc.

Kod:
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define ILOSCDIOD 5
Adafruit_NeoPixel pasek = Adafruit_NeoPixel(ILOSCDIOD,PIN,NEO_GRB + NEO_KHZ800);
void setup() {
  pasek.begin();
  pinMode(8, INPUT_PULLUP);
 
  for (int i=0; i<5; i++){
  pasek.setPixelColor(i,pasek.Color(0,255,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){
  pasek.setPixelColor(i,pasek.Color(0,0,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(0,255,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(0,0,0));}
  pasek.show();
  delay(250);
  for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(0,255,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(0,0,0));}
  pasek.show();
  delay(250);}
 
 
  // put your setup code here, to run once:



void loop() {

if (digitalRead(8) == LOW){

 
  for(int i=0; i<5; i++){
    pasek.setPixelColor(i,0,0,255);  //wszystkie na niebiesko
    pasek.show();}
    delay(1000);
  for(int i=0; i<5; i++){ 
    pasek.setPixelColor(i,0,0,0);}
    pasek.show();
    delay(10);

  for (int i=0; i<4; i++){
    pasek.setPixelColor(i,0,255,00);   //cztery na zielono
    }
    pasek.show();

    delay(1000); 
   
  for (int i=0; i<5; i++){
    pasek.setPixelColor(i,0,0,0);}   
    pasek.show();
    delay(10);

  for (int i=0; i<3; i++) { 
    pasek.setPixelColor(i,255,255,0);  } //trzy na ��to
    pasek.show();
    delay(1000);

     for (int i=0; i<5; i++){
    pasek.setPixelColor(i,0,0,0);}
    pasek.show();
    delay(10);

  for (int i=0; i<2; i++) { 
    pasek.setPixelColor(i,255,132,19);  } //dwie na pomara�czowo
    pasek.show();
    delay(1000);

for (int i=0; i<5; i++){
    pasek.setPixelColor(i,0,0,0);}
    pasek.show();
    delay(10);

  for (int i=0; i<1; i++) { 
    pasek.setPixelColor(i,255,0,0);  } //jedna na czerwono
    pasek.show();
    delay(1000);

  for (int i=0; i<5; i++){
    pasek.setPixelColor(i,0,0,0);}
    pasek.show();
    delay(250); 

    for (int i=0; i<5; i++){ //po czasie 5 sekund wszyskie migaj� trzy razy na czerwono
  pasek.setPixelColor(i,pasek.Color(255,0,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){
  pasek.setPixelColor(i,pasek.Color(0,0,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(255,0,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(0,0,0));}
  pasek.show();
  delay(250);
  for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(255,0,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(0,0,0));}
  pasek.show();
  delay(250);}

 
while(digitalRead(8) == LOW){
   for (int i=0; i<5; i++){
  pasek.setPixelColor(i,pasek.Color(0,255,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){
  pasek.setPixelColor(i,pasek.Color(0,0,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(0,255,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(0,0,0));}
  pasek.show();
  delay(250);
  for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(0,255,0));}
  pasek.show();
  delay(250);
for (int i=0; i<5; i++){ 
  pasek.setPixelColor(i,pasek.Color(0,0,0));}
  pasek.show();
  delay(250);
  }

}

 
// for(int i=0; i<ILOSCDIOD; i++) {
   // pasek.setPixelColor(i,255,0,0);
   // pasek.show();
   // delay(500);}
   // delay(3000);
// for(int i=0; i<ILOSCDIOD; i++) {
   // pasek.setPixelColor(i,0,0,0);
   // pasek.show();
   // delay(500); }

// for(int i=0; i<ILOSCDIOD; i++) {
   // pasek.setPixelColor(i,0,0,255);
   // pasek.show();
   // delay(500);}
   // delay(3000);
  // for(int i=0; i<ILOSCDIOD; i++) {
   // pasek.setPixelColor(i,0,0,0);
   // pasek.show();
   // delay(500); }

   // for(int i=0; i<ILOSCDIOD; i++) {
   // pasek.setPixelColor(i,0,255,0);
   // pasek.show();
   // delay(500);}
  //  delay(3000);
// for(int i=0; i<ILOSCDIOD; i++) {
  //  pasek.setPixelColor(i,0,0,0);
  //  pasek.show();
   // delay(500); }

   //  for(int i=0; i<255; i++) {
    //  pasek.setPixelColor(0,i,(255-i),i);
    //  pasek.setPixelColor(1,i,(255-i),i);
    //  pasek.setPixelColor(2,i,(255-i),i);
    //  pasek.setPixelColor(3,i,(255-i),i);
    //  pasek.setPixelColor(4,i,(255-i),i);
    //  pasek.show();
    //  delay(50); }

 
  // put your main code here, to run repeatedly:


Załączone pliki
.txt   diody.txt (Rozmiar: 4.6 KB / Pobrań: 3)
 
Odpowiedź
#2
Nie możesz odczytywać stanu przycisków, gdy program jest w pętli delay(); więc nic nie zrobisz przed upływem tych pięciu sekund.
Usuń delaye i zainteresuj się innym sposobem odliczania czasu.
(millis, biblioteka timers, itp.)
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
Więc jak mogę skonstruować formułę żeby raz naciskając uruchamiam jedną sekwencję na 5 sekund a w przypadku kolejnego wciśnięcie w czasie do 5 sekund żeby realizować coś innego a po wykonaniu żeby program znowu czekał na wciśnięcie przycisku?
 
Odpowiedź
#4
Najpierw zalicz kurs https://forbot.pl/blog//kurs-arduino-pod...rsu-id5290 lub przeczytaj książkę. Zadajesz pytania, na które są już gotowe odpowiedzi i przykłady w Arduino.
Użyj millis do odmierzania czasu, proste sprawdzenie if i porównanie, czy od poprzedniego wykonania minęło np. 1000ms, jak tak to coś robisz i zapisujesz sobie nową wartość millis, zaczynasz mierzenie czasu od nowa, jak nie to wracasz do wykonywania innych zadań programu w loop.
 
Odpowiedź
#5
(20-03-2020, 20:39)kaczakat napisał(a): Najpierw zalicz kurs https://forbot.pl/blog//kurs-arduino-pod...rsu-id5290 lub przeczytaj książkę. Zadajesz pytania, na które są już gotowe odpowiedzi i przykłady w Arduino.
Użyj millis do odmierzania czasu, proste sprawdzenie if i porównanie, czy od poprzedniego wykonania minęło np. 1000ms, jak tak to coś robisz i zapisujesz sobie nową wartość millis, zaczynasz mierzenie czasu od nowa, jak nie to wracasz do wykonywania innych zadań programu w loop.
 
Odpowiedź
#6
Proszę tylko o podpowiedź:
If () or do() albo else jak to ułożyć. Ostatni program zrobiłem na pracę dyplomową i zniszczył mnie system dlatego proszę o pomoc. Dla Ciebie to chwila zastanowienia dla mnie 3 dni walki dzięki pandemi bo normalnie trwało by to 3 miesiące...
 
Odpowiedź
#7
Forum nie służy do wyjaśniania czym różni się if , do  i else. To jest w kursie, każdy może go przeczytać, a Ty chcesz indywidualną lekcję? Na forum się pomaga, a nie robi coś za kogoś, od tego jest dział zlecenia. Nie zabieramy pracy programistom, to nie fair. Proszę, masz przykład użycia millis:
Kod:
#define przycisk 2
uint32_t czasTeraz,czasPoprzedni,tik=10; //tik musi byc mniejszy niz 1000 i dzilic 1000ms na rowne czesci
uint8_t nTik,sekundy,minuty,godziny,dni; //liczniki tikow, sekund, itd.
bool fnTik,fsekundy,fminuty,fgodziny,fdni; //flagi zdarzen nowy tik, nowa sekunda,minuta, godzina, dzien
char napis[10];
uint8_t czasprzyspieszenia=10, czaszawieszenia=15,predkosc=100,przyspieszony, zablokuj;

void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
pinMode(LED_BUILTIN,OUTPUT);
pinMode(przycisk,INPUT_PULLUP);

}
//oczywiscie serialprinty i ledy sa do wyrzucenia
void loop() {
  // put your main code here, to run repeatedly:
   

//odczyt przycisku w kazdej petli

czas();
fprzycisk();
//wykorzystanie wartosci "predkosc" co 2 sekundy
if (fsekundy && sekundy%2==0) Serial.println(predkosc);





}


void fprzycisk()
{
if(!digitalRead(przycisk)&& ! zablokuj && !przyspieszony) //wcisniety przycisk==0 i zablokuj==0, mozna jeszcze +/- by trzymanie przycisku (nie) przedluzalo
{

  przyspieszony=czasprzyspieszenia;
  Serial.println("Aktywacja przyspieszenia");
}


if(fsekundy) //tylko gdy nowa sekunda, odliczanie
{
  if (przyspieszony)
  {
    digitalWrite(LED_BUILTIN,1);
    przyspieszony--;
    predkosc=200;
    if(! przyspieszony) zablokuj=  czaszawieszenia; //jak dojdzie do 0 aktywacja zawieszenia
    Serial.print("Do konca przyspieszenia zostalo: ");
    Serial.println( przyspieszony);
  }
  else
  {
    predkosc=100;
   if(zablokuj)
   {
    Serial.print("Do konca blokady zostalo: ");
    Serial.println( --zablokuj);//zmniejszaj czas blokady az do 0
    digitalWrite(LED_BUILTIN,0);
   }
  }
 
}
}


void czas()
{
  czasTeraz=millis();
fnTik=fsekundy=fminuty=fgodziny=fdni=0;
if((uint32_t)(czasTeraz-czasPoprzedni)>=tik) //tak napisany warunek jest odporny na "klątwe 50 dni millis()"
{
  czasPoprzedni=czasTeraz;
  fnTik=1;
  nTik++;
  if(nTik>=(1000/tik))
  {
    nTik=0;
    sekundy++;
    fsekundy=1;
     if (sekundy>=60)
    {
      sekundy=0;
      minuty++;
      fminuty=1;
      if (minuty>=60)
      {
        minuty=0;
        godziny++;
        fgodziny=1;
        if (godziny>=24)
        {
          godziny=0;
          fdni=1;
          dni++;
   
        }
      }
    }
  }
}
}

Rozumiesz coś bez znajomości alfabetu?
Równie dobrze mogę Ci wrzucić przykładowe wypracowanie po francusku, bez znajomości podstaw języka nie będziesz wiedział gdzie się podpisać. Zajrzyj do kursu, on kończy się na pierwszym użyciu millis, a to dopiero miejsce gdzie należy podjąć decyzję czy faktycznie chcesz się uczyć programowania. A wtedy czekają darmowe książki tu: https://pl.wikibooks.org/wiki/C , a wiele innych jest w linkach tu na forum.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości