Протокол NEC ИК-приемник на Attiny88(digispark)

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

Добрый день форумчане! я новенький ! Такой вопрос написал программу по приему ИК сигнала ,все работает 

код пульта читает , но осталась одна нерешенная проблема вывод в порт кода не соответствует принятому...

короче:

ПРИМЕР ВЫВОДА СООБЩЕНИЯ В ПОРТ----------------------------------------------------------
 
 
                                   00000000111111111010100001010111  -принятый сигнал в бинарной системе 
                                   NEC_ADDR:     |    0 | HEX:     |  0 |
                                   NEC_ADDR_inv: |  255 | HEX:     | FF |
                                   NEC_code:     |  168 | HEX:     | A8 |
                                   NEC_ADDR_inv: |   87 | HEX:     | 57 |
                                   NEC_CODE_DEC: | 4294944855            -получившееся значение не соответствует принятому 4294944855=11111111111111111010100001010111
 
предлагаю код:
/*Скетч использует 5194 байт (76%) памяти устройства. 
Глобальные переменные используют 315 байт (61%) динамической памяти
*/
//                    ___________________________________________________________________
//                   |                            LOW      HIGH    {     COMMAND        }|
//                   |    Praambula     Pause     ADDR    ADDR-inv    DATA    DATA-inv   |
//                   |  |||||||||||||__________|_|_|_|_|__|_||_|_|__|_||_|_|__|_||_|_|__ |
//                   |    9ms           4.5ms  {       27ms      } {         27ms       }|
//                   |___________________________________________________________________|


//                    ___________________________________________________________________
//                   | {  Logical "1"                     }{ Logical "0"    }            |
//                   | |||||||||___________________________|||||||||_________||||||||    |                                                               |
//                   | { 560us }{       1690us            }{ 560us }{ 560us }            |
//                   | {            2.25ms                }{    1.12ms      }            |
//                   |___________________________________________________________________|

//ПРИМЕР ВЫВОДА СООБЩЕНИЯ В ПОРТ----------------------------------------------------------

/*
                                    ( 00000000111111111010100001010111 )
                                   NEC_ADDR:     |    0 | HEX:     |  0 |
                                   NEC_ADDR_inv: |  255 | HEX:     | FF |
                                   NEC_code:     |  168 | HEX:     | A8 |
                                   NEC_ADDR_inv: |   87 | HEX:     | 57 |
                                   NEC_CODE_DEC: | 4294944855
*/
//ПОДКЛЮЧАЕМ БИБЛИОТЕКИ-------------------------------------------------------------------
#include <SoftSerial.h>     /* последовательной передачи данных */
#include <TinyPinChange.h>  /*  библиотека для прерывания  */
SoftSerial mySerial(2, 3); // RX, TX //указываем пины Виртуального порта

//УКАЗЫВАЕМ ПЕРЕМЕННЫЕ--------------------------------------------------------------------
int irPin = 10; //ИК-детектор, подключенный к цифровому 10
const byte BIT_PER_BLOCK = 32;//порог бит максимум
int start_bit = 2200; //порог стартового бита (микросекунды)
int CODE[32]={};//создаем массив и храним полученные значения с ИК датчика максимум 32 бит

//УКАЗЫВАЕМ ПИНЫ, СКОРОСТЬ ВИРТ.ПОРТА----------------------------------------------------- 
void setup() {
  pinMode(irPin, INPUT);//пин к которому подключен ИК приемник
  mySerial.begin(4800);//скорость виртульного последовательного порта
}

//ОСНОВНОЙ КОД ПРОГРАММЫ-------------------------------------------------------------------------------------------------------------
void loop() {
int data[BIT_PER_BLOCK];
  int i;  
  
//ПРИЕМ И ОБРАБОТКА СИГНАЛА С ИК ПРИЕМНИКА-------------------------------------------------------------------------------------------- 
  while(pulseIn(irPin, HIGH) < start_bit); //подождите приема преамбулы (высокого уровня сигнала частотой 38 кГц и длительностью 9 мс)
 
  for(i = 0 ; i < BIT_PER_BLOCK ; i++) {   //Начните измерять биты, мне нужны только LOW импульсы
    data[i] = pulseIn(irPin, LOW);   
  }
  mySerial.print("( ");                    //передаем на печать виртуального порта         
  for(i = 0 ; i < BIT_PER_BLOCK ; i++) {
     if(data[i]>=600){                     //указываем что сигнал длительностью более 600мкс (560мкс) ,это "1"
     mySerial.print("1");                  //передаем на печать виртуального порта "1"
     CODE[i]= 1;}                          //храним принятое значение в масcиве CODE
     else{                                 //указываем что сигнал длительностью менее 600мкс (560мкс) ,это "0"
     mySerial.print("0");                  //передаем на печать виртуального порта "0"
      CODE[i]= 0;}                         //храним принятое значение в масcиве CODE
     }  
  mySerial.println(" )");                  //передаем на печать виртуального порта
  
 // mySerial.print(CODE[16]);mySerial.print(CODE[17]);mySerial.print(CODE[18]);mySerial.print(CODE[19]);
 // mySerial.print(CODE[20]);mySerial.print(CODE[21]);mySerial.print(CODE[22]);mySerial.print(CODE[23]);

//СОБИРАЕМ МАССИВ ИЗ ПРИНЯТЫХ ДАННЫХ И ПЕРЕДАЕМ В ПОРТ(mySerial)------------------------------------------------------------------------
byte ADDR =0b00000000;                     // ADDRESS LOW 
 if(CODE[0]==1){ADDR = ADDR | 0b10000000;} // ставим бит №1
 if(CODE[1]==1){ADDR = ADDR | 0b01000000;} // ставим бит №2
 if(CODE[2]==1){ADDR = ADDR | 0b00100000;} // ставим бит №3
 if(CODE[3]==1){ADDR = ADDR | 0b00010000;} // ставим бит №4
 if(CODE[4]==1){ADDR = ADDR | 0b00001000;} // ставим бит №5
 if(CODE[5]==1){ADDR = ADDR | 0b00000100;} // ставим бит №6
 if(CODE[6]==1){ADDR = ADDR | 0b00000010;} // ставим бит №7
 if(CODE[7]==1){ADDR = ADDR | 0b00000001;} // ставим бит №8
 mySerial.print("NEC_ADDR:     | ");       //передаем на печать виртуального порта
 mySerial.printf("%4d",ADDR);              //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(ADDR,HEX);                 //передаем на печать виртуального порта значение ADDR в HEX
 mySerial.println(" |");                   //передаем на печать виртуального порта

byte ADDR_inv =~ADDR;                      // инвертируем в ADDRESS HIGH
 mySerial.print("NEC_ADDR_inv: | ");       //передаем на печать виртуального порта
 mySerial.printf("%4d",ADDR_inv);          //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(ADDR_inv,HEX);             //передаем на печать виртуального порта значение ADDR_inv в HEX
  mySerial.println(" |");                  //передаем на печать виртуального порта
  
byte cod =0b00000000;                      // COMMAND LOW 
 if(CODE[16]==1){cod = cod | 0b10000000;}  // ставим бит №1
 if(CODE[17]==1){cod = cod | 0b01000000;}  // ставим бит №2
 if(CODE[18]==1){cod = cod | 0b00100000;}  // ставим бит №3
 if(CODE[19]==1){cod = cod | 0b00010000;}  // ставим бит №4
 if(CODE[20]==1){cod = cod | 0b00001000;}  // ставим бит №5
 if(CODE[21]==1){cod = cod | 0b00000100;}  // ставим бит №6
 if(CODE[22]==1){cod = cod | 0b00000010;}  // ставим бит №7
 if(CODE[23]==1){cod = cod | 0b00000001;}  // ставим бит №8
 mySerial.print("NEC_code:     | ");       //передаем на печать виртуального порта
 mySerial.printf("%4d",cod);               //передаем на печать виртуального порта (занимает 4-знака) 
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(cod,HEX);                  //передаем на печать виртуального порта значение cod в HEX
 mySerial.println(" |");                   //передаем на печать виртуального порта
 
 byte cod_inv =~cod;                       // инвертируем в COMMAND HIGH
 mySerial.print("NEC_ADDR_inv: | ");       //передаем на печать виртуального порта
 mySerial.printf("%4d",cod_inv);           //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(cod_inv,HEX);              //передаем на печать виртуального порта значение cod_inv в HEX 
 mySerial.println(" |");                  //передаем на печать виртуального порта

  //unsigned int result_ADDR = (ADDR << 8) | ADDR_inv;
  //unsigned int result_cod = (cod << 8) | cod_inv;
//ПРЕОБРАЗОВЫВАЕМ МАССИВ В ЕДИНОЕ 32BIT ЗНАЧЕНИЕ  
    char read1 = ADDR;                     //ADDRESS LOW 
    char read2 = ADDR_inv;                 //ADDRESS HIGH
    char read3 = cod;                      //COMMAND LOW
    char read4 = cod_inv;                  //COMMAND HIGH
    unsigned long testint = read1<<24|read2<<16|read3<<8|read4;//собираем одно 32-битное число 
  mySerial.print("NEC_CODE_DEC: | ");     //передаем на печать виртуального порта
  mySerial.println(testint,DEC);          //передаем на печать виртуального порта значение testint в DEC
 
}

