| |
|
| |
#define BLINKER_MIOT_OUTLET
|
| |
#define BLINKER_WIFI
|
| |
|
| |
#include <Blinker.h>
|
| |
|
| |
#include <Arduino.h>
|
| |
#include <IRremoteESP8266.h>
|
| |
#include <IRsend.h>
|
| |
#include <IRac.h>
|
| |
#include <IRutils.h>
|
| |
|
| |
int ledPin=2;
|
| |
|
| |
|
| |
|
| |
char auth[] = "864123441048";
|
| |
char ssid[] = "WiFi";
|
| |
char pswd[] = "12345678";
|
| |
|
| |
|
| |
|
| |
|
| |
int firm = 18;
|
| |
|
| |
|
| |
const uint16_t kIrLed = 16;
|
| |
IRac ac(kIrLed);
|
| |
stdAc::state_t state;
|
| |
stdAc::state_t prev;
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
int countSetMode = 0;
|
| |
int countFan = 0;
|
| |
uint8_t lastSetMode;
|
| |
uint8_t lastSetFan;
|
| |
uint8_t twoLastSetMode;
|
| |
uint8_t twoLastSetFan;
|
| |
|
| |
bool tab[5] = { false };
|
| |
bool tab1[5] = { false };
|
| |
bool tabSetMode[5] = { false };
|
| |
bool tabSetFan[5] = { false };
|
| |
|
| |
BlinkerButton ButtonPower("powerac");
|
| |
BlinkerButton ButtonHealth("healthac");
|
| |
BlinkerSlider SliderHump("sethump");
|
| |
|
| |
BlinkerTab setModeTab("setmode");
|
| |
BlinkerTab setSpeedTab("setspeed");
|
| |
|
| |
|
| |
bool oState = false;
|
| |
|
| |
void miotPowerState(const String & state)
|
| |
{
|
| |
BLINKER_LOG("need set power state: ", state);
|
| |
|
| |
if (state == BLINKER_CMD_ON) {
|
| |
digitalWrite(LED_BUILTIN, HIGH);
|
| |
powerOn();
|
| |
BlinkerMIOT.powerState("on");
|
| |
BlinkerMIOT.print();
|
| |
|
| |
oState = true;
|
| |
}
|
| |
else if (state == BLINKER_CMD_OFF) {
|
| |
digitalWrite(LED_BUILTIN, LOW);
|
| |
powerOff();
|
| |
BlinkerMIOT.powerState("off");
|
| |
BlinkerMIOT.print();
|
| |
|
| |
oState = false;
|
| |
}
|
| |
}
|
| |
|
| |
void miotQuery(int32_t queryCode)
|
| |
{
|
| |
BLINKER_LOG("MIOT Query codes: ", queryCode);
|
| |
|
| |
switch (queryCode)
|
| |
{
|
| |
case BLINKER_CMD_QUERY_ALL_NUMBER :
|
| |
BLINKER_LOG("MIOT Query All");
|
| |
BlinkerMIOT.powerState(oState ? "on" : "off");
|
| |
BlinkerMIOT.print();
|
| |
break;
|
| |
case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :
|
| |
BLINKER_LOG("MIOT Query Power State");
|
| |
BlinkerMIOT.powerState(oState ? "on" : "off");
|
| |
BlinkerMIOT.print();
|
| |
break;
|
| |
default :
|
| |
BlinkerMIOT.powerState(oState ? "on" : "off");
|
| |
BlinkerMIOT.print();
|
| |
break;
|
| |
}
|
| |
}
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
void buttonPower_callback(const String & state)
|
| |
{
|
| |
ledState();
|
| |
BLINKER_LOG("get buttonPower state: ", state);
|
| |
|
| |
if (state == BLINKER_CMD_ON) {
|
| |
BLINKER_LOG("power on!");
|
| |
powerOn();
|
| |
|
| |
ButtonPower.color("#008000");
|
| |
ButtonPower.text("on power");
|
| |
|
| |
ButtonPower.print("on");
|
| |
}
|
| |
else if (state == BLINKER_CMD_OFF) {
|
| |
BLINKER_LOG("power off!");
|
| |
powerOff();
|
| |
|
| |
ButtonPower.color("#FF0000");
|
| |
ButtonPower.text("off power");
|
| |
|
| |
ButtonPower.print("off");
|
| |
}
|
| |
else {
|
| |
BLINKER_LOG("Get user setting buttonPower: ", state);
|
| |
|
| |
|
| |
ButtonPower.color("#FFFFFF");
|
| |
ButtonPower.text("Your button name or describe");
|
| |
|
| |
ButtonPower.print();
|
| |
}
|
| |
}
|
| |
|
| |
void buttonHealth_callback(const String & state)
|
| |
{
|
| |
ledState();
|
| |
BLINKER_LOG("get buttonHealth state: ", state);
|
| |
|
| |
if (state == BLINKER_CMD_ON) {
|
| |
BLINKER_LOG("buttonHealth on!");
|
| |
healthOn();
|
| |
|
| |
ButtonHealth.color("#008000");
|
| |
ButtonHealth.text("on Health");
|
| |
|
| |
ButtonHealth.print("on");
|
| |
}
|
| |
else if (state == BLINKER_CMD_OFF) {
|
| |
BLINKER_LOG("buttonHealth off!");
|
| |
healthOff();
|
| |
|
| |
ButtonHealth.color("#FF0000");
|
| |
ButtonHealth.text("off health");
|
| |
|
| |
ButtonHealth.print("off");
|
| |
}
|
| |
else {
|
| |
BLINKER_LOG("Get user setting buttonHealth: ", state);
|
| |
|
| |
|
| |
ButtonHealth.color("#FFFFFF");
|
| |
ButtonHealth.text("Your button name or describe");
|
| |
|
| |
ButtonHealth.print();
|
| |
}
|
| |
}
|
| |
|
| |
void setHump_callback(int32_t value)
|
| |
{
|
| |
ledState();
|
| |
BLINKER_LOG("get slider setHump value: ", value);
|
| |
setDegrees(value);
|
| |
|
| |
|
| |
}
|
| |
|
| |
|
| |
void setMode_callback(uint8_t tab_set)
|
| |
{
|
| |
BLINKER_LOG("get setMode tab set: ", tab_set);
|
| |
|
| |
|
| |
switch (tab_set)
|
| |
{
|
| |
case BLINKER_CMD_TAB_0 :
|
| |
tab[0] = true;
|
| |
BLINKER_LOG("tab 0 set");
|
| |
tab[1] = false;
|
| |
tab[2] = false;
|
| |
tab[3] = false;
|
| |
tab[4] = false;
|
| |
|
| |
BLINKER_LOG("");
|
| |
break;
|
| |
case BLINKER_CMD_TAB_1 :
|
| |
tab[1] = true;
|
| |
BLINKER_LOG("tab 1 set");
|
| |
tab[0] = false;
|
| |
tab[2] = false;
|
| |
tab[3] = false;
|
| |
tab[4] = false;
|
| |
|
| |
break;
|
| |
case BLINKER_CMD_TAB_2 :
|
| |
tab[2] = true;
|
| |
BLINKER_LOG("tab 2 set");
|
| |
tab[0] = false;
|
| |
tab[1] = false;
|
| |
tab[3] = false;
|
| |
tab[4] = false;
|
| |
|
| |
break;
|
| |
case BLINKER_CMD_TAB_3 :
|
| |
tab[3] = true;
|
| |
BLINKER_LOG("tab 3 set");
|
| |
tab[0] = false;
|
| |
tab[1] = false;
|
| |
tab[2] = false;
|
| |
tab[4] = false;
|
| |
|
| |
break;
|
| |
case BLINKER_CMD_TAB_4 :
|
| |
tab[4] = true;
|
| |
BLINKER_LOG("tab 4 set");
|
| |
tab[0] = false;
|
| |
tab[1] = false;
|
| |
tab[2] = false;
|
| |
tab[3] = false;
|
| |
|
| |
break;
|
| |
default:
|
| |
break;
|
| |
}
|
| |
countSetMode++;
|
| |
|
| |
|
| |
tabCountMode();
|
| |
|
| |
}
|
| |
|
| |
|
| |
void tabCountMode() {
|
| |
|
| |
if (countSetMode == 1) {
|
| |
for (uint8_t one = 0; one < 5; one++) {
|
| |
tabSetMode[one] = tab[one];
|
| |
|
| |
}
|
| |
|
| |
} else {
|
| |
for (uint8_t num = 0; num < 5; num++)
|
| |
{
|
| |
if (tab[num])
|
| |
{
|
| |
if (lastSetMode ==num) {
|
| |
for (uint8_t one = 0; one < 5; one++) {
|
| |
tab[one] = tabSetMode[one];
|
| |
tabSetMode[one]=false;
|
| |
|
| |
}
|
| |
}
|
| |
}
|
| |
}
|
| |
|
| |
}
|
| |
|
| |
}
|
| |
|
| |
|
| |
|
| |
void setMode_feedback()
|
| |
{
|
| |
for (uint8_t num = 0; num < 5; num++)
|
| |
{
|
| |
if (tab[num])
|
| |
{
|
| |
sendMode(num);
|
| |
setModeTab.tab(num);
|
| |
lastSetMode = num;
|
| |
tab[num] = false;
|
| |
}
|
| |
|
| |
|
| |
}
|
| |
setModeTab.print();
|
| |
countSetMode=0;
|
| |
}
|
| |
|
| |
|
| |
|
| |
void setSpeed_callback(uint8_t tab_set)
|
| |
{
|
| |
BLINKER_LOG("get setMode tab set: ", tab_set);
|
| |
|
| |
switch (tab_set)
|
| |
{
|
| |
case BLINKER_CMD_TAB_0 :
|
| |
tab1[0] = true;
|
| |
BLINKER_LOG("setFanAuto");
|
| |
tab1[1] =false;
|
| |
tab1[2] =false;
|
| |
tab1[3] =false;
|
| |
tab1[4] =false;
|
| |
|
| |
break;
|
| |
case BLINKER_CMD_TAB_1 :
|
| |
tab1[1] = true;
|
| |
BLINKER_LOG(" setFanMin");
|
| |
tab1[0] = false;
|
| |
tab1[2] =false;
|
| |
tab1[3] =false;
|
| |
tab1[4] =false;
|
| |
|
| |
break;
|
| |
case BLINKER_CMD_TAB_2 :
|
| |
tab1[2] = true;
|
| |
BLINKER_LOG("setFanLow");
|
| |
tab1[0] = false;
|
| |
tab1[1] =false;
|
| |
tab1[3] =false;
|
| |
tab1[4] =false;
|
| |
|
| |
break;
|
| |
case BLINKER_CMD_TAB_3 :
|
| |
tab1[3] = true;
|
| |
BLINKER_LOG(" setFanMedium");
|
| |
tab1[0] = false;
|
| |
tab1[1] =false;
|
| |
tab1[2] =false;
|
| |
tab1[4] =false;
|
| |
|
| |
break;
|
| |
case BLINKER_CMD_TAB_4 :
|
| |
tab1[4] = true;
|
| |
BLINKER_LOG(" setFanHigh");
|
| |
tab1[0] = false;
|
| |
tab1[1] =false;
|
| |
tab1[2] =false;
|
| |
tab1[3] =false;
|
| |
|
| |
break;
|
| |
default:
|
| |
break;
|
| |
|
| |
}
|
| |
|
| |
countFan++;
|
| |
|
| |
|
| |
tabCountFan();
|
| |
}
|
| |
|
| |
|
| |
void tabCountFan() {
|
| |
|
| |
if (countFan == 1) {
|
| |
for (uint8_t one = 0; one < 5; one++) {
|
| |
tabSetFan[one] = tab1[one];
|
| |
|
| |
}
|
| |
|
| |
} else {
|
| |
for (uint8_t num = 0; num < 5; num++)
|
| |
{
|
| |
if (tab1[num])
|
| |
{
|
| |
if(lastSetFan==num){
|
| |
for (uint8_t one = 0; one < 5; one++) {
|
| |
tab1[one]=tabSetFan[one];
|
| |
tabSetFan[one]=false;
|
| |
}
|
| |
}
|
| |
}
|
| |
}
|
| |
|
| |
}
|
| |
|
| |
}
|
| |
|
| |
|
| |
void setSpeed_feedback()
|
| |
{
|
| |
for (uint8_t num = 0; num < 5; num++)
|
| |
{
|
| |
if (tab1[num])
|
| |
{
|
| |
|
| |
sendFan(num);
|
| |
setSpeedTab.tab(num);
|
| |
lastSetFan = num;
|
| |
tab1[num]=false;
|
| |
}
|
| |
}
|
| |
setSpeedTab.print();
|
| |
countFan=0;
|
| |
}
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
void dataRead(const String & data)
|
| |
{
|
| |
BLINKER_LOG("Blinker readString: ", data);
|
| |
|
| |
Blinker.vibrate();
|
| |
|
| |
uint32_t BlinkerTime = millis();
|
| |
|
| |
Blinker.print("millis", BlinkerTime);
|
| |
BLINKER_LOG("Now second: ", Blinker.second());
|
| |
BLINKER_LOG("Now minute: ", Blinker.minute());
|
| |
BLINKER_LOG("Now hour: ", Blinker.hour());
|
| |
BLINKER_LOG("Now wday: ", Blinker.wday());
|
| |
BLINKER_LOG("Now month: ", Blinker.month());
|
| |
BLINKER_LOG("Now mday: ", Blinker.mday());
|
| |
BLINKER_LOG("Now year: ", Blinker.year());
|
| |
BLINKER_LOG("Now yday: ", Blinker.yday());
|
| |
BLINKER_LOG("Now ntp time: ", Blinker.time());
|
| |
}
|
| |
|
| |
|
| |
|
| |
|
| |
void setup()
|
| |
{
|
| |
Serial.begin(115200);
|
| |
BLINKER_DEBUG.stream(Serial);
|
| |
|
| |
pinMode(ledPin, OUTPUT);
|
| |
digitalWrite(ledPin, HIGH);
|
| |
|
| |
setIntIr();
|
| |
|
| |
Blinker.begin(auth, ssid, pswd);
|
| |
Blinker.attachData(dataRead);
|
| |
ButtonPower.attach(buttonPower_callback);
|
| |
ButtonHealth.attach(buttonHealth_callback);
|
| |
SliderHump.attach(setHump_callback);
|
| |
setModeTab.attach(setMode_callback, setMode_feedback);
|
| |
setSpeedTab.attach(setSpeed_callback, setSpeed_feedback);
|
| |
BlinkerMIOT.attachPowerState(miotPowerState);
|
| |
|
| |
|
| |
|
| |
}
|
| |
|
| |
void loop()
|
| |
{
|
| |
Blinker.run();
|
| |
}
|
| |
|
| |
void setFirm() {
|
| |
decode_type_t protocol = (decode_type_t)firm;
|
| |
state.protocol = protocol;
|
| |
}
|
| |
|
| |
void sendIR() {
|
| |
ac.sendAc(state, &prev);
|
| |
ledState();
|
| |
|
| |
}
|
| |
|
| |
|
| |
void ledState(){
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
for(int i=0;i<6;i++){
|
| |
digitalWrite(ledPin, !analogRead(ledPin));
|
| |
delay(100);
|
| |
}
|
| |
|
| |
|
| |
}
|
| |
|
| |
void powerOn() {
|
| |
setFirm();
|
| |
state.power = true;
|
| |
sendIR();
|
| |
|
| |
}
|
| |
|
| |
|
| |
|
| |
void powerOff() {
|
| |
setFirm();
|
| |
state.power = false;
|
| |
sendIR();
|
| |
}
|
| |
|
| |
void healthOn() {
|
| |
setFirm();
|
| |
state.mode = stdAc::opmode_t::kAuto;
|
| |
sendIR();
|
| |
|
| |
}
|
| |
|
| |
|
| |
|
| |
void healthOff() {
|
| |
setFirm();
|
| |
state.mode = stdAc::opmode_t::kHeat;;
|
| |
sendIR();
|
| |
}
|
| |
|
| |
void setDegrees(int32_t value) {
|
| |
setFirm();
|
| |
state.degrees = value;
|
| |
sendIR();
|
| |
}
|
| |
|
| |
void setTicker(int32_t value)
|
| |
{
|
| |
int8_t hour = Blinker.hour();
|
| |
int8_t min = Blinker.minute();
|
| |
|
| |
|
| |
}
|
| |
|
| |
void setIntIr() {
|
| |
|
| |
state.protocol = decode_type_t::ELECTRA_AC;
|
| |
state.model = 1;
|
| |
state.mode = stdAc::opmode_t::kCool;
|
| |
state.celsius = true;
|
| |
state.degrees = 25;
|
| |
state.fanspeed = stdAc::fanspeed_t::kMedium;
|
| |
state.swingv = stdAc::swingv_t::kOff;
|
| |
state.swingh = stdAc::swingh_t::kOff;
|
| |
state.light = true;
|
| |
state.beep = false;
|
| |
state.econo = false;
|
| |
state.filter = false;
|
| |
state.turbo = false;
|
| |
state.quiet = false;
|
| |
state.sleep = -1;
|
| |
state.clean = false;
|
| |
state.clock = -1;
|
| |
state.power = false;
|
| |
prev = state;
|
| |
}
|
| |
void setModeAuto() {
|
| |
setFirm();
|
| |
state.power = true;
|
| |
state.mode = stdAc::opmode_t::kAuto;
|
| |
sendIR();
|
| |
}
|
| |
void setModeCool() {
|
| |
setFirm();
|
| |
state.power = true;
|
| |
state.mode = stdAc::opmode_t::kCool;
|
| |
sendIR();
|
| |
}
|
| |
void setModeDry() {
|
| |
setFirm();
|
| |
state.power = true;
|
| |
state.mode = stdAc::opmode_t::kDry;
|
| |
sendIR();
|
| |
}
|
| |
|
| |
void setModeHeat() {
|
| |
setFirm();
|
| |
state.power = true;
|
| |
state.mode = stdAc::opmode_t::kHeat;
|
| |
sendIR();
|
| |
}
|
| |
|
| |
|
| |
void setModeFan() {
|
| |
setFirm();
|
| |
state.mode = stdAc::opmode_t::kFan;
|
| |
sendIR();
|
| |
}
|
| |
|
| |
void sendMode(int a){
|
| |
switch(a){
|
| |
case 0:setModeAuto();
|
| |
break;
|
| |
case 1:setModeCool();
|
| |
break;
|
| |
case 2:setModeDry();
|
| |
break;
|
| |
case 3:setModeHeat();
|
| |
break;
|
| |
case 4:setModeFan();
|
| |
break;
|
| |
default:
|
| |
break;
|
| |
}
|
| |
|
| |
}
|
| |
|
| |
|
| |
void setFanAuto() {
|
| |
setFirm();
|
| |
state.fanspeed = stdAc::fanspeed_t::kAuto;
|
| |
sendIR();
|
| |
}
|
| |
void setFanMin() {
|
| |
setFirm();
|
| |
state.fanspeed = stdAc::fanspeed_t::kMin;
|
| |
sendIR();
|
| |
}
|
| |
|
| |
void setFanLow() {
|
| |
setFirm();
|
| |
state.fanspeed = stdAc::fanspeed_t::kLow;
|
| |
sendIR();
|
| |
}
|
| |
|
| |
void setFanMedium() {
|
| |
setFirm();
|
| |
state.fanspeed = stdAc::fanspeed_t::kMedium;
|
| |
sendIR();
|
| |
}
|
| |
void setFanHigh() {
|
| |
setFirm();
|
| |
state.fanspeed = stdAc::fanspeed_t::kHigh;
|
| |
sendIR();
|
| |
}
|
| |
void setFanMax() {
|
| |
setFirm();
|
| |
state.fanspeed = stdAc::fanspeed_t::kMax;
|
| |
sendIR();
|
| |
}
|
| |
|
| |
void sendFan(int a){
|
| |
switch(a){
|
| |
case 0:setFanAuto();
|
| |
break;
|
| |
case 1:setFanLow();
|
| |
break;
|
| |
case 2:setFanMedium();
|
| |
break;
|
| |
case 3:setFanHigh();
|
| |
break;
|
| |
case 4:setFanMax();
|
| |
break;
|
| |
default:
|
| |
break;
|
| |
}
|
| |
|
| |
}
|
| |
|