IRremoteESP8266
ir_Samsung.h
Go to the documentation of this file.
1 // Copyright 2018 David Conran
9 
10 // Supports:
11 // Brand: Samsung, Model: UA55H6300 TV (SAMSUNG)
12 // Brand: Samsung, Model: BN59-01178B TV remote (SAMSUNG)
13 // Brand: Samsung, Model: DB63-03556X003 remote
14 // Brand: Samsung, Model: DB93-16761C remote
15 // Brand: Samsung, Model: IEC-R03 remote
16 // Brand: Samsung, Model: AK59-00167A Bluray remote (SAMSUNG36)
17 // Brand: Samsung, Model: AH59-02692E Soundbar remote (SAMSUNG36)
18 // Brand: Samsung, Model: HW-J551 Soundbar (SAMSUNG36)
19 // Brand: Samsung, Model: AR09FSSDAWKNFA A/C (SAMSUNG_AC)
20 // Brand: Samsung, Model: AR12KSFPEWQNET A/C (SAMSUNG_AC)
21 // Brand: Samsung, Model: AR12HSSDBWKNEU A/C (SAMSUNG_AC)
22 // Brand: Samsung, Model: AR12NXCXAWKXEU A/C (SAMSUNG_AC)
23 
24 #ifndef IR_SAMSUNG_H_
25 #define IR_SAMSUNG_H_
26 
27 #define __STDC_LIMIT_MACROS
28 #include <stdint.h>
29 #ifndef UNIT_TEST
30 #include <Arduino.h>
31 #endif
32 #include "IRremoteESP8266.h"
33 #include "IRsend.h"
34 #ifdef UNIT_TEST
35 #include "IRsend_test.h"
36 #endif
37 
38 // Constants
39 
40 // SamsungAc
41 // Byte[1]
42 // Checksum 0b11110000 ???
43 const uint8_t kSamsungAcPower1Offset = 5; // Mask 0b00100000
44 const uint8_t kSamsungAcQuiet1Offset = 4; // Mask 0b00010000
45 // Byte[5]
46 const uint8_t kSamsungAcQuiet5Offset = 5;
47 // Byte[6]
48 const uint8_t kSamsungAcPower6Offset = 4; // Mask 0b00110000
49 const uint8_t kSamsungAcPower6Size = 2; // Bits
50 // Byte[8]
51 // Checksum 0b11110000 ???
52 const uint8_t kSamsungAcPowerfulMask8 = 0b01010000;
53 // Byte[9]
54 const uint8_t kSamsungAcSwingOffset = 4; // Mask 0b01110000
55 const uint8_t kSamsungAcSwingSize = 3; // Bits
56 const uint8_t kSamsungAcSwingMove = 0b010;
57 const uint8_t kSamsungAcSwingStop = 0b111;
58 // Byte[10]
59 const uint8_t kSamsungAcPowerful10Offset = 1; // Mask 0b00001110
60 const uint8_t kSamsungAcPowerful10Size = 3; // Mask 0b00001110
61 const uint8_t kSamsungAcPowerful10On = 0b011;
62 // Breeze (aka. WindFree)
65 const uint8_t kSamsungAcBreezeOn = 0b101;
66 const uint8_t kSamsungAcDisplayOffset = 4; // Mask 0b00010000
67 const uint8_t kSamsungAcClean10Offset = 7; // Mask 0b10000000
68 // Byte[11]
69 const uint8_t kSamsungAcIonOffset = 0; // Mask 0b00000001
70 const uint8_t kSamsungAcClean11Offset = 1; // Mask 0b00000010
71 const uint8_t kSamsungAcMinTemp = 16; // C Mask 0b11110000
72 const uint8_t kSamsungAcMaxTemp = 30; // C Mask 0b11110000
73 const uint8_t kSamsungAcAutoTemp = 25; // C Mask 0b11110000
74 // Byte[12]
75 const uint8_t kSamsungAcModeOffset = 4; // Mask 0b01110000
76 const uint8_t kSamsungAcAuto = 0;
77 const uint8_t kSamsungAcCool = 1;
78 const uint8_t kSamsungAcDry = 2;
79 const uint8_t kSamsungAcFan = 3;
80 const uint8_t kSamsungAcHeat = 4;
81 const uint8_t kSamsungAcFanOffest = 1; // Mask 0b00001110
82 const uint8_t kSamsungAcFanSize = 3; // Bits
83 const uint8_t kSamsungAcFanAuto = 0;
84 const uint8_t kSamsungAcFanLow = 2;
85 const uint8_t kSamsungAcFanMed = 4;
86 const uint8_t kSamsungAcFanHigh = 5;
87 const uint8_t kSamsungAcFanAuto2 = 6;
88 const uint8_t kSamsungAcFanTurbo = 7;
89 // Byte[13]
90 const uint8_t kSamsungAcBeepOffset = 1; // Mask 0b00000010
91 
92 const uint16_t kSamsungAcSectionLength = 7;
93 const uint64_t kSamsungAcPowerSection = 0x1D20F00000000;
94 
95 // Classes
97 class IRSamsungAc {
98  public:
99  explicit IRSamsungAc(const uint16_t pin, const bool inverted = false,
100  const bool use_modulation = true);
101  void stateReset(const bool forcepower = true, const bool initialPower = true);
102 #if SEND_SAMSUNG_AC
103  void send(const uint16_t repeat = kSamsungAcDefaultRepeat,
104  const bool calcchecksum = true);
105  void sendExtended(const uint16_t repeat = kSamsungAcDefaultRepeat,
106  const bool calcchecksum = true);
107  void sendOn(const uint16_t repeat = kSamsungAcDefaultRepeat);
108  void sendOff(const uint16_t repeat = kSamsungAcDefaultRepeat);
113  int8_t calibrate(void) { return _irsend.calibrate(); }
114 #endif // SEND_SAMSUNG_AC
115  void begin(void);
116  void on(void);
117  void off(void);
118  void setPower(const bool on);
119  bool getPower(void);
120  void setTemp(const uint8_t temp);
121  uint8_t getTemp(void);
122  void setFan(const uint8_t speed);
123  uint8_t getFan(void);
124  void setMode(const uint8_t mode);
125  uint8_t getMode(void);
126  void setSwing(const bool on);
127  bool getSwing(void);
128  void setBeep(const bool on);
129  bool getBeep(void);
130  void setClean(const bool on);
131  bool getClean(void);
132  void setQuiet(const bool on);
133  bool getQuiet(void);
134  void setPowerful(const bool on);
135  bool getPowerful(void);
136  void setBreeze(const bool on);
137  bool getBreeze(void);
138  void setDisplay(const bool on);
139  bool getDisplay(void);
140  void setIon(const bool on);
141  bool getIon(void);
142  uint8_t* getRaw(void);
143  void setRaw(const uint8_t new_code[],
144  const uint16_t length = kSamsungAcStateLength);
145  static bool validChecksum(const uint8_t state[],
146  const uint16_t length = kSamsungAcStateLength);
147  static uint8_t calcChecksum(const uint8_t state[],
148  const uint16_t length = kSamsungAcStateLength);
149  uint8_t convertMode(const stdAc::opmode_t mode);
150  uint8_t convertFan(const stdAc::fanspeed_t speed);
151  static stdAc::opmode_t toCommonMode(const uint8_t mode);
152  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
153  stdAc::state_t toCommon(void);
154  String toString(void);
155 #ifndef UNIT_TEST
156 
157  private:
159 #else // UNIT_TEST
160  IRsendTest _irsend;
162 #endif // UNIT_TEST
165  bool _forcepower;
167  void checksum(const uint16_t length = kSamsungAcStateLength);
168 };
169 
170 #endif // IR_SAMSUNG_H_
IRSamsungAc::getIon
bool getIon(void)
Get the Ion (Filter) setting of the A/C.
Definition: ir_Samsung.cpp:644
kSamsungAcDry
const uint8_t kSamsungAcDry
Definition: ir_Samsung.h:78
IRSamsungAc
Class for handling detailed Samsung A/C messages.
Definition: ir_Samsung.h:97
IRSamsungAc::_forcepower
bool _forcepower
Hack to know when we need to send a special power mesg.
Definition: ir_Samsung.h:165
kSamsungAcCool
const uint8_t kSamsungAcCool
Definition: ir_Samsung.h:77
IRSamsungAc::setQuiet
void setQuiet(const bool on)
Set the Quiet setting of the A/C.
Definition: ir_Samsung.cpp:571
kSamsungAcFanMed
const uint8_t kSamsungAcFanMed
Definition: ir_Samsung.h:85
IRSamsungAc::send
void send(const uint16_t repeat=kSamsungAcDefaultRepeat, const bool calcchecksum=true)
Send the current internal state as an IR message.
Definition: ir_Samsung.cpp:345
kSamsungAcFanAuto2
const uint8_t kSamsungAcFanAuto2
Definition: ir_Samsung.h:87
kSamsungAcAuto
const uint8_t kSamsungAcAuto
Definition: ir_Samsung.h:76
IRSamsungAc::_irsend
IRsend _irsend
Instance of the IR send class.
Definition: ir_Samsung.h:158
IRSamsungAc::IRSamsungAc
IRSamsungAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
Class constructor.
Definition: ir_Samsung.cpp:272
kSamsungAcFanHigh
const uint8_t kSamsungAcFanHigh
Definition: ir_Samsung.h:86
kSamsungAcBreezeSize
const uint8_t kSamsungAcBreezeSize
Definition: ir_Samsung.h:64
stdAc::fanspeed_t
fanspeed_t
Common A/C settings for Fan Speeds.
Definition: IRsend.h:58
kSamsungAcFan
const uint8_t kSamsungAcFan
Definition: ir_Samsung.h:79
IRSamsungAc::getBreeze
bool getBreeze(void)
Are the vanes closed over the fan outlet, to stop direct wind? Aka. WindFree.
Definition: ir_Samsung.cpp:611
IRSamsungAc::setBreeze
void setBreeze(const bool on)
Closes the vanes over the fan outlet, to stop direct wind. Aka. WindFree.
Definition: ir_Samsung.cpp:620
IRSamsungAc::toCommon
stdAc::state_t toCommon(void)
Convert the current internal state into its stdAc::state_t equivilant.
Definition: ir_Samsung.cpp:709
kSamsungAcSwingStop
const uint8_t kSamsungAcSwingStop
Definition: ir_Samsung.h:57
kSamsungAcPower1Offset
const uint8_t kSamsungAcPower1Offset
Definition: ir_Samsung.h:43
IRSamsungAc::getDisplay
bool getDisplay(void)
Get the Display (Light/LED) setting of the A/C.
Definition: ir_Samsung.cpp:632
IRSamsungAc::getMode
uint8_t getMode(void)
Get the operating mode setting of the A/C.
Definition: ir_Samsung.cpp:488
kSamsungAcDefaultRepeat
const uint16_t kSamsungAcDefaultRepeat
Definition: IRremoteESP8266.h:1000
kSamsungAcPowerful10On
const uint8_t kSamsungAcPowerful10On
Definition: ir_Samsung.h:61
IRSamsungAc::getPower
bool getPower(void)
Get the value of the current power setting.
Definition: ir_Samsung.cpp:446
IRsend.h
IRSamsungAc::setSwing
void setSwing(const bool on)
Set the vertical swing setting of the A/C.
Definition: ir_Samsung.cpp:531
IRSamsungAc::toString
String toString(void)
Convert the current internal state into a human readable string.
Definition: ir_Samsung.cpp:736
kSamsungAcSectionLength
const uint16_t kSamsungAcSectionLength
Definition: ir_Samsung.h:92
IRSamsungAc::begin
void begin(void)
Set up hardware to be able to send a message.
Definition: ir_Samsung.cpp:293
IRsend
Class for sending all basic IR protocols.
Definition: IRsend.h:176
IRSamsungAc::setIon
void setIon(const bool on)
Set the Ion (Filter) setting of the A/C.
Definition: ir_Samsung.cpp:650
IRsend::calibrate
int8_t calibrate(uint16_t hz=38000U)
Calculate & set any offsets to account for execution times during sending.
Definition: IRsend.cpp:207
IRSamsungAc::setRaw
void setRaw(const uint8_t new_code[], const uint16_t length=kSamsungAcStateLength)
Set the internal state from a valid code for this protocol.
Definition: ir_Samsung.cpp:420
String
std::string String
Definition: IRremoteESP8266.h:1128
IRSamsungAc::getTemp
uint8_t getTemp(void)
Get the current temperature setting.
Definition: ir_Samsung.cpp:463
IRSamsungAc::sendOff
void sendOff(const uint16_t repeat=kSamsungAcDefaultRepeat)
Send the special extended "Off" message as the library can't seem to reproduce this message automatic...
Definition: ir_Samsung.cpp:400
kSamsungAcQuiet1Offset
const uint8_t kSamsungAcQuiet1Offset
Definition: ir_Samsung.h:44
IRSamsungAc::getPowerful
bool getPowerful(void)
Get the Powerful (Turbo) setting of the A/C.
Definition: ir_Samsung.cpp:583
IRSamsungAc::on
void on(void)
Set the requested power state of the A/C to on.
Definition: ir_Samsung.cpp:431
IRSamsungAc::getBeep
bool getBeep(void)
Get the Beep setting of the A/C.
Definition: ir_Samsung.cpp:538
kSamsungAcFanSize
const uint8_t kSamsungAcFanSize
Definition: ir_Samsung.h:82
IRSamsungAc::convertFan
uint8_t convertFan(const stdAc::fanspeed_t speed)
Convert a stdAc::fanspeed_t enum into it's native speed.
Definition: ir_Samsung.cpp:670
IRSamsungAc::remote_state
uint8_t remote_state[kSamsungAcExtendedStateLength]
State in code form.
Definition: ir_Samsung.h:164
kSamsungAcPowerfulMask8
const uint8_t kSamsungAcPowerfulMask8
Definition: ir_Samsung.h:52
kSamsungAcStateLength
const uint16_t kSamsungAcStateLength
Definition: IRremoteESP8266.h:996
IRSamsungAc::validChecksum
static bool validChecksum(const uint8_t state[], const uint16_t length=kSamsungAcStateLength)
Verify the checksum is valid for a given state.
Definition: ir_Samsung.cpp:318
IRremoteESP8266.h
IRSamsungAc::setTemp
void setTemp(const uint8_t temp)
Set the temperature.
Definition: ir_Samsung.cpp:454
kSamsungAcSwingOffset
const uint8_t kSamsungAcSwingOffset
Definition: ir_Samsung.h:54
kSamsungAcPowerSection
const uint64_t kSamsungAcPowerSection
Definition: ir_Samsung.h:93
IRSamsungAc::setPowerful
void setPowerful(const bool on)
Set the Powerful (Turbo) setting of the A/C.
Definition: ir_Samsung.cpp:592
kSamsungAcModeOffset
const uint8_t kSamsungAcModeOffset
Definition: ir_Samsung.h:75
kSamsungAcExtendedStateLength
const uint16_t kSamsungAcExtendedStateLength
Definition: IRremoteESP8266.h:998
IRSamsungAc::getQuiet
bool getQuiet(void)
Get the Quiet setting of the A/C.
Definition: ir_Samsung.cpp:564
kSamsungAcDisplayOffset
const uint8_t kSamsungAcDisplayOffset
Definition: ir_Samsung.h:66
IRSamsungAc::setPower
void setPower(const bool on)
Change the power setting.
Definition: ir_Samsung.cpp:438
IRSamsungAc::setDisplay
void setDisplay(const bool on)
Set the Display (Light/LED) setting of the A/C.
Definition: ir_Samsung.cpp:638
IRSamsungAc::getFan
uint8_t getFan(void)
Get the current fan speed setting.
Definition: ir_Samsung.cpp:514
kSamsungAcBreezeOn
const uint8_t kSamsungAcBreezeOn
Definition: ir_Samsung.h:65
kSamsungAcPowerful10Offset
const uint8_t kSamsungAcPowerful10Offset
Definition: ir_Samsung.h:59
IRSamsungAc::stateReset
void stateReset(const bool forcepower=true, const bool initialPower=true)
Reset the internal state of the emulation.
Definition: ir_Samsung.cpp:282
IRSamsungAc::calcChecksum
static uint8_t calcChecksum(const uint8_t state[], const uint16_t length=kSamsungAcStateLength)
Calculate the checksum for a given state.
Definition: ir_Samsung.cpp:299
IRSamsungAc::_lastsentpowerstate
bool _lastsentpowerstate
Definition: ir_Samsung.h:166
kSamsungAcAutoTemp
const uint8_t kSamsungAcAutoTemp
Definition: ir_Samsung.h:73
kSamsungAcSwingMove
const uint8_t kSamsungAcSwingMove
Definition: ir_Samsung.h:56
IRSamsungAc::setMode
void setMode(const uint8_t mode)
Set the operating mode of the A/C.
Definition: ir_Samsung.cpp:470
kSamsungAcBreezeOffset
const uint8_t kSamsungAcBreezeOffset
Definition: ir_Samsung.h:63
kSamsungAcSwingSize
const uint8_t kSamsungAcSwingSize
Definition: ir_Samsung.h:55
kSamsungAcFanLow
const uint8_t kSamsungAcFanLow
Definition: ir_Samsung.h:84
IRSamsungAc::setClean
void setClean(const bool on)
Set the Clean setting of the A/C.
Definition: ir_Samsung.cpp:557
kSamsungAcHeat
const uint8_t kSamsungAcHeat
Definition: ir_Samsung.h:80
IRSamsungAc::toCommonMode
static stdAc::opmode_t toCommonMode(const uint8_t mode)
Convert a native mode into its stdAc equivilant.
Definition: ir_Samsung.cpp:684
IRSamsungAc::sendOn
void sendOn(const uint16_t repeat=kSamsungAcDefaultRepeat)
Send the special extended "On" message as the library can't seem to reproduce this message automatica...
Definition: ir_Samsung.cpp:387
kSamsungAcFanAuto
const uint8_t kSamsungAcFanAuto
Definition: ir_Samsung.h:83
kSamsungAcClean11Offset
const uint8_t kSamsungAcClean11Offset
Definition: ir_Samsung.h:70
IRSamsungAc::checksum
void checksum(const uint16_t length=kSamsungAcStateLength)
Update the checksum for the internal state.
Definition: ir_Samsung.cpp:331
IRSamsungAc::setBeep
void setBeep(const bool on)
Set the Beep setting of the A/C.
Definition: ir_Samsung.cpp:544
IRSamsungAc::getClean
bool getClean(void)
Get the Clean setting of the A/C.
Definition: ir_Samsung.cpp:550
kSamsungAcFanOffest
const uint8_t kSamsungAcFanOffest
Definition: ir_Samsung.h:81
IRSamsungAc::convertMode
uint8_t convertMode(const stdAc::opmode_t mode)
Convert a stdAc::opmode_t enum into its native mode.
Definition: ir_Samsung.cpp:657
IRSamsungAc::calibrate
int8_t calibrate(void)
Run the calibration to calculate uSec timing offsets for this platform.
Definition: ir_Samsung.h:113
IRSamsungAc::sendExtended
void sendExtended(const uint16_t repeat=kSamsungAcDefaultRepeat, const bool calcchecksum=true)
Send the extended current internal state as an IR message.
Definition: ir_Samsung.cpp:366
IRSamsungAc::setFan
void setFan(const uint8_t speed)
Set the speed of the fan.
Definition: ir_Samsung.cpp:494
kSamsungAcMaxTemp
const uint8_t kSamsungAcMaxTemp
Definition: ir_Samsung.h:72
kSamsungAcIonOffset
const uint8_t kSamsungAcIonOffset
Definition: ir_Samsung.h:69
kSamsungAcPower6Offset
const uint8_t kSamsungAcPower6Offset
Definition: ir_Samsung.h:48
kSamsungAcPowerful10Size
const uint8_t kSamsungAcPowerful10Size
Definition: ir_Samsung.h:60
kSamsungAcClean10Offset
const uint8_t kSamsungAcClean10Offset
Definition: ir_Samsung.h:67
IRSamsungAc::getSwing
bool getSwing(void)
Get the vertical swing setting of the A/C.
Definition: ir_Samsung.cpp:522
IRSamsungAc::off
void off(void)
Set the requested power state of the A/C to off.
Definition: ir_Samsung.cpp:434
kSamsungAcPower6Size
const uint8_t kSamsungAcPower6Size
Definition: ir_Samsung.h:49
IRSamsungAc::toCommonFanSpeed
static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
Convert a native fan speed into its stdAc equivilant.
Definition: ir_Samsung.cpp:697
kSamsungAcBeepOffset
const uint8_t kSamsungAcBeepOffset
Definition: ir_Samsung.h:90
IRSamsungAc::getRaw
uint8_t * getRaw(void)
Get a PTR to the internal state/code for this protocol.
Definition: ir_Samsung.cpp:412
kSamsungAcQuiet5Offset
const uint8_t kSamsungAcQuiet5Offset
Definition: ir_Samsung.h:46
kSamsungAcFanTurbo
const uint8_t kSamsungAcFanTurbo
Definition: ir_Samsung.h:88
stdAc::state_t
Structure to hold a common A/C state.
Definition: IRsend.h:97
kSamsungAcMinTemp
const uint8_t kSamsungAcMinTemp
Definition: ir_Samsung.h:71
stdAc::opmode_t
opmode_t
Common A/C settings for A/C operating modes.
Definition: IRsend.h:46