Заранее спасибо Всем кто захочет или поможет)) 

Моя почта:zhoramotors@gmail.com

 

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

Так же облегчу задачу!  проблему вижу )))  как ее решить?

Komandir
Offline
Зарегистрирован: 18.08.2018

Вижу что просто первые 8 бит инвертировались

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

Да Komandir вижу не могу понять из за чего...старший байт вроде правильный

Komandir
Offline
Зарегистрирован: 18.08.2018

тип char в 119-122 не верен видимо

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

char хранит  вроде как правильное значение ,проверил остаётся только неправильное побитное сложение ,блин проснулся спортивный интерес! Помогайте!

Komandir
Offline
Зарегистрирован: 18.08.2018

char знаковый тип

как он сдвигается влево ХЗ

меняйте на byte

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Komandir пишет:

char знаковый тип

как он сдвигается влево ХЗ

меняйте на byte

Вообще говоря, char в Си - тип с неопределенной "знаковостью", т.е. все отдается на усмотрение разработчика. 

Применительно Ардуино: для 8-разрядных контроллеров компилятор полагает char знаковым, а для 32-разрядных - беззнаковым.

Код ASCII - семибитный, поэтому в случае char никаких проблем с ним быть не может. Если же мы пытаемся использовать тип char для данных, у которых может быть установлен старший бит, то тем самым гарантированно нарываемся на неприятности.

Отсюда вывод: если используется старший разряд - никогда не пытайтесь

1. Анализировать char путем сравнения с 0.

2. Анализировать char путем сравнения с 127-128.

3. Производить арифметические действия.

4. Использовать операции, подразумевающие преобразование в int.

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

вот такая конструкция работает!!!  но правда онлайн компилятор 

/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <iostream>

using namespace std;

int main()
{
    
    //НАЧАЛЬНОЕ: 16753245 = Bin:  00000000 11111111 10100010 01011101
    int read1 = 0b00000000;                     //ADDRESS LOW 0
    int read2 = 0b11111111;                 //ADDRESS HIGH 1
    int read3 = 0b10100010;                      //COMMAND LOW
    int read4 = 0b01011101;                  //COMMAND HIGH
    char32_t testint = read1<<24|read2<<16|read3<<8|read4;//собираем одно 32-битное число 
    cout<<read1;cout<<"\n";
    cout<<read2;cout<<"\n";
    cout<<read3;cout<<"\n";
    cout<<read4;cout<<"\n";
    cout<<testint;cout<<"\n";
    //     ИТОГ: 116753245 = Bin:  00000000 11111111 10100010 01011101
    return 0;
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В названии темы фигурирует attiny, т.е. речь идет о 8-разрядном контроллере. Тогда почему переменным типа int присваиваются 32-разрядные значения?

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

andriano а, вот в чем секрет)) крылся ок спасибо

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

Исправил ошибки ,если  кому нужно выкладываю код.

/*Скетч использует 5314 байт (78%) памяти устройства. 
Глобальные переменные используют 351 байт (68%) динамической памяти
*/
//                    ___________________________________________________________________
//                   |                            LOW      HIGH    {     COMMAND        }|
//                   |    Praambula     Pause     ADDR    ADDR-inv    DATA    DATA-inv   |
//                   |  |||||||||||||__________|_|_|_|_|__|_||_|_|__|_||_|_|__|_||_|_|__ |
//                   |    9ms           4.5ms  {       27ms      } {         27ms       }|
//                   |___________________________________________________________________|


//                    ___________________________________________________________________
//                   | {  Logical "1"                     }{ Logical "0"    }            |
//                   | |||||||||___________________________|||||||||_________||||||||    |                                                               |
//                   | { 560us }{       1690us            }{ 560us }{ 560us }            |
//                   | {            2.25ms                }{    1.12ms      }            |
//                   |___________________________________________________________________|

//ПРИМЕР ВЫВОДА СООБЩЕНИЯ В ПОРТ----------------------------------------------------------

/*
                                  ( 00000000111111110001100011100111 )    <--Данные BIN
                                  NEC_ADDR:     |    0 | HEX:     |  0 |  <--Адрес
                                  NEC_INVERSE:  |  255 | HEX:     | FF |  <--инв.Адрес
                                  NEC_DATA:     |   24 | HEX:     | 18 |  <--Данные
                                  NEC_INVERSE:  |  231 | HEX:     | E7 |  <--инв.Данные
                                  NEC: Special for MP3                    <--Пульт от...

*/
//ПОДКЛЮЧАЕМ БИБЛИОТЕКИ-------------------------------------------------------------------
#include <SoftSerial.h>     /* последовательной передачи данных */
#include <TinyPinChange.h>  /*  библиотека для прерывания  */
SoftSerial mySerial(2, 3);        // RX, TX //указываем пины Виртуального порта

//УКАЗЫВАЕМ ПЕРЕМЕННЫЕ--------------------------------------------------------------------
int irPin = 10;                   // ИК-детектор, подключенный к цифровому 10
int ledPin = 4;                   // пин для светодиода
const byte BIT_PER_BLOCK = 32;    // порог бит максимум
int start_bit = 2200;             // порог стартового бита (микросекунды)
int CODE[32]={};                  // создаем массив и храним полученные значения с ИК датчика максимум 32 бит

//УКАЗЫВАЕМ ПИНЫ, СКОРОСТЬ ВИРТ.ПОРТА----------------------------------------------------- 
void setup() {
  pinMode(irPin, INPUT);//пин к которому подключен ИК приемник
  pinMode(ledPin, OUTPUT);       // пин ledPin как выход светодиода
  digitalWrite(ledPin, LOW);     // выключаем светодиод
  mySerial.begin(4800);//скорость виртульного последовательного порта
}

