Odliczanie diodami ws2812b - Taktisz - 19-03-2020
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:
RE: Odliczanie diodami ws2812b - Robson Kerman - 20-03-2020
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.)
RE: Odliczanie diodami ws2812b - Taktisz - 20-03-2020
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?
RE: Odliczanie diodami ws2812b - kaczakat - 20-03-2020
Najpierw zalicz kurs https://forbot.pl/blog//kurs-arduino-podstawy-programowania-spis-tresci-kursu-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.
RE: Odliczanie diodami ws2812b - Taktisz - 21-03-2020
(20-03-2020, 20:39)kaczakat napisał(a): Najpierw zalicz kurs https://forbot.pl/blog//kurs-arduino-podstawy-programowania-spis-tresci-kursu-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.
RE: Odliczanie diodami ws2812b - Taktisz - 21-03-2020
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...
RE: Odliczanie diodami ws2812b - kaczakat - 21-03-2020
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.
RE: Odliczanie diodami ws2812b - frbabos - 12-08-2020
https://flaviobabos.com.br/melhores-projetos-com-arduino/
|