• 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
Sterowanie IR i pentle w switch
#1
Hej,
Mam problem z napisaniem kodu, który będzie wykonywał różne case'y zależnie od wyboru na pilocie, dokładnie to nie wiem, jak napisać to aby pętla z wybranej już opcji (wybranego przycisku) wykonywała się do momentu wyboru innej opcji (innego przycisku) - mam nadzieje że rozumiecie Smile 
Załączam kod 
 


Kod:
#include <FastLED.h>
#include <IRremote.h>

#define LED_PIN     7
#define NUM_LEDS    144
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define BRIGHTNESS  10
#define Speed 20

#define nr_0 0xFF9867
#define nr_1 0xFFA25D
#define nr_2 0xFFE21D
#define nr_3 0xFFE21D
#define nr_4 0xFF22DD
#define nr_5 0xFF02FD
#define nr_6 0xFFC23D
#define nr_7 0xFFE01F
#define nr_8 0xFFA857
#define nr_9 0xFF906F

long    ir_signal;

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

CRGB leds[NUM_LEDS];

void setup() {
 pinMode(5 , OUTPUT);
 delay(1000);
 LEDS.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
 FastLED.setBrightness(BRIGHTNESS);

 Serial.begin(9600);
 irrecv.enableIRIn();
}

void loop()
{
 if (irrecv.decode(&results)) {

   ir_signal = results.value;
   Serial.println( ir_signal );

   //    irrecv.resume();
   //    digitalWrite(5 , HIGH);
   //    digitalWrite(5 , LOW);

   switch ( results.value ) {

     case nr_0:
       for (int i = 0; i < NUM_LEDS; i++) {
         leds[i] = CRGB::White;
       }
       FastLED.show();
       delay(10);
       for (int i = 0; i < NUM_LEDS; i++) {
         leds[i] = CRGB::Black;
       }
       delay(400);
       irrecv.resume();
       break;


     case nr_1:
       for (int i = 0 ; i <= 108 ; i++ ) {
         if ( i <= 72 ) {
           leds[i] = CRGB::Green;
           leds[144 - i] = CRGB::Green;
         }
         if ( i >= 36 ) {
           leds[i - 36] = CRGB::Black;
           leds[180 - i] = CRGB::Black;
         }
         FastLED.show();
         delay(1);
       }
       irrecv.resume();
       break;
   }
   
   ir_signal = 0;
   irrecv.resume();
 }
}

Jakieś pomysły? Pierwszy raz mam do czynienia z sterowaniem IR
 
Odpowiedź
#2
Tak na sucho bez analizy Twojego kodu , jak zrobić aby dany kod wykonywał się do momentu wciśnięcia przycisku. Kod, który chcesz wykonywać do momentu wciśnięcia przycisku zamknij w osobnej pętli while nieskończonej, na końcu pętli sprawdzaj czy wciśnięto jakiś przycisk, jeśli tak to instrukcją break wróć do pętli loop.
CodingBlog.pl - ELEKTRONIKA / PROGRAMOWANIE / DIY
 
Odpowiedź
#3
Kod:
#include <FastLED.h>
#include <IRremote.h>

#define LED_PIN     7
#define NUM_LEDS    144
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define BRIGHTNESS  10
#define Speed 20

#define nr_0 0xFF9867
#define nr_1 0xFFA25D
#define nr_2 0xFFE21D
#define nr_3 0xFFE21D
#define nr_4 0xFF22DD
#define nr_5 0xFF02FD
#define nr_6 0xFFC23D
#define nr_7 0xFFE01F
#define nr_8 0xFFA857
#define nr_9 0xFF906F

long    ir_signal;

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;

CRGB leds[NUM_LEDS];

void setup() {
pinMode(5 , OUTPUT);
delay(1000);
LEDS.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);

Serial.begin(9600);
irrecv.enableIRIn();
}

void loop()
{
if (irrecv.decode(&results)) {
while(!results.value==0){

  Sprawadz( results.value);
}

}
}
void Sprawadz( int x){  ir_signal = results.value;
   Serial.println( ir_signal );

   //    irrecv.resume();
   //    digitalWrite(5 , HIGH);
   //    digitalWrite(5 , LOW);

   switch (x ) {

     case nr_0:
       for (int i = 0; i < NUM_LEDS; i++) {
         leds[i] = CRGB::White;
       }
       FastLED.show();
       delay(10);
       for (int i = 0; i < NUM_LEDS; i++) {
         leds[i] = CRGB::Black;
       }
       delay(400);
       irrecv.resume();
       break;


     case nr_1:
       for (int i = 0 ; i <= 108 ; i++ ) {
         if ( i <= 72 ) {
           leds[i] = CRGB::Green;
           leds[144 - i] = CRGB::Green;
         }
         if ( i >= 36 ) {
           leds[i - 36] = CRGB::Black;
           leds[180 - i] = CRGB::Black;
         }
         FastLED.show();
         delay(1);
       }
       irrecv.resume();
       break;
   }
  
   ir_signal = 0;
   irrecv.resume();}
Spróbuj to i popisz co się dzieje.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#4
Dzięki, już lepiej ale nadal nie to Smile
Teraz jak w monitore portu szeregowego ciągle wyskakuje ta sama wartość i zmienianie na pilocie numeru nic nie daje, zmienna nie przyjmuje innych wartosci.

Teraz pentla wykonuje się prawidłowo, ale nie ma przełączania, np przy wybieraniu 1 działa case dla 1 ale jak w trakcie trwania jego nie da się zmienic na inny np. 2.

Więc nie ma możlwości zmiany,
 
Odpowiedź
#5
Będe bardzo wdzięczny za pomoc, dodałem do programu jeszcze losowanie kolorów led, i kilka case'ów ale nadal nie mogę rozpracować ten zmiany, jakies pomysły ?
 
Odpowiedź
#6
Musisz zrobić programowe przerwanie które będzie sprawdzało stan na pilocie albo zamiast dely użyć mils.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#7
Wybacz, ale nie zabardzo wiem jak to zrobić. Jeszcze nie mam takiej wiedzy Sad
Bede mega wdzięczny jak byś mógł napisać coś takiego.
Bo z tego co myśłem to trzeba by bylo zrobić zmienna która przechowywała by wynik ostatniego odczytu i jeśli nowy odczyt ( czyli taki który bedzie sie wykonywał pod koniec case'a ) bedzie inny to wtedy zmieni się ten case ze starym na case z nowym odczytem. Ale wiedzę problem w tym ponieważ nie wiem jak zrobić aby nowy odczyt się zarejestrował podczas wykonywania pętli :/
 
Odpowiedź
#8
http://forum.arduinopolska.com/watek-prz...e-poradnik
Tu masz poradnik.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#9
Wybacz ale pomimo wielu, naprawdę wielu prób, nie wychodzi mi to, nie umiem tego zrobić Sad
 
Odpowiedź
#10
Wzuć kod dotychczasowy. spróbuje coś poradzić.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości