Да, интересная китаёвинка!ivan-club писал(а):Добрый день,хочу подключить ваттметр hlw8032
Да, спасибо, понял.ivan-club писал(а):Да есть и с spi но она дороже ,у неё сложней обвязка больше выводов нет встроенного кварца и купить её проблемней .Я покупал у этого продовца hlw8012 и просил добавить в продажу всю линейку микросхем но он ответил что может поставить только hlw8032 и дал ссылку для заказа.
На си алгоритм декодирования данных с 8032 выглядит такivan-club писал(а): ↑06.12.2017{, 00:31}Добрый день,хочу подключить ваттметр hlw8032 к ардуино для измерения переменного тока и напряжения. Микросхема выдаёт в uart среднеквадратичные значения напряжения тока и активной мощности при этом в стоит 63 рубля на Али и 34 рубля на другом китайском сайте. Как мне из передаваемых ею данных извлечь 6,7,8байт(напряжение) и 12,13,14(ток) средствами flprog?
Код: Выделить всё
static float Vk=1.88;//расчетное значение сопротивления делителя U
static float Ik=0.25;//Значение, вычисленное из резистора I (4mR)
static uint32_t VParam=0;
static uint32_t VReg=0;
static float V=0;
static uint32_t IParam=0;
static uint32_t IReg=0;
static float I=0;
static uint32_t PParam=0;
static uint32_t PReg=0;
static float P=0;
static float PV=0;
static float PF=0;
static float PBuf[20];
static float PMin=0;
static uint8_t Windex=0;
void Widget::WLW8032_DecodProtocol(uint8_t Data)
{
static uint8_t status=0;
static uint8_t index=0;
static uint8_t sum=0;
static uint8_t tempBuf[24];
static uint8_t i;
switch (status)
{
case 0:
if(Data==0x55)
{
tempBuf[0]=Data;
status=1;
}
break;
case 1:
if(Data==0x5A)
{
tempBuf[1]=Data;
status=2;
}
else status=0;
index=2;
sum=0;
break;
case 2:
tempBuf[index]=Data;
index++;
if(index==24)
{
if(sum==Data)
{
//Tools_Printf("check sum OK\r\n");
if(tempBuf[20]&(0x03<<4))
{
VParam=(tempBuf[2]<<24)|(tempBuf[3]<<16)|tempBuf[4];
VReg=(tempBuf[5]<<24)|(tempBuf[6]<<16)|tempBuf[7];
IParam=(tempBuf[8]<<24)|(tempBuf[9]<<16)|tempBuf[10];
IReg=(tempBuf[11]<<24)|(tempBuf[12]<<16)|tempBuf[13];
PParam=(tempBuf[14]<<24)|(tempBuf[15]<<16)|tempBuf[16];
PReg=(tempBuf[17]<<24)|(tempBuf[18]<<16)|tempBuf[19];
V=(float)VParam/(float)VReg*Vk;
I=(float)IParam/(float)IReg*Ik;
P=(float)PParam/(float)PReg*Vk*Ik;
PV=V*I;
PF=P/PV;
//Tools_Printf("V:%f\tI:%f\tP:%f\tPV:%f\r\n",V,I,P,PV);
qDebug()<<"V:"<<V<<"I:"<<I<<"P:"<<P<<"PV:"<<PV<<"PF:"<<PF;
}
}
//else Tools_Printf("check sum Fail\r\n");
status=0;
}
else
{
sum+=Data;
}
break;
default:
break;
}
}