Управление нагрузкой atmega328p arduino

Что бы еще такого сделать?... Предлагайте! Обсудим все!!!
Ответить
Lonely_Jack
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт сен 11, 2015 15:49:29

Управление нагрузкой atmega328p arduino

Сообщение Lonely_Jack »

Задумал свет в комнате замутить от ардуино - чтобы от ик пульта и от кнопки
написал один скетч с функцией flag - работает хорошо - только от кнопки дребезг
переписал с библиотеками irremote и bounce. работает отлично, только:
1. при нажатии кнопки переключается отлично
2. при нажатии пульта переключается отлично
3. если нажал кнопку - на пульт приходиться дважды нажимать чтоб сработало устройство и наоборот. еще при этом начинает гореть светодиод tx, а спустя секунд 30 гаснет
подскажите,плз, что исправить в коде для сработки от однократного нажатия в любом случае. с flag все так и было, но дребезг...

Код: Выделить всё

//управление нагрузками (светом) при помощи ик пульта и тактовой кнопки. команды ик пульта прописывать отдельно
#include <IRremote.h>
#include <Bounce.h>
//дефайним значения пинов с кнопкой и со светодиодом
#define BUTTON 2
#define led 13

//создаем объект класса Bounce. Указываем пин, к которому подключена кнопка, и время дребезга в мс.
Bounce bouncer = Bounce(BUTTON,5); 


//задаем начальное состояние светодиода "выключен"
int ledValue = LOW;
// переменные
int RECV_PIN = 11;
int ledStat = 0;
IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
//определяем режимы работы пинов
  pinMode(BUTTON,INPUT);
  pinMode(led,OUTPUT);
Serial.begin(9600);
irrecv.enableIRIn(); // Запуск приемника
pinMode(led, OUTPUT);
}

void loop() {
 

 //если сменилось состояние кнопки
  if ( bouncer.update() ) {
    //если считано значение 1
    if ( bouncer.read() == HIGH) {
     //если свет был выключен, будем его включать
     if ( ledValue == LOW ) {
       ledValue = HIGH;
     //если свет был включен, будем выключать
     } else {
       ledValue = LOW;
     }
     //записываем значение вкл/выкл на пин со светодиодом 
     digitalWrite(led,ledValue);
    }
  }
if (irrecv.decode(&results)) 
{
Serial.println(results.value);

//красный
if (results.value == 0xFF48B7 && ledStat == 0)
{
digitalWrite(led, HIGH);
ledStat = 1;
}
else
if (results.value == 0xFF48B7
 && ledStat == 1)
{
digitalWrite(led, LOW);
ledStat = 0;
}


irrecv.resume(); // Получить слудующее значение
}
}

Реклама
Шурики
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Re: Управление нагрузкой atmega328p arduino

Сообщение Шурики »

А шо вы хотели, если состояние лампы сохраняется в двух разных переменных? Поэтому если нажали кнопку, одна переменная изменилась, другая нет - они не синхронны. Запись значения порта производится в 2-х разных местах программы. Это конечно ничего, но такая запись происходит только при отработке условия что кнопка нажата или команда пульта правильна.
Если у вас переменная имеет только 2 значения, не желательно использовать int, лучше булевскую переменную. Не нужно использовать if для её изменения - лучше использовать обратимые операции - инверсию, исключающее ИЛИ и т.д.

И, кстати, недавно спорили на форуме про Ардуино. Насколько видно из этого примера, как не сокращай басню, для упрощения и популяризации работы с микроконтроллерами, всё-равно побеждает ctrl-c/ctrl-v.

В целом, стиль написания программы "никакой". с 87-го года прошлого века такого не видел, думал не увижу. Вы уж разберитесь со структурой программы и выкладывайте, поможем. Имейте ввиду, что события кнопка или IR могут возникать в любой момент времени и даже одновременно - не надейтесь на быстродействие МК, оптимизируйте код.

З.Ы. Не обращайте внимания на ворчание, ещё после работы не отошёл...
Реклама
Lonely_Jack
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт сен 11, 2015 15:49:29

Re: Управление нагрузкой atmega328p arduino

Сообщение Lonely_Jack »

На крутой стиль и не претендую)) по сути - это первое, что я пытаюсь самостоятельно написать на ардуино (да и не только на ардуино, а вообще). В дикие дебри лезть пока не хочу, это хобби, так что ардуино для меня вполне приемлемая вещь. Спасибо за комментарий))
Lonely_Jack
Первый раз сказал Мяу!
Сообщения: 23
Зарегистрирован: Пт сен 11, 2015 15:49:29

Re: Управление нагрузкой atmega328p arduino

Сообщение Lonely_Jack »

переправил свой изящный код, переменную сделал одну - заработало. спасибо, кэп))) :beer:
по мере необходимости будем учиться)))
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «Умные мысли»