IRremoteESP8266
ir_Sharp.h
Go to the documentation of this file.
1 // Copyright 2019 crankyoldgit
2 
12 
13 // Supports:
14 // Brand: Sharp, Model: LC-52D62U TV
15 // Brand: Sharp, Model: AY-ZP40KR A/C
16 // Brand: Sharp, Model: AH-AxSAY A/C
17 // Brand: Sharp, Model: CRMC-A907 JBEZ remote
18 // Brand: Sharp, Model: AH-XP10NRY A/C
19 // Brand: Sharp, Model: CRMC-820JBEZ remote
20 
21 #ifndef IR_SHARP_H_
22 #define IR_SHARP_H_
23 
24 #ifndef UNIT_TEST
25 #include <Arduino.h>
26 #endif
27 #include "IRrecv.h"
28 #include "IRremoteESP8266.h"
29 #include "IRsend.h"
30 #ifdef UNIT_TEST
31 #include "IRsend_test.h"
32 #endif
33 #include "IRutils.h"
34 
35 // Constants
36 const uint16_t kSharpAcHdrMark = 3800;
37 const uint16_t kSharpAcHdrSpace = 1900;
38 const uint16_t kSharpAcBitMark = 470;
39 const uint16_t kSharpAcZeroSpace = 500;
40 const uint16_t kSharpAcOneSpace = 1400;
42 
43 // Byte[4]
44 const uint8_t kSharpAcByteTemp = 4;
45 const uint8_t kSharpAcMinTemp = 15; // Celsius
46 const uint8_t kSharpAcMaxTemp = 30; // Celsius
47 // Byte[5]
48 const uint8_t kSharpAcBytePowerSpecial = 5;
49 const uint8_t kSharpAcPowerSetSpecialOffset = kHighNibble; // 0bxxxx0000
50 const uint8_t kSharpAcPowerSpecialSize = kNibbleSize; // 0bxxxx0000
51 const uint8_t kSharpAcPowerUnknown = 0; // 0b0000
52 const uint8_t kSharpAcPowerOnFromOff = 1; // 0b0001
53 const uint8_t kSharpAcPowerOff = 2; // 0b0010
54 const uint8_t kSharpAcPowerOn = 3; // 0b0011 (Normal)
55 const uint8_t kSharpAcPowerSetSpecialOn = 6; // 0b0110
56 const uint8_t kSharpAcPowerSetSpecialOff = 7; // 0b0111
57 const uint8_t kSharpAcPowerTimerSetting = 8; // 0b1000
58 // Byte[6]
59 const uint8_t kSharpAcByteMode = 6;
60 const uint8_t kSharpAcModeSize = 2; // Mask 0b000000xx;
61 const uint8_t kSharpAcAuto = 0b00;
62 const uint8_t kSharpAcDry = 0b11;
63 const uint8_t kSharpAcCool = 0b10;
64 const uint8_t kSharpAcHeat = 0b01;
66 const uint8_t kSharpAcBitCleanOffset = 3; // Mask 0b0000x000
68 const uint8_t kSharpAcFanOffset = 4; // Mask 0b0xxx0000
69 const uint8_t kSharpAcFanSize = 3; // Nr. of Bits
70 const uint8_t kSharpAcFanAuto = 0b010; // 2
71 const uint8_t kSharpAcFanMin = 0b100; // 4 (FAN1)
72 const uint8_t kSharpAcFanMed = 0b011; // 3 (FAN2)
73 const uint8_t kSharpAcFanHigh = 0b101; // 5 (FAN3)
74 const uint8_t kSharpAcFanMax = 0b111; // 7 (FAN4)
75 // Byte[7]
76 const uint8_t kSharpAcByteTimer = 7;
77 const uint8_t kSharpAcTimerIncrement = 30; // Mins
79 const uint8_t kSharpAcTimerHoursSize = kNibbleSize; // Mask 0b0000xxxx
80 const uint8_t kSharpAcTimerHoursOff = 0b0000;
81 const uint8_t kSharpAcTimerHoursMax = 0b1100; // 12
82 const uint8_t kSharpAcBitTimerType = 6; // Mask 0b0x000000
83 const uint8_t kSharpAcOffTimerType = 0b0;
84 const uint8_t kSharpAcOnTimerType = 0b1;
85 const uint8_t kSharpAcBitTimerEnabled = 7; // Mask 0bx0000000
86 // Byte[8]
87 const uint8_t kSharpAcByteSwing = 8;
88 const uint8_t kSharpAcSwingOffset = 0;
89 const uint8_t kSharpAcSwingSize = 3; // Mask 0b00000xxx
90 const uint8_t kSharpAcSwingToggle = 0b111;
91 const uint8_t kSharpAcSwingNoToggle = 0b000;
92 // Byte[10]
93 const uint8_t kSharpAcByteSpecial = 10; // Mask 0bxxxxxxxx
94 const uint8_t kSharpAcSpecialPower = 0x00;
95 const uint8_t kSharpAcSpecialTurbo = 0x01;
96 const uint8_t kSharpAcSpecialTempEcono = 0x04;
97 const uint8_t kSharpAcSpecialFan = 0x05;
98 const uint8_t kSharpAcSpecialSwing = 0x06;
99 const uint8_t kSharpAcSpecialTimer = 0xC0;
100 const uint8_t kSharpAcSpecialTimerHalfHour = 0xDE;
101 // Byte[11]
102 const uint8_t kSharpAcByteIon = 11;
103 const uint8_t kSharpAcBitIonOffset = 2; // Mask 0b00000x00
104 // Byte[12] (Checksum)
105 
106 // Classes
108 class IRSharpAc {
109  public:
110  explicit IRSharpAc(const uint16_t pin, const bool inverted = false,
111  const bool use_modulation = true);
112 #if SEND_SHARP_AC
113  void send(const uint16_t repeat = kSharpAcDefaultRepeat);
118  int8_t calibrate(void) { return _irsend.calibrate(); }
119 #endif // SEND_SHARP_AC
120  void begin(void);
121  void on(void);
122  void off(void);
123  void setPower(const bool on, const bool prev_on = true);
124  bool getPower(void);
125  bool isPowerSpecial(void);
126  void setTemp(const uint8_t temp, const bool save = true);
127  uint8_t getTemp(void);
128  void setFan(const uint8_t fan, const bool save = true);
129  uint8_t getFan(void);
130  void setMode(const uint8_t mode, const bool save = true);
131  uint8_t getMode(void);
132  void setSpecial(const uint8_t mode);
133  uint8_t getSpecial(void);
134  bool getTurbo(void);
135  void setTurbo(const bool on);
136  bool getSwingToggle(void);
137  void setSwingToggle(const bool on);
138  bool getIon(void);
139  void setIon(const bool on);
140  bool getEconoToggle(void);
141  void setEconoToggle(const bool on);
142  uint16_t getTimerTime(void);
143  bool getTimerEnabled(void);
144  bool getTimerType(void);
145  void setTimer(bool enable, bool timer_type, uint16_t mins);
146  bool getClean(void);
147  void setClean(const bool on);
148  uint8_t* getRaw(void);
149  void setRaw(const uint8_t new_code[],
150  const uint16_t length = kSharpAcStateLength);
151  static bool validChecksum(uint8_t state[],
152  const uint16_t length = kSharpAcStateLength);
153  static uint8_t convertMode(const stdAc::opmode_t mode);
154  static uint8_t convertFan(const stdAc::fanspeed_t speed);
155  static stdAc::opmode_t toCommonMode(const uint8_t mode);
156  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
157  stdAc::state_t toCommon(void);
158  String toString(void);
159 #ifndef UNIT_TEST
160 
161  private:
163 #else // UNIT_TEST
164  IRsendTest _irsend;
166 #endif // UNIT_TEST
169  uint8_t _temp;
170  uint8_t _mode;
171  uint8_t _fan;
172  void stateReset(void);
173  void checksum(void);
174  static uint8_t calcChecksum(uint8_t state[],
175  const uint16_t length = kSharpAcStateLength);
176  void setPowerSpecial(const uint8_t value);
177  uint8_t getPowerSpecial(void);
178  void clearPowerSpecial(void);
179 };
180 
181 #endif // IR_SHARP_H_
IRSharpAc::getPowerSpecial
uint8_t getPowerSpecial(void)
Get the value of the Power Special setting.
Definition: ir_Sharp.cpp:319
kSharpAcTimerHoursSize
const uint8_t kSharpAcTimerHoursSize
Definition: ir_Sharp.h:79
kSharpAcByteFan
const uint8_t kSharpAcByteFan
Definition: ir_Sharp.h:67
kSharpAcFanSize
const uint8_t kSharpAcFanSize
Definition: ir_Sharp.h:69
kSharpAcHeat
const uint8_t kSharpAcHeat
Definition: ir_Sharp.h:64
kSharpAcSpecialTempEcono
const uint8_t kSharpAcSpecialTempEcono
Definition: ir_Sharp.h:96
IRSharpAc::getMode
uint8_t getMode(void)
Get the operating mode setting of the A/C.
Definition: ir_Sharp.cpp:421
IRSharpAc::calibrate
int8_t calibrate(void)
Run the calibration to calculate uSec timing offsets for this platform.
Definition: ir_Sharp.h:118
IRSharpAc::setTimer
void setTimer(bool enable, bool timer_type, uint16_t mins)
Set or cancel the timer function.
Definition: ir_Sharp.cpp:568
IRSharpAc::isPowerSpecial
bool isPowerSpecial(void)
Is one of the special power states in use?
Definition: ir_Sharp.cpp:332
IRSharpAc::setTemp
void setTemp(const uint8_t temp, const bool save=true)
Set the temperature.
Definition: ir_Sharp.cpp:393
kSharpAcPowerOnFromOff
const uint8_t kSharpAcPowerOnFromOff
Definition: ir_Sharp.h:52
kSharpAcPowerSpecialSize
const uint8_t kSharpAcPowerSpecialSize
Definition: ir_Sharp.h:50
IRSharpAc::off
void off(void)
Set the requested power state of the A/C to off.
Definition: ir_Sharp.cpp:345
kSharpAcOneSpace
const uint16_t kSharpAcOneSpace
Definition: ir_Sharp.h:40
stdAc::fanspeed_t
fanspeed_t
Common A/C settings for Fan Speeds.
Definition: IRsend.h:58
IRSharpAc::_temp
uint8_t _temp
Saved copy of the desired temp.
Definition: ir_Sharp.h:169
kDefaultMessageGap
const uint32_t kDefaultMessageGap
Definition: IRsend.h:41
IRSharpAc::calcChecksum
static uint8_t calcChecksum(uint8_t state[], const uint16_t length=kSharpAcStateLength)
Calculate the checksum for a given state.
Definition: ir_Sharp.cpp:263
IRSharpAc::toCommon
stdAc::state_t toCommon(void)
Convert the current internal state into its stdAc::state_t equivilant.
Definition: ir_Sharp.cpp:663
IRSharpAc::getIon
bool getIon(void)
Get the Ion (Filter) setting of the A/C.
Definition: ir_Sharp.cpp:515
kSharpAcSpecialTimer
const uint8_t kSharpAcSpecialTimer
Definition: ir_Sharp.h:99
kSharpAcOnTimerType
const uint8_t kSharpAcOnTimerType
Definition: ir_Sharp.h:84
IRSharpAc::getFan
uint8_t getFan(void)
Get the current fan speed setting.
Definition: ir_Sharp.cpp:476
kSharpAcCool
const uint8_t kSharpAcCool
Definition: ir_Sharp.h:63
IRsend.h
IRSharpAc::getPower
bool getPower(void)
Get the value of the current power setting.
Definition: ir_Sharp.cpp:360
kSharpAcSpecialFan
const uint8_t kSharpAcSpecialFan
Definition: ir_Sharp.h:97
kSharpAcSpecialSwing
const uint8_t kSharpAcSpecialSwing
Definition: ir_Sharp.h:98
kSharpAcOffTimerType
const uint8_t kSharpAcOffTimerType
Definition: ir_Sharp.h:83
IRsend
Class for sending all basic IR protocols.
Definition: IRsend.h:176
kSharpAcMaxTemp
const uint8_t kSharpAcMaxTemp
Definition: ir_Sharp.h:46
IRSharpAc::setFan
void setFan(const uint8_t fan, const bool save=true)
Set the speed of the fan.
Definition: ir_Sharp.cpp:455
IRsend::calibrate
int8_t calibrate(uint16_t hz=38000U)
Calculate & set any offsets to account for execution times during sending.
Definition: IRsend.cpp:207
IRSharpAc::IRSharpAc
IRSharpAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
Class constructor.
Definition: ir_Sharp.cpp:244
kSharpAcSwingOffset
const uint8_t kSharpAcSwingOffset
Definition: ir_Sharp.h:88
kSharpAcZeroSpace
const uint16_t kSharpAcZeroSpace
Definition: ir_Sharp.h:39
IRSharpAc::setPower
void setPower(const bool on, const bool prev_on=true)
Change the power setting, including the previous power state.
Definition: ir_Sharp.cpp:350
kSharpAcDry
const uint8_t kSharpAcDry
Definition: ir_Sharp.h:62
String
std::string String
Definition: IRremoteESP8266.h:1128
kNibbleSize
const uint8_t kNibbleSize
Definition: IRutils.h:17
kSharpAcTimerHoursMax
const uint8_t kSharpAcTimerHoursMax
Definition: ir_Sharp.h:81
kSharpAcPowerOff
const uint8_t kSharpAcPowerOff
Definition: ir_Sharp.h:53
IRSharpAc::getTimerTime
uint16_t getTimerTime(void)
Get how long the timer is set for, in minutes.
Definition: ir_Sharp.cpp:544
kLowNibble
const uint8_t kLowNibble
Definition: IRutils.h:18
kSharpAcSwingNoToggle
const uint8_t kSharpAcSwingNoToggle
Definition: ir_Sharp.h:91
kSharpAcTimerIncrement
const uint8_t kSharpAcTimerIncrement
Definition: ir_Sharp.h:77
IRremoteESP8266.h
kSharpAcPowerSetSpecialOn
const uint8_t kSharpAcPowerSetSpecialOn
Definition: ir_Sharp.h:55
IRSharpAc::convertMode
static uint8_t convertMode(const stdAc::opmode_t mode)
Convert a stdAc::opmode_t enum into its native mode.
Definition: ir_Sharp.cpp:612
IRSharpAc::setTurbo
void setTurbo(const bool on)
Set the Turbo setting of the A/C.
Definition: ir_Sharp.cpp:492
IRSharpAc::validChecksum
static bool validChecksum(uint8_t state[], const uint16_t length=kSharpAcStateLength)
Verify the checksum is valid for a given state.
Definition: ir_Sharp.cpp:274
IRSharpAc::getSpecial
uint8_t getSpecial(void)
Get the value of the Special (button/command?) setting.
Definition: ir_Sharp.cpp:388
kSharpAcSpecialTimerHalfHour
const uint8_t kSharpAcSpecialTimerHalfHour
Definition: ir_Sharp.h:100
kSharpAcTimerHoursOff
const uint8_t kSharpAcTimerHoursOff
Definition: ir_Sharp.h:80
kSharpAcBitTimerEnabled
const uint8_t kSharpAcBitTimerEnabled
Definition: ir_Sharp.h:85
kSharpAcByteTimer
const uint8_t kSharpAcByteTimer
Definition: ir_Sharp.h:76
IRSharpAc::getTemp
uint8_t getTemp(void)
Get the current temperature setting.
Definition: ir_Sharp.cpp:414
kHighNibble
const uint8_t kHighNibble
Definition: IRutils.h:19
kSharpAcByteSpecial
const uint8_t kSharpAcByteSpecial
Definition: ir_Sharp.h:93
kSharpAcSwingToggle
const uint8_t kSharpAcSwingToggle
Definition: ir_Sharp.h:90
IRSharpAc::setPowerSpecial
void setPowerSpecial(const uint8_t value)
Set the value of the Power Special setting without any checks.
Definition: ir_Sharp.cpp:312
kSharpAcFanAuto
const uint8_t kSharpAcFanAuto
Definition: ir_Sharp.h:70
IRSharpAc::send
void send(const uint16_t repeat=kSharpAcDefaultRepeat)
Send the current internal state as an IR message.
Definition: ir_Sharp.cpp:254
IRSharpAc::_irsend
IRsend _irsend
Instance of the IR send class.
Definition: ir_Sharp.h:162
IRSharpAc::checksum
void checksum(void)
Calculate and set the checksum values for the internal state.
Definition: ir_Sharp.cpp:280
kSharpAcGap
const uint32_t kSharpAcGap
Definition: ir_Sharp.h:41
kSharpAcBitTimerType
const uint8_t kSharpAcBitTimerType
Definition: ir_Sharp.h:82
IRSharpAc::getRaw
uint8_t * getRaw(void)
Get a PTR to the internal state/code for this protocol.
Definition: ir_Sharp.cpp:298
kSharpAcSwingSize
const uint8_t kSharpAcSwingSize
Definition: ir_Sharp.h:89
kSharpAcByteMode
const uint8_t kSharpAcByteMode
Definition: ir_Sharp.h:59
IRSharpAc::getTimerType
bool getTimerType(void)
Get the current timer type.
Definition: ir_Sharp.cpp:559
kSharpAcPowerUnknown
const uint8_t kSharpAcPowerUnknown
Definition: ir_Sharp.h:51
IRrecv.h
kSharpAcPowerOn
const uint8_t kSharpAcPowerOn
Definition: ir_Sharp.h:54
IRSharpAc::setSpecial
void setSpecial(const uint8_t mode)
Set the value of the Special (button/command?) setting.
Definition: ir_Sharp.cpp:370
IRSharpAc::begin
void begin(void)
Set up hardware to be able to send a message.
Definition: ir_Sharp.cpp:249
kSharpAcByteClean
const uint8_t kSharpAcByteClean
Definition: ir_Sharp.h:65
kSharpAcStateLength
const uint16_t kSharpAcStateLength
Definition: IRremoteESP8266.h:1011
kSharpAcModeSize
const uint8_t kSharpAcModeSize
Definition: ir_Sharp.h:60
kSharpAcFanMax
const uint8_t kSharpAcFanMax
Definition: ir_Sharp.h:74
IRutils.h
IRSharpAc::_mode
uint8_t _mode
Saved copy of the desired mode.
Definition: ir_Sharp.h:170
kSharpAcBytePowerSpecial
const uint8_t kSharpAcBytePowerSpecial
Definition: ir_Sharp.h:48
IRSharpAc
Class for handling detailed Sharp A/C messages.
Definition: ir_Sharp.h:108
IRSharpAc::toCommonMode
static stdAc::opmode_t toCommonMode(const uint8_t mode)
Convert a native mode into its stdAc equivilant.
Definition: ir_Sharp.cpp:639
IRSharpAc::getEconoToggle
bool getEconoToggle(void)
Get the Economical mode toggle setting of the A/C.
Definition: ir_Sharp.cpp:529
kSharpAcPowerTimerSetting
const uint8_t kSharpAcPowerTimerSetting
Definition: ir_Sharp.h:57
kSharpAcBitIonOffset
const uint8_t kSharpAcBitIonOffset
Definition: ir_Sharp.h:103
kSharpAcFanHigh
const uint8_t kSharpAcFanHigh
Definition: ir_Sharp.h:73
IRSharpAc::getSwingToggle
bool getSwingToggle(void)
Get the (vertical) Swing Toggle setting of the A/C.
Definition: ir_Sharp.cpp:500
kSharpAcFanMin
const uint8_t kSharpAcFanMin
Definition: ir_Sharp.h:71
kSharpAcByteSwing
const uint8_t kSharpAcByteSwing
Definition: ir_Sharp.h:87
IRSharpAc::setClean
void setClean(const bool on)
Set the Economical mode toggle setting of the A/C.
Definition: ir_Sharp.cpp:595
IRSharpAc::remote
uint8_t remote[kSharpAcStateLength]
State of the remote in IR code form.
Definition: ir_Sharp.h:168
kSharpAcFanMed
const uint8_t kSharpAcFanMed
Definition: ir_Sharp.h:72
kSharpAcDefaultRepeat
const uint16_t kSharpAcDefaultRepeat
Definition: IRremoteESP8266.h:1013
kSharpAcTimerHoursOffset
const uint8_t kSharpAcTimerHoursOffset
Definition: ir_Sharp.h:78
IRSharpAc::_fan
uint8_t _fan
Saved copy of the desired fan speed.
Definition: ir_Sharp.h:171
kSharpAcByteIon
const uint8_t kSharpAcByteIon
Definition: ir_Sharp.h:102
IRSharpAc::setEconoToggle
void setEconoToggle(const bool on)
Set the Economical mode toggle setting of the A/C.
Definition: ir_Sharp.cpp:537
kSharpAcFanOffset
const uint8_t kSharpAcFanOffset
Definition: ir_Sharp.h:68
IRSharpAc::getClean
bool getClean(void)
Get the Clean setting of the A/C.
Definition: ir_Sharp.cpp:588
kSharpAcHdrSpace
const uint16_t kSharpAcHdrSpace
Definition: ir_Sharp.h:37
IRSharpAc::getTurbo
bool getTurbo(void)
Get the Turbo setting of the A/C.
Definition: ir_Sharp.cpp:482
kSharpAcAuto
const uint8_t kSharpAcAuto
Definition: ir_Sharp.h:61
IRSharpAc::toCommonFanSpeed
static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
Convert a native fan speed into its stdAc equivilant.
Definition: ir_Sharp.cpp:651
IRSharpAc::setSwingToggle
void setSwingToggle(const bool on)
Set the (vertical) Swing Toggle setting of the A/C.
Definition: ir_Sharp.cpp:507
IRSharpAc::getTimerEnabled
bool getTimerEnabled(void)
Is the Timer enabled?
Definition: ir_Sharp.cpp:553
kSharpAcPowerSetSpecialOffset
const uint8_t kSharpAcPowerSetSpecialOffset
Definition: ir_Sharp.h:49
kSharpAcPowerSetSpecialOff
const uint8_t kSharpAcPowerSetSpecialOff
Definition: ir_Sharp.h:56
IRSharpAc::on
void on(void)
Set the requested power state of the A/C to on.
Definition: ir_Sharp.cpp:342
IRSharpAc::setMode
void setMode(const uint8_t mode, const bool save=true)
Set the operating mode of the A/C.
Definition: ir_Sharp.cpp:428
kSharpAcBitMark
const uint16_t kSharpAcBitMark
Definition: ir_Sharp.h:38
kSharpAcMinTemp
const uint8_t kSharpAcMinTemp
Definition: ir_Sharp.h:45
kSharpAcSpecialTurbo
const uint8_t kSharpAcSpecialTurbo
Definition: ir_Sharp.h:95
IRSharpAc::toString
String toString(void)
Convert the current internal state into a human readable string.
Definition: ir_Sharp.cpp:690
IRSharpAc::stateReset
void stateReset(void)
Reset the state of the remote to a known good state/sequence.
Definition: ir_Sharp.cpp:286
kSharpAcByteTemp
const uint8_t kSharpAcByteTemp
Definition: ir_Sharp.h:44
IRSharpAc::setIon
void setIon(const bool on)
Set the Ion (Filter) setting of the A/C.
Definition: ir_Sharp.cpp:521
stdAc::state_t
Structure to hold a common A/C state.
Definition: IRsend.h:97
IRSharpAc::clearPowerSpecial
void clearPowerSpecial(void)
Clear the "special"/non-normal bits in the power section. e.g. for normal/common command modes.
Definition: ir_Sharp.cpp:326
kSharpAcHdrMark
const uint16_t kSharpAcHdrMark
Definition: ir_Sharp.h:36
IRSharpAc::setRaw
void setRaw(const uint8_t new_code[], const uint16_t length=kSharpAcStateLength)
Set the internal state from a valid code for this protocol.
Definition: ir_Sharp.cpp:306
kSharpAcSpecialPower
const uint8_t kSharpAcSpecialPower
Definition: ir_Sharp.h:94
kSharpAcBitCleanOffset
const uint8_t kSharpAcBitCleanOffset
Definition: ir_Sharp.h:66
stdAc::opmode_t
opmode_t
Common A/C settings for A/C operating modes.
Definition: IRsend.h:46
IRSharpAc::convertFan
static uint8_t convertFan(const stdAc::fanspeed_t speed)
Convert a stdAc::fanspeed_t enum into it's native speed.
Definition: ir_Sharp.cpp:625