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: AR09FSSDAWKNFA A/C (SAMSUNG_AC)
18 // Brand: Samsung, Model: AR12KSFPEWQNET A/C (SAMSUNG_AC)
19 // Brand: Samsung, Model: AR12HSSDBWKNEU A/C (SAMSUNG_AC)
20 // Brand: Samsung, Model: AR12NXCXAWKXEU A/C (SAMSUNG_AC)
21 
22 #ifndef IR_SAMSUNG_H_
23 #define IR_SAMSUNG_H_
24 
25 #define __STDC_LIMIT_MACROS
26 #include <stdint.h>
27 #ifndef UNIT_TEST
28 #include <Arduino.h>
29 #endif
30 #include "IRremoteESP8266.h"
31 #include "IRsend.h"
32 #ifdef UNIT_TEST
33 #include "IRsend_test.h"
34 #endif
35 
36 // Constants
37 
38 // SamsungAc
39 // Byte[1]
40 // Checksum 0b11110000 ???
41 const uint8_t kSamsungAcPower1Offset = 5; // Mask 0b00100000
42 const uint8_t kSamsungAcQuiet1Offset = 4; // Mask 0b00010000
43 // Byte[5]
44 const uint8_t kSamsungAcQuiet5Offset = 5;
45 // Byte[6]
46 const uint8_t kSamsungAcPower6Offset = 4; // Mask 0b00110000
47 const uint8_t kSamsungAcPower6Size = 2; // Bits
48 // Byte[8]
49 // Checksum 0b11110000 ???
50 const uint8_t kSamsungAcPowerfulMask8 = 0b01010000;
51 // Byte[9]
52 const uint8_t kSamsungAcSwingOffset = 4; // Mask 0b01110000
53 const uint8_t kSamsungAcSwingSize = 3; // Bits
54 const uint8_t kSamsungAcSwingMove = 0b010;
55 const uint8_t kSamsungAcSwingStop = 0b111;
56 // Byte[10]
57 const uint8_t kSamsungAcPowerful10Offset = 1; // Mask 0b00001110
58 const uint8_t kSamsungAcPowerful10Size = 3; // Mask 0b00001110
59 const uint8_t kSamsungAcPowerful10On = 0b011;
60 // Breeze (aka. WindFree)
63 const uint8_t kSamsungAcBreezeOn = 0b101;
64 const uint8_t kSamsungAcDisplayOffset = 4; // Mask 0b00010000
65 const uint8_t kSamsungAcClean10Offset = 7; // Mask 0b10000000
66 // Byte[11]
67 const uint8_t kSamsungAcIonOffset = 0; // Mask 0b00000001
68 const uint8_t kSamsungAcClean11Offset = 1; // Mask 0b00000010
69 const uint8_t kSamsungAcMinTemp = 16; // C Mask 0b11110000
70 const uint8_t kSamsungAcMaxTemp = 30; // C Mask 0b11110000
71 const uint8_t kSamsungAcAutoTemp = 25; // C Mask 0b11110000
72 // Byte[12]
73 const uint8_t kSamsungAcModeOffset = 4; // Mask 0b01110000
74 const uint8_t kSamsungAcAuto = 0;
75 const uint8_t kSamsungAcCool = 1;
76 const uint8_t kSamsungAcDry = 2;
77 const uint8_t kSamsungAcFan = 3;
78 const uint8_t kSamsungAcHeat = 4;
79 const uint8_t kSamsungAcFanOffest = 1; // Mask 0b00001110
80 const uint8_t kSamsungAcFanSize = 3; // Bits
81 const uint8_t kSamsungAcFanAuto = 0;
82 const uint8_t kSamsungAcFanLow = 2;
83 const uint8_t kSamsungAcFanMed = 4;
84 const uint8_t kSamsungAcFanHigh = 5;
85 const uint8_t kSamsungAcFanAuto2 = 6;
86 const uint8_t kSamsungAcFanTurbo = 7;
87 // Byte[13]
88 const uint8_t kSamsungAcBeepOffset = 1; // Mask 0b00000010
89 
90 const uint16_t kSamsungAcSectionLength = 7;
91 const uint64_t kSamsungAcPowerSection = 0x1D20F00000000;
92 
93 // Classes
95 class IRSamsungAc {
96  public:
97  explicit IRSamsungAc(const uint16_t pin, const bool inverted = false,
98  const bool use_modulation = true);
99  void stateReset(const bool forcepower = true, const bool initialPower = true);
100 #if SEND_SAMSUNG_AC
101  void send(const uint16_t repeat = kSamsungAcDefaultRepeat,
102  const bool calcchecksum = true);
103  void sendExtended(const uint16_t repeat = kSamsungAcDefaultRepeat,
104  const bool calcchecksum = true);
105  void sendOn(const uint16_t repeat = kSamsungAcDefaultRepeat);
106  void sendOff(const uint16_t repeat = kSamsungAcDefaultRepeat);
111  int8_t calibrate(void) { return _irsend.calibrate(); }
112 #endif // SEND_SAMSUNG_AC
113  void begin(void);
114  void on(void);
115  void off(void);
116  void setPower(const bool on);
117  bool getPower(void);
118  void setTemp(const uint8_t temp);
119  uint8_t getTemp(void);
120  void setFan(const uint8_t speed);
121  uint8_t getFan(void);
122  void setMode(const uint8_t mode);
123  uint8_t getMode(void);
124  void setSwing(const bool on);
125  bool getSwing(void);
126  void setBeep(const bool on);
127  bool getBeep(void);
128  void setClean(const bool on);
129  bool getClean(void);
130  void setQuiet(const bool on);
131  bool getQuiet(void);
132  void setPowerful(const bool on);
133  bool getPowerful(void);
134  void setBreeze(const bool on);
135  bool getBreeze(void);
136  void setDisplay(const bool on);
137  bool getDisplay(void);
138  void setIon(const bool on);
139  bool getIon(void);
140  uint8_t* getRaw(void);
141  void setRaw(const uint8_t new_code[],
142  const uint16_t length = kSamsungAcStateLength);
143  static bool validChecksum(const uint8_t state[],
144  const uint16_t length = kSamsungAcStateLength);
145  static uint8_t calcChecksum(const uint8_t state[],
146  const uint16_t length = kSamsungAcStateLength);
147  uint8_t convertMode(const stdAc::opmode_t mode);
148  uint8_t convertFan(const stdAc::fanspeed_t speed);
149  static stdAc::opmode_t toCommonMode(const uint8_t mode);
150  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
151  stdAc::state_t toCommon(void);
152  String toString(void);
153 #ifndef UNIT_TEST
154 
155  private:
157 #else // UNIT_TEST
158  IRsendTest _irsend;
160 #endif // UNIT_TEST
163  bool _forcepower;
165  void checksum(const uint16_t length = kSamsungAcStateLength);
166 };
167 
168 #endif // IR_SAMSUNG_H_
IRSamsungAc::getIon
bool getIon(void)
Get the Ion (Filter) setting of the A/C.
Definition: ir_Samsung.cpp:636
kSamsungAcDry
const uint8_t kSamsungAcDry
Definition: ir_Samsung.h:76
IRSamsungAc
Class for handling detailed Samsung A/C messages.
Definition: ir_Samsung.h:95
IRSamsungAc::_forcepower
bool _forcepower
Hack to know when we need to send a special power mesg.
Definition: ir_Samsung.h:163
kSamsungAcCool
const uint8_t kSamsungAcCool
Definition: ir_Samsung.h:75
IRSamsungAc::setQuiet
void setQuiet(const bool on)
Set the Quiet setting of the A/C.
Definition: ir_Samsung.cpp:563
kSamsungAcFanMed
const uint8_t kSamsungAcFanMed
Definition: ir_Samsung.h:83
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:337
kSamsungAcFanAuto2
const uint8_t kSamsungAcFanAuto2
Definition: ir_Samsung.h:85
kSamsungAcAuto
const uint8_t kSamsungAcAuto
Definition: ir_Samsung.h:74
IRSamsungAc::_irsend
IRsend _irsend
Instance of the IR send class.
Definition: ir_Samsung.h:156
IRSamsungAc::IRSamsungAc
IRSamsungAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
Class constructor.
Definition: ir_Samsung.cpp:264
kSamsungAcFanHigh
const uint8_t kSamsungAcFanHigh
Definition: ir_Samsung.h:84
kSamsungAcBreezeSize
const uint8_t kSamsungAcBreezeSize
Definition: ir_Samsung.h:62
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:77
IRSamsungAc::getBreeze
bool getBreeze(void)
Are the vanes closed over the fan outlet, to stop direct wind? Aka. WindFree.
Definition: ir_Samsung.cpp:603
IRSamsungAc::setBreeze
void setBreeze(const bool on)
Closes the vanes over the fan outlet, to stop direct wind. Aka. WindFree.
Definition: ir_Samsung.cpp:612
IRSamsungAc::toCommon
stdAc::state_t toCommon(void)
Convert the current internal state into its stdAc::state_t equivilant.
Definition: ir_Samsung.cpp:701
kSamsungAcSwingStop
const uint8_t kSamsungAcSwingStop
Definition: ir_Samsung.h:55
kSamsungAcPower1Offset
const uint8_t kSamsungAcPower1Offset
Definition: ir_Samsung.h:41
IRSamsungAc::getDisplay
bool getDisplay(void)
Get the Display (Light/LED) setting of the A/C.
Definition: ir_Samsung.cpp:624
IRSamsungAc::getMode
uint8_t getMode(void)
Get the operating mode setting of the A/C.
Definition: ir_Samsung.cpp:480
kSamsungAcDefaultRepeat
const uint16_t kSamsungAcDefaultRepeat
Definition: IRremoteESP8266.h:973
kSamsungAcPowerful10On
const uint8_t kSamsungAcPowerful10On
Definition: ir_Samsung.h:59
IRSamsungAc::getPower
bool getPower(void)
Get the value of the current power setting.
Definition: ir_Samsung.cpp:438
IRsend.h
IRSamsungAc::setSwing
void setSwing(const bool on)
Set the vertical swing setting of the A/C.
Definition: ir_Samsung.cpp:523
IRSamsungAc::toString
String toString(void)
Convert the current internal state into a human readable string.
Definition: ir_Samsung.cpp:728
kSamsungAcSectionLength
const uint16_t kSamsungAcSectionLength
Definition: ir_Samsung.h:90
IRSamsungAc::begin
void begin(void)
Set up hardware to be able to send a message.
Definition: ir_Samsung.cpp:285
IRsend
Class for sending all basic IR protocols.
Definition: IRsend.h:170
IRSamsungAc::setIon
void setIon(const bool on)
Set the Ion (Filter) setting of the A/C.
Definition: ir_Samsung.cpp:642
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:412
String
std::string String
Definition: IRremoteESP8266.h:1093
IRSamsungAc::getTemp
uint8_t getTemp(void)
Get the current temperature setting.
Definition: ir_Samsung.cpp:455
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:392
kSamsungAcQuiet1Offset
const uint8_t kSamsungAcQuiet1Offset
Definition: ir_Samsung.h:42
IRSamsungAc::getPowerful
bool getPowerful(void)
Get the Powerful (Turbo) setting of the A/C.
Definition: ir_Samsung.cpp:575
IRSamsungAc::on
void on(void)
Set the requested power state of the A/C to on.
Definition: ir_Samsung.cpp:423
IRSamsungAc::getBeep
bool getBeep(void)
Get the Beep setting of the A/C.
Definition: ir_Samsung.cpp:530
kSamsungAcFanSize
const uint8_t kSamsungAcFanSize
Definition: ir_Samsung.h:80
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:662
IRSamsungAc::remote_state
uint8_t remote_state[kSamsungAcExtendedStateLength]
State in code form.
Definition: ir_Samsung.h:162
kSamsungAcPowerfulMask8
const uint8_t kSamsungAcPowerfulMask8
Definition: ir_Samsung.h:50
kSamsungAcStateLength
const uint16_t kSamsungAcStateLength
Definition: IRremoteESP8266.h:969
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:310
IRremoteESP8266.h
IRSamsungAc::setTemp
void setTemp(const uint8_t temp)
Set the temperature.
Definition: ir_Samsung.cpp:446
kSamsungAcSwingOffset
const uint8_t kSamsungAcSwingOffset
Definition: ir_Samsung.h:52
kSamsungAcPowerSection
const uint64_t kSamsungAcPowerSection
Definition: ir_Samsung.h:91
IRSamsungAc::setPowerful
void setPowerful(const bool on)
Set the Powerful (Turbo) setting of the A/C.
Definition: ir_Samsung.cpp:584
kSamsungAcModeOffset
const uint8_t kSamsungAcModeOffset
Definition: ir_Samsung.h:73
kSamsungAcExtendedStateLength
const uint16_t kSamsungAcExtendedStateLength
Definition: IRremoteESP8266.h:971
IRSamsungAc::getQuiet
bool getQuiet(void)
Get the Quiet setting of the A/C.
Definition: ir_Samsung.cpp:556
kSamsungAcDisplayOffset
const uint8_t kSamsungAcDisplayOffset
Definition: ir_Samsung.h:64
IRSamsungAc::setPower
void setPower(const bool on)
Change the power setting.
Definition: ir_Samsung.cpp:430
IRSamsungAc::setDisplay
void setDisplay(const bool on)
Set the Display (Light/LED) setting of the A/C.
Definition: ir_Samsung.cpp:630
IRSamsungAc::getFan
uint8_t getFan(void)
Get the current fan speed setting.
Definition: ir_Samsung.cpp:506
kSamsungAcBreezeOn
const uint8_t kSamsungAcBreezeOn
Definition: ir_Samsung.h:63
kSamsungAcPowerful10Offset
const uint8_t kSamsungAcPowerful10Offset
Definition: ir_Samsung.h:57
IRSamsungAc::stateReset
void stateReset(const bool forcepower=true, const bool initialPower=true)
Reset the internal state of the emulation.
Definition: ir_Samsung.cpp:274
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:291
IRSamsungAc::_lastsentpowerstate
bool _lastsentpowerstate
Definition: ir_Samsung.h:164
kSamsungAcAutoTemp
const uint8_t kSamsungAcAutoTemp
Definition: ir_Samsung.h:71
kSamsungAcSwingMove
const uint8_t kSamsungAcSwingMove
Definition: ir_Samsung.h:54
IRSamsungAc::setMode
void setMode(const uint8_t mode)
Set the operating mode of the A/C.
Definition: ir_Samsung.cpp:462
kSamsungAcBreezeOffset
const uint8_t kSamsungAcBreezeOffset
Definition: ir_Samsung.h:61
kSamsungAcSwingSize
const uint8_t kSamsungAcSwingSize
Definition: ir_Samsung.h:53
kSamsungAcFanLow
const uint8_t kSamsungAcFanLow
Definition: ir_Samsung.h:82
IRSamsungAc::setClean
void setClean(const bool on)
Set the Clean setting of the A/C.
Definition: ir_Samsung.cpp:549
kSamsungAcHeat
const uint8_t kSamsungAcHeat
Definition: ir_Samsung.h:78
IRSamsungAc::toCommonMode
static stdAc::opmode_t toCommonMode(const uint8_t mode)
Convert a native mode into its stdAc equivilant.
Definition: ir_Samsung.cpp:676
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:379
kSamsungAcFanAuto
const uint8_t kSamsungAcFanAuto
Definition: ir_Samsung.h:81
kSamsungAcClean11Offset
const uint8_t kSamsungAcClean11Offset
Definition: ir_Samsung.h:68
IRSamsungAc::checksum
void checksum(const uint16_t length=kSamsungAcStateLength)
Update the checksum for the internal state.
Definition: ir_Samsung.cpp:323
IRSamsungAc::setBeep
void setBeep(const bool on)
Set the Beep setting of the A/C.
Definition: ir_Samsung.cpp:536
IRSamsungAc::getClean
bool getClean(void)
Get the Clean setting of the A/C.
Definition: ir_Samsung.cpp:542
kSamsungAcFanOffest
const uint8_t kSamsungAcFanOffest
Definition: ir_Samsung.h:79
IRSamsungAc::convertMode
uint8_t convertMode(const stdAc::opmode_t mode)
Convert a stdAc::opmode_t enum into its native mode.
Definition: ir_Samsung.cpp:649
IRSamsungAc::calibrate
int8_t calibrate(void)
Run the calibration to calculate uSec timing offsets for this platform.
Definition: ir_Samsung.h:111
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:358
IRSamsungAc::setFan
void setFan(const uint8_t speed)
Set the speed of the fan.
Definition: ir_Samsung.cpp:486
kSamsungAcMaxTemp
const uint8_t kSamsungAcMaxTemp
Definition: ir_Samsung.h:70
kSamsungAcIonOffset
const uint8_t kSamsungAcIonOffset
Definition: ir_Samsung.h:67
kSamsungAcPower6Offset
const uint8_t kSamsungAcPower6Offset
Definition: ir_Samsung.h:46
kSamsungAcPowerful10Size
const uint8_t kSamsungAcPowerful10Size
Definition: ir_Samsung.h:58
kSamsungAcClean10Offset
const uint8_t kSamsungAcClean10Offset
Definition: ir_Samsung.h:65
IRSamsungAc::getSwing
bool getSwing(void)
Get the vertical swing setting of the A/C.
Definition: ir_Samsung.cpp:514
IRSamsungAc::off
void off(void)
Set the requested power state of the A/C to off.
Definition: ir_Samsung.cpp:426
kSamsungAcPower6Size
const uint8_t kSamsungAcPower6Size
Definition: ir_Samsung.h:47
IRSamsungAc::toCommonFanSpeed
static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
Convert a native fan speed into its stdAc equivilant.
Definition: ir_Samsung.cpp:689
kSamsungAcBeepOffset
const uint8_t kSamsungAcBeepOffset
Definition: ir_Samsung.h:88
IRSamsungAc::getRaw
uint8_t * getRaw(void)
Get a PTR to the internal state/code for this protocol.
Definition: ir_Samsung.cpp:404
kSamsungAcQuiet5Offset
const uint8_t kSamsungAcQuiet5Offset
Definition: ir_Samsung.h:44
kSamsungAcFanTurbo
const uint8_t kSamsungAcFanTurbo
Definition: ir_Samsung.h:86
stdAc::state_t
Structure to hold a common A/C state.
Definition: IRsend.h:97
kSamsungAcMinTemp
const uint8_t kSamsungAcMinTemp
Definition: ir_Samsung.h:69
stdAc::opmode_t
opmode_t
Common A/C settings for A/C operating modes.
Definition: IRsend.h:46