Проблема с кодом версия 2

Тема в разделе "Arduino & Shields", создана пользователем NikitaBarinov, 25 июл 2014.

  1. NikitaBarinov

    NikitaBarinov Нерд

    Написал такой скетч
    Код (Text):
    #include <Servo.h>
    #include <IRremote.h>

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

    Servo myservo;
    Servo myservo2;

    int led_pin = 12;
    int on_off = 1;

    void setup() {
      irrecv.enableIRIn();
     
      myservo.attach(4);
      myservo2.attach(9);
      myservo.write(178);
      myservo2.write(2);
     
      pinMode(led_pin, OUTPUT);
      digitalWrite(led_pin, HIGH);
    }

    void loop() {
      if(irrecv.decode(&results)) {
        if(results.value == 0xFF30CF) {
          if(on_off == 1) {
            digitalWrite(led_pin, LOW);
            on_off = 0;
          }
          if(on_off == 0) {
            digitalWrite(led_pin, HIGH);
            on_off = 1;
          }
        }
        if(results.value == 0xFF48B7) {
          myservo.write(178);
          myservo2.write(2);
          if(on_off == 1) {
            delay(1000);
            digitalWrite(led_pin, HIGH);
          }    
        }
        if(results.value == 0xFF6897) {
          if(on_off == 1) {
            digitalWrite(led_pin, LOW);
          }  
          myservo.write(2);
          myservo2.write(178);
        }
        irrecv.resume();
      }
    }
    Суть такова: нажал на одну кнопку - диод потух, сервы повернулись, нажал на другую - диод загорается, сервы повернулись на другой угл. Это все прекрасно работает. Но у меня есть еще одна команда:
    Код (Text):
    if(results.value == 0xFF30CF) {
          if(on_off == 1) {
            digitalWrite(led_pin, LOW);
            on_off = 0;
          }
          if(on_off == 0) {
            digitalWrite(led_pin, HIGH);
            on_off = 1;
          }
        }
    Суть ее такова: нажал на кнопку, проверяет значение переменной, если 1, то выключаем диод, если 0, то включаем. И от этой команды зависят другие(повороты серво и вкл/выкл диода). То есть есди значение переменной on_off = 1, то вкл/выкл диода перед поворотом серв так сказать разрешен, если on_off = 0, то, при выполнении последующих команд, сервы поворачиваются, а диод ни включается, ни выключается(он всегда выключен). Но почему то эта команда у меня не работает: нажимаю на кнопку, но значение переменной не меняется(диод не выключается). В чем проблема, ведь реализация легкая, вроде?
     
  2. Unixon

    Unixon Оракул Модератор

    Потому, что вы тут же передергиваете состояние обратно: второй if {} возвращает все на место после первого. Да и вообще лишней писанины много...

    Лучше так:
    Код (Text):

    if(results.value == 0xFF30CF)
    {
     on_off = !on_off;
     digitalWrite(led_pin, on_off);
    }
     
     
  3. NikitaBarinov

    NikitaBarinov Нерд

    Оу, спасибо, все заработало!