Pull to refresh

Comments 20

Так же эту задачу можно было решить по-другому, проще:
-используя логический анализатор за 10$ (мастхэв для хакера)
-используя микрофонный вход ПК и одну из многих программ, например
image
Можно ссылочку на инет-магазин с примером подходящего анализатора?
Для большинства задач начального и среднего уровня достаточно такого Saleae logic pro
Вдруг кому-то пригодится — найдено где-то в тырнетах и успешно используется,
для 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);
}

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;
}


gcc sendir.c -lm -o sendir -lwiringPi -lpthread
UFO landed and left these words here

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

Для записи и разбора данных использую AnalysIR. Не бесплатно, но и не дорого. Плюс она из коробки умеет работать с протоколами кондиционеров и скорее всего ваш там тоже есть. Мой китайский ОЕМ был, например.
UFO landed and left these words here
Разбирать работающее устройство совсем не улыбается, тем более там тончайшие пластинки теплообменника помять которые можно даже пальцем (а если торчат и порезаться можно). Да я видел что есть модели с wifi но не менять же кондиционер из-за этого к тому же wifi там несовместим с моим умным домом (majordomo). Такой wifi для меня почти бесполезен (хотя если бы был, можно было бы ревес инжинирить протокол обмена родного wifi с кондеем и потом вставить свой wifi модуль). Вообще то согласно схеме на моей плате должен быть разъем для wifi модуля, но без совместимого (родного) wifi модуля понять какие сигналы нужно отправлять нереально.
UFO landed and left these words here
разборка внутреннего блока сплит-системы это вообще-то нормальная ежесезонная регламентированная процедура! Каждый раз меняя сезон зима или лето — кондиционер надо разбирать, высушивать досуха, продувать компрессором или промывать мойкой высокого давления и собирать назад. потом идет чистка дренажных труб и наружного блока — аналогично! Вы удивитесь сколько навоза внутри между пластинками, на лопастях центробежного вентилятора и в дренаже скапливается. летом там все время влажно и как только начинается межсезонье и кондиционер глушится — там начинает расти плесень грибы и что только там не растет. потом зимой вы его на обогрев включите и это все разлетится по всей комнате. фильтры и прочие — работают ровно неделю… дада… каждую неделю надо доставать решетки и чистить. И не ведитесь что там модные покрытия и т.д. каждый сезон я беру ванночку детскую, ставлю на лестницу, кондер снимаю с креплений, разбираю весь пластик и мою! под давлением накрыв пленкой. поверьте… это надо видеть… только третья или 4 ванночка будет хоть немного не черной водой набрана! и это у меня приточная вентиляция с фильтром от камаза + угольник для приточной вентиляции за ней! окон не открываем т.к. не нужно.
Коды пульта подошли от haier. Круто жить с приточной вентиляцией! А почему после сезона не включить кондиционер на обогрев на час он сам себя высушит? Если пользоваться не очень часто даже за год ничего не нарастает. У родителей смотрел через 2 года эксплуатации (от случая к случаю) не нашел что там вообще можно почистить все и так чисто. У себя за год эпизодической эксплуатации тоже ничего не нашел.
у меня алегрия на грибок и пыль. если его включить сразу после холода на тепло я потом в этом помещении ещё пару дней не смогу находиться :) все высыхает отшелушивается и разлетается по всей комнате оседая на полу полках полостях и вообще везде где только можно — споры грибов есть даже на илюминаторах станции мир :) с наружной стороны!
Спасибо, сам бы я наверно до упора мучал алгоритмы CRC подбирая полиномы, стартовые значения и т.п.
Я бы подпаялся к кнопкам имеющегося пульта и подавал бы на них сигналы с ардуино.
Зачем делать так просто, когда можно сделать пальцы на ардуино, которые будут нажимать кнопки на пульте?

А тут, как видите и волки сыты и овцы целы. И ни один кондей не пострадал :-)

Добрый день!
Спасибо большое автору, очень помогла Ваша статья и программа разобрать команды для моего кондея Gree.
А вот практическое применение Вы сделали? Коды известны, а управлять получилось?
Only those users with full accounts are able to leave comments. Log in, please.