Comments 21
Так же эту задачу можно было решить по-другому, проще:
-используя логический анализатор за 10$ (мастхэв для хакера)
-используя микрофонный вход ПК и одну из многих программ, например
-используя логический анализатор за 10$ (мастхэв для хакера)
-используя микрофонный вход ПК и одну из многих программ, например
+3
Можно ссылочку на инет-магазин с примером подходящего анализатора?
0
Для большинства задач начального и среднего уровня достаточно такого Saleae logic pro
0
Вдруг кому-то пригодится — найдено где-то в тырнетах и успешно используется,
для 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
+1
UFO just landed and posted this here
Для записи и разбора данных использую AnalysIR. Не бесплатно, но и не дорого. Плюс она из коробки умеет работать с протоколами кондиционеров и скорее всего ваш там тоже есть. Мой китайский ОЕМ был, например.
-1
UFO just landed and posted this here
Разбирать работающее устройство совсем не улыбается, тем более там тончайшие пластинки теплообменника помять которые можно даже пальцем (а если торчат и порезаться можно). Да я видел что есть модели с wifi но не менять же кондиционер из-за этого к тому же wifi там несовместим с моим умным домом (majordomo). Такой wifi для меня почти бесполезен (хотя если бы был, можно было бы ревес инжинирить протокол обмена родного wifi с кондеем и потом вставить свой wifi модуль). Вообще то согласно схеме на моей плате должен быть разъем для wifi модуля, но без совместимого (родного) wifi модуля понять какие сигналы нужно отправлять нереально.
0
UFO just landed and posted this here
разборка внутреннего блока сплит-системы это вообще-то нормальная ежесезонная регламентированная процедура! Каждый раз меняя сезон зима или лето — кондиционер надо разбирать, высушивать досуха, продувать компрессором или промывать мойкой высокого давления и собирать назад. потом идет чистка дренажных труб и наружного блока — аналогично! Вы удивитесь сколько навоза внутри между пластинками, на лопастях центробежного вентилятора и в дренаже скапливается. летом там все время влажно и как только начинается межсезонье и кондиционер глушится — там начинает расти плесень грибы и что только там не растет. потом зимой вы его на обогрев включите и это все разлетится по всей комнате. фильтры и прочие — работают ровно неделю… дада… каждую неделю надо доставать решетки и чистить. И не ведитесь что там модные покрытия и т.д. каждый сезон я беру ванночку детскую, ставлю на лестницу, кондер снимаю с креплений, разбираю весь пластик и мою! под давлением накрыв пленкой. поверьте… это надо видеть… только третья или 4 ванночка будет хоть немного не черной водой набрана! и это у меня приточная вентиляция с фильтром от камаза + угольник для приточной вентиляции за ней! окон не открываем т.к. не нужно.
0
Коды пульта подошли от haier. Круто жить с приточной вентиляцией! А почему после сезона не включить кондиционер на обогрев на час он сам себя высушит? Если пользоваться не очень часто даже за год ничего не нарастает. У родителей смотрел через 2 года эксплуатации (от случая к случаю) не нашел что там вообще можно почистить все и так чисто. У себя за год эпизодической эксплуатации тоже ничего не нашел.
0
у меня алегрия на грибок и пыль. если его включить сразу после холода на тепло я потом в этом помещении ещё пару дней не смогу находиться :) все высыхает отшелушивается и разлетается по всей комнате оседая на полу полках полостях и вообще везде где только можно — споры грибов есть даже на илюминаторах станции мир :) с наружной стороны!
0
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
+1
Я бы подпаялся к кнопкам имеющегося пульта и подавал бы на них сигналы с ардуино.
0
WinLIRC, Lirc?
Saleae?
Saleae?
0
Добрый день!
Спасибо большое автору, очень помогла Ваша статья и программа разобрать команды для моего кондея Gree.
А вот практическое применение Вы сделали? Коды известны, а управлять получилось?
Спасибо большое автору, очень помогла Ваша статья и программа разобрать команды для моего кондея Gree.
А вот практическое применение Вы сделали? Коды известны, а управлять получилось?
0
Sign up to leave a comment.
Реверс инжиниринг протокола пульта от инверторного кондиционера Electrolux