Комментарии 21
Так же эту задачу можно было решить по-другому, проще:
-используя логический анализатор за 10$ (мастхэв для хакера)
-используя микрофонный вход ПК и одну из многих программ, например

-используя логический анализатор за 10$ (мастхэв для хакера)
-используя микрофонный вход ПК и одну из многих программ, например

Можно ссылочку на инет-магазин с примером подходящего анализатора?
Для большинства задач начального и среднего уровня достаточно такого Saleae logic pro
Вдруг кому-то пригодится — найдено где-то в тырнетах и успешно используется,
для Orange Pi PC:
gcc sendir.c -lm -o sendir -lwiringPi -lpthread
для Orange Pi PC:
scanir.c
/*scanir.c*/
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
int readable = 1;
int read_pin = 1;
int interval = 10;
int max_wait = 40000;
void signalCallBackHandler(int sig){
readable = 0;
}
double getMoment(){
struct timeval tv;
gettimeofday(&tv, NULL);
return ((double)(tv.tv_sec) * 1000000 + (double)(tv.tv_usec));
}
int main(int argc, char *argv[]){
int result;
FILE *fp;
char *fileName = «irdata.txt»;
if(argc >= 2){ fileName = argv[1]; }
if((fp = fopen(fileName, «w»)) == NULL){
printf(«can't open file: %s\n», fileName);
exit(1);
}
printf(«write file: %s\n», fileName);
if(signal(SIGINT, signalCallBackHandler) == SIG_ERR){
printf(«can't set signal\n»);
exit(1);
}
if(wiringPiSetup() == -1){
printf(«error wiringPi setup\n»);
exit(1);
}
if(argc >= 3){
read_pin = atoi(argv[2]);
}
pinMode(read_pin, INPUT);
printf(«scaning pin: %d (wiringpi)\n», read_pin);
if(argc >= 4){
max_wait = atoi(argv[3]) * 1000;
}
printf(«max keep time: %d(ms)\n», max_wait/1000);
printf(«Infrared LED scanning start.\n»);
printf(«Pressed Ctrl+C, this program will exit.\n»);
result = scan(fp);
fclose(fp);
if(result || !readable){
printf("\n\n!!! could not scanning. quit.\n\n");
} else {
printf("\nScanning has been done.\n\n");
}
return 0;
}
int scan(FILE *fp){
if(!digitalRead(read_pin)){ return 1; }
int on, off;
while( readable && digitalRead(read_pin) ){}
while( readable ){
on = getTime(0);
off = getTime(1);
fprintf(fp, "%6d %6d\n", on, off);
if(off > max_wait){ break; }
}
return 0;
}
int getTime(int status){
int count = 0;
int max = max_wait / interval;
double start, end;
start = getMoment();
while( digitalRead(read_pin) == status ){
delayMicroseconds(interval);
count++;
if(count > max){ break; }
}
end = getMoment();
return getInterval(start, end);
}
int getInterval(double t1, double t2){
return (int)(t2-t1);
}
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
int readable = 1;
int read_pin = 1;
int interval = 10;
int max_wait = 40000;
void signalCallBackHandler(int sig){
readable = 0;
}
double getMoment(){
struct timeval tv;
gettimeofday(&tv, NULL);
return ((double)(tv.tv_sec) * 1000000 + (double)(tv.tv_usec));
}
int main(int argc, char *argv[]){
int result;
FILE *fp;
char *fileName = «irdata.txt»;
if(argc >= 2){ fileName = argv[1]; }
if((fp = fopen(fileName, «w»)) == NULL){
printf(«can't open file: %s\n», fileName);
exit(1);
}
printf(«write file: %s\n», fileName);
if(signal(SIGINT, signalCallBackHandler) == SIG_ERR){
printf(«can't set signal\n»);
exit(1);
}
if(wiringPiSetup() == -1){
printf(«error wiringPi setup\n»);
exit(1);
}
if(argc >= 3){
read_pin = atoi(argv[2]);
}
pinMode(read_pin, INPUT);
printf(«scaning pin: %d (wiringpi)\n», read_pin);
if(argc >= 4){
max_wait = atoi(argv[3]) * 1000;
}
printf(«max keep time: %d(ms)\n», max_wait/1000);
printf(«Infrared LED scanning start.\n»);
printf(«Pressed Ctrl+C, this program will exit.\n»);
result = scan(fp);
fclose(fp);
if(result || !readable){
printf("\n\n!!! could not scanning. quit.\n\n");
} else {
printf("\nScanning has been done.\n\n");
}
return 0;
}
int scan(FILE *fp){
if(!digitalRead(read_pin)){ return 1; }
int on, off;
while( readable && digitalRead(read_pin) ){}
while( readable ){
on = getTime(0);
off = getTime(1);
fprintf(fp, "%6d %6d\n", on, off);
if(off > max_wait){ break; }
}
return 0;
}
int getTime(int status){
int count = 0;
int max = max_wait / interval;
double start, end;
start = getMoment();
while( digitalRead(read_pin) == status ){
delayMicroseconds(interval);
count++;
if(count > max){ break; }
}
end = getMoment();
return getInterval(start, end);
}
int getInterval(double t1, double t2){
return (int)(t2-t1);
}
sendir.c
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <math.h>
#include <unistd.h>
#define BUF_LEN 256
int write_pin = 0;
int Hz = 38; //KHz)
int duty_num = 1;
int duty_denomi = 3;
int unit = 26;
int duty_high = 9;
int duty_low = 17;
int repeat = 1;
void high(int on_time){
int i;
int count = on_time/unit;
for(i=0; i<count; i++)
{
digitalWrite(write_pin, 1);
delayMicroseconds(duty_high);
digitalWrite(write_pin, 0);
delayMicroseconds(duty_low);
}
}
void output(int on_time, int off_time){
high(on_time);
digitalWrite(write_pin, 0);
delayMicroseconds(off_time);
}
void readAndSend(FILE *fp){
char buf[BUF_LEN];
int i, j, length = 0;
int *on, *off;
while( fgets(buf, BUF_LEN, fp) != NULL){ length++; }
on = (int *)calloc(length, sizeof(int));
off = (int *)calloc(length, sizeof(int));
rewind(fp);
for(i=0; i<length; i++){
fscanf(fp,"%d %d", &on[i], &off[i]);
}
for(j=0; j<repeat; j++){
printf(«send data.\n»);
for(i=0; i<length; i++){
output(on[i], off[i]);
}
usleep(50000);
}
free(on);
free(off);
}
int main(int argc, char *argv[]){
FILE *fp;
char *fileName = «irdata.txt»;
if(argc >= 2){ fileName = argv[1]; }
if((fp = fopen(fileName, «r»)) == NULL){
printf(«can't open file: %s\n», fileName);
exit(1);
}
printf(«read file: %s\n», fileName);
if(wiringPiSetup() == -1){
printf(«error wiringPi setup\n»);
exit(1);
}
if(argc >= 3){
repeat = atoi(argv[2]);
}
if(argc >= 4){
write_pin = atoi(argv[3]);
}
pinMode(write_pin, OUTPUT);
printf(«output pin: %d (wiringpi)\n», write_pin);
if(argc >= 5){ Hz = atoi(argv[4]); }
if(argc >= 6){ duty_num = atoi(argv[5]); }
if(argc >= 7){ duty_denomi = atoi(argv[6]); }
unit = (1.0f / (Hz * 1000)) * 1000000;
duty_high = roundf(((float)unit / duty_denomi) * duty_num);
unit = (int)unit; //us
duty_low = unit — duty_high;
printf(«unit: %dms duty:%d-%d\n», unit, duty_high, duty_low);
printf(«send infrared signal.\n»);
readAndSend(fp);
printf("\ndone\n");
fclose(fp);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <math.h>
#include <unistd.h>
#define BUF_LEN 256
int write_pin = 0;
int Hz = 38; //KHz)
int duty_num = 1;
int duty_denomi = 3;
int unit = 26;
int duty_high = 9;
int duty_low = 17;
int repeat = 1;
void high(int on_time){
int i;
int count = on_time/unit;
for(i=0; i<count; i++)
{
digitalWrite(write_pin, 1);
delayMicroseconds(duty_high);
digitalWrite(write_pin, 0);
delayMicroseconds(duty_low);
}
}
void output(int on_time, int off_time){
high(on_time);
digitalWrite(write_pin, 0);
delayMicroseconds(off_time);
}
void readAndSend(FILE *fp){
char buf[BUF_LEN];
int i, j, length = 0;
int *on, *off;
while( fgets(buf, BUF_LEN, fp) != NULL){ length++; }
on = (int *)calloc(length, sizeof(int));
off = (int *)calloc(length, sizeof(int));
rewind(fp);
for(i=0; i<length; i++){
fscanf(fp,"%d %d", &on[i], &off[i]);
}
for(j=0; j<repeat; j++){
printf(«send data.\n»);
for(i=0; i<length; i++){
output(on[i], off[i]);
}
usleep(50000);
}
free(on);
free(off);
}
int main(int argc, char *argv[]){
FILE *fp;
char *fileName = «irdata.txt»;
if(argc >= 2){ fileName = argv[1]; }
if((fp = fopen(fileName, «r»)) == NULL){
printf(«can't open file: %s\n», fileName);
exit(1);
}
printf(«read file: %s\n», fileName);
if(wiringPiSetup() == -1){
printf(«error wiringPi setup\n»);
exit(1);
}
if(argc >= 3){
repeat = atoi(argv[2]);
}
if(argc >= 4){
write_pin = atoi(argv[3]);
}
pinMode(write_pin, OUTPUT);
printf(«output pin: %d (wiringpi)\n», write_pin);
if(argc >= 5){ Hz = atoi(argv[4]); }
if(argc >= 6){ duty_num = atoi(argv[5]); }
if(argc >= 7){ duty_denomi = atoi(argv[6]); }
unit = (1.0f / (Hz * 1000)) * 1000000;
duty_high = roundf(((float)unit / duty_denomi) * duty_num);
unit = (int)unit; //us
duty_low = unit — duty_high;
printf(«unit: %dms duty:%d-%d\n», unit, duty_high, duty_low);
printf(«send infrared signal.\n»);
readAndSend(fp);
printf("\ndone\n");
fclose(fp);
return 0;
}
gcc sendir.c -lm -o sendir -lwiringPi -lpthread
Для записи и разбора данных использую AnalysIR. Не бесплатно, но и не дорого. Плюс она из коробки умеет работать с протоколами кондиционеров и скорее всего ваш там тоже есть. Мой китайский ОЕМ был, например.
Разбирать работающее устройство совсем не улыбается, тем более там тончайшие пластинки теплообменника помять которые можно даже пальцем (а если торчат и порезаться можно). Да я видел что есть модели с wifi но не менять же кондиционер из-за этого к тому же wifi там несовместим с моим умным домом (majordomo). Такой wifi для меня почти бесполезен (хотя если бы был, можно было бы ревес инжинирить протокол обмена родного wifi с кондеем и потом вставить свой wifi модуль). Вообще то согласно схеме на моей плате должен быть разъем для wifi модуля, но без совместимого (родного) wifi модуля понять какие сигналы нужно отправлять нереально.
разборка внутреннего блока сплит-системы это вообще-то нормальная ежесезонная регламентированная процедура! Каждый раз меняя сезон зима или лето — кондиционер надо разбирать, высушивать досуха, продувать компрессором или промывать мойкой высокого давления и собирать назад. потом идет чистка дренажных труб и наружного блока — аналогично! Вы удивитесь сколько навоза внутри между пластинками, на лопастях центробежного вентилятора и в дренаже скапливается. летом там все время влажно и как только начинается межсезонье и кондиционер глушится — там начинает расти плесень грибы и что только там не растет. потом зимой вы его на обогрев включите и это все разлетится по всей комнате. фильтры и прочие — работают ровно неделю… дада… каждую неделю надо доставать решетки и чистить. И не ведитесь что там модные покрытия и т.д. каждый сезон я беру ванночку детскую, ставлю на лестницу, кондер снимаю с креплений, разбираю весь пластик и мою! под давлением накрыв пленкой. поверьте… это надо видеть… только третья или 4 ванночка будет хоть немного не черной водой набрана! и это у меня приточная вентиляция с фильтром от камаза + угольник для приточной вентиляции за ней! окон не открываем т.к. не нужно.
Коды пульта подошли от haier. Круто жить с приточной вентиляцией! А почему после сезона не включить кондиционер на обогрев на час он сам себя высушит? Если пользоваться не очень часто даже за год ничего не нарастает. У родителей смотрел через 2 года эксплуатации (от случая к случаю) не нашел что там вообще можно почистить все и так чисто. У себя за год эпизодической эксплуатации тоже ничего не нашел.
у меня алегрия на грибок и пыль. если его включить сразу после холода на тепло я потом в этом помещении ещё пару дней не смогу находиться :) все высыхает отшелушивается и разлетается по всей комнате оседая на полу полках полостях и вообще везде где только можно — споры грибов есть даже на илюминаторах станции мир :) с наружной стороны!
CRC это xor всех байт без адреса(83 06)
Например:83 06 60^73^00^00^00^00^96^04^00^00^00^80^1E=1F
Например:83 06 60^73^00^00^00^00^96^04^00^00^00^80^1E=1F
Я бы подпаялся к кнопкам имеющегося пульта и подавал бы на них сигналы с ардуино.
WinLIRC, Lirc?
Saleae?
Saleae?
Добрый день!
Спасибо большое автору, очень помогла Ваша статья и программа разобрать команды для моего кондея Gree.
А вот практическое применение Вы сделали? Коды известны, а управлять получилось?
Спасибо большое автору, очень помогла Ваша статья и программа разобрать команды для моего кондея Gree.
А вот практическое применение Вы сделали? Коды известны, а управлять получилось?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Реверс инжиниринг протокола пульта от инверторного кондиционера Electrolux