Заинтересовала статейка "Укрощение домофона Цифрал"
https://radiokot.ru/artfiles/6577/Собрал пробник для домофона из первой части статьи, не заработал. Начал разбираться, в схеме ошибка. Нижнее плечо делителя, минус дисплея и минус домофона должны подключаться с пину GND, а не к Vin.
Далее смутило "резисторы делителя напряжения на 12: 900кОм и 82кОм или 1,1Мом и 100кОм". Как по мне 900/82=10,98 больше смахивает на делитель на 11. Но не суть. Домофона на горизонте не было, скормил пробнику попавшуюся батарейку CR2032. Пробник намерял на ней 3229mV, это меня немного удивило, батарейка явно не из свежих была, померял мультиметром батарейку 2.95V. Делитель подбирать не хотелось, по этому везде где в коде использовался делитель,
Код:
tmp=((ADCx*Uref)+10)/(1023*20/12); //Делитель 1100к/100к в 12 раз (1023*20/12)
заменил 12 на 11. На этот раз измерив ту же батарейку прибор показал 2969mV, что гораздо ближе к истине. Поэтому или номиналы делителя в статье не верные или требуется корректировка прошивки.
Прописав свой ключ в пробник, побрел к домофону. Параметры с домофона пробник снял прекрасно, а вот на предполагаемую эмуляцию ключа домофон не отреагировал вообще никак. Как оказалось я сгоряча не обратил внимания на то что в статье описан Цифрал, а дома оказался Метаком.
Вроде как я понял и цифрал и метаком по таймингам соместимы, но различен формат. У цифрала имеем стартовое слово четырехразрядное, а у метакома - синхронизирующий бит и трехразрядное стартовое слово. В программе
Код:
//Код ключа по напряжению (с инверсией)
const unsigned char KOD[] PROGMEM = {1,1,1,0, 0,0,1,0, 0,0,0,1, 1,0,0,0, 1,0,0,0, 0,0,0,1, 1,0,0,0, 0,0,1,0, 0,1,0,0};
вот эта часть "{1,1,1,0," у нас и является стартовым словом определяющим принадлежность к цифралу. Что нужно сделать чтобы прикинуться метакомом? Оставить 3 разряда стартового слова? И что нужно скорректировать в выводе кода?
Код:
//Передача кода
while(1)
{ n=0;
while (n<36)
{ k=pgm_read_byte(&KOD[n]);
digitalWrite(R1_Line, HIGH); //0 на выходе транзисторного ключа
if (k==0) //Если передаётся 0 задержка 39,6мкс (<0,4Tп=107us)
{ delayMicroseconds(35);
}
else //Иначе, если 1 - задержка 79,2мкс (>0,6Tп=113us)
{ delayMicroseconds(75);
}
digitalWrite(R1_Line, LOW); //1 на выходе транзисторного ключа
if (k==0) //Если передаётся 0 задержка 67,2мкс (>0,6Tп=107us)
{ delayMicroseconds(62);
}
else //Иначе, если 1 - задержка 33,2мкс (<0,4Tп=113us)
{ delayMicroseconds(28);
}
n++;
}
}