//ОСНОВНОЙ КОД ПРОГРАММЫ-------------------------------------------------------------------------------------------------------------
void loop() {
int data[BIT_PER_BLOCK];
  int i;  
  
//ПРИЕМ И ОБРАБОТКА СИГНАЛА С ИК ПРИЕМНИКА-------------------------------------------------------------------------------------------- 
  while(pulseIn(irPin, HIGH) < start_bit); //подождите приема преамбулы (высокого уровня сигнала частотой 38 кГц и длительностью 9 мс)
 
  for(i = 0 ; i < BIT_PER_BLOCK ; i++) {   //Начните измерять биты, мне нужны только LOW импульсы
    data[i] = pulseIn(irPin, LOW);   
  }
  mySerial.print("( ");                    //передаем на печать виртуального порта         
  for(i = 0 ; i < BIT_PER_BLOCK ; i++) {
     if(data[i]>=600){                     //указываем что сигнал длительностью более 600мкс (560мкс) ,это "1"
     mySerial.print("1");                  //передаем на печать виртуального порта "1"
     CODE[i]= 1;}                          //храним принятое значение в масиве CODE
     else{                                 //указываем что сигнал длительностью менее 600мкс (560мкс) ,это "0"
     mySerial.print("0");                  //передаем на печать виртуального порта "0"
      CODE[i]= 0;}                         //храним принятое значение в масиве CODE
     }  
  mySerial.println(" )");                  //передаем на печать виртуального порта
  
 // mySerial.print(CODE[16]);mySerial.print(CODE[17]);mySerial.print(CODE[18]);mySerial.print(CODE[19]);
 // mySerial.print(CODE[20]);mySerial.print(CODE[21]);mySerial.print(CODE[22]);mySerial.print(CODE[23]);

//СОБИРАЕМ МАССИВ ИЗ ПРИНЯТЫХ ДАННЫХ И ПЕРЕДАЕМ В ПОРТ(mySerial)------------------------------------------------------------------------
byte ADDR =0b00000000;                     // ADDRESS LOW 
 if(CODE[0]==1){ADDR = ADDR | 0b10000000;} // ставим бит №1
 if(CODE[1]==1){ADDR = ADDR | 0b01000000;} // ставим бит №2
 if(CODE[2]==1){ADDR = ADDR | 0b00100000;} // ставим бит №3
 if(CODE[3]==1){ADDR = ADDR | 0b00010000;} // ставим бит №4
 if(CODE[4]==1){ADDR = ADDR | 0b00001000;} // ставим бит №5
 if(CODE[5]==1){ADDR = ADDR | 0b00000100;} // ставим бит №6
 if(CODE[6]==1){ADDR = ADDR | 0b00000010;} // ставим бит №7
 if(CODE[7]==1){ADDR = ADDR | 0b00000001;} // ставим бит №8
 mySerial.print("NEC_ADDR:     | ");       //передаем на печать виртуального порта
 mySerial.printf("%4d",ADDR);              //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(ADDR,HEX);                 //передаем на печать виртуального порта значение ADDR в HEX
 mySerial.println(" |");                   //передаем на печать виртуального порта

byte ADDR_inv =~ADDR;                      // инвертируем в ADDRESS HIGH
 mySerial.print("NEC_INVERSE:  | ");       //передаем на печать виртуального порта
 mySerial.printf("%4d",ADDR_inv);          //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(ADDR_inv,HEX);             //передаем на печать виртуального порта значение ADDR_inv в HEX
  mySerial.println(" |");                  //передаем на печать виртуального порта
  
byte cod =0b00000000;                      // COMMAND LOW 
 if(CODE[16]==1){cod = cod | 0b10000000;}  // ставим бит №1
 if(CODE[17]==1){cod = cod | 0b01000000;}  // ставим бит №2
 if(CODE[18]==1){cod = cod | 0b00100000;}  // ставим бит №3
 if(CODE[19]==1){cod = cod | 0b00010000;}  // ставим бит №4
 if(CODE[20]==1){cod = cod | 0b00001000;}  // ставим бит №5
 if(CODE[21]==1){cod = cod | 0b00000100;}  // ставим бит №6
 if(CODE[22]==1){cod = cod | 0b00000010;}  // ставим бит №7
 if(CODE[23]==1){cod = cod | 0b00000001;}  // ставим бит №8
 mySerial.print("NEC_DATA:     | ");       //передаем на печать виртуального порта
 mySerial.printf("%4d",cod);               //передаем на печать виртуального порта (занимает 4-знака) 
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(cod,HEX);                  //передаем на печать виртуального порта значение cod в HEX
 mySerial.println(" |");                   //передаем на печать виртуального порта
 
 byte cod_inv =~cod;                       // инвертируем в COMMAND HIGH
 mySerial.print("NEC_INVERSE:  | ");       //передаем на печать виртуального порта
 mySerial.printf("%4d",cod_inv);           //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(cod_inv,HEX);              //передаем на печать виртуального порта значение cod_inv в HEX 
 mySerial.println(" |");                   //передаем на печать виртуального порта
 
//ОПРЕДЕЛЯЕМ ПО АДРЕСУ ПРОИЗВОДИТЕЛЯ ПУЛЬТА-----------------------------------------------------------------
if(ADDR==0){mySerial.println("NEC: Special for MP3");}
if(ADDR==128){mySerial.println("NEC: MicroLab");}
if(ADDR==224){mySerial.println("NEC: Tel.SAMSUNG");}
if(pulseIn(irPin, HIGH)>=0){digitalWrite(ledPin, HIGH);     // зажигаем светодиод    
delay(1000);                                                // ждем секунду
digitalWrite(ledPin, LOW); }                                // выключаем светодиод
    
  
 
  
  
//ПРЕОБРАЗОВЫВАЕМ МАССИВ В ЕДИНОЕ 32BIT ЗНАЧЕНИЕ------------------------------------------------------------  
  //char read1 = ADDR;                     //ADDRESS LOW 
  // char read2 = ADDR_inv;                 //ADDRESS HIGH
  // char read3 = cod;                      //COMMAND LOW
  // char read4 = cod_inv;                  //COMMAND HIGH
  // unsigned long testint = read1<<24|read2<<16|read3<<8|read4;//собираем одно 32-битное число 
  }

 

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

одно изменение добавил кнопку и  рег. резистор для настройки границы 0 и 1 -так мне показалось лучше будет


/*Скетч использует 3934 байт (58%) памяти устройства. 
Глобальные переменные используют 355 байт (69%) динамической памяти
*/
//                    ___________________________________________________________________
//                   |                            LOW      HIGH    {     COMMAND        }|
//                   |    Praambula     Pause     ADDR    ADDR-inv    DATA    DATA-inv   |
//                   |  |||||||||||||__________|_|_|_|_|__|_||_|_|__|_||_|_|__|_||_|_|__ |
//                   |    9ms           4.5ms  {       27ms      } {         27ms       }|
//                   |___________________________________________________________________|


//                    ___________________________________________________________________
//                   | {  Logical "1"                     }{ Logical "0"    }            |
//                   | |||||||||___________________________|||||||||_________||||||||    |                                                               |
//                   | { 560us }{       1690us            }{ 560us }{ 560us }            |
//                   | {            2.25ms                }{    1.12ms      }            |
//                   |___________________________________________________________________|

//ПРИМЕР ВЫВОДА СООБЩЕНИЯ В ПОРТ----------------------------------------------------------

/*
                                  ( 00000000111111110001100011100111 )    <--Данные BIN
                                  NEC_ADDR:     |    0 | HEX:     |  0 |  <--Адрес
                                  NEC_INVERSE:  |  255 | HEX:     | FF |  <--инв. Адрес
                                  NEC_DATA:     |   24 | HEX:     | 18 |  <--Данные
                                  NEC_INVERSE:  |  231 | HEX:     | E7 |  <--инв. Данные
                                  NEC: Special for MP3                    <--Пульт от...

*/
//ПОДКЛЮЧАЕМ БИБЛИОТЕКИ-------------------------------------------------------------------
#include <EEPROM.h>         /* стандартная библиотека EEPROM ARDUINO */
#include <SoftSerial.h>     /* последовательной передачи данных */
#include <TinyPinChange.h>  /*  библиотека для прерывания  */
SoftSerial mySerial(2, 3);        // RX, TX //указываем пины Виртуального порта

//УКАЗЫВАЕМ ПЕРЕМЕННЫЕ--------------------------------------------------------------------
int irPin = 10;                   // ИК-детектор, подключенный к цифровому 10
int ledPin = 4;                   // пин для светодиода
const byte BIT_PER_BLOCK = 32;    // порог бит максимум
int start_bit = 2200;             // порог стартового бита (микросекунды)
int CODE[32]={};                  // создаем массив и храним полученные значения с ИК датчика максимум 32 бит
int analogInput = A0;             // номер пина потенциометра
int value = 0;                    // запоминаем значение пина потенциометра
const int NASTROYKA=5;            // кнопка ВКЛ режима НАСТРОЙКИ
int SostNASTR;                    // храним состояние НАСТРОЙКИ
int address = 10;                 // адрес первой ячейки для записи НАСТРОЕК

//УКАЗЫВАЕМ ПИНЫ, СКОРОСТЬ ВИРТ.ПОРТА----------------------------------------------------- 
void setup() {
  pinMode(NASTROYKA,INPUT_PULLUP);//пин НАСТРОЙКА, подтянуть + к пину
  pinMode(analogInput, INPUT);//пин аналогового значения c потенциометра
  pinMode(irPin, INPUT);//пин к которому подключен ИК приемник
  pinMode(ledPin, OUTPUT);       // пин ledPin как выход светодиода
  digitalWrite(ledPin, LOW);     // выключаем светодиод
  mySerial.begin(4800);//скорость виртуального последовательного порта
}

