прошу помощи в доработке кода
- Войдите на сайт для отправки комментариев
Ср, 15/11/2017 - 14:21
имеиться код
#include <IRremote.h>
int RECV_PIN = A0;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
irrecv.enableIRIn();
Serial.begin(9600);
pinMode(2, OUTPUT); //Relay 1
pinMode(3, OUTPUT); //Relay 2
pinMode(4, OUTPUT); //Relay 3
pinMode(5, OUTPUT); //Relay 4
pinMode(6, OUTPUT); //Relay 5
pinMode(7, OUTPUT); //Relay 6
pinMode(8, OUTPUT); //Relay 7
pinMode(9, OUTPUT); //Relay 8
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume();
}
if (results.value == 0xFE807F) {//1
num1();
results.value = 0x00000000;
}
if (results.value == 0xFE40BF) {//2
num2();
results.value = 0x00000000;
}
if (results.value == 0xFEC03F) {//3
num3();
results.value = 0x00000000;
}
if (results.value == 0xFE20DF) {//4
num4();
results.value = 0x00000000;
}
if (results.value == 0xFEA05F) {//5
num5();
results.value = 0x00000000;
}
if (results.value == 0xFE609F) {//6
num6();
results.value = 0x00000000;
}
if (results.value == 0xFEE01F) {//7
num7();
results.value = 0x00000000;
if (results.value == 0xFE10EF) {//8
num8();
results.value = 0x00000000;
}
}
}
void num1() {
static int m = HIGH;
m = !m;
digitalWrite(2, m);
}
void num2() {
static int m = HIGH;
m = !m;
digitalWrite(3, m);
}
void num3() {
static int m = HIGH;
m = !m;
digitalWrite(4, m);
}
void num4() {
static int m = HIGH;
m = !m;
digitalWrite(5, m);
}
void num5() {
static int m = HIGH;
m = !m;
digitalWrite(6, m);
}
void num6() {
static int m = HIGH;
m = !m;
digitalWrite(7, m);
}
void num7() {
static int m = HIGH;
m = !m;
digitalWrite(8, m);
}
void num8() {
static int m = HIGH;
m = !m;
digitalWrite(9, m);
}
при посылки сигнала 1 с пульта работает реле №1 в скетче (num1)
задача: заставить скетч работать такпри получении сигнала с пульта включались только определенные реле а осталые отключались не важно в каком состоянии они были до получения сигнала
вот пои коды кнопок и какие реле надо включать:
FE48B7 (отключает все реле )
FE00FF (включает только 2, 3, 4, 7, 8)
FE807F (включает только 2, 3)
FE40BF (включает только 2, 4, 5, 6, 8)
FEC03F (включает только 2, 3, 4, 5, 6)
FE20DF (включает только 2, 3, 5, 7)
FEA05F (включает только 3, 4, 5, 6, 7)
FE609F (включает только 3, 4, 5, 6, 7, 8)
FEE01F (включает только 2, 3, 4)
FE10EF (включает только 2, 3, 4, 5, 6, 7, 8)
FE906F (включает только 2, 3, 4, 5, 6, 7)
прошу помощи кто напишет или допишит скетч как мне нужно, гарантирую маленькое вознаграждение=)
Вы ошиблись разделом. Вам сюда.
Не проверял, мне это не интересно
/**/ //--------------------------- // класс реле #define OFF_ HIGH /*выключенное сост реле*/ class Cl_Rel { protected: byte pin; public: /*конструктор*/ Cl_Rel(byte pin_): pin(pin_) {} /*инициализация*/ void init() { pinMode(pin, OUTPUT); //Relay 1 OFF(); } /*выкл*/ void OFF() { digitalWrite(pin, OFF_); } /*вкл*/ void ON() { digitalWrite(pin, !OFF_); } }; //-----Компановка---------------------- #include <IRremote.h> IRrecv irrecv(/*пин ИК*/A0); decode_results results; Cl_Rel Rel_1(/*пин*/2); Cl_Rel Rel_2(/*пин*/3); Cl_Rel Rel_3(/*пин*/4); Cl_Rel Rel_4(/*пин*/5); Cl_Rel Rel_5(/*пин*/6); Cl_Rel Rel_6(/*пин*/7); Cl_Rel Rel_7(/*пин*/8); Cl_Rel Rel_8(/*пин*/9); //------main-------------------------- void setup() { Serial.begin(9600); irrecv.enableIRIn(); Rel_1.init(); Rel_2.init(); Rel_3.init(); Rel_4.init(); Rel_5.init(); Rel_6.init(); Rel_7.init(); Rel_8.init(); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); } if (results.value == 0xFE807F) {//1 Rel_1.OFF(); Rel_2.OFF(); Rel_3.OFF(); Rel_4.OFF(); Rel_5.OFF(); Rel_6.OFF(); Rel_7.OFF(); Rel_8.OFF(); } else if (results.value == 0xFE40BF) {//2 Rel_2.ON(); Rel_3.ON(); Rel_4.ON(); Rel_7.ON(); Rel_8.ON(); } else if (results.value == 0xFEC03F) {//3 } else if (results.value == 0xFE20DF) {//4 } else if (results.value == 0xFEA05F) {//5 } else if (results.value == 0xFE609F) {//6 } else if (results.value == 0xFEE01F) {//7 } else if (results.value == 0xFE10EF) {//8 } } /**/Сдаётся мне, что классы этому скетчу никак не помогут. Он как не работал, так и не будет из-за одной небольшой ошибки, сделанной из-за бездумного копипастинга.
sadman, согласен. Мне просто облом искать там ошибки. А без классов я уже писать не могу. Так я еще и свои напихаю.
sadman, согласен. Мне просто облом искать там ошибки. А без классов я уже писать не могу. Так я еще и свои напихаю.
Ну раз уж взялись за ОО, почему бы не использовать все его преимущества? К примеру куда приятенее ваш код сделать так:
Cl_Rel* Rels[8]; //------main-------------------------- void setup() { Serial.begin(9600); irrecv.enableIRIn(); for (int i=0; i < 8; i++){ Rels[i] = new Cl_Rel(i+2); Rels[i]->init(); } } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); } if (results.value == 0xFE807F) {//1 for (int i=0; i < 8; i++) Rels[i]->OFF(); // ну и дальше по тексту...Кстати, при создании экземпляров в Setup - от метода init вообще надо избавляться и все делать в конструкторе
задача: заставить скетч работать такпри получении сигнала с пульта включались только определенные реле а осталые отключались не важно в каком состоянии они были до получения сигнала
вот пои коды кнопок и какие реле надо включать:
FE48B7 (отключает все реле )
Попробуйте так
#include <IRremote.h> int RECV_PIN = A0; IRrecv irrecv(RECV_PIN); decode_results results; uint32_t resultsTemp; void setup() { irrecv.enableIRIn(); Serial.begin(9600); DDRD = DDRD | 0b11111100; PORTD = PORTD & 0b00000011; DDRB = DDRB | 0b00000011; PORTB = PORTB & 0b11111100; } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); } if(resultsTemp != results.value) { resultsTemp = results.value; if(results.value == 0xFE48B7) {//1 (отключает все реле ) PORTD = PORTD & 0x03; PORTB &= ~(1<<0);// 0 } else if(results.value == 0xFE00FF) {//2 (включает только 2, 3, 4, 7, 8) PORTD = PORTD & 0x03; PORTD = PORTD | 0x9C; PORTB |= (1<<0);// 1 } else if(results.value == 0xFE807F) {//3 (включает только 2, 3) PORTD = PORTD & 0x03; PORTD = PORTD | 0x0C; PORTB &= ~(1<<0);// 0 } else if(results.value == 0xFE40BF) {//4 (включает только 2, 4, 5, 6, 8) PORTD = PORTD & 0x03; PORTD = PORTD | 0x74; PORTB |= 1<<0;// 1 } else if(results.value == 0xFEC03F) {//5 (включает только 2, 3, 4, 5, 6) PORTD = PORTD & 0x03; PORTD = PORTD | 0x78; PORTB &= ~(1<<0);// 0 } else if(results.value == 0xFE20DF) {//6 (включает только 2, 3, 5, 7) PORTD = PORTD & 0x03; PORTD = PORTD | 0xAC; PORTB &= ~(1<<0);// 0 } else if(results.value == 0xFEA05F) {//7 (включает только 3, 4, 5, 6, 7) PORTD = PORTD & 0x03; PORTD = PORTD | 0xF8; PORTB &= ~(1<<0);// 0 } else if(results.value == 0xFE609F) {//8 (включает только 3, 4, 5, 6, 7, 8) PORTD = PORTD & 0x03; PORTD = PORTD | 0xF8; PORTB |= 1<<0;// 1 } else if(results.value == 0xFEE01F) {//9 (включает только 2, 3, 4) PORTD = PORTD & 0x03; PORTD = PORTD | 0x1C; PORTB &= ~(1<<0);// 0 } else if(results.value == 0xFE10EF) {//10 (включает только 2, 3, 4, 5, 6, 7, 8) PORTD = PORTD & 0x03; PORTD = PORTD | 0xFC; PORTB |= 1<<0;// 1 } else if(results.value == 0xFE906F) {//11 (включает только 2, 3, 4, 5, 6, 7) PORTD = PORTD & 0x03; PORTD = PORTD | 0xFC; PORTB &= ~(1<<0);// 0 } } }Это Калапуций запретил или в наставлениях по кошерному коду написано? Если "баран в зеркале" такой идиот,
что вынесши работу с аппаратной частью в конструктор, создает экземпляр в описании, то кто мешает ему яйца клавиатурой защемить?
Или что-то другое имелось ввиду? Фраза "иницировать в конструкторе объекты" сильно отдает неграмотностью в программировании, не сказать еще больше.
К слову, сказать, не видел ни одного тру-эмбедера, который приветствовал бы использование ++.
Всем привет вот что добился с дугом, типично но работает)
#include <IRremote.h> int RECV_PIN = 10; //вход ИК приемника IRrecv irrecv(RECV_PIN); decode_results results; int ledpin2 = 2; int ledpin3 = 3; int ledpin4 = 4; int ledpin5 = 5; int ledpin6 = 6; int ledpin7 = 7; int ledpin8 = 8; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); digitalWrite(9, HIGH); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if (results.value==0xFF30CF) {//off digitalWrite(2,HIGH); digitalWrite(3,HIGH); digitalWrite(4,HIGH); digitalWrite(5,HIGH); digitalWrite(6,HIGH); digitalWrite(7,HIGH); digitalWrite(8,HIGH); } if (results.value==0xFFC03F) {//test digitalWrite(2,LOW); delay(400); digitalWrite(4,LOW); delay(400); digitalWrite(7,LOW); delay(400); digitalWrite(5,LOW); delay(400); digitalWrite(3,LOW); delay(400); digitalWrite(6,LOW); delay(400); digitalWrite(8,LOW); delay(400); digitalWrite(2,HIGH); delay(400); digitalWrite(4,HIGH); delay(400); digitalWrite(7,HIGH); delay(400); digitalWrite(5,HIGH); delay(400); digitalWrite(3,HIGH); delay(400); digitalWrite(6,HIGH); delay(400); digitalWrite(8,HIGH); delay(400); digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW); digitalWrite(8,LOW); delay(400); digitalWrite(2,HIGH); digitalWrite(3,HIGH); digitalWrite(4,HIGH); digitalWrite(5,HIGH); digitalWrite(6,HIGH); digitalWrite(7,HIGH); digitalWrite(8,HIGH); delay(400); digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW); digitalWrite(8,LOW); delay(400); digitalWrite(2,HIGH); digitalWrite(3,HIGH); digitalWrite(4,HIGH); digitalWrite(5,HIGH); digitalWrite(6,HIGH); digitalWrite(7,HIGH); digitalWrite(8,HIGH); delay(400); digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW); digitalWrite(8,LOW); delay(400); digitalWrite(2,HIGH); digitalWrite(3,HIGH); digitalWrite(4,HIGH); digitalWrite(5,HIGH); digitalWrite(6,HIGH); digitalWrite(7,HIGH); digitalWrite(8,HIGH); delay(400); } if (results.value==0xFF629D) {//0 digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,HIGH); digitalWrite(6,LOW); digitalWrite(7,LOW); digitalWrite(8,LOW); } if (results.value==0xFFB04F) {//1 digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,HIGH); digitalWrite(5,HIGH); digitalWrite(6,HIGH); digitalWrite(7,HIGH); digitalWrite(8,HIGH); } if (results.value==0xFF906F) {//2 digitalWrite(2,LOW); digitalWrite(3,HIGH); digitalWrite(4,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,HIGH); digitalWrite(8,LOW); } if (results.value==0xFFA05F) {//3 digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,HIGH); digitalWrite(8,HIGH); } if (results.value==0xFF807F) {//4 digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,HIGH); digitalWrite(5,LOW); digitalWrite(6,HIGH); digitalWrite(7,LOW); digitalWrite(8,HIGH); } if (results.value==0xFFF20D) {//5 digitalWrite(2,HIGH); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW); digitalWrite(8,HIGH); } if (results.value==0xFFD22D) {//6 digitalWrite(2,HIGH); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW); digitalWrite(8,LOW); } if (results.value==0xFFE21D) {//7 digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,HIGH); digitalWrite(6,HIGH); digitalWrite(7,HIGH); digitalWrite(8,HIGH); } if (results.value==0xFFC23D) {//8 digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW); digitalWrite(8,LOW); } if (results.value==0xFF52AD) {//9 digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW); digitalWrite(8,HIGH); } irrecv.resume(); // Receive the next value } }Шо, съели, плюсофилы?
Хоть упишитесь своими классами, а индусский код и меняемые в ходе игры правила всегда выставят вас фриками, которые на своем птичьем языке качество своего помёта обсуждают ))
Всем привет вот что добился с дугом, типично но работает)
Не могу смотреть, крофь из глаз. Нада напица.
Шо, съели, плюсофилы?
не совсем понимаю сути твоего восторга - ты расписал в ифах, что должно происходить при получении кода с пульта, и шо?
при чём плюсофилы и классы?
напиши тоже самое без ифов и класса IRremote, если желаешь доказать свою независимость от плюсов и классов.
Иди проспись, динозавор - ты уже всех авторов постов перепутал.
Иди проспись, динозавор - ты уже всех авторов постов перепутал.
как по мне - все тараканы на одно лицо.
Вот так тоже работать должно
#include <IRremote.h> int RECV_PIN = A0; IRrecv irrecv(RECV_PIN); decode_results results; uint32_t codes[] = { 0xFE48B7, 0xFE00FF, 0xFE807F, 0xFE40BF, 0xFEC03F, 0xFE20DF, 0xFEA05F, 0xFE609F, 0xFEE01F, 0xFE10EF, 0xFE906F }; uint8_t pin_states[] = { 0, B1100111, B11, B1011101, B11111, B101011, B111110, B1111110, B111, B111111, B11111 }; void setup() { irrecv.enableIRIn(); DDRD |= 0b11111100; PORTD |= ~0b00000011; DDRB |= 0b00000001; PORTB |= ~0b11111110; } void loop() { if (irrecv.decode(&results)) { for (int i = 0; i < 11; i++) if (codes[i] == results.value) { if (pin_states[i] & B01000000) PORTB &= B11111110; else PORTB |= B00000001; PORTD &= ~(pin_states[i] << 2 & B11); break; } irrecv.resume(); } }Дальше будем оптимизировать?
Да, можно сделать красиво и в array of struct завернуть codes[] и pin_states[].
Дальше будем оптимизировать?
На чистый С переходить? Без богомерзкого класса IRrecv?
На чистый С переходить? Без богомерзкого класса IRrecv?
сразу в пропасть.
А я рад человека, написал сам и главное что работает так как ему надо а остальное придет!!!
А я рад человека, написал сам и главное что работает так как ему надо а остальное придет!!!
Если, человек не имеет представление о циклах и массивах - ничего у него не придет. Меня поражает другое - подобные задачи сейчас являются обязательными на ГИА общеобразовательной школы. Т.е. предполагается, что каждый 9-ти классник должен мочь элементарную булеву алгебру и алгоритмы с массивами и циклами писать в одном из 3-х языков в зависимости от школы (Паскаль, Си, Питон). Про задачи на ЕГЭ я уже и молчу.
Откуда появляются такие коды, как у топикстартера?
Откуда появляются такие коды, как у топикстартера?
Ис мосху, мысль , она вариативна !
Т.е. предполагается, что каждый 9-ти классник должен мочь...
не должен мочь - у нас свободная деморкатическая страна, в отличии от, прости Аллах, Омерки и Гейропейского Союза геев.
каждый волен быть дыбилом. О_О
Да, можно сделать красиво и в array of struct завернуть codes[] и pin_states[].
Не.... Красивее pin_states засунуть старшим байтом в неиспользованый байт codes...
uint32_t states_and_codes[] = { 0xFE48B7, B1100111 << 24 | 0xFE00FF, B11 << 24 | 0xFE807F, B1011101 << 24 |0xFE40BF, B11111 << 24 | 0xFEC03F, B101011 << 24 | 0xFE20DF, B111110 << 24 | 0xFEA05F, B1111110 << 24 | 0xFE609F, B111 << 24 | 0xFEE01F, B111111 << 24 | 0xFE10EF, B11111 << 24 | 0xFE906F }; ..... for (int i = 0; i < 11; i++) if (states_and_codes[i] & 0xFFFFFF == results.value) { if (states_and_codes[i] & (B01000000 << 24)) PORTB &= B11111110; else PORTB |= B00000001; PORTD &= ~(states_and_codes[i] >> 22 & B11); break; }Но главного добиться не удалось - у программы остались какие-то мизерные признаки читаемости :(
Набросились, гнобители. Этот то хоть сам что то пытаеца, надо просто подсказать и направить. Хуже, когда думать и делать не хотят. Эй, форум из ларца, сделайте мне код. И плюшками набейте.
Набросились, гнобители. Этот то хоть сам что то пытаеца, надо просто подсказать и направить.
Не, ну так то оно - так, но задавать вопросы по программированию не владея алгоритмизацией даже на уровне незаконченной средней школы это тоже ни разу не радует.
Причем, он даже не попытался распросить по предаставленным ему вариантам, что тоже как бы намекает..
Но главного добиться не удалось - у программы остались какие-то мизерные признаки читаемости :(
Так есть же инструментарий!!!
Так есть же инструментарий!!!
Не, ну это Вы с козырей зашли.... Думаю, достаточно будет перевести все двочино/шеснадцетиричные действия в моем скетче в десятичные результаты и отладка программы станет требовать почти бесконечного времени, что уже не плохо и без брайнфака.
Хотя если без шуток, очень хороший пример, на мой взгляд, когда в оптимизации надо остановиться заренее.
Я бы даже в своем изначальном скетче использовал бы не работу с регистрами, а wire и на этом бы остановился.