Ви не увійшли.
А как сделать, чтобы нажал и переключилось с предыдущего выхода на тот который нажал ?
Ознакомитесь с этим уроком(а еще лучше со всеми с первого). Во второй части разбирается код который,
по моему, решит эту проблему.
https://www.youtube.com/watch?v=wjB2qZ3 … Zs_4VnJqLa
наверное я вам все таки порекомендую найти исполнителя.
то что вы хотите делается просто -
start
bool power_status = false;
set power OFF
if power button is pressed
{
set power ON
power_status = true
}
if power_status == true
{
check key1
check key2
check key3
и т.д.
}
пример алгоритма,
и не забывайте что выключение должно быть с удержанием например 700 мс, включение не по первому импульсу а например 300 мс
рекомендую расписать алгоритм хотя бы для себя, может в процессе создания корректного ТЗ прийдет понимание как сделать хороший алгоритм а не собрать код с двух примеров
код из примера более читабельный как по мне
http://arrduinolab.blogspot.ru/2014/04/ … st_10.html
#include <IRremote.h> // https://github.com/shirriff/Arduino-IRremote
#define RECV_PIN 8 // IR приемник
#define POWER_IR_KEY xxxx номер контакта что включает питание
#define OUT1 11 // выхода на мосфеты\реле
#define OUT2 12
#define OUT3 15
#define OUT4 14
#define POWER_IR_KEY 0x40BF30CF // коды пульта ДУ
#define KEY1 0x40BF7887
#define KEY2 0x40BFF807
#define KEY3 0xC03FC03F
#define KEY4 0xC03F40BF
IRrecv irrecv(RECV_PIN);
int power_status = 0;
decode_results results;
void setup()
{
irrecv.enableIRIn();
pinMode(POWER_PIN, OUTPUT);
pinMode(OUT1, OUTPUT);
pinMode(OUT2, OUTPUT);
pinMode(OUT3, OUTPUT);
pinMode(OUT4, OUTPUT);
digitalWrite(POWER_PIN, LOW);
}
void loop() {
if (irrecv.decode(&results))
{
if (results.value == POWER_IR_KEY)
{
if ( power_status == 0 )
{ power_status = 1; digitalWrite(POWER_PIN, LOW); }
else { power_status = 0; digitalWrite(POWER_PIN, HIGH); }
}
else if ( power_status )
{
if (results.value == KEY1) digitalWrite(OUT1, !digitalRead(OUT1)); // инверсия только после включения
else if (results.value == KEY2) digitalWrite(OUT2, !digitalRead(OUT2));
else if (results.value == KEY3) digitalWrite(OUT3, !digitalRead(OUT3));
else if (results.value == KEY4) digitalWrite(OUT4, !digitalRead(OUT4));
}
irrecv.resume();
}
}
подправите под свои нужды
вот его и возмите за основу, но начните с алгоритма
вариант "хочу это" не очень хорош
пример более корреткного описания задачи, тем более что цяця ваша хорошо звучит и наверяка денег стоит )
забейте в поиск state machine
много примеров понагляднее
Выше я привел два примера.17 пост. Теперь их нужно как то объединить, что бы одна кнопка включала\выключала сеть режим стендбай т.е. при нажатии на кнопку давалась команда на один из выходов ардуино , чтобы включить реле питание усилителем. И чтобы при этом разблокировались ( или как правильно сказать, стали активны команды для переключения других кнопок. А именно переключение каналов. Их четыре. В примере выше нажал включено, еще нажал выключилось.
А как сделать, чтобы нажал и переключилось с предыдущего выхода на тот который нажал ?
На счет сервы, давайте пока отложим. Еще не выбрал, серво двигатель или мотор альпс. Не совсем разобрался с устройством и работой. Если серво то нужно углы поворота задавать ? Ну так вроде бы и мотор альпсы тоже также. Хотя видел в старых усилителях и с концевиками.
У меня в усилителе какой то мотор на громкости стоит. Алгоритма его работы я не знаю. Курочить пока не могу, усилитель сильно не дешевый ...
Хотя команды можно заложить , держишь кнопку на пульте + громкость на выходе ардуино есть сигнал, - громкость на другом выходе сигнал.
Так сказать команды с удержанием. Вот такие нужны команды.
И еще один момент. В 10 посте тоже есть пример. Чем он лучше\хуже того , что в 17. (первый пример)?
вы выложили код из примеров.
плс оформляйте как С++ код, 5 кнопка справа
но это не то что я хотел узнать,
кнопки вы уже идентифицируете.. какой следующий шаг,
сервой крутить? отработать на лампочках алгоритмы.
обьяснить что за строчка в примерах?
Самый первый опыт был вот с таким скетчем . Изменил коды кнопок на свои.
Этот скетч с фиксацией кнопок. Работает.
//урок от Дмитрия Осипова - управление arduino ИК пультом
С исправленными моими кодами команд (пульт ТВ Самсунг)
#include <IRremote.h> // это скачанная библиотека
int RECV_PIN = 11; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;
int a=0; // переменная переключения режима, при нажатии кнопки она принимает значение +1
int b=0; //
int c=0; //
int d=0; //
int e=0; //
int f=0; //
int g=0; //
void setup()
{
irrecv.enableIRIn(); // включить приемник
pinMode(13, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT); // назначаем пины как выходы
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
}
void loop() {
if (irrecv.decode(&results)) {
delay(300); // задержка перед выполнением определения кнопок, чтобы избежать быстрое двойное нажатие
if (results.value == 0xE13DDA28) {a=a+1;} // обработка нажитя клавиши, здесь переменная принимает значение +1
if (results.value == 0xAD586662) {b=b+1;} //ВАЖНО !!! ( 1008889 ) это код кнопки №2 - моего пульта от телевизора Panasonic - у вашего пульта будет другой код - замените на свой
if (results.value == 0x273009C4) {c=c+1;}
if (results.value == 0xF5999288) {d=d+1;}
if (results.value == 0x731A3E02
) {e=e+1;}
if (results.value == 0x2C452C6C
) {f=f+1;}
if (results.value == 0xB9F56762) {g=g+1;}
// начинаем включать светодиоды на пинах
if (a==1){digitalWrite(13, HIGH);} else {digitalWrite(13, LOW); a=0;} // действие после нажатия кнопки, если переменная стала равна 1 то
if (b==1){digitalWrite(2, HIGH);} else {digitalWrite(2, LOW); b=0;} // произвести переключение пина в режим HIGH, если же нет то вернуть переменную в исходное состояние
if (c==1){digitalWrite(3, HIGH);} else {digitalWrite(3, LOW); c=0;} // Дествие может быть другим
if (d==1){digitalWrite(4, HIGH);} else {digitalWrite(4, LOW); d=0;} // действие после нажатия кнопки
if (e==1){digitalWrite(5, HIGH);} else {digitalWrite(5, LOW); e=0;} // действие после нажатия кнопки
if (f==1){digitalWrite(6, HIGH);} else {digitalWrite(6, LOW); f=0;} // действие после нажатия кнопки
if (g==1){digitalWrite(7, HIGH);} else {digitalWrite(7, LOW); g=0;} // действие после нажатия кнопки
{ //
delay(50); //пауза между повторами //
} //
irrecv.resume(); //
}
}
Следующий опыт был с удержанием кнопок. Пока кнопка нажата светодиод светится.
Работает
/* урок от Дмитрия Осипова. http://www.youtube.com/user/d36073?feature=watch
v.01 Arduino IR Управление с ИК пульта в режиме удержания кнопки
Version 0.1 2013/07/02
После того как я выложил видео
1/6 Управление Arduino с ИК пульта - начало
http://www.youtube.com/watch?v=PjR9jlP4644
поступило немало просьб такого содержания
(Антон Палыч
Дмитрий, огромная благодарность за Ваш труд! Все просто и доходчиво.
Скачал Ваш пример "urok ot Dmitriya Osipova - upravleniye Arduino IK pulоtom"
Все работает но у меня возник вопрос. Как сделать,
что бы кнопка определенного пина работала в режиме удержания а не в режиме "триггер" как в уроке?
То есть нажимая и удерживая кнопку пульта напряжение идет, отпуская исчезает.)
//
Поначалу я думал все это будет сделать очень легко и просто, а потом выяснилось что тут
много подводных камней.
в видео я подробно все это изложу
v.01 Arduino IR Управление с ИК пульта в режиме удержания кнопки
https://www.youtube.com/watch?v=AjIASUNiWkY
*******************************************************************
Скачать библиотеку IRremote для ИК пульта
https://disk.yandex.ru/public/?hash=yNz … mhW4Xt0%3D
скетч arduino чтобы узнать код кнопки ИК пульта
sketch arduino buttons on the remote to learn the code
https://disk.yandex.ru/public/?hash=KzL … QKJHGRQ%3D
4/6 как ? узнать код - кнопки своего ИК пульта
http://www.youtube.com/watch?v=InZuGntH_wk
Arduino Розетки, Управление любым ИК пультом, (программируемые на лету) socket IR remote control
http://www.youtube.com/watch?v=Nx6DUQ7Tx1w
усилитель ИК инфракрасного сигнала IR infrared signal amplifier на одном транзисторе Arduino
http://www.youtube.com/watch?v=3EYxONWSyR4
*/
#include <IRremote.h> // это скачанная библиотека
int RECV_PIN = 11; //вход ИК приемника
IRrecv irrecv(RECV_PIN);
decode_results results;
//eventTime, для паузы, вместо delay,будем использовать функцию millis.
unsigned long eventTime=0;
//индикация таймера
int timer = 12;
int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно.
int L2 = 2;
int L3 = 3;
int L4 = 4;
int L5 = 5;
int L6 = 6;
int L7 = 7;
int L8 = 8;
void setup(){
irrecv.enableIRIn(); // включить приемник
pinMode(L13, OUTPUT); // назначаем пины как выходы
pinMode(L2, OUTPUT);
pinMode(L3, OUTPUT);
pinMode(L4, OUTPUT);
pinMode(L5, OUTPUT);
pinMode(L6, OUTPUT);
pinMode(L7, OUTPUT);
pinMode(L8, OUTPUT);
pinMode(timer, OUTPUT);
}
void loop() {
// Эта конструкция нужна чтобы конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный.
//После появление и пропадания сигнала, состояние сразу не меняется! а ждет 100 миллисекунд.
//Если 100 миллисекунд не прошло, и поступил еще один сигнал с пульта, тогда таймер заново запускается на 100 миллисекунд.
//Проще говоря, пока кнопка на пульте нажата таймерПИН остается вКлюченным, если кнопка на пульте отпущена таймерПИН вЫключен.
// Читаем данные с (ИК) преемника. В момент приема данных у (ИК) приемника на выходе появляется пульсирующий (-)отрицательный сигнал
if (digitalRead(RECV_PIN) == LOW)
// Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);
eventTime=millis(),digitalWrite(timer, HIGH);
// Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)
if(millis()-eventTime>100) digitalWrite(timer, LOW)
// и вЫключаем все
,digitalWrite(L13, LOW),digitalWrite(L2, LOW),digitalWrite(L3, LOW)
,digitalWrite(L4, LOW),digitalWrite(L5, LOW),digitalWrite(L6, LOW),digitalWrite(L7, LOW),digitalWrite(L8, LOW);
if (irrecv.decode(&results)) {
//ВАЖНО !!! ( 1000809 ) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -
//-у вашего пульта будет другой код, замените на свой!
// У моего пульта при нажатии на одну и ту же кнопку, могут отсылаться два разных (КОДА) сигнала, чтобы обойти эту проблему
//я использовал Логический оператор "или" (||) if (results.value == 0x1000809 || results.value == 0xF7283C77
// Теперь неважно какой код отправлен с кнопки пульта, первый или второй
// Если ваша кнопка пульта не страдает раздвоением личности, можете написать так if (results.value == 0x1000809
//Только при условии если, (Одновременно),Обнаружен поступивший код кнопки
// и выключен ТаймерПИН,"и" "&&" (digitalRead(timer) == HIGH)
// включаем нужный нам pin, digitalWrite(L13, HIGH);
if (results.value == 0xE13DDA28 || results.value == 0xF7283C77 && (digitalRead(timer) == HIGH) )digitalWrite(L13, HIGH);
if (results.value == 0xAD586662 || results.value == 0x757FB4DF && (digitalRead(timer) == HIGH) )digitalWrite(L2, HIGH);
if (results.value == 0x273009C4 || results.value == 0xB33B4597 && (digitalRead(timer) == HIGH) )digitalWrite(L3, HIGH);
if (results.value == 0xF5999288 || results.value == 0x3C03E507 && (digitalRead(timer) == HIGH) )digitalWrite(L4, HIGH);
if (results.value == 0x731A3E02 || results.value == 0xE705551F && (digitalRead(timer) == HIGH) )digitalWrite(L5, HIGH);
if (results.value == 0x2C452C6C || results.value == 0xA4A58EC7 && (digitalRead(timer) == HIGH) )digitalWrite(L6, HIGH);
if (results.value == 0xB9F56762 || results.value == 0xE2E45F7F && (digitalRead(timer) == HIGH) )digitalWrite(L7, HIGH);
irrecv.resume();
}
}
правильно, поздравляю,
теперь двигайтесь далее )
что там у Вас по плану?
Проводил эксперимент
Пульт от ТВ Самсунг
E13DDA28 1
AD586662 2
273009C4 3
F5999288 4
731A3E02 5
2C452C6C 6
B9F56762 0
5F12E8C4 +каналы
189D7928 -каналы
68733A46 +громкость
83B19366 -громкость
Когда нажимаю кнопоку моего пульта на выходе ардуино загорается светодиод.
Нажимаю еще раз ,на ту же кнопку - светодиод тухнет.
Считаю, что это работа - с фиксацией.
вы проверили сами свой код?
что происходит с вашими аутами при нажатии кнопок пульта?
GE_NE, привет.
vvr имел в виду сначала вывести на экран ваши коды от пульта. т.е. как их видит ваша ардуино.
надеюсь откликнется кто на отсурсе сидит.
есть тут несколько деятелей что заказы принимают , им отпишитесь.
успеха.
Люди ... отзовитесь. Помогите за деньги. Не уже ли сложная задача ?
vvr А, по командам, прописанным в скетче, нельзя увидеть,показать, объяснить ? Причем здесь коды кнопок пульта ?
ни у кого нет вашего пульта
попробуйте и отпишитесь
подключите светодиоды и всё будет понятно.
или в сериал выводите состояния этих аутов
Подскажите, пожалуйста, знатоки. Может мне подойдет вот этот пример ?Или чего надо добавить ?
Не совсем понял кнопки , кроме повер , включаются с удержанием ?
http://arrduinolab.blogspot.ru/2014/04/ … st_10.html
#include <IRremote.h> // https://github.com/shirriff/Arduino-IRremote
#define RECV_PIN 8 // IR приемник
#define OUT1 11 // выхода на мосфеты\реле
#define OUT2 12
#define OUT3 15
#define OUT4 14
#define POWER_KEY 0x40BF30CF // коды пульта ДУ
#define KEY1 0x40BF7887
#define KEY2 0x40BFF807
#define KEY3 0xC03FC03F
#define KEY4 0xC03F40BF
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
irrecv.enableIRIn();
pinMode(OUT1, OUTPUT);
pinMode(OUT2, OUTPUT);
pinMode(OUT3, OUTPUT);
pinMode(OUT4, OUTPUT);
}
void loop() {
if (irrecv.decode(&results)) {
if (results.value == KEY1) digitalWrite(OUT1, !digitalRead(OUT1));
else if (results.value == KEY2) digitalWrite(OUT2, !digitalRead(OUT2));
else if (results.value == KEY3) digitalWrite(OUT3, !digitalRead(OUT3));
else if (results.value == KEY4) digitalWrite(OUT4, !digitalRead(OUT4));
else if (results.value == POWER_KEY) {
if (digitalRead(OUT1) || digitalRead(OUT2) || digitalRead(OUT3) || digitalRead(OUT4)){
digitalWrite(OUT1, LOW);
digitalWrite(OUT2, LOW);
digitalWrite(OUT3, LOW);
digitalWrite(OUT4, LOW);
}
else {
digitalWrite(OUT1, HIGH);
digitalWrite(OUT2, HIGH);
digitalWrite(OUT3, HIGH);
digitalWrite(OUT4, HIGH);
}
}
irrecv.resume();
}
}
Alex Wels Вы не внимательно читали. Какие цифровые системы ? Потенциометр моторизированный ALPS.
А селектор входов на реле.
Бррр. Как то я например не приемлю в усилителях мощности цифровые системы. В уселках все таки аналог актуальнее и лучше звучит.
Кстати есть готовые решения по ДУ с аналогвовым резистором и реализованым к нему приводом от сервы.
уверен, Вы найдете исполнителя под эту задачу.
но если вдруг надумаете сами делать, напишите, в свободное время посмотрю и подправлю Ваш код.
иной вариант, для меня, на текущий момент неприемлем.