//ОСНОВНОЙ КОД ПРОГРАММЫ-------------------------------------------------------------------------------------------------------------
void loop() {
value = analogRead(analogInput);      //считывание аналогового значения c потенциометра
int data[BIT_PER_BLOCK];
  int i;  
//НАСТРОЙКА ГРАНЦ (0|1) --------------------------------------------------------------------------------------------------------------
SostNASTR = digitalRead(NASTROYKA);  // считываем значение с входа
if(SostNASTR==LOW){                  // пока кнопка ВКЛ 
mySerial.print("ADC: ");            //печатаем в порт
mySerial.println(value);           //печатаем в порт значение границ 0
EEPROM.update(address,value);
}

//ПРИЕМ И ОБРАБОТКА СИГНАЛА С ИК ПРИЕМНИКА-------------------------------------------------------------------------------------------- 
  while(pulseIn(irPin, HIGH) < start_bit); //подождите приема преамбулы (высокого уровня сигнала частотой 38 кГц и длительностью 9 мс)
 
  for(i = 0 ; i < BIT_PER_BLOCK ; i++) {   //Начните измерять биты, мне нужны только LOW импульсы
    data[i] = pulseIn(irPin, LOW);   
  }
  mySerial.print("( ");                    //передаем на печать виртуального порта         
  for(i = 0 ; i < BIT_PER_BLOCK ; i++) {
     int seveNASTR=EEPROM.read(address);
     if(data[i]>=seveNASTR*4){             //указываем что сигнал длительностью более 600мкс (560мкс) ,это "1"
     mySerial.print("1");                  //передаем на печать виртуального порта "1"
     digitalWrite(ledPin, HIGH);           // зажигаем светодиод  
     CODE[i]= 1;}                          //храним принятое значение в массиве CODE
     else{                                 //указываем что сигнал длительностью менее 600мкс (560мкс) ,это "0"
     mySerial.print("0");                  //передаем на печать виртуального порта "0"
     digitalWrite(ledPin, LOW);            // выключаем светодиод
      CODE[i]= 0;}                         //храним принятое значение в массиве CODE
     }  
  mySerial.println(" )");                  //передаем на печать виртуального порта
  digitalWrite(ledPin, LOW);               // выключаем светодиод

//СОБИРАЕМ МАССИВ ИЗ ПРИНЯТЫХ ДАННЫХ И ПЕРЕДАЕМ В ПОРТ(mySerial)------------------------------------------------------------------------
byte ADDR =0b00000000;                     // ADDRESS LOW 
 if(CODE[0]==1){ADDR = ADDR | 0b10000000;} // ставим бит №1
 if(CODE[1]==1){ADDR = ADDR | 0b01000000;} // ставим бит №2
 if(CODE[2]==1){ADDR = ADDR | 0b00100000;} // ставим бит №3
 if(CODE[3]==1){ADDR = ADDR | 0b00010000;} // ставим бит №4
 if(CODE[4]==1){ADDR = ADDR | 0b00001000;} // ставим бит №5
 if(CODE[5]==1){ADDR = ADDR | 0b00000100;} // ставим бит №6
 if(CODE[6]==1){ADDR = ADDR | 0b00000010;} // ставим бит №7
 if(CODE[7]==1){ADDR = ADDR | 0b00000001;} // ставим бит №8
 mySerial.print("NEC_ADDR:     | ");       //передаем на печать виртуального порта
 mySerial.print(ADDR);              //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(ADDR,HEX);                 //передаем на печать виртуального порта значение ADDR в HEX
 mySerial.println(" |");                   //передаем на печать виртуального порта

byte ADDR_inv =~ADDR;                      // инвертируем в ADDRESS HIGH
 mySerial.print("NEC_INVERSE:  | ");       //передаем на печать виртуального порта
 mySerial.print(ADDR_inv);          //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(ADDR_inv,HEX);             //передаем на печать виртуального порта значение ADDR_inv в HEX
  mySerial.println(" |");                  //передаем на печать виртуального порта
  
byte cod =0b00000000;                      // COMMAND LOW 
 if(CODE[16]==1){cod = cod | 0b10000000;}  // ставим бит №1
 if(CODE[17]==1){cod = cod | 0b01000000;}  // ставим бит №2
 if(CODE[18]==1){cod = cod | 0b00100000;}  // ставим бит №3
 if(CODE[19]==1){cod = cod | 0b00010000;}  // ставим бит №4
 if(CODE[20]==1){cod = cod | 0b00001000;}  // ставим бит №5
 if(CODE[21]==1){cod = cod | 0b00000100;}  // ставим бит №6
 if(CODE[22]==1){cod = cod | 0b00000010;}  // ставим бит №7
 if(CODE[23]==1){cod = cod | 0b00000001;}  // ставим бит №8
 mySerial.print("NEC_DATA:     | ");       //передаем на печать виртуального порта
 mySerial.print(cod);               //передаем на печать виртуального порта (занимает 4-знака) 
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(cod,HEX);                  //передаем на печать виртуального порта значение cod в HEX
 mySerial.println(" |");                   //передаем на печать виртуального порта
 
byte cod_inv =~cod;                       // инвертируем в COMMAND HIGH
 mySerial.print("NEC_INVERSE:  | ");       //передаем на печать виртуального порта
 mySerial.print(cod_inv);           //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(cod_inv,HEX);              //передаем на печать виртуального порта значение cod_inv в HEX 
 mySerial.println(" |");                   //передаем на печать виртуального порта
 
//ОПРЕДЕЛЯЕМ ПО АДРЕСУ ПРОИЗВОДИТЕЛЯ ПУЛЬТА-----------------------------------------------------------------
if(ADDR==0){mySerial.println("NEC: Special for MP3");}
if(ADDR==128){mySerial.println("NEC: MicroLab");}
if(ADDR==224){mySerial.println("NEC: Tel.SAMSUNG");}

//ЧИТАЕМ И ОТПРАВЛЯЕМ В ПОРТ ЗНАЧЕНИЯ EEPROM----------------------------------------------------------------
  //mySerial.print("EEPROM: ");
  //mySerial.println(EEPROM.read(address));
  
//ПРЕОБРАЗОВЫВАЕМ МАССИВ В ЕДИНОЕ 32BIT ЗНАЧЕНИЕ------------------------------------------------------------  
  //char read1 = ADDR;                     //ADDRESS LOW 
  // char read2 = ADDR_inv;                 //ADDRESS HIGH
  // char read3 = cod;                      //COMMAND LOW
  // char read4 = cod_inv;                  //COMMAND HIGH
  // unsigned long testint = read1<<24|read2<<16|read3<<8|read4;//собираем одно 32-битное число 
  
  }

 

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

кое что допилил ARDUINO --->PROCESSING ---> SEVE File JSON --->WEB Site

//ARDUINO--------------------------------------------------------------
/*Скетч использует 3564 байт (52%) памяти устройства. 
Глобальные переменные используют 227 байт (44%) динамической памяти
*/
//                    ___________________________________________________________________
//                   |                            LOW      HIGH    {     COMMAND        }|
//                   |    Praambula     Pause     ADDR    ADDR-inv    DATA    DATA-inv   |
//                   |  |||||||||||||__________|_|_|_|_|__|_||_|_|__|_||_|_|__|_||_|_|__ |
//                   |    9ms           4.5ms  {       27ms      } {         27ms       }|
//                   |___________________________________________________________________|


//                    ___________________________________________________________________
//                   | {  Logical "1"                     }{ Logical "0"    }            |
//                   | |||||||||___________________________|||||||||_________||||||||    |                                                               |
//                   | { 560us }{       1690us            }{ 560us }{ 560us }            |
//                   | {            2.25ms                }{    1.12ms      }            |
//                   |___________________________________________________________________|

//ПРИМЕР ВЫВОДА СООБЩЕНИЯ В ПОРТ----------------------------------------------------------

/*
                                  ( 00000000111111110001100011100111 )    <--Данные BIN
                                  NEC_ADDR:     |    0 | HEX:     |  0 |  <--Адрес
                                  NEC_INVERSE:  |  255 | HEX:     | FF |  <--инв. Адрес
                                  NEC_DATA:     |   24 | HEX:     | 18 |  <--Данные
                                  NEC_INVERSE:  |  231 | HEX:     | E7 |  <--инв. Данные
                                  NEC: Special for MP3                    <--Пульт от...

*/
//ПОДКЛЮЧАЕМ БИБЛИОТЕКИ-------------------------------------------------------------------
#include <EEPROM.h>         /* стандартная библиотека EEPROM ARDUINO */
#include <SoftSerial.h>     /* последовательной передачи данных */
#include <TinyPinChange.h>  /*  библиотека для прерывания  */
SoftSerial mySerial(2, 3);        // RX, TX //указываем пины Виртуального порта

//УКАЗЫВАЕМ ПЕРЕМЕННЫЕ--------------------------------------------------------------------
int irPin = 10;                   // ИК-детектор, подключенный к цифровому 10
int ledPin = 4;                   // пин для светодиода
const byte BIT_PER_BLOCK = 32;    // порог бит максимум
int start_bit = 2200;             // порог стартового бита (микросекунды)
int CODE[32]={};                  // создаем массив и храним полученные значения с ИК датчика максимум 32 бит
int analogInput = A0;             // номер пина потенциометра
int value = 0;                    // запоминаем значение пина потенциометра
const int NASTROYKA=5;            // кнопка ВКЛ режима НАСТРОЙКИ
int SostNASTR;                    // храним состояние НАСТРОЙКИ
int address = 10;                 // адрес первой ячейки для записи НАСТРОЕК

