-
Notifications
You must be signed in to change notification settings - Fork 168
Description
Hi, I have an air conditioner that stores parameters and check sum in nibbles instead of bytes. Is it possible to realize its control using your library?
I have written a code that checks its work in your project, but how to make it control - I don't have enough knowledge.
Can you advise?
Thanks.
Nibbles:
0x182773800000008000804026
Bits:
0b000110000010011101110011100000000000000000000000000000001000000000000000100000000100000000100110
Header [1-16] = 0001100000100111 - constant
Temp [21, 17-20] = 00111 - The first four bytes are normal, but the high bit is in position 21 for some reason. Starts from 0(16).
Range 16-32 For Cool, 18-28 For Dry, 23 For Fan in Celsius
Mode [22-24] = 001 For Cool, 010 for Dry, 011 for Fan
Power [25] = 0/1
Swing [26] = 0/1
Empty [27-33] = 000000 - constant
CF [34-41] = 00000000 for Celsius, 10011010 for Fahrenheit
Sleep (Night Mode) [42] =0 for off, 1 for on
Empty [43-56] = Constant, always zero
Timer off[57-64] = Timer in Hours, starts from 128 to 164 - Equal 1-24hrs
Timer State [65] = 1 for on, 0 for off
Empty [74-80] = Always 0
Speed [81-84] = 1000 for Auto, 0001 For 1 Speed, 0010 For 2 Speed, 0100 For 3 Speed, (1 Speed For Dry mode const)
Empty [85-90] = Always 0
CheckSum [91-96] = Sum in Hex from 5 to 22 bytes (7+3+8+8+8+4) = 0x26
`#include <Arduino.h> // NEO ACM-14 remote
bool decodeNeoAcm14Remote(char* symbols, int bitCount, byte *bytes, int byteCount)
{
if (symbols[1] != 'H' || symbols[2] != 'h') { return false; }
if (byteCount != 24) { return false; }
if (bytes[0] == 0x18 && bytes[1] == 0xE4) {
Serial.println(F("Looks like a Neo ACM 14 protocol"));
// Power
if (symbols[27] == '0') {Serial.println(F("POWER OFF"));}
else if (symbols[27] == '1') {Serial.println(F("POWER ON"));}
// Operating mode
int acMode;
if (symbols[25] == '0' && symbols[26] == '1') { acMode = 1; }
else if (symbols[25] == '1' && symbols[26] == '0') { acMode = 2; }
else if (symbols[25] == '1' && symbols[26] == '1') { acMode = 3; }
else {
Serial.println(F("Mode: UNKNOWN"));
return false;
}
Serial.print(F("Mode: "));
Serial.println(acMode);
int acTemp;
if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '0' && symbols[21] == '0' && symbols[22] == '0') { acTemp = 16; }
else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '0' && symbols[21] == '0' && symbols[22] == '1') { acTemp = 17; }
else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '0' && symbols[21] == '1' && symbols[22] == '0') { acTemp = 18; }
else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '0' && symbols[21] == '1' && symbols[22] == '1') { acTemp = 19; }
else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '1' && symbols[21] == '0' && symbols[22] == '0') { acTemp = 20; }
else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '1' && symbols[21] == '0' && symbols[22] == '1') { acTemp = 21; }
else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '1' && symbols[21] == '1' && symbols[22] == '0') { acTemp = 22; }
else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '1' && symbols[21] == '1' && symbols[22] == '1') { acTemp = 23; }
else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '0' && symbols[21] == '0' && symbols[22] == '0') { acTemp = 24; }
else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '0' && symbols[21] == '0' && symbols[22] == '1') { acTemp = 25; }
else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '0' && symbols[21] == '1' && symbols[22] == '0') { acTemp = 26; }
else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '0' && symbols[21] == '1' && symbols[22] == '1') { acTemp = 27; }
else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '1' && symbols[21] == '0' && symbols[22] == '0') { acTemp = 28; }
else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '1' && symbols[21] == '0' && symbols[22] == '1') { acTemp = 29; }
else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '1' && symbols[21] == '1' && symbols[22] == '0') { acTemp = 30; }
else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '1' && symbols[21] == '1' && symbols[22] == '1') { acTemp = 31; }
else if (symbols[23] == '1' && symbols[19] == '0' && symbols[20] == '0' && symbols[21] == '0' && symbols[22] == '0') { acTemp = 32; }
else {
Serial.println(F("Temp: UNKNOWN"));
return false;
}
Serial.print(F("Temp: "));
Serial.println(acTemp);
int acSpeed;
if (symbols[83] == '1' && symbols[84] == '0' && symbols[85] == '0' && symbols[86] == '0') { acSpeed = 0; }
else if (symbols[83] == '0' && symbols[84] == '0' && symbols[85] == '0' && symbols[86] == '1') { acSpeed = 1; }
else if (symbols[83] == '0' && symbols[84] == '0' && symbols[85] == '1' && symbols[86] == '0') { acSpeed = 2; }
else if (symbols[83] == '0' && symbols[84] == '1' && symbols[85] == '0' && symbols[86] == '0') { acSpeed = 3; }
else {
Serial.println(F("Speed: UNKNOWN"));
return false;
}
Serial.print(F("Speed: "));
Serial.println(acSpeed);
if (symbols[28] == '0') {Serial.println(F("SWING OFF"));}
else if (symbols[28] == '1') {Serial.println(F("SWING ON"));}
char ACTimer[7];
ACTimer [0] = symbols[59];
ACTimer [1] = symbols[60];
ACTimer [2] = symbols[61];
ACTimer [3] = symbols[62];
ACTimer [4] = symbols[63];
ACTimer [5] = symbols[64];
ACTimer [6] = symbols[65];
ACTimer [7] = symbols[66];
Serial.print(int(ACTimer));
if (symbols[68] == '0') {Serial.println(F("TIMER OFF"));}
else if (symbols[68] == '1') {Serial.println(F("TIMER ON"));}
return true;
}
return false;
}
`