Протокол NEC ИК-приемник на Attiny88(digispark)
- Войдите на сайт для отправки комментариев
Сб, 27/11/2021 - 12:48
Добрый день форумчане! я новенький ! Такой вопрос написал программу по приему ИК сигнала ,все работает
код пульта читает , но осталась одна нерешенная проблема вывод в порт кода не соответствует принятому...
короче:
ПРИМЕР ВЫВОДА СООБЩЕНИЯ В ПОРТ----------------------------------------------------------
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
Так же облегчу задачу! проблему вижу ))) как ее решить?
Вижу что просто первые 8 бит инвертировались
Да Komandir вижу не могу понять из за чего...старший байт вроде правильный
тип char в 119-122 не верен видимо
char хранит вроде как правильное значение ,проверил остаётся только неправильное побитное сложение ,блин проснулся спортивный интерес! Помогайте!
char знаковый тип
как он сдвигается влево ХЗ
меняйте на byte
char знаковый тип
как он сдвигается влево ХЗ
меняйте на byte
Применительно Ардуино: для 8-разрядных контроллеров компилятор полагает char знаковым, а для 32-разрядных - беззнаковым.
Отсюда вывод: если используется старший разряд - никогда не пытайтесь
1. Анализировать char путем сравнения с 0.
2. Анализировать char путем сравнения с 127-128.
3. Производить арифметические действия.
4. Использовать операции, подразумевающие преобразование в int.
вот такая конструкция работает!!! но правда онлайн компилятор
/****************************************************************************** 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; }В названии темы фигурирует attiny, т.е. речь идет о 8-разрядном контроллере. Тогда почему переменным типа int присваиваются 32-разрядные значения?
andriano а, вот в чем секрет)) крылся ок спасибо
Исправил ошибки ,если кому нужно выкладываю код.
/*Скетч использует 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-битное число }одно изменение добавил кнопку и рег. резистор для настройки границы 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-битное число }кое что допилил 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-----------------------------------------------------------ПРИМЕР ВЫВОДА В ПОРТ
Вроде как и получилось выкладываю готовый вариант
//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----------------------------------------------------------------------------------------------------------фото меню
строго не судите мой первый опыт в программировании да и дизайнер из меня ...