invandy / Oregon_NR

Arduino library for Oregon Scientific and Explore Scientific wireless sensors decode and simulate
Other
31 stars 21 forks source link

THN132N поддержка Transmit #18

Open karev-anton opened 3 years ago

karev-anton commented 3 years ago

Все таки не все метеостанции поддерживают THGN132 ( согласно таблице https://oregonscientific.ru/tablitsa-sovmestimosti-datchikov) и хотелось бы добавить поддержку THN132N если возможно. Собрал данные по своему датчику, но не удаётся посчитать контрольную сумму, могли бы помочь? А то есть две метеостанции, а датчики поломались, хотелось сделать простые на Arduino или вообще слать на них погоду с интернета, но никак не удаётся подобрать THN132 именно.

Во вложении примеры данных с датчика: oregon.txt Интервалы отправки у них аналогичные с THGN132.

karev-anton commented 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; }

invandy commented 3 years ago

Думаю вот так должно быть:

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

karev-anton commented 3 years ago

проверил, не сошлось всё равно, получается вот так, для одного примера: EC40 1158 3110 23 73 THN132N CHNL: 1 BAT: F ID: 15 TMP: 11.3C EC40 1158 3110 32 13 т.е. перевёрнутая чексумма, но это понятно как поправить, а вот CRS не сходится всё равно.

invandy commented 3 years ago

Да, действительно. Похоже вот так должно быть

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

karev-anton commented 3 years ago

сработало, проверил на 6 показаниях с отрицательными и положительными значениями, спасибо вам огромное!!! Чуть позже протестирую работу уже с учётом динамического изменения температуры и сделаю pull request, что бы сохранить в истории. Спасибо ещё раз!

mr-brune commented 3 months ago

do you have some update?

invandy commented 3 months ago

What kind of update do you mean?