В детскую часы на 2812 8х8 и пульт

у меня этих досок … есть
жена выкидывает, а я прибираю.

Вот была бы вытяжка, то можно и паяльником продырявить.
Я собираюсь всё клеевым пистолетом склеить.
Вырежу брусочки плотного пенопласта для торцов=боковин=низа.

Код для ИК крутой. Я на нем все пульты могу распознавать, из тех до которых дотянулся.
Без всяких выборов филипс/япония/китай. HEX код любой кнопки выдаёт.
Убил тогда весь день пачки микросекунд разглядывая в логах сом порта ардуины…
Отдельно должен быть на форуме где-то.
Опять же всё из-за того, что библиотеки пультов у меня не заработали :frowning:

Они мало у кого с умными пикселями заработали :slight_smile:

1 лайк

переменные все понятны мне
r g b =red green blue цвета
tm тайминг
dgd = digit цифра
ch =char буква
cl =color цвет
ss =scren экран

абракадабра для временных
iz bn n i1 i2

Эт самое главное :slight_smile:
Ну лучше типа cvet, bukva, ekran, что б так сказать массы поняли.

Это сейчас. Попробуйте заглянуть в этот код через годик ))

Основная масса, как известно, в Китае.
Немножко поменьше - в Индии.
Как Вы думаете, они Вас поймут?
Не надо выпендриваться, когда есть всем понятные light, char, screen.

Я про отечественные массы… Ещё китайцев нам не хватало… к англосаксам.
…Хотя Вы правы, выглядит помесь своих и не своих слов не очень:

void setup() {
 /////////////////////
 epd.Init_4Gray();
  //марка и печать
 Dis_Cvet(2);
 DrawFilledRectangle(50,34 ,350 ,266 , 1);
 drawBitmap_4(80,64,marka_0,240,172);
 drawBitmap_1(220,140,pechat_0,160,160,0);
 Buf_Ris();
// epd.Clear();
////////////////
epd.Sleep();//отключение дисплея в сон
}


ТС!, кстати в плане монтажа - открыл для себя в этом году пористый двухсторонний скотч:

Ту же матрицу, да на стекло! Пока жена не прибила :slight_smile:

Чему бы там не заработать то, по прерыванию пульта сразу ленту отключаешь и всё.

ЗЫ: заказ у меня был на подобную херь, тоже пульт , тоже “умные диоды”, и переменные такие же, как у lilik’а (svet, yarkost и т.д.). Только вот проблема в том, что этот lilik был немцем. Судя по коду , я бы даже сказал - ФАШИСТОМ. :slight_smile:
Ну их нафиг такие наименования…

Попробовал его, чуть изменив. Конечно писец, а не точность. Веер случайных кодов на кнопке. Но если число нажатий для срабатывания не важно, то пойдёт :slight_smile:

// для ИК пульта приёмник без библиотеки
#define plus 4 //
#define minus 3 //
#define IK_PIN 2 //

byte n = 0;
word keycode = 0;
unsigned long tm = 0;
unsigned long last = 0;
void setup() {
//  
pinMode(IK_PIN, INPUT);  // ir recv
pinMode(plus,OUTPUT);//
digitalWrite(plus,HIGH);// плюс питания ик приёмника
pinMode(minus,OUTPUT);//
digitalWrite(minus,LOW);// минус питания ик приёмника
// 
attachInterrupt(0, irread, FALLING);
Serial.begin(9600);
}
void loop() {
keypressed();
delay(100);  
}
/////////////////////////////////////////
void irread() {
  tm = micros() - last;
  last = micros();
  n += 1;
  if (tm > 3000) {
    keycode = 0;
    n = 0;
    }
  if (n >8) {
    if (tm > 1500) {keycode += 1;}
    keycode = keycode << 1;
  }
}
//////////////////////////////////////////
void keypressed() {
  n = 0;
 if(keycode!=0){ Serial.println(keycode, HEX); keycode = 0;}  // печатаем код
}
//////////////////////////////////////////////

На форуме упоминание нашёл тут:

Пробовал менять числа в стоках 30,34,35. Как бы фиолетово пульту на это :slight_smile:

ууЪ

Так не заработает!

// для ИК пульта
byte n = 0;
word keycode = 0;
unsigned long tm = 0;
unsigned long last = 0;
void setup() {
  pinMode(2, INPUT);  // ir recv
  attachInterrupt(0, irread, FALLING);
  Serial.begin(9600);
}

void irread() { // ловим и считаем пачку импульсов
  tm = micros() - last;
  last = micros();
  n += 1;
  if (tm > 3000) {
    keycode = 0;
    n = 0;
  }
  if (n > 8) {
    if (tm > 1500) keycode += 1;
    keycode = keycode << 1;
  }
}

