Вопрос по IR управлению

dimex
Offline
Зарегистрирован: 10.01.2016

Здравствуйте! Строго не судите я новичок!

есть скетч :

const int led[] = {3,5,6};
const int delayTime = 10; 

#define RG 0
#define GB 1
#define BR 2

void setColour(const int * led, const int * colour)
{
    for(int i = 0; i < 3; i ++)
    {
        analogWrite(led[i],colour[i]);
    }
}

void cycle(int which, const int * led)
{
    int a;
    int b;
    int c;
    switch(which)
    {
        case RG:
            a = led[0];
            b = led[1];
        break;
        case GB:
            a = led[1];
            b = led[2];
        break;
        default:
            a = led[2];
            b = led[0];

    }

    for(int i = 0; i <= 255; i ++)
    {
        analogWrite(b, i);
        analogWrite(a, 255 - i);
        delay(delayTime);
    }
}

void setup()
{
    for(int i = 0; i < 3; i++)
    {
        pinMode(led[i],OUTPUT);
    }
}

void loop()
{
    cycle(RG, led);
    cycle(GB, led);
    cycle(BR, led);
}

как сделать что бы он включался и отключался от IR приёмника с разных кнопок?

заранее спасибо за ответ!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dimex пишет:

есть скетч :

....

как сделать что бы он включался и отключался от IR приёмника с разных кнопок?

Хороший вопрос! давайте я Вам задам такой же:

Есть скетч

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

Как сделать, чтобы он управлял центрифугой в стиральной машинке? Заранее спасибо за ответ!

В этом разделе люди делают сами, и справшивают когда у них что-то конкретное не получается. А для вопросов типа Вашего есть раздел "Ищу исполнителя"

dimex
Offline
Зарегистрирован: 10.01.2016

Извините!! собрал скетч включается с пульта но светодиоды горят не равномерно!!  один плавно гаснет другие на секунду загораются и гаснут!! что делаю не так???ещё раз повторюсь я только начинаю!!!

#include <IRremote.h>


IRrecv irrecv(12);
decode_results results;
const int led[] = {3,9,11};
const int delayTime = 10; 

#define RG 0
#define GB 1
#define BR 2

void setColour(const int * led, const int * colour)
{
    for(int i = 0; i < 3; i ++)
    {
        analogWrite(led[i],colour[i]);
    }
}

void cycle(int which, const int * led)
{
  
    
    int a;
    int b;
    int c;
    switch(which)
    {
        case RG:
            a = led[0];
            b = led[1];
        break;
        case GB:
            a = led[1];
            b = led[2];
        break;
        default:
            a = led[2];
            b = led[0];
         
    }

    for(int i = 0; i <= 255; i ++)
    {
        analogWrite(b, i);
        analogWrite(a, 255 - i);
        delay(delayTime);
    }
}

void setup(){
irrecv.enableIRIn(); 


 
    for(int i = 0; i < 3; i++)
    {
        pinMode(led[i],OUTPUT);
    
    }

}

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

switch ( results.value ) 
{
 case 0x76044FEC:
{ 
    cycle(RG, led);
    cycle(GB, led);
    cycle(BR, led);
break;
}


irrecv.resume();
}
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот так лучше.

Попробуйте в setup добавить установку конфигурации пинов 3,5,6

Типа 

pinMode(3, OUTPUT);
... и т.д. для всех трёх.

dimex
Offline
Зарегистрирован: 10.01.2016

при изменении значений в setup абсолютно ничего не изменяется! светодиоды начинаю себя так вести когда запускаеш irrecv.enableIRIn(); в setup!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Тогда отделите мух от котлет.

Отложите этот скетч в сторонку, а пока сделайте на основе его скетч, который только работает со светодиодами (без IR!) Убедитесь, что он работает нормально. Если нет - дожмите его. А потом уже подключайте IR

dimex
Offline
Зарегистрирован: 10.01.2016

