2023-09-29 16:18:21 +00:00
|
|
|
#include <user_code.hpp>
|
2023-09-29 17:56:25 +00:00
|
|
|
|
2023-10-02 11:45:59 +00:00
|
|
|
// AC Control Locking
|
|
|
|
char AC_LOCK_TOPIC[75];
|
|
|
|
#define AC_LOCK_ADDRESS 15002
|
|
|
|
bool ac_lock = false;
|
|
|
|
|
2023-09-30 11:09:03 +00:00
|
|
|
// Display Componets
|
2023-10-02 11:00:01 +00:00
|
|
|
NexText clock_txt = NexText(1, 2, "clock");
|
2023-10-02 09:04:44 +00:00
|
|
|
NexDSButton lt_bt = NexDSButton(1, 3, "lt_bt");
|
|
|
|
NexDSButton fan_bt = NexDSButton(1, 4, "fan_bt");
|
|
|
|
NexDSButton puri_bt = NexDSButton(1, 5, "puri_bt");
|
|
|
|
NexButton up_bt = NexButton(1, 6, "up_bt");
|
|
|
|
NexButton down_bt = NexButton(1, 7, "down_bt");
|
|
|
|
NexButton mode_off_btn = NexButton(1, 8, "mode_off_btn");
|
|
|
|
NexButton mode_fan_btn = NexButton(1, 9, "mode_fan_btn");
|
|
|
|
NexButton mode_cool_btn = NexButton(1, 10, "mode_cool_btn");
|
|
|
|
NexButton fan_auto_btn = NexButton(1, 11, "fan_auto_btn");
|
|
|
|
NexButton fan_1_btn = NexButton(1, 12, "fan_1_btn");
|
|
|
|
NexButton fan_2_btn = NexButton(1, 13, "fan_2_btn");
|
|
|
|
NexButton fan_3_btn = NexButton(1, 14, "fan_3_btn");
|
2023-10-02 11:45:59 +00:00
|
|
|
NexText temperature_txt = NexText(1, 15, "temperature");
|
|
|
|
NexPage dashboard_page = NexPage(1, 0, "dashboard");
|
2023-10-02 09:04:44 +00:00
|
|
|
|
2023-09-30 11:09:03 +00:00
|
|
|
// List of Component ID Message to listen to
|
|
|
|
NexTouch *nex_listen_list[] =
|
|
|
|
{
|
2023-10-02 09:04:44 +00:00
|
|
|
<_bt,
|
|
|
|
&fan_bt,
|
|
|
|
&puri_bt,
|
|
|
|
&up_bt,
|
|
|
|
&down_bt,
|
|
|
|
&mode_off_btn,
|
|
|
|
&mode_fan_btn,
|
|
|
|
&mode_cool_btn,
|
|
|
|
&fan_auto_btn,
|
|
|
|
&fan_1_btn,
|
|
|
|
&fan_2_btn,
|
|
|
|
&fan_3_btn,
|
2023-09-30 11:09:03 +00:00
|
|
|
NULL};
|
2023-09-30 09:29:16 +00:00
|
|
|
|
2023-09-29 17:06:49 +00:00
|
|
|
/*
|
|
|
|
This Code will run right after ESPMega PRO's
|
|
|
|
Peripheral Initialization Routine
|
|
|
|
*/
|
2023-09-29 17:37:31 +00:00
|
|
|
void user_pre_init()
|
|
|
|
{
|
2023-09-30 09:29:16 +00:00
|
|
|
nexInit();
|
2023-09-29 16:18:21 +00:00
|
|
|
}
|
2023-09-29 17:06:49 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
This code will run after every component is initialized
|
|
|
|
*/
|
2023-09-29 17:37:31 +00:00
|
|
|
void user_init()
|
|
|
|
{
|
2023-10-02 08:29:57 +00:00
|
|
|
ESPMega_EXTLCD.print("page dashboard");
|
2023-09-30 08:42:44 +00:00
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
2023-10-02 11:45:59 +00:00
|
|
|
memcpy(AC_LOCK_TOPIC, MQTT_BASE_TOPIC, 20);
|
|
|
|
strcat(AC_LOCK_TOPIC, "/ac/lock");
|
|
|
|
ac_lock = ESPMega_FRAM.read8(AC_LOCK_ADDRESS);
|
|
|
|
ac_lock = ac_lock > 1 ? 0 : ac_lock;
|
|
|
|
ESPMega_EXTLCD.print("dashboard.pic=");
|
|
|
|
ESPMega_EXTLCD.print(ac_lock ? "2" : "1");
|
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
|
|
|
mqtt.subscribe(AC_LOCK_TOPIC, ac_lock_callback);
|
2023-10-02 09:04:44 +00:00
|
|
|
lt_bt.attachPop(lt_btn_cb, <_bt);
|
|
|
|
fan_bt.attachPop(fan_btn_cb, &fan_bt);
|
2023-10-02 11:00:01 +00:00
|
|
|
puri_bt.attachPop(puri_btn_cb, &puri_bt);
|
|
|
|
up_bt.attachPop(ac_temp_adj_btn_cb, &up_bt);
|
|
|
|
down_bt.attachPop(ac_temp_adj_btn_cb, &down_bt);
|
|
|
|
mode_off_btn.attachPop(ac_mode_adj_btn_cb, &mode_off_btn);
|
|
|
|
mode_fan_btn.attachPop(ac_mode_adj_btn_cb, &mode_fan_btn);
|
|
|
|
mode_cool_btn.attachPop(ac_mode_adj_btn_cb, &mode_cool_btn);
|
|
|
|
fan_auto_btn.attachPop(ac_fan_adj_btn_cb, &fan_auto_btn);
|
|
|
|
fan_1_btn.attachPop(ac_fan_adj_btn_cb, &fan_1_btn);
|
|
|
|
fan_2_btn.attachPop(ac_fan_adj_btn_cb, &fan_2_btn);
|
|
|
|
fan_3_btn.attachPop(ac_fan_adj_btn_cb, &fan_3_btn);
|
2023-09-29 16:18:21 +00:00
|
|
|
}
|
|
|
|
|
2023-09-29 17:06:49 +00:00
|
|
|
/*
|
|
|
|
This code will run once every event loop
|
|
|
|
*/
|
2023-09-29 17:37:31 +00:00
|
|
|
void user_loop()
|
|
|
|
{
|
2023-09-30 09:29:16 +00:00
|
|
|
nexLoop(nex_listen_list);
|
2023-09-29 16:18:21 +00:00
|
|
|
}
|
|
|
|
|
2023-09-29 17:06:49 +00:00
|
|
|
/*
|
|
|
|
This code will run when an input pin changed state
|
|
|
|
*/
|
2023-09-29 17:37:31 +00:00
|
|
|
void virtual_interrupt_user_callback(int pin, int state)
|
|
|
|
{
|
2023-10-02 11:45:59 +00:00
|
|
|
if (pin>=0&pin<=7){
|
|
|
|
pwm_toggle(pin);
|
|
|
|
}
|
2023-09-29 16:18:21 +00:00
|
|
|
}
|
2023-09-29 17:06:49 +00:00
|
|
|
|
2023-09-30 09:29:16 +00:00
|
|
|
void pwm_changed_user_callback(int pin)
|
|
|
|
{
|
2023-10-02 11:00:01 +00:00
|
|
|
if ((pin == LIGHT1_PIN) || (pin == LIGHT2_PIN) || (pin == LIGHT3_PIN) || (pin = LIGHT4_PIN))
|
|
|
|
{
|
|
|
|
lt_bt.setValue(cud_light_group_state());
|
|
|
|
}
|
|
|
|
else if (pin == FAN1_PIN || pin == FAN2_PIN || pin == FAN3_PIN)
|
|
|
|
{
|
|
|
|
fan_bt.setValue(cud_fan_group_state());
|
|
|
|
}
|
|
|
|
else if (pin == AIR_PURIFIER_PIN)
|
|
|
|
{
|
|
|
|
puri_bt.setValue(pwm_get_state(pin));
|
|
|
|
}
|
2023-09-30 08:42:44 +00:00
|
|
|
}
|
|
|
|
|
2023-09-29 17:06:49 +00:00
|
|
|
/*
|
2023-09-29 17:37:31 +00:00
|
|
|
This code will run every 15 seconds
|
2023-09-29 17:06:49 +00:00
|
|
|
*/
|
2023-09-29 17:37:31 +00:00
|
|
|
void timer_tick_callback()
|
|
|
|
{
|
2023-10-02 11:00:01 +00:00
|
|
|
char time_buffer[15];
|
|
|
|
rtctime_t time = ESPMega_getTime();
|
|
|
|
sprintf(time_buffer, "%02d:%02d", time.hours, time.minutes);
|
|
|
|
clock_txt.setText(time_buffer);
|
2023-09-29 16:18:21 +00:00
|
|
|
}
|
2023-09-30 09:29:16 +00:00
|
|
|
|
2023-10-02 11:00:01 +00:00
|
|
|
void lt_btn_cb(void *comp)
|
|
|
|
{
|
|
|
|
cud_light_toggle();
|
2023-10-02 09:04:44 +00:00
|
|
|
}
|
2023-10-02 11:00:01 +00:00
|
|
|
void fan_btn_cb(void *comp)
|
|
|
|
{
|
|
|
|
cud_fan_toggle();
|
2023-10-02 09:04:44 +00:00
|
|
|
}
|
2023-10-02 11:00:01 +00:00
|
|
|
void puri_btn_cb(void *comp)
|
|
|
|
{
|
|
|
|
pwm_toggle(AIR_PURIFIER_PIN);
|
2023-10-02 09:04:44 +00:00
|
|
|
}
|
2023-10-02 11:00:01 +00:00
|
|
|
void ac_temp_adj_btn_cb(void *comp)
|
|
|
|
{
|
2023-10-02 11:45:59 +00:00
|
|
|
if (!ac_lock)
|
|
|
|
{
|
|
|
|
uint8_t new_temp = ac_get_temperature();
|
|
|
|
if (comp == &up_bt)
|
|
|
|
ac_set_state(ac_get_mode(), ac_get_temperature() + 1, ac_get_fan_speed());
|
|
|
|
else if (comp == &down_bt)
|
|
|
|
ac_set_state(ac_get_mode(), ac_get_temperature() - 1, ac_get_fan_speed());
|
|
|
|
}
|
2023-10-02 09:04:44 +00:00
|
|
|
}
|
2023-10-02 11:00:01 +00:00
|
|
|
void ac_mode_adj_btn_cb(void *comp)
|
|
|
|
{
|
2023-10-02 11:45:59 +00:00
|
|
|
if (!ac_lock)
|
|
|
|
{
|
|
|
|
if (comp == &mode_off_btn)
|
|
|
|
ac_set_state(0, ac_get_temperature(), ac_get_fan_speed());
|
|
|
|
else if (comp == &mode_fan_btn)
|
|
|
|
ac_set_state(1, ac_get_temperature(), ac_get_fan_speed());
|
|
|
|
else if (comp == &mode_cool_btn)
|
|
|
|
ac_set_state(2, ac_get_temperature(), ac_get_fan_speed());
|
|
|
|
}
|
2023-10-02 11:00:01 +00:00
|
|
|
}
|
|
|
|
void ac_fan_adj_btn_cb(void *comp)
|
|
|
|
{
|
2023-10-02 11:45:59 +00:00
|
|
|
if (!ac_lock)
|
|
|
|
{
|
|
|
|
if (comp == &fan_auto_btn)
|
|
|
|
ac_set_state(ac_get_mode(), ac_get_temperature(), 0);
|
|
|
|
else if (comp == &fan_1_btn)
|
|
|
|
ac_set_state(ac_get_mode(), ac_get_temperature(), 1);
|
|
|
|
else if (comp == &fan_2_btn)
|
|
|
|
ac_set_state(ac_get_mode(), ac_get_temperature(), 2);
|
|
|
|
else if (comp == &fan_3_btn)
|
|
|
|
ac_set_state(ac_get_mode(), ac_get_temperature(), 3);
|
|
|
|
}
|
2023-10-02 09:04:44 +00:00
|
|
|
}
|
|
|
|
|
2023-10-02 11:00:01 +00:00
|
|
|
void cud_light_toggle()
|
|
|
|
{
|
|
|
|
bool new_state = !cud_light_group_state();
|
|
|
|
pwm_set_state(LIGHT1_PIN, new_state);
|
|
|
|
pwm_set_state(LIGHT2_PIN, new_state);
|
|
|
|
pwm_set_state(LIGHT3_PIN, new_state);
|
|
|
|
pwm_set_state(LIGHT4_PIN, new_state);
|
|
|
|
}
|
|
|
|
bool cud_light_group_state()
|
|
|
|
{
|
|
|
|
return pwm_get_state(LIGHT1_PIN) || pwm_get_state(LIGHT2_PIN) || pwm_get_state(LIGHT3_PIN) || pwm_get_state(LIGHT4_PIN);
|
|
|
|
}
|
|
|
|
void cud_fan_toggle()
|
|
|
|
{
|
|
|
|
bool new_state = !cud_fan_group_state();
|
|
|
|
pwm_set_state(FAN1_PIN, new_state);
|
|
|
|
pwm_set_state(FAN2_PIN, new_state);
|
|
|
|
pwm_set_state(FAN3_PIN, new_state);
|
|
|
|
}
|
|
|
|
bool cud_fan_group_state()
|
|
|
|
{
|
|
|
|
return pwm_get_state(FAN1_PIN) || pwm_get_state(FAN2_PIN) || pwm_get_state(FAN3_PIN);
|
2023-10-02 11:45:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void ac_changed_user_callback(int mode, int temperature, int fan_speed)
|
|
|
|
{
|
|
|
|
char temp_text[3] = {(temperature - temperature % 10) + '0', (temperature % 10) + '0', 'C'};
|
|
|
|
temperature_txt.setText(temp_text);
|
|
|
|
mode_off_btn.Set_background_image_pic(mode == 0 ? 1 : 0);
|
|
|
|
mode_fan_btn.Set_background_image_pic(mode == 1 ? 1 : 0);
|
|
|
|
mode_cool_btn.Set_background_image_pic(mode == 2 ? 1 : 0);
|
|
|
|
fan_auto_btn.Set_background_image_pic(fan_speed == 0 ? 1 : 0);
|
|
|
|
fan_1_btn.Set_background_image_pic(fan_speed == 1 ? 1 : 0);
|
|
|
|
fan_2_btn.Set_background_image_pic(fan_speed == 2 ? 1 : 0);
|
|
|
|
fan_3_btn.Set_background_image_pic(fan_speed == 3 ? 1 : 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ac_lock_callback(String topic, String payload)
|
|
|
|
{
|
|
|
|
if (payload.equals("lock"))
|
|
|
|
{
|
|
|
|
ac_lock = true;
|
|
|
|
ESPMega_FRAM.write8(AC_LOCK_ADDRESS, ac_lock);
|
|
|
|
ESPMega_EXTLCD.print("dashboard.pic=");
|
|
|
|
ESPMega_EXTLCD.print(ac_lock ? "2" : "1");
|
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
|
|
|
}
|
|
|
|
else if (payload.equals("unlock"))
|
|
|
|
{
|
|
|
|
ac_lock = false;
|
|
|
|
ESPMega_FRAM.write8(AC_LOCK_ADDRESS, ac_lock);
|
|
|
|
ESPMega_EXTLCD.print("dashboard.pic=");
|
|
|
|
ESPMega_EXTLCD.print(ac_lock ? "2" : "1");
|
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
|
|
|
ESPMega_EXTLCD.write(0xFF);
|
|
|
|
}
|
2023-09-30 09:29:16 +00:00
|
|
|
}
|