void loop()
{
  if (n == 32) {
    n = 0;
    Serial.println(keycode, HEX);
    // здесь ваш код в зависимости от keycode
    //  if (keycode==0xFF) then light(0);
  }

// !! delay  нельзя использовать = тупит

}


Подправил скетч, с делеями тоже вроде чётко работает.

// для ИК пульта приёмник без библиотеки
#define plus 4 //
#define minus 3 //
#define IK_PIN 2 //

byte n = 0;
word keycode = 0;
unsigned long tm = 0;
unsigned long last = 0;
void setup() {
//  
pinMode(IK_PIN, INPUT);  // ir recv
pinMode(plus,OUTPUT);//
digitalWrite(plus,HIGH);// плюс питания ик приёмника
pinMode(minus,OUTPUT);//
digitalWrite(minus,LOW);// минус питания ик приёмника
// 
attachInterrupt(0, irread, FALLING);
Serial.begin(9600);
}
void loop() {
keypressed();
delay(100);  
}
/////////////////////////////////////////
void irread() {
  tm = micros() - last;
  last = micros();
  n += 1;
  if (tm > 3000) {
    keycode = 0;
    n = 0;
    }
  if (n >8) {
    if (tm > 1500) {keycode += 1;}
    keycode = keycode << 1;
  }
}
//////////////////////////////////////////
void keypressed() {
 if(keycode!=0&&n==32){ Serial.println(keycode, HEX); keycode = 0; n = 0;}  // печатаем код
 }
//////////////////////////////////////////////

Именно достижение n значения 32 дает нам знать, что keycode прочитан полностью.
Пора анализировать и принимать решение.

А keycode!=0 уже в начале приема первого бита.

Значит просто:

if(n==32)

Дело не в именах переменных. Вы абсолютно не умеете пользоваться функциями.
Вот это не функция.

Главное правило - функция это замкнутый мир, все переменные которой должны быть либо локальными, либо передаваться как аргументы.
А у вас? Четыре из пяти переменных - глобальные. Кому нафик нужна эта функция? Она же никак не упрощает программу. Почему вы не заменили ее просто ее же кодом?

Не говоря уже о том, что в библиотеке Фастлед есть встроенный метод для присваивания пикселю ленты заданного цвета. Чем он вас не устроил? Всяко лучше вашего творчества.

Из- за того что вы не умеете писать функции, у вас код многократно дублирован. Функции setPixel и fonPixel - это фактически одно и тоже. То же самое про функции tt1 tt2. Далее - у вас же есть функция color_read(), зачем ещё одна - take_color?

В целом код раза в три длинней, чем мог быть и с кучей повторов. Такой код и выглядит, как помойка, и отлаживать его трудно.

// для ИК пульта приёмник без библиотеки
#define plus 4 //
#define minus 3 //
#define IK_PIN 2 //

volatile word keycode_ = 0;// переменная хранения кода кнопки

void setup() {
//  
pinMode(IK_PIN, INPUT);  // ir recv
pinMode(plus,OUTPUT);//
digitalWrite(plus,HIGH);// плюс питания ик приёмника
pinMode(minus,OUTPUT);//
digitalWrite(minus,LOW);// минус питания ик приёмника
// 
attachInterrupt(0, irread, FALLING);
Serial.begin(9600);
}
void loop() {
keypressed();
delay(1000);
}
/////////////////////////////////////////
void irread() {
volatile static byte n = 0;
volatile static word keycode = 0;
volatile static unsigned long tm = 0;
volatile static unsigned long last = 0;

  tm = micros() - last;
  last = micros();
  n += 1;
  if (tm > 3000) {
    keycode = 0;
    n = 0;
    }
  if (n >8&&n<=32) {
    if (tm > 1500) {keycode += 1;}
    keycode = keycode << 1;
  }
  if(n==32){keycode_ = keycode;keycode = 0; n = 0;}
}
//////////////////////////////////////////
void keypressed() {
 if(keycode_!=0){
  Serial.println(keycode_, HEX);// печатаем код кнопки 
  //код по обработке значений keycode_
  keycode_ = 0;
   }  
 }
//////////////////////////////////////////////

Ну вот я написал по интуиции, но функция в прерывании не может возвращать значение переменной, а должна! :slight_smile:
ТС, кстати этот вариант устойчив к делеям, даже в 1000 :slight_smile:

Вот и я о том же. Функцию надо и из прерывания вызывать и из программы, чтоб значение кода кнопки прочесть.
…кстати, а как её написать без прерывания?

Ужость!

А как надо написать?

Вы о чём? Что написать?