светодиоды без IR плавно загораются и гаснут тоесть всё нормально!! но стоит добавить IR начинает нестабильно работать!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Тогда понятно.Ваша библиотека IRremote.h подрались за таймер с ШИМ'ом.

1. сумеете посмотреть каким таймером пользуется библиотека?

2. знаете какие таймеры отвечают ШИМ на каких ногах?

Если нет - не стесняйтесь - напишите, я сам посмотрю, только скажите библиотеку IRremote.h где брали? Это та, что с IDE идёт или другую где-то скачали?

Посмотрел.
Если библиотека из IDE, то она использует второй таймер. Значит Вы не можете пользовать ШИМ на пинах 3 и 11. 
Перенесите светодиод с пина 3 на пин 9 или 10 и всё должно заработать нормально.

 

dimex
Offline
Зарегистрирован: 10.01.2016

Спасибо большое помогло!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dimex пишет:

Спасибо большое помогло!!

Не за что. Имейте в виду на будущее, если кто-то (Вы сами или библиотека) использует таймер, то с ШИМ (или с tone()) будут проблемы на пинах, которые обслуживаются этим таймером.

Для Uno/Nano и т.п.

Pins 5 и 6: timer0
Pins 9 и 10: timer1
Pins 11 и 3: timer2
 
Для Mega 
 
Pins 4 и13: timer0
Pins 11 и12: timer1
Pins 9 и10: timer2
Pin 2, 3 и5: timer3
Pin 6, 7 и8: timer4
Pin 46, 45 и44:: timer5
 
dimex
Offline
Зарегистрирован: 10.01.2016

Возник ещё вопрос как отключить?? ничего у меня не получается всё перебрал!!последующее нажатие кнопок не работает, пока не завершится 1 цикл!! как его становить ?

#include <IRremote.h>


IRrecv irrecv(2);
decode_results results;
const int led[] = {10,6,9};
const int delayTime = 10; 

#define RG 0
#define GB 1
#define BR 2

void setColour(const int * led, const int * colour)
{
    for(int i = 0; i < 3; i ++)
    {
        analogWrite(led[i],colour[i]);
    }
}

void cycle(int which, const int * led)
{
  
    
    int a;
    int b;
    int c;
    switch(which)
    {
        case RG:
            a = led[0];
            b = led[1];
        break;
        case GB:
            a = led[1];
            b = led[2];
        break;
        default:
            a = led[2];
            b = led[0];
         
    }

    for(int i = 0; i <= 255; i ++)
    {
        analogWrite(b, i);
        analogWrite(a, 255 - i);
        delay(delayTime);
    }
}

void setup(){
irrecv.enableIRIn(); 


 
    for(int i = 0; i < 3; i++)
    {
        pinMode(led[i],OUTPUT);
    
    }

}

void loop()
{
if ( irrecv.decode( &results ))  
{
switch ( results.value ) 
{
 case 0x76044FEC:
{
    cycle(RG, led);
    cycle(GB, led);
    cycle(BR, led);
break;

case 0x76044FDC :




}


irrecv.resume();
}
}}

 

Logik
Offline
Зарегистрирован: 05.08.2014

Строка 48 гадит.  Читайте про Blink без deley. Раскрывайте цикл, отмеряйте время.. У Вас очень типичный и не сложный случай.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, ладно, Вам, Logic, там в строке 48 всего-то 10мс - чего там она гадит. Проблема не в ней, а в цикле как таковом.

dimex, у Вас цикл в строках 44-49 мёртвый и из него нет иного выхода, кроме как дождаться его завершения. Если хотите, его досрочно прекращать, то надо в него вставить проверку, не пришло ли что-нибудь новое, и если пришло, то выходить из цикла.

dimex
Offline
Зарегистрирован: 10.01.2016

Подскажите пожалуйста где про это можно почитать??Или можете пример какой нибуть скинуть,а дальше я сам!! Спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dimex пишет:

Подскажите пожалуйста где про это можно почитать??Или можете пример какой нибуть скинуть,а дальше я сам!! Спасибо!

А чего тут читать, тут программу писать надо.

Сма-то я этой библиотекой не пользуюсь, да и нет её у меня, но так из общих соображений всё понятно, каждется.

Для начала, что у Вас фигурные скобки в строках в строках 72/83? Нечего им там делать. Убирайте.

Из-за жтой лишей скобки у Вас строка 86 попала внутрь switch, а она должна быть снаружи (внутри if, но не внутри switch). Переносим её на место перед закрывающей } if'а.

Наконец, после delay (строки 48), добавляем строку

if (irrecv.decode( &results )) break;
 
Т.е. "если что-нибудь пришло", немедленно выйти из цикла.
 
Получается что-то вроде вот такого:
 
#include <IRremote.h>

IRrecv irrecv(2);
decode_results results;
const int led[] = {10, 6, 9};
const int delayTime = 10;

#define RG 0
#define GB 1
#define BR 2

void setColour(const int * led, const int * colour) {
  for (int i = 0; i < 3; i ++) {
    analogWrite(led[i], colour[i]);
  }
}

void cycle(int which, const int * led) {
  int a;
  int b;
  int c;
  switch (which) {
    case RG:
      a = led[0];
      b = led[1];
      break;
    case GB:
      a = led[1];
      b = led[2];
      break;
    default:
      a = led[2];
      b = led[0];

  }

  for (int i = 0; i <= 255; i ++) {
    analogWrite(b, i);
    analogWrite(a, 255 - i);
    delay(delayTime);
    if (irrecv.decode( &results )) break;
  }
}

void setup() {
  irrecv.enableIRIn();
  for (int i = 0; i < 3; i++) {
    pinMode(led[i], OUTPUT);
  }
}

void loop() {
  if (irrecv.decode( &results )) {
    switch ( results.value ) {
      case 0x76044FEC:
        cycle(RG, led);
        cycle(GB, led);
        cycle(BR, led);
        break;
      case 0x76044FDC :
        break;
    }
    irrecv.resume();
  }
}

 

dimex
Offline
Зарегистрирован: 10.01.2016

Спасибо большое за подсказки!! без вас ничего быне получилось!! ещё раз спасибо!!

заработало вот так!!!

#include <IRremote.h>

IRrecv irrecv(2);
decode_results results;
const int led[] = {10, 6, 9};
const int delayTime = 10;
int pin = 13;
#define RG 0
#define GB 1
#define BR 2

void setColour(const int * led, const int * colour) {
  for (int i = 0; i < 3; i ++) {
    analogWrite(led[i], colour[i]);
  }
}

void cycle(int which, const int * led) {
  int a;
  int b;
  int c;
  switch (which) {
    case RG:
      a = led[0];
      b = led[1];
      break;
    case GB:
      a = led[1];
      b = led[2];
      break;
    default:
      a = led[2];
      b = led[0];

  }

  for (int i = 0; i <= 255; i ++) {
    analogWrite(b, i);
    analogWrite(a, 255 - i);
    delay(delayTime);
   if (irrecv.decode( &results ))
 break;
  
}}

void setup() {
  irrecv.enableIRIn();
  pinMode(13, OUTPUT);
  for (int i = 0; i < 3; i++) {
    pinMode(led[i], OUTPUT);
  }
}

void loop() {
  if (irrecv.decode( &results )) {
    switch ( results.value ) {
      
      case 0x76044FDC :
       analogWrite(10, LOW);
        analogWrite(6, LOW);
        analogWrite(9, LOW);
        break;
    }
    irrecv.resume();
  }
switch ( results.value ) {
      case 0x76044FEC:
        cycle(RG, led);
        cycle(GB, led);
        cycle(BR, led);
}}