//УКАЗЫВАЕМ ПИНЫ, СКОРОСТЬ ВИРТ.ПОРТА----------------------------------------------------- 
void setup() {
  pinMode(NASTROYKA,INPUT_PULLUP);//пин НАСТРОЙКА, подтянуть + к пину
  pinMode(analogInput, INPUT);//пин аналогового значения c потенциометра
  pinMode(irPin, INPUT);//пин к которому подключен ИК приемник
  pinMode(ledPin, OUTPUT);       // пин ledPin как выход светодиода
  digitalWrite(ledPin, LOW);     // выключаем светодиод
  mySerial.begin(4800);//скорость виртуального последовательного порта
}

//ОСНОВНОЙ КОД ПРОГРАММЫ-------------------------------------------------------------------------------------------------------------
void loop() {
value = analogRead(analogInput);      //считывание аналогового значения c потенциометра
int data[BIT_PER_BLOCK];
  int i;  
//НАСТРОЙКА ГРАНЦ (0|1) --------------------------------------------------------------------------------------------------------------
SostNASTR = digitalRead(NASTROYKA);  // считываем значение с входа
if(SostNASTR==LOW){                  // пока кнопка ВКЛ 
//mySerial.print("ADC: ");            //печатаем в порт
//mySerial.println(value);           //печатаем в порт значение границ 0
EEPROM.update(address,value);
}

//ПРИЕМ И ОБРАБОТКА СИГНАЛА С ИК ПРИЕМНИКА-------------------------------------------------------------------------------------------- 
  while(pulseIn(irPin, HIGH) < start_bit); //подождите приема преамбулы (высокого уровня сигнала частотой 38 кГц и длительностью 9 мс)
 
  for(i = 0 ; i < BIT_PER_BLOCK ; i++) {   //Начните измерять биты, мне нужны только LOW импульсы
    data[i] = pulseIn(irPin, LOW);   
  }
  //mySerial.print("( ");                    //передаем на печать виртуального порта         
  for(i = 0 ; i < BIT_PER_BLOCK ; i++) {
     int seveNASTR=EEPROM.read(address);
     if(data[i]>=seveNASTR*4){             //указываем что сигнал длительностью более 600мкс (560мкс) ,это "1"
     //mySerial.print("1");                  //передаем на печать виртуального порта "1"
     digitalWrite(ledPin, HIGH);           // зажигаем светодиод  
     CODE[i]= 1;}                          //храним принятое значение в массиве CODE
     else{                                 //указываем что сигнал длительностью менее 600мкс (560мкс) ,это "0"
     //mySerial.print("0");                  //передаем на печать виртуального порта "0"
     digitalWrite(ledPin, LOW);            // выключаем светодиод
      CODE[i]= 0;}                         //храним принятое значение в массиве CODE
     }  
  //mySerial.println(" )");                  //передаем на печать виртуального порта
  digitalWrite(ledPin, LOW);               // выключаем светодиод

//СОБИРАЕМ МАССИВ ИЗ ПРИНЯТЫХ ДАННЫХ И ПЕРЕДАЕМ В ПОРТ(mySerial)------------------------------------------------------------------------
byte ADDR =0b00000000;                     // ADDRESS LOW 
 if(CODE[0]==1){ADDR = ADDR | 0b10000000;} // ставим бит №1
 if(CODE[1]==1){ADDR = ADDR | 0b01000000;} // ставим бит №2
 if(CODE[2]==1){ADDR = ADDR | 0b00100000;} // ставим бит №3
 if(CODE[3]==1){ADDR = ADDR | 0b00010000;} // ставим бит №4
 if(CODE[4]==1){ADDR = ADDR | 0b00001000;} // ставим бит №5
 if(CODE[5]==1){ADDR = ADDR | 0b00000100;} // ставим бит №6
 if(CODE[6]==1){ADDR = ADDR | 0b00000010;} // ставим бит №7
 if(CODE[7]==1){ADDR = ADDR | 0b00000001;} // ставим бит №8
 /*mySerial.print("NEC_ADDR:     | ");     //передаем на печать виртуального порта
 mySerial.print(ADDR);                     //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(ADDR,HEX);                 //передаем на печать виртуального порта значение ADDR в HEX
 mySerial.println(" |");                   //передаем на печать виртуального порта
*/
byte ADDR_inv =~ADDR;                      // инвертируем в ADDRESS HIGH
/*
 mySerial.print("NEC_INVERSE:  | ");       //передаем на печать виртуального порта
 mySerial.print(ADDR_inv);                 //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(ADDR_inv,HEX);             //передаем на печать виртуального порта значение ADDR_inv в HEX
  mySerial.println(" |");                  //передаем на печать виртуального порта
  */
byte cod =0b00000000;                      // COMMAND LOW 
 if(CODE[16]==1){cod = cod | 0b10000000;}  // ставим бит №1
 if(CODE[17]==1){cod = cod | 0b01000000;}  // ставим бит №2
 if(CODE[18]==1){cod = cod | 0b00100000;}  // ставим бит №3
 if(CODE[19]==1){cod = cod | 0b00010000;}  // ставим бит №4
 if(CODE[20]==1){cod = cod | 0b00001000;}  // ставим бит №5
 if(CODE[21]==1){cod = cod | 0b00000100;}  // ставим бит №6
 if(CODE[22]==1){cod = cod | 0b00000010;}  // ставим бит №7
 if(CODE[23]==1){cod = cod | 0b00000001;}  // ставим бит №8
 /*
 mySerial.print("NEC_DATA:     | ");       //передаем на печать виртуального порта
 mySerial.print(cod);                      //передаем на печать виртуального порта (занимает 4-знака) 
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(cod,HEX);                  //передаем на печать виртуального порта значение cod в HEX
 mySerial.println(" |");                   //передаем на печать виртуального порта
*/ 
byte cod_inv =~cod;                        // инвертируем в COMMAND HIGH
/*
 mySerial.print("NEC_INVERSE:  | ");       //передаем на печать виртуального порта
 mySerial.print(cod_inv);                  //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(cod_inv,HEX);              //передаем на печать виртуального порта значение cod_inv в HEX 
 mySerial.println(" |");                   //передаем на печать виртуального порта
 
//ОПРЕДЕЛЯЕМ ПО АДРЕСУ ПРОИЗВОДИТЕЛЯ ПУЛЬТА-----------------------------------------------------------------
if(ADDR==0){mySerial.println("NEC: Special for MP3");}
if(ADDR==128){mySerial.println("NEC: MicroLab");}
if(ADDR==224){mySerial.println("NEC: Tel.SAMSUNG");}

//ЧИТАЕМ И ОТПРАВЛЯЕМ В ПОРТ ЗНАЧЕНИЯ EEPROM----------------------------------------------------------------
  mySerial.print("EEPROM: ");
  mySerial.println(EEPROM.read(address));
*/
//ОТПРАВКА ЗНАЧЕНИЙ В ПРОЦЕССИНГ----------------------------------------------------------------------------
if(ADDR!=0){mySerial.print(ADDR,HEX);        }      else{mySerial.print("00");}
if(ADDR_inv!=0){mySerial.print(ADDR_inv,HEX);}      else{mySerial.print("00");}
if(cod!=0){mySerial.print(cod,HEX);          }      else{mySerial.print("00");}
if(cod_inv!=0){mySerial.print(cod_inv,HEX);  }      else{mySerial.print("00");}
 
//ПРЕОБРАЗОВЫВАЕМ МАССИВ В ЕДИНОЕ 32BIT ЗНАЧЕНИЕ------------------------------------------------------------  
  //char read1 = ADDR;                     //ADDRESS LOW 
  // char read2 = ADDR_inv;                 //ADDRESS HIGH
  // char read3 = cod;                      //COMMAND LOW
  // char read4 = cod_inv;                  //COMMAND HIGH
  // unsigned long testint = read1<<24|read2<<16|read3<<8|read4;//собираем одно 32-битное число 
  
  }

//ПРИМЕР ВЫВОДА ИНФОРМАЦИИ В ПОРТ-----------------------------------------------------------------------------
/*
---------------------------------------
Значение ADDR :     40
Значение ADDR_inv : BF
Значение DATA :     EA
Значение DATA_inv : 15
---------------------------------------

*/
//ARDUINO--------------------------------------------------------------

//PROCESSING-----------------------------------------------------------
import processing.serial.*;
JSONObject json;//используем объекты json
Serial myPort;  // The serial port
int jsonID;

void setup() {
  // List all the available serial ports
  printArray(Serial.list());
  // Open the port you are using at the rate you want:
  myPort = new Serial(this, Serial.list()[1], 4800);
  
  size(600, 250);//размер окна
  background(120);//цвет фона
 }

