хрембрель релю
Подскажите пожалуйста, кто в теме. Мне нужно разробать несложное устройство, которое должно управляться с помощью ЭВМ. Этот девайс будет делать только одно - замыкать и размыкать релю. У меня программа АОН подключена к телефонной линии, и ловит весь звук с телефона. Поэтому радиотрубкой я уже управляю ВинАмпом. Выхожу на улицу, и, переключаю песни в в вине и регулирую громкость. Вот, я хочу с помощью трубки телеуправлять - выключать и включать свет, иные электроприборы. В крайнем случае, можно одной из релю отключить питание всего пилота, так сказать самоуничтожение. Например на улице я вижу, что дело труба - снимаю трубу, перевожу ее в тоновый набор, набираю код, АОН ловит эту тоновую посылку, правильным образом её интерпретирует (Я - это программа), и отключает питание у пилота - ВСЁ, выключается всё, компьютер, принтер, колонки. Вобщем ребята-железячники подскажите, как разработать этот хрембрель релю? СОМ-порта у меня нет, видимо придется через ЛПТ ? Мне только нужно замыкать и размыкать силовые релю. Дело в том, что проблема есть. Эта проблема - я так до сих пор и не понял как работыет транзистор, как его там включать, эммиттером, коллектыром или базой. Серьезно.
Ребят, посмотрите как просто управлять вином с помощью телефонной трубы
Может кто-то возьмет на вооружение, как управлять трубой компьютером.
Вот ваш кот:
//***************************************
//***************************************
//***************************************
//***************************************
//***************************************
//***************************************
namespace ToneFFT
{
const gmCount=7;
const DigitCount=12; //число цифр
const N=512; //не менять - иначе менять нужно массив gm[]
/* 0 1 2 3 4 5 6 */
static int gm[gmCount]={ 32, 36, 40, 44, 56, 62, 69}; //68 ???
// 697, 770, 852, 941, 1209, 1336, 1477
const double PI=3.1415926;
static double SIN[gmCount][N];
static double COS[gmCount][N];
struct GARMONYK
{
int a, //
n; //
};
//выделяет гармонику n из массива
static double fft(int n, int N, unsigned char *y)
{
double Asn=0, Acn=0;
for(int i=1; i<N; i++)
{
int Y=y;
Asn+=Y*SIN[n];
Acn+=Y*COS[n];
}
Asn=Asn*2/N;
Acn=Acn*2/N;
return sqrt(Asn*Asn+Acn*Acn);
}
static int digit[DigitCount][3]=
{
{ 3,5, '0' },
{ 0,4, '1' },
{ 0,5, '2' },
{ 0,6, '3' },
{ 1,4, '4' },
{ 1,5, '5' },
{ 1,6, '6' },
{ 2,4, '7' },
{ 2,5, '8' },
{ 2,6, '9' },
{ 3,4, '*' },
{ 3,6, '#' }
};
//инициализация таблиц синусов-косинусов
void DTFM_initSinCosTable()
{
for(int j=0; j<gmCount; j++)
for(int i=0; i<=N; i++)
{
double p=2*PI*gm[j]*i/N;
SIN[j]=sin(p);
COS[j]=cos(p);
}
}
//возвращает цифру тонового набора: 0,1, ...11,12
// (-1) - в случае не определения
//ToneDate - указатель на буфер (512 байт),
//содержащий запись
// на 11025 герц тонового сигнала
char ToneAnalyse(unsigned char *ToneDate)
{
GARMONYK garm[gmCount];
for(int i=0;i<gmCount;i++)
{
garm.a=int(fft(i,N,ToneDate));
garm.n=i;
}
//б®авЁа㥬
for(i=0;i<gmCount;i++)
for(int j=0;j<gmCount;j++)
{
if(garm[j].a<garm.a)
{
GARMONYK temp=garm;
garm=garm[j];
garm[j]=temp;
}
}
int found=0;
for(int j=0; j<DigitCount; j++)
{
int a=digit[j][0],
b=digit[j][1],
a2=garm[0].n,
b2=garm[1].n;
if ( (a == a2 && b==b2) || (a==b2 && b==a2) )
{
if (garm[0].a>13 && garm[1].a>12)
{
found=1;
return j;
}
}
}
//if (!found)
return -1;
}
};
//***************************************
//***************************************
//***************************************
//***************************************
//***************************************
//***************************************
{
//c помощью прямого Фурье выцепляем из звукового буфера ЦИФРУ
char tone=ToneFFT::ToneAnalyse(SwapBuffer);
if (tone>=0 && tone<=9)
{
STRING s="Command Winamp ";
s+=char(tone+'0');
List(s);
NumberToPcm(tone,-1,-1,FALSE); //FASLE- не генер.
//проигрывание одной цифры тоного режима
SoundPlay("output.pcm",13525,2, 0.5);
HWND hwndWinamp = FindWindow("Winamp v1.x",NULL);
if (tone==7)
{
SendMessage(hwndWinamp,WM_COMMAND,40044,0); List("WinAmp: prev track");
} //Previus track
if (tone==9) {SendMessage(hwndWinamp,WM_COMMAND,40048,0); List("WinAmp: next track");} //Next track
//назад на 5 сек
if (tone==4)
{
for(int i=0;i<5;i++)SendMessage(hwndWinamp,WM_COMMAND,40144,0);
List("WinAmp: назад");
}
//вперед на 5 сек
if (tone==6)
{
for(int i=0;i<5;i++)SendMessage(hwndWinamp,WM_COMMAND,40148,0);
List("WinAmp: вперед");
}
if (tone==2)
{
for(int i=0;i<5;i++)SendMessage(hwndWinamp,WM_COMMAND,40058,0);
List("WinAmp: VolumeUp");
}
if (tone==8)
{
for(int i=0;i<5i++)SendMessage(hwndWinamp,WM_COMMAND,40059,0);
List("WinAmp: VolumeDown");
}
}
}
Может кто-то возьмет на вооружение, как управлять трубой компьютером.
Вот ваш кот:
//***************************************
//***************************************
//***************************************
//***************************************
//***************************************
//***************************************
namespace ToneFFT
{
const gmCount=7;
const DigitCount=12; //число цифр
const N=512; //не менять - иначе менять нужно массив gm[]
/* 0 1 2 3 4 5 6 */
static int gm[gmCount]={ 32, 36, 40, 44, 56, 62, 69}; //68 ???
// 697, 770, 852, 941, 1209, 1336, 1477
const double PI=3.1415926;
static double SIN[gmCount][N];
static double COS[gmCount][N];
struct GARMONYK
{
int a, //
n; //
};
//выделяет гармонику n из массива
static double fft(int n, int N, unsigned char *y)
{
double Asn=0, Acn=0;
for(int i=1; i<N; i++)
{
int Y=y;
Asn+=Y*SIN[n];
Acn+=Y*COS[n];
}
Asn=Asn*2/N;
Acn=Acn*2/N;
return sqrt(Asn*Asn+Acn*Acn);
}
static int digit[DigitCount][3]=
{
{ 3,5, '0' },
{ 0,4, '1' },
{ 0,5, '2' },
{ 0,6, '3' },
{ 1,4, '4' },
{ 1,5, '5' },
{ 1,6, '6' },
{ 2,4, '7' },
{ 2,5, '8' },
{ 2,6, '9' },
{ 3,4, '*' },
{ 3,6, '#' }
};
//инициализация таблиц синусов-косинусов
void DTFM_initSinCosTable()
{
for(int j=0; j<gmCount; j++)
for(int i=0; i<=N; i++)
{
double p=2*PI*gm[j]*i/N;
SIN[j]=sin(p);
COS[j]=cos(p);
}
}
//возвращает цифру тонового набора: 0,1, ...11,12
// (-1) - в случае не определения
//ToneDate - указатель на буфер (512 байт),
//содержащий запись
// на 11025 герц тонового сигнала
char ToneAnalyse(unsigned char *ToneDate)
{
GARMONYK garm[gmCount];
for(int i=0;i<gmCount;i++)
{
garm.a=int(fft(i,N,ToneDate));
garm.n=i;
}
//б®авЁа㥬
for(i=0;i<gmCount;i++)
for(int j=0;j<gmCount;j++)
{
if(garm[j].a<garm.a)
{
GARMONYK temp=garm;
garm=garm[j];
garm[j]=temp;
}
}
int found=0;
for(int j=0; j<DigitCount; j++)
{
int a=digit[j][0],
b=digit[j][1],
a2=garm[0].n,
b2=garm[1].n;
if ( (a == a2 && b==b2) || (a==b2 && b==a2) )
{
if (garm[0].a>13 && garm[1].a>12)
{
found=1;
return j;
}
}
}
//if (!found)
return -1;
}
};
//***************************************
//***************************************
//***************************************
//***************************************
//***************************************
//***************************************
{
//c помощью прямого Фурье выцепляем из звукового буфера ЦИФРУ
char tone=ToneFFT::ToneAnalyse(SwapBuffer);
if (tone>=0 && tone<=9)
{
STRING s="Command Winamp ";
s+=char(tone+'0');
List(s);
NumberToPcm(tone,-1,-1,FALSE); //FASLE- не генер.
//проигрывание одной цифры тоного режима
SoundPlay("output.pcm",13525,2, 0.5);
HWND hwndWinamp = FindWindow("Winamp v1.x",NULL);
if (tone==7)
{
SendMessage(hwndWinamp,WM_COMMAND,40044,0); List("WinAmp: prev track");
} //Previus track
if (tone==9) {SendMessage(hwndWinamp,WM_COMMAND,40048,0); List("WinAmp: next track");} //Next track
//назад на 5 сек
if (tone==4)
{
for(int i=0;i<5;i++)SendMessage(hwndWinamp,WM_COMMAND,40144,0);
List("WinAmp: назад");
}
//вперед на 5 сек
if (tone==6)
{
for(int i=0;i<5;i++)SendMessage(hwndWinamp,WM_COMMAND,40148,0);
List("WinAmp: вперед");
}
if (tone==2)
{
for(int i=0;i<5;i++)SendMessage(hwndWinamp,WM_COMMAND,40058,0);
List("WinAmp: VolumeUp");
}
if (tone==8)
{
for(int i=0;i<5i++)SendMessage(hwndWinamp,WM_COMMAND,40059,0);
List("WinAmp: VolumeDown");
}
}
}
0: Wiz:
самое простое - управление через LPT порт. В проге меняешь состояние какого нибудь пина, а к нему через транзистор подключено реле.
самое простое - управление через LPT порт. В проге меняешь состояние какого нибудь пина, а к нему через транзистор подключено реле.
неужели никому не нужен это хрембрель ?
1. плохой кот. Нет корректировки по интервалам и потерям, нет буферизации, нет учета длительности. Реакцию надо делать в отдельном потоке. Без этого всего в общем случае будет большой процент ошибок - проверено.
2. управление. Покупаешь девайс и цепляешь к usb.
2. управление. Покупаешь девайс и цепляешь к usb.
Дэнс, ну это же ядро системы. При реализации это все учитывается естественно, это я как пример показал. При реализации все доводится до состоянии руля...
Большое спасибо за ссылку!
Дэнс извини...про компостацию моска...ты мне тоже помог..
Большое спасибо за ссылку!
Дэнс извини...про компостацию моска...ты мне тоже помог..
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость