Open karev-anton opened 3 years ago
или может подскажите как crs посчитать, checksum корректно считается, а вот с CRS никак побороть не могу, сейчас метод такой использую (6 байт - sum - считается корректно, 7 байт - crs - она вот некорректна считается):
void Oregon_TM::calculateAndSetChecksum132_S(void) { byte CCIT_POLY = 0x07; SendBuffer[6] = 0x00; SendBuffer[7] = 0x00; byte summ = 0x00; byte crc = 0xD6; byte cur_nible; for(int i = 0; i<6; i++) { cur_nible = (SendBuffer[i] & 0xF0) >> 4; summ += cur_nible;
cur_nible = SendBuffer[i] & 0x0F;
summ += cur_nible;
if (i !=2)
{
crc ^= cur_nible;
for(int j = 0; j < 4; j++)
if (crc & 0x80) crc = (crc << 1) ^ CCIT_POLY;
else crc <<= 1;
}
} SendBuffer[6] += (summ & 0x0F) <<4; SendBuffer[6] += (summ & 0xF0) >>4; SendBuffer[7] += crc & 0x0F; SendBuffer[7] += crc & 0xF0; }
Думаю вот так должно быть:
void Oregon_TM::calculateAndSetChecksum132_S(void)
{
byte CCIT_POLY = 0x07;
byte summ = 0x00;
byte crc = 0xD6;
byte cur_nible;
for(int i = 0; i < 6; i++)
{
cur_nible = (SendBuffer[i] & 0xF0) >> 4;
summ += cur_nible;
if (i !=3)
{
crc ^= cur_nible;
for(int j = 0; j < 4; j++)
if (crc & 0x80) crc = (crc << 1) ^ CCIT_POLY;
else crc <<= 1;
}
cur_nible = SendBuffer[i] & 0x0F;
summ += cur_nible;
if (i !=2)
{
crc ^= cur_nible;
for(int j = 0; j < 4; j++)
if (crc & 0x80) crc = (crc << 1) ^ CCIT_POLY;
else crc <<= 1;
}
}
SendBuffer[6] = summ;
SendBuffer[7] = crc;
}
проверил, не сошлось всё равно, получается вот так, для одного примера: EC40 1158 3110 23 73 THN132N CHNL: 1 BAT: F ID: 15 TMP: 11.3C EC40 1158 3110 32 13 т.е. перевёрнутая чексумма, но это понятно как поправить, а вот CRS не сходится всё равно.
Да, действительно. Похоже вот так должно быть
void Oregon_TM::calculateAndSetChecksum132S(void)
{
byte CCIT_POLY = 0x07;
byte summ = 0x00;
byte crc = 0xD6;
SendBuffer[6] = SendBuffer[7] = 0x00;
byte cur_nible;
for(int i = 0; i < 6; i++)
{
cur_nible = (SendBuffer[i] & 0xF0) >> 4;
summ += cur_nible;
if (i !=3)
{
crc ^= cur_nible;
for(int j = 0; j < 4; j++)
if (crc & 0x80) crc = (crc << 1) ^ CCIT_POLY;
else crc <<= 1;
}
cur_nible = SendBuffer[i] & 0x0F;
summ += cur_nible;
if (i !=2)
{
crc ^= cur_nible;
for(int j = 0; j < 4; j++)
if (crc & 0x80) crc = (crc << 1) ^ CCIT_POLY;
else crc <<= 1;
}
}
for(int j = 0; j < 4; j++)
if (crc & 0x80) crc = (crc << 1) ^ CCIT_POLY;
else crc <<= 1;
SendBuffer[6] += (summ & 0x0F) << 4; SendBuffer[6] += (summ & 0xF0) >> 4; SendBuffer[7] += (crc & 0x0F) << 4; SendBuffer[7] += (crc & 0xF0) >> 4; }
сработало, проверил на 6 показаниях с отрицательными и положительными значениями, спасибо вам огромное!!! Чуть позже протестирую работу уже с учётом динамического изменения температуры и сделаю pull request, что бы сохранить в истории. Спасибо ещё раз!
do you have some update?
What kind of update do you mean?
Все таки не все метеостанции поддерживают THGN132 ( согласно таблице https://oregonscientific.ru/tablitsa-sovmestimosti-datchikov) и хотелось бы добавить поддержку THN132N если возможно. Собрал данные по своему датчику, но не удаётся посчитать контрольную сумму, могли бы помочь? А то есть две метеостанции, а датчики поломались, хотелось сделать простые на Arduino или вообще слать на них погоду с интернета, но никак не удаётся подобрать THN132 именно.
Во вложении примеры данных с датчика: oregon.txt Интервалы отправки у них аналогичные с THGN132.