Arduino Polska Forum

Pełna wersja: Sterowanie IR i pentle w switch
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
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
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.
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.
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,
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 ?
Musisz zrobić programowe przerwanie które będzie sprawdzało stan na pilocie albo zamiast dely użyć mils.
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 :/
Wybacz ale pomimo wielu, naprawdę wielu prób, nie wychodzi mi to, nie umiem tego zrobić Sad
Wzuć kod dotychczasowy. spróbuje coś poradzić.
Stron: 1 2