void draw() {
  
  // Expand array size to the number of bytes you expect
  byte[] inBuffer = new byte[7];
  while (myPort.available() > 0) {
    jsonID++;//увеличеваем счетчик ID
    inBuffer = myPort.readBytes();
    myPort.readBytes(inBuffer);
    if (inBuffer != null) {
      String myString = new String(inBuffer);
      String st = myString;
      String ADDR = "";
      String OSTATOC = "";
        for (int j = 0; j < st.length(); j++) {
            if ( j < st.length() /4) {
                ADDR += st.charAt(j);
            }else
                OSTATOC += st.charAt(j);
       }
                
//-------------------------------------------------------------------------                
        String st1 = OSTATOC;
        String ADDR_inv = "";
        String OSTATOC1 = "";
        for (int j = 0; j < st1.length(); j++) {
            if ( j < st1.length() /3) {
                ADDR_inv += st1.charAt(j);
            }else
                OSTATOC1 += st1.charAt(j);
       }
              
//-------------------------------------------------------------------------                
        String st2 = OSTATOC1;
        String DATA = "";
        String OSTATOC2 = "";
        for (int j = 0; j < st2.length(); j++) {
            if ( j < st2.length() /2) {
                DATA += st2.charAt(j);
            }else
                OSTATOC2 += st2.charAt(j);
       }       
                println("Значение ADDR :     " + ADDR);
                println("Значение ADDR_inv : " + ADDR_inv);
                println("Значение DATA :     " + DATA);
                println("Значение DATA_inv : " + OSTATOC2);
                println("---------------------------------------");
                 size(600, 250);//размер окна
background(20);//цвет фона
textSize(32);//размер текста
fill(0, 102, 153);//цвет стиль
text("ADDR: ", 20, 40);//текст-горизонт-вертикаль
fill(0, 202, 253);//цвет стиль
text(ADDR, 180, 40);//текст-горизонт-вертикаль
//------------------------------------------------------------------------- 
textSize(32);//размер текста
fill(0, 102, 153);//цвет стиль
text("ADDR_inv: ", 20, 80);//текст-горизонт-вертикаль
fill(0, 202, 253);//цвет стиль
text(ADDR_inv, 180, 80);//текст-горизонт-вертикаль
//------------------------------------------------------------------------- 
textSize(32);//размер текста
fill(0, 102, 153);//цвет стиль
text("DATA: ", 20, 120);//текст-горизонт-вертикаль
fill(0, 202, 253);//цвет стиль
text(DATA, 180, 120);//текст-горизонт-вертикаль
//------------------------------------------------------------------------- 
textSize(32);//размер текста
fill(0, 102, 153);//цвет стиль
text("DATA_inv: ", 20, 160);//текст-горизонт-вертикаль
fill(0, 202, 253);//цвет стиль
text(OSTATOC2, 180, 160);//текст-горизонт-вертикаль
//------------------------------------------------------------------------- 

//json-СОХРОНЯЕМ ДАННЫЕ В ФАЙЛ ПО АДРЕСУ-----------------------------------
  json = new JSONObject();//Создаем объект JSON
  
  json.setInt("id", jsonID);//указываем его id
  json.setString("Значение ADDR", ADDR);//записываем адреса
  json.setString("Значение ADDR_inv", ADDR_inv);//инвертные значения
  json.setString("Значение DATA", DATA);//записываем данные 
  json.setString("Значение DATA_inv", OSTATOC2);//инвертные значения

//saveJSONObject(json, "C:/Users/Georgy/Documents/Processing/new.json");
//Сохроняем в файл json по адресу
  saveJSONObject(json, "C:/inetpub/wwwroot/new.json");
//json-СОХРОНЯЕМ ДАННЫЕ В ФАЙЛ ПО АДРЕСУ-----------------------------------
 
    }
  }
}

//PROCESSING-----------------------------------------------------------

 

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

ПРИМЕР ВЫВОДА В ПОРТ

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

Вроде как и получилось выкладываю готовый вариант

//ARDUINO---------------------------------------------------------------------------------------------------------
/*Скетч использует 3564 байт (52%) памяти устройства. 
Глобальные переменные используют 227 байт (44%) динамической памяти
*/
//                    ___________________________________________________________________
//                   |                            LOW      HIGH    {     COMMAND        }|
//                   |    Praambula     Pause     ADDR    ADDR-inv    DATA    DATA-inv   |
//                   |  |||||||||||||__________|_|_|_|_|__|_||_|_|__|_||_|_|__|_||_|_|__ |
//                   |    9ms           4.5ms  {       27ms      } {         27ms       }|
//                   |___________________________________________________________________|


//                    ___________________________________________________________________
//                   | {  Logical "1"                     }{ Logical "0"    }            |
//                   | |||||||||___________________________|||||||||_________||||||||    |                                                               |
//                   | { 560us }{       1690us            }{ 560us }{ 560us }            |
//                   | {            2.25ms                }{    1.12ms      }            |
//                   |___________________________________________________________________|

//ПРИМЕР ВЫВОДА СООБЩЕНИЯ В ПОРТ----------------------------------------------------------------------------------

/*
                                  ( 00000000111111110001100011100111 )    <--Данные BIN
                                  NEC_ADDR:     |    0 | HEX:     |  0 |  <--Адрес
                                  NEC_INVERSE:  |  255 | HEX:     | FF |  <--инв. Адрес
                                  NEC_DATA:     |   24 | HEX:     | 18 |  <--Данные
                                  NEC_INVERSE:  |  231 | HEX:     | E7 |  <--инв. Данные
                                  NEC: Special for MP3                    <--Пульт от...

*/
//ПОДКЛЮЧАЕМ БИБЛИОТЕКИ--------------------------------------------------------------------------------------------
#include <EEPROM.h>         /* стандартная библиотека EEPROM ARDUINO */
#include <SoftSerial.h>     /* последовательной передачи данных */
#include <TinyPinChange.h>  /*  библиотека для прерывания  */
SoftSerial mySerial(2, 3);        // RX, TX //указываем пины Виртуального порта

//УКАЗЫВАЕМ ПЕРЕМЕННЫЕ---------------------------------------------------------------------------------------------
int irPin = 10;                   // ИК-детектор, подключенный к цифровому 10
int ledPin = 4;                   // пин для светодиода
const byte BIT_PER_BLOCK = 32;    // порог бит максимум
int start_bit = 2200;             // порог стартового бита (микросекунды)
int CODE[32]={};                  // создаем массив и храним полученные значения с ИК датчика максимум 32 бит
int analogInput = A0;             // номер пина потенциометра
int value = 0;                    // запоминаем значение пина потенциометра
const int NASTROYKA=5;            // кнопка ВКЛ режима НАСТРОЙКИ
int SostNASTR;                    // храним состояние НАСТРОЙКИ
int address = 10;                 // адрес первой ячейки для записи НАСТРОЕК

//УКАЗЫВАЕМ ПИНЫ, СКОРОСТЬ ВИРТ.ПОРТА------------------------------------------------------------------------------- 
void setup() {
  pinMode(NASTROYKA,INPUT_PULLUP);//пин НАСТРОЙКА, подтянуть + к пину
  pinMode(analogInput, INPUT);//пин аналогового значения c потенциометра
  pinMode(irPin, INPUT);//пин к которому подключен ИК приемник
  pinMode(ledPin, OUTPUT);       // пин ledPin как выход светодиода
  digitalWrite(ledPin, LOW);     // выключаем светодиод
  mySerial.begin(4800);//скорость виртуального последовательного порта
}

