Помогите поправить код

Тема в разделе "Arduino & Shields", создана пользователем Максим B, 9 май 2014.

  1. Максим B

    Максим B Гуру

    Код управления люстрой с ик пульта и кнопки (выключателя). Идея реализовать включения света и кнопкой и ИК.
    Код (Text):

    #include <IRremote.h>
    #include <IRremoteInt.h>

    const int buttonPin = 2;

    int Pwr = 13; // LED  (здесь реле)
    boolean state = 0;
    int buttonState = 0;  // переменная для хранения состяния кнопки

    //IR Receiver Module Pin and variable
    int RECV_PIN = 11;
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void setup(){
      pinMode(Pwr, OUTPUT); // Вывод Pwr выход
      irrecv.enableIRIn(); //Старт ИК-приёмника
      pinMode(buttonPin, INPUT); // инициализируем пин, подключенный к кнопке, как вход

    }

    void loop(){

    // считываем значения с входа кнопки
      buttonState = digitalRead(buttonPin);

    if (buttonState == HIGH) {
        // включаем реле
        digitalWrite(Pwr, buttonState);
      }
      else {
        // выключаем реле
        digitalWrite(Pwr, buttonState);
      }


      if(irrecv.decode(&results)){ // Декодирование принятого сигнала по ИК
        if(results.value == 0xFF629D){ // Код кнопки POWER  
          state = !state;
        }
        digitalWrite(Pwr, state); // Пин Pwr
        irrecv.resume();
      }
    }
     
     
    Последнее редактирование: 9 май 2014
  2. lerik2703

    lerik2703 Гик

    как я вижу исходя из скетча ,реле у вас включаться если удержать кнопку,а с пульта вообще ничего не происходит?!
     
  3. Код (Text):
    void loop(){
     
      if (digitalRead(buttonPin)) {
        digitalWrite(Pwr, !digitalRead(Pwr));
        delay(100);
      }
      if(irrecv.decode(&results)){
        if(results.value == 0xFF629D)  digitalWrite(Pwr, !digitalRead(Pwr));  
        irrecv.resume();
      }
    }
     
  4. Максим B

    Максим B Гуру

    С данным кодом таки есть, с кнопки все ок, а с пульта нет. Но если оставить код только для пульта
    Код (Text):
    #include <IRremote.h>
    #include <IRremoteInt.h>

    int Pwr = 4; // LED
    boolean state = 0;

    //IR Receiver Module Pin and variable
    int RECV_PIN = 11;
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void setup(){
      pinMode(Pwr, OUTPUT); // Вывод Pwr выход
      irrecv.enableIRIn(); //Старт ИК-приёмника
    }

    void loop(){
      if(irrecv.decode(&results)){ // Декодирование принятого сигнала по ИК
        if(results.value == 0xFF629D){ // Код кнопки POWER  
          state = !state;
        }
        digitalWrite(Pwr, state); // Пин Pwr
        irrecv.resume();
      }
    }
    пульт работает.

    Пушной звер, спасибо - буду пробовать
     
  5. Максим B

    Максим B Гуру

    не работает код (((
     
  6. Максим B

    Максим B Гуру

    Длявыключателя получилось использовать вот такой код, но выключатель кнопочный "без пружины".

    Код (Text):


    #define BUTTON_PIN  A3
    #define LED_PIN    13
    boolean buttonWasUp = true;  // была ли кнопка отпущена?
    boolean ledEnabled = false;  // включен ли свет?
    void setup()
    {
      pinMode(LED_PIN, OUTPUT);
      pinMode(BUTTON_PIN, INPUT_PULLUP);
    }
    void loop()
    {
      // определить момент «клика» несколько сложнее, чем факт того,
      // что кнопка сейчас просто нажата. Для определения клика мы
      // сначала понимаем, отпущена ли кнопка прямо сейчас...
      boolean buttonIsUp = digitalRead(BUTTON_PIN);
      // ...если «кнопка была отпущена и (&&) не отпущена сейчас»...
      if (buttonWasUp && !buttonIsUp) {
        // ...может это «клик», а может и ложный сигнал (дребезг),
        // возникающий в момент замыкания/размыкания пластин кнопки,
        // поэтому даём кнопке полностью «успокоиться»...
        delay(10);
        // ...и считываем сигнал снова
        buttonIsUp = digitalRead(BUTTON_PIN);
        if (!buttonIsUp) {  // если она всё ещё нажата...
          // ...это клик! Переворачиваем сигнал светодиода
        ledEnabled = !ledEnabled;
        digitalWrite(LED_PIN, ledEnabled);
        }
      }
      // запоминаем последнее состояние кнопки для новой итерации
      buttonWasUp = buttonIsUp;
    }
     
  7. Максим B

    Максим B Гуру

    поправил код
    Код (Text):
    #include <IRremote.h>
    #include <IRremoteInt.h>



    #define BUTTON_PIN  A3
    #define LED_PIN    13

    boolean buttonWasUp = true;  // была ли кнопка отпущена?
    boolean ledEnabled = false;  // включен ли свет?

    //int Pwr = 8; // LED
    boolean state = 0;

    //IR Receiver Module Pin and variable
    int RECV_PIN = 2;
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void setup(){
     
      pinMode(LED_PIN, OUTPUT);
      pinMode(BUTTON_PIN, INPUT_PULLUP);
     
      pinMode(LED_PIN, OUTPUT); // Вывод Pwr выход  (был pwr_)
      irrecv.enableIRIn(); //Старт ИК-приёмника
    }

    void loop(){
     
      boolean buttonIsUp = digitalRead(BUTTON_PIN);
     
      if (buttonWasUp && !buttonIsUp)  {
        delay(10);  
        buttonIsUp = digitalRead(BUTTON_PIN);
        if (!buttonIsUp) {
          ledEnabled = !ledEnabled;
        digitalWrite(LED_PIN, ledEnabled);
        }
       
      }
      buttonWasUp = buttonIsUp;
     
     
      if(irrecv.decode(&results)){
        if(results.value == 0xFF629D)  digitalWrite(LED_PIN, !digitalRead(LED_PIN));
        irrecv.resume();
      }
    }
     
  8. Максим B

    Максим B Гуру

    Код работает, но проблема с выключателем осталась
     
  9. lerik2703

    lerik2703 Гик

    что за проблема ?
     
  10. Максим B

    Максим B Гуру

    Включатель включаешь - свет загорается, а когда выключаешь приходиться дважды переключать выключатель. (Вверх-вниз-вверх-вниз и свет выключился.)
     
  11. Максим B

    Максим B Гуру

    Спасибо tomasina, за часть кода из соседней ветки. Но сижу и не понимаю как правильно реализовать, что бы все таки выключатель работал правильно: Вот мой код
    Код (Text):

    #include <IRremote.h>
    #include <IRremoteInt.h>

    #define BUTTON_PIN  A2   //кнопка
    #define LED_PIN     5    // реле

    boolean buttonWasUp = true;  // была ли кнопка отпущена?
    boolean ledEnabled = false;  // включен ли свет?

    //IR Receiver Module Pin and variable
    int RECV_PIN = 11;
    IRrecv irrecv(RECV_PIN);
    decode_results results;

    void setup(){
      pinMode(LED_PIN, OUTPUT);
      pinMode(BUTTON_PIN, INPUT_PULLUP);
      irrecv.enableIRIn(); //Старт ИК-приёмника
    }

    void loop(){
      boolean buttonIsUp = digitalRead(BUTTON_PIN);
      if (buttonWasUp && !buttonIsUp)  {
        delay(10);    
        buttonIsUp = digitalRead(BUTTON_PIN);
        if (!buttonIsUp) {
          ledEnabled = !ledEnabled;
         digitalWrite(LED_PIN, ledEnabled);
        }
       
      }
      buttonWasUp = buttonIsUp;
      if(irrecv.decode(&results)){
        if(results.value == 0xFF629D)  digitalWrite(LED_PIN, !digitalRead(LED_PIN));  
        irrecv.resume();
      }
    }
     

    , а это код для выключателя света

    Код (Text):

    void setup()
    {
      pinMode(LED_PIN, OUTPUT);
      pinMode(BUTTON_PIN, INPUT_PULLUP);
    }
    void loop()
    {
       digitalWrite(LED_PIN, !digitalRead(BUTTON_PIN));
       delay(100);
    }
     
    как и подружить, уже перепробовал многое. В си пока все новое. (((
     
    Последнее редактирование: 18 май 2014
  12. lerik2703

    lerik2703 Гик

    так весь алгоритм опишите!
     
  13. Максим B

    Максим B Гуру

    Брал часть кода с сайта http://agsidenko.ru/2014/04/03/практическая-работа-5-кнопочный-перек/ .

    Суть, все просто до невозможно. Заходим в комнату либо включаем обычный кнопочный выключатель света (с положением вверх либо вниз) и свет включается, либо включаем с пульта. И отключается либо кнопкой, либо пультом. Сейчас все работает, но код сделан для "кнопки", которую раз нажал и отпустил - свет включился, и еще раз нажал отключился. С пульта все работает..
     
  14. lerik2703

    lerik2703 Гик

    у вас опрос выключателя и опрос пульта работают отдельно друг от друга, а должны работать вместе !
    digitalWrite(LED_PIN, !digitalRead(LED_PIN)); здесь вы тупо меняете состояние порта ,но вот выключателю не сообщаете что произошли изменения ...
     
  15. Максим B

    Максим B Гуру

    Что самое удивительное код работает =). Тогда вопрос как? На деле не скажешь, что есть косяк между выключателем и ик
     
  16. lerik2703

    lerik2703 Гик

    хотя наверно можно и так оставить..
    как то так должно работать...

    Код (Text):
    void setup(){
      pinMode(LED_PIN, OUTPUT);
      pinMode(BUTTON_PIN, INPUT_PULLUP);
      irrecv.enableIRIn(); //Старт ИК-приёмника
      buttonWasUp=!digitalRead(BUTTON_PIN);

    }

    void loop(){
      boolean buttonIsUp = digitalRead(BUTTON_PIN);
            delay(50);
            buttonIsUp = digitalRead(BUTTON_PIN);
      if (buttonIsUp == buttonWasUp)  {
            buttonWasUp=!buttonIsUp;
            digitalWrite(LED_PIN,  !digitalRead(LED_PIN));

      }

      if(irrecv.decode(&results)){
        if(results.value == 0xFF629D)
        digitalWrite(LED_PIN,  !digitalRead(LED_PIN));
        irrecv.resume();
      }
    }
     
  17. Максим B

    Максим B Гуру

    спасибо тебе большое, все работает как надо.