//ОСНОВНОЙ КОД ПРОГРАММЫ--------------------------------------------------------------------------------------------
void loop() {
value = analogRead(analogInput);      //считывание аналогового значения c потенциометра
int data[BIT_PER_BLOCK];
  int i;  
//НАСТРОЙКА ГРАНЦ (0|1) --------------------------------------------------------------------------------------------
SostNASTR = digitalRead(NASTROYKA);  // считываем значение с входа
if(SostNASTR==LOW){                  // пока кнопка ВКЛ 
//mySerial.print("ADC: ");            //печатаем в порт
//mySerial.println(value);           //печатаем в порт значение границ 0
EEPROM.update(address,value);
}

//ПРИЕМ И ОБРАБОТКА СИГНАЛА С ИК ПРИЕМНИКА---------------------------------------------------------------------------
  while(pulseIn(irPin, HIGH) < start_bit); //подождите приема преамбулы 
                                           //(высокого уровня сигнала частотой 38 кГц и длительностью 9 мс)
 
  for(i = 0 ; i < BIT_PER_BLOCK ; i++) {   //Начните измерять биты, мне нужны только LOW импульсы
    data[i] = pulseIn(irPin, LOW);   
  }
  //mySerial.print("( ");                    //передаем на печать виртуального порта         
  for(i = 0 ; i < BIT_PER_BLOCK ; i++) {
     int seveNASTR=EEPROM.read(address);
     if(data[i]>=seveNASTR*4){             //указываем что сигнал длительностью более 600мкс (560мкс) ,это "1"
     //mySerial.print("1");                  //передаем на печать виртуального порта "1"
     digitalWrite(ledPin, HIGH);           // зажигаем светодиод  
     CODE[i]= 1;}                          //храним принятое значение в массиве CODE
     else{                                 //указываем что сигнал длительностью менее 600мкс (560мкс) ,это "0"
     //mySerial.print("0");                  //передаем на печать виртуального порта "0"
     digitalWrite(ledPin, LOW);            // выключаем светодиод
      CODE[i]= 0;}                         //храним принятое значение в массиве CODE
     }  
  //mySerial.println(" )");                  //передаем на печать виртуального порта
  digitalWrite(ledPin, LOW);               // выключаем светодиод

//СОБИРАЕМ МАССИВ ИЗ ПРИНЯТЫХ ДАННЫХ И ПЕРЕДАЕМ В ПОРТ(mySerial)---------------------------------------------------
byte ADDR =0b00000000;                     // ADDRESS LOW 
 if(CODE[0]==1){ADDR = ADDR | 0b10000000;} // ставим бит №1
 if(CODE[1]==1){ADDR = ADDR | 0b01000000;} // ставим бит №2
 if(CODE[2]==1){ADDR = ADDR | 0b00100000;} // ставим бит №3
 if(CODE[3]==1){ADDR = ADDR | 0b00010000;} // ставим бит №4
 if(CODE[4]==1){ADDR = ADDR | 0b00001000;} // ставим бит №5
 if(CODE[5]==1){ADDR = ADDR | 0b00000100;} // ставим бит №6
 if(CODE[6]==1){ADDR = ADDR | 0b00000010;} // ставим бит №7
 if(CODE[7]==1){ADDR = ADDR | 0b00000001;} // ставим бит №8
 /*mySerial.print("NEC_ADDR:     | ");     //передаем на печать виртуального порта
 mySerial.print(ADDR);                     //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(ADDR,HEX);                 //передаем на печать виртуального порта значение ADDR в HEX
 mySerial.println(" |");                   //передаем на печать виртуального порта
*/
byte ADDR_inv =~ADDR;                      // инвертируем в ADDRESS HIGH
/*
 mySerial.print("NEC_INVERSE:  | ");       //передаем на печать виртуального порта
 mySerial.print(ADDR_inv);                 //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(ADDR_inv,HEX);             //передаем на печать виртуального порта значение ADDR_inv в HEX
  mySerial.println(" |");                  //передаем на печать виртуального порта
  */
byte cod =0b00000000;                      // COMMAND LOW 
 if(CODE[16]==1){cod = cod | 0b10000000;}  // ставим бит №1
 if(CODE[17]==1){cod = cod | 0b01000000;}  // ставим бит №2
 if(CODE[18]==1){cod = cod | 0b00100000;}  // ставим бит №3
 if(CODE[19]==1){cod = cod | 0b00010000;}  // ставим бит №4
 if(CODE[20]==1){cod = cod | 0b00001000;}  // ставим бит №5
 if(CODE[21]==1){cod = cod | 0b00000100;}  // ставим бит №6
 if(CODE[22]==1){cod = cod | 0b00000010;}  // ставим бит №7
 if(CODE[23]==1){cod = cod | 0b00000001;}  // ставим бит №8
 /*
 mySerial.print("NEC_DATA:     | ");       //передаем на печать виртуального порта
 mySerial.print(cod);                      //передаем на печать виртуального порта (занимает 4-знака) 
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(cod,HEX);                  //передаем на печать виртуального порта значение cod в HEX
 mySerial.println(" |");                   //передаем на печать виртуального порта
*/ 
byte cod_inv =~cod;                        // инвертируем в COMMAND HIGH
/*
 mySerial.print("NEC_INVERSE:  | ");       //передаем на печать виртуального порта
 mySerial.print(cod_inv);                  //передаем на печать виртуального порта (занимает 4-знака)
 mySerial.print(" | HEX:     | ");         //передаем на печать виртуального порта
 mySerial.print(cod_inv,HEX);              //передаем на печать виртуального порта значение cod_inv в HEX 
 mySerial.println(" |");                   //передаем на печать виртуального порта
 
//ОПРЕДЕЛЯЕМ ПО АДРЕСУ ПРОИЗВОДИТЕЛЯ ПУЛЬТА-------------------------------------------------------------------------
if(ADDR==0){mySerial.println("NEC: Special for MP3");}
if(ADDR==128){mySerial.println("NEC: MicroLab");}
if(ADDR==224){mySerial.println("NEC: Tel.SAMSUNG");}

//ЧИТАЕМ И ОТПРАВЛЯЕМ В ПОРТ ЗНАЧЕНИЯ EEPROM------------------------------------------------------------------------
  mySerial.print("EEPROM: ");
  mySerial.println(EEPROM.read(address));
*/
//ОТПРАВКА ЗНАЧЕНИЙ В ПРОЦЕССИНГ------------------------------------------------------------------------------------
if(ADDR!=0){mySerial.print(ADDR,HEX);        }      else{mySerial.print("00");}
if(ADDR_inv!=0){mySerial.print(ADDR_inv,HEX);}      else{mySerial.print("00");}
if(cod!=0){mySerial.print(cod,HEX);          }      else{mySerial.print("00");}
if(cod_inv!=0){mySerial.print(cod_inv,HEX);  }      else{mySerial.print("00");}
 
//ПРЕОБРАЗОВЫВАЕМ МАССИВ В ЕДИНОЕ 32BIT ЗНАЧЕНИЕ---------------------------------------------------------------------  
  //char read1 = ADDR;                     //ADDRESS LOW 
  // char read2 = ADDR_inv;                 //ADDRESS HIGH
  // char read3 = cod;                      //COMMAND LOW
  // char read4 = cod_inv;                  //COMMAND HIGH
  // unsigned long testint = read1<<24|read2<<16|read3<<8|read4;//собираем одно 32-битное число 
  
  }

//ПРИМЕР ВЫВОДА ИНФОРМАЦИИ В ПОРТ------------------------------------------------------------------------------------
/*
---------------------------------------
Значение ADDR :     40
Значение ADDR_inv : BF
Значение DATA :     EA
Значение DATA_inv : 15
---------------------------------------

*/
//ARDUINO-------------------------------------------------------------------------------------------------------------

//PROCESSING----------------------------------------------------------------------------------------------------------
import processing.serial.*;                                // Библиотека Serial
import controlP5.*;                                            //библиотека кнопки крутилки
JSONObject json;                                             // используем объекты json
ControlP5 cp5;
Serial myPort;                                                   // The serial port
int jsonID;                                                         // сохраняем значение счетчика ID
String NameJsonSeve = "Processing.json";     // указываем имя сохраняемого файла Json
String portName;
int speed = 4800;                                              //скорость порта
RadioButton r1, r2;  
//---------------------------------------------------------------------------------------------------------------------  
void setup() {
    cp5 = new ControlP5(this);
    cp5.setFont(createFont("Calibri", 8));           // сделаем шрифт побольше
// кнопки
    cp5.addButton("open").setPosition(80, 5).setSize(50, 16);
    cp5.addButton("close").setPosition(130, 5).setSize(50, 16).linebreak();
// выпадающий список
    cp5.addScrollableList("com")
    .setPosition(5, 5)
    .setSize(80, 100)
    .setBarHeight(16)//размер
    .setItemHeight(16)//размер
    .close()
    .addItems(Serial.list());                                  // добавляем список портов
  ;
// выпадающий список
 r1 = cp5.addRadioButton("Speed")
         .setPosition(2,240)                                   //позиция
         .setSize(40,10)                                         //размер
         .setColorForeground(color(120))
         .setColorActive(color(255))
         .setColorLabel(color(255))
         .setItemsPerRow(5)
         .setSpacingColumn(90)
         .addItem("4800",1)                                    // добавляем список портов
         .addItem("9600",2)
         .addItem("19200",3)
         .addItem("38400",4)
         .addItem("115200",5)
  ;
  for(Toggle t:r1.getItems()) {
       t.getCaptionLabel().setColorBackground(color(40,80));  //цвет фона текста скорости
       t.getCaptionLabel().getStyle().moveMargin(0,0,0,0);       //положение текста скорости
       t.getCaptionLabel().getStyle().movePadding(0,0,0,0);
       t.getCaptionLabel().getStyle().backgroundWidth = 25;    //длинна серых
       t.getCaptionLabel().getStyle().backgroundHeight = 20;
}

  size(600, 250);                                                                      // размер окна
//background(120);                                                                  // цвет фона
//background(052,190,200);                                                    // цвет фона RGB
//--------------------------------------------------------------------------------------------------------------------- 
PImage img;                                                   //использовать фото для фона
img = loadImage("fon.jpg");                            //указываем путь к файлу
background(img);                                           //применяем

//НАСТРОЙКА ПОРТА------------------------------------------------------------------------------------------------------ 
  printArray(Serial.list());                                 // Список всех доступных последовательных портов
  myPort = new Serial(this, Serial.list()[1], 4800);       // Откройте порт, который вы используете, с нужной скоростью:
  
//ИНФОРМАЦИЯ-----------------------------------------------------------------------------------------------------------
textSize(32);                                       //размер текста
fill(0, 202, 253);                                  //цвет стиль
text("ИНФОРМАЦИЯ", 190, 40);       //текст-горизонт-вертикаль
textSize(20);                                      //размер текста
fill(60, 30, 50);                                    //цвет стиль
text("Программа предназначена для определения кодов ИК пультов", 20, 60);            //текст-горизонт-вертикаль
text("Подключите ARDUINO c iR приемником и подайте сигнал", 20, 80);            //текст-горизонт-вертикаль
text("Код в формате HEX будет выведен на экран и сохранен JSON", 20, 100);           //текст-горизонт-вертикаль
text("По нижеуказанным адресам", 20, 120);           //текст-горизонт-вертикаль
//---------------------------------------------------------------------------------------------------------------------
  }
//---------------------------------------------------------------------------------------------------------------------
void com(int n) {
  portName = Serial.list()[n];
}
void open() {
  myPort = new Serial(this, portName, speed);
}
void close() {
  myPort.stop();
}
void Speed(int TheSpeed) {
 if(TheSpeed==1){speed=4800;}
  if(TheSpeed==2){speed=9600;}
   if(TheSpeed==3){speed=19200;}
    if(TheSpeed==4){speed=38400;}
     if(TheSpeed==5){speed=115200;}
     print(speed);
}
//---------------------------------------------------------------------------------------------------------------------
void draw() {
      byte[] inBuffer = new byte[7];                       // Увеличьте размер массива до ожидаемого количества байтов
  while (myPort.available() > 0) {                         // цикл
    jsonID++;                                              // увеличиваем счетчик ID
    inBuffer = myPort.readBytes();
    myPort.readBytes(inBuffer);                            // читаем буфер
    if (inBuffer != null) {                                // если буфер не равен Null
      String myString = new String(inBuffer);              // создаем новую строку для данных из буффера
      String st = myString;                                // строка
      String ADDR = "";                                    // пустая строка 
      String OSTATOC = "";
        for (int j = 0; j < st.length(); j++) {
            if ( j < st.length() /4) {                     // отнимаем 4 символа справа
                ADDR += st.charAt(j);
            }else
                OSTATOC += st.charAt(j);
       }
//---------------------------------------------------------------------------------------------------------------------         
        String st1 = OSTATOC;
        String ADDR_inv = "";
        String OSTATOC1 = "";
        for (int j = 0; j < st1.length(); j++) {
            if ( j < st1.length() /3) {                     // отнимаем 3 символа справа
                ADDR_inv += st1.charAt(j);
            }else
                OSTATOC1 += st1.charAt(j);
       }
//---------------------------------------------------------------------------------------------------------------------       
        String st2 = OSTATOC1;
        String DATA = "";
        String OSTATOC2 = "";
        for (int j = 0; j < st2.length(); j++) {
            if ( j < st2.length() /2) {                     // отнимаем 2 символа справа
                DATA += st2.charAt(j);
            }else
                OSTATOC2 += st2.charAt(j);
       }       
                println("Значение ADDR :     " + ADDR);     // печатаем в порт полученные значение
                println("Значение ADDR_inv : " + ADDR_inv); // печатаем в порт полученные значение
                println("Значение DATA :     " + DATA);     // печатаем в порт полученные значение
                println("Значение DATA_inv : " + OSTATOC2); // печатаем в порт полученные значение
                println("---------------------------------------");
//---------------------------------------------------------------------------------------------------------------------                
size(600, 250);                    //размер окна
background(20);                    //цвет фона
//ФОН РАБОЧЕГО СТОЛА--------------------------------------------------------------------------------------------------- 
PImage img;                                                //использовать фото для фона
img = loadImage("fon4.jpg");                                //указываем путь к файлу
background(img);                                           //пременяем

textSize(32);                      //размер текста
fill(0, 102, 153);                 //цвет стиль
text("ADDR: ", 20, 50);            //текст-горизонт-вертикаль
fill(0, 202, 253);                 //цвет стиль
text(ADDR, 180, 50);               //текст-горизонт-вертикаль
//---------------------------------------------------------------------------------------------------------------------
textSize(32);                      //размер текста
fill(0, 102, 153);                 //цвет стиль
text("ADDR_inv: ", 20, 80);        //текст-горизонт-вертикаль
fill(0, 202, 253);                 //цвет стиль
text(ADDR_inv, 180, 80);           //текст-горизонт-вертикаль
//---------------------------------------------------------------------------------------------------------------------
textSize(32);                      //размер текста
fill(0, 102, 153);                 //цвет стиль
text("DATA: ", 20, 130);           //текст-горизонт-вертикаль
fill(0, 202, 253);                 //цвет стиль
text(DATA, 180, 130);              //текст-горизонт-вертикаль
//---------------------------------------------------------------------------------------------------------------------
textSize(32);                      //размер текста
fill(0, 102, 153);                 //цвет стиль
text("DATA_inv: ", 20, 160);       //текст-горизонт-вертикаль
fill(0, 202, 253);                 //цвет стиль
text(OSTATOC2, 180, 160);          //текст-горизонт-вертикаль
//ПИШЕМ АДРЕС ГДЕ СОХРАНЕН JSON---------------------------------------------------------------------------------------- 
textSize(22);                      //размер текста
fill(0, 102, 153);                 //цвет стиль
text("Seves:         1.", 20, 190);//текст-горизонт-вертикаль
fill(0, 202, 253);//цвет стиль
text("C:/Users/Public/Documents/Processing.json", 180, 190);            //текст-горизонт-вертикаль
//--------------------------------------------------------------------------------------------------------------------- 
//ПИШЕМ АДРЕС ГДЕ СОХРАНЕН JSON---------------------------------------------------------------------------------------- 
textSize(22);                                                           //размер текста
fill(0, 102, 153);                                                      //цвет стиль
text("         2. ", 80, 210);                                                   //текст-горизонт-вертикаль
fill(0, 202, 253);                                                      //цвет стиль
text("C:/Users/Public/Documents/Processing.json", 180, 210);            //текст-горизонт-вертикаль
//--------------------------------------------------------------------------------------------------------------------- 
//ПИШЕМ NumberiD------------------------------------------------------------------------------------------------------- 
textSize(22);                                                           //размер текста
fill(0, 102, 153);                                                      //цвет стиль
text("Number iD: ", 20, 230);                                                   //текст-горизонт-вертикаль
fill(0, 202, 253);                                                      //цвет стиль
text(jsonID, 180, 230);                                                 //текст-горизонт-вертикаль
//--------------------------------------------------------------------------------------------------------------------- 
//json-СОХРОНЯЕМ ДАННЫЕ В ФАЙЛ ПО АДРЕСУ-------------------------------------------------------------------------------
  json = new JSONObject();                                              //Создаем объект JSON
  
  json.setInt("id", jsonID);                                            //указываем его id
  json.setString("Значение ADDR", ADDR);                                //записываем адреса
  json.setString("Значение ADDR_inv", ADDR_inv);                        //инвертное значения
  json.setString("Значение DATA", DATA);                                //записываем данные 
  json.setString("Значение DATA_inv", OSTATOC2);                        //инвертное значения

//saveJSONObject(json, "C:/Users/Georgy/Documents/Processing/new.json");
//Сохраняем в файл json по адресу
  saveJSONObject(json, "C:/inetpub/wwwroot/Processing.json");
  saveJSONObject(json, "C:/Users/Public/Documents/" + NameJsonSeve);    //сохраняем в Документы
  saveJSONObject(json, "C:/Users/Public/Downloads/" + NameJsonSeve);    //сохраняем в Downloads
//json-СОХРОНЯЕМ ДАННЫЕ В ФАЙЛ ПО АДРЕСУ------------------------------------------------------------------------------
 
    }
  }
}

//PROCESSING----------------------------------------------------------------------------------------------------------

 

georgy36arduino
Offline
Зарегистрирован: 27.11.2021

фото меню

строго не судите мой первый опыт в программировании да и дизайнер из меня ...