精准控温使用的是日本芝浦/华工高理温度传感器,感温精确达到±1%(B=3950,R=10K)。
温度检测电路图如下:
下图为英国STRIX温控器正反面照片:
无源蜂鸣器控制电路如下所示:
其中,
预留该管脚,用作后续功能扩展。
本方案设计中在触摸焊盘上加了导电泡棉,增强导电性。
导电泡棉
触摸按键
按键检测芯片
选用TS02N作为按键检测芯片。TS02N是双通道电容式传感器,具有自动灵敏度校准功能,其电源电压范围为2.5~5.5V。通过并联输出端口(OUT1和OUT2),芯片由低电平触发,可以检测触摸感知的结果。由于有了SYNC功能,两个TS02N可以同时在一个应用程序上工作。
管脚分配
TS02N使用说明
触摸焊盘P1时,P8输出低电平;同理,触摸焊盘P2时,P7输出低电平。
触摸检测电路
主控板上设有主控芯片,无线信号接收及发生装置与主控芯片集成为一体或相互独立。
主控板上设有煮沸控制开关和保温控制开关。
电源板上设有继电器,继电器包括继电器线圈和继电器开关,继电器线圈通过电源板与主控板电性连接,继电器开关与加热电路电性连接、并控制加热电路的通断。
BLE模组方案使用涂鸦BLESDK和Telink芯片平台TLSR825x进行开发,以下为搭建开发环境的步骤。
我们将在\ble_sdk_multimode\tuya_ble_app中进行智能烧水壶应用代码的编写。
将代码导入Eclipse,可以直接在Eclipse进行代码修改,也可以先使用自己熟悉的代码编辑器。
温度采集代码
初始化温度采集所用的ADC设备,再采集温度。
//初始化adc设备voidb3950_init(void){/*createadcdevice,gethandle*/temper_adc=(tuya_adc_t*)tuya_driver_find(TUYA_DRV_ADC,TUYA_ADC2);/*adc_devcfg*/TUYA_ADC_CFG(temper_adc,TUYA_ADC2,0);/*adc_devinit*/tuya_adc_init(temper_adc);}//获取温度值intcur_temper_get(){intRt=0;floatRp=100000;floatT2=273.15+25;floatBx=3950;floatKa=273.15;inttemp=0;/*CollectADdataandstoreitinadc_buffer*/tuya_adc_convert(temper_adc,&adc_buf,1);/*req_val(0-4096)-V(0-2.4)*/volt=(float)adc_buf*2.4/4096;//volt=adc_buf;Rt=(3.3-volt)*20000/volt;PR_DEBUG("Rt:%d",Rt);temp=(int)(1/(1/T2+log(Rt/Rp)/Bx)-Ka+0.5);PR_DEBUG("volt:%f",volt);returntemp;}温度显示代码
温度显示流程为每2秒采集一次温度,并将温度值上报到云端。
利用蜂鸣器报警,当测得温度高于105摄氏度时说明水壶已经没水了,此时驱动蜂鸣器响动并上报干烧状态到云端。
功能简述
智能烧水壶设备上提供煮沸、保温两个按键。
离线控制代码
为了后期的程序扩展,采用回调函数注册的方式实现按键控制。
按键驱动代码如下:
主线程代码。按键或云端触发会控制水壶处于不同的模式,此时主线程根据不同模式进行对应的处理。
实现云端控制首先要实现dp数据触发的执行函数,下面我们将实现这些执行函数
实现煮沸控制的执行函数
此执行函数需要根据下发的DP数据控制水壶的煮沸功能,开启和关闭触发后要实现的具体功能如下:
开启:
关闭
具体代码实现,需要在kettle_app.c中增加执行函数
实现设定保温温度的函数
设定保温温度的函数是通过云端设定进行触发,触发后要实现的具体功能如下:
staticvoiddp_keep_warm_set_handle(INintvalue){set_kettle_keep_warm_temper(value);//设置保温温度,注意设定保温温度不会直接触发保温report_one_dp_status(DP_TEMP_SET);//上报dp_keep_warm_set这个dp点的设定值到云端}//保温温度设置范围为45~90摄氏度voidset_kettle_keep_warm_temper(intvalue){if(44 实现保温控制的执行函数 云端可以控制界面上的保温按钮决定是否开启保温,触发后要实现的具体功能如下: 关闭:切换烧水壶的工作状态到自然模式(无操作) staticvoiddp_keep_warm_handle(INBOOL_TbONOFF){ //保温开启,水质模式为自来水模式,烧水壶进入保温1模式(先煮沸再保温)if(bONOFF==TRUE&&(get_water_type()==tap_water)){set_kettle_work_status(keep_warm_mode1);set_dp_keep_warm_switch(TRUE);set_dp_boil_value(FALSE);PR_DEBUG("keep_warm_mode1");//保温开启,水质模式为纯净水模式,烧水壶进入保温2模式(直接保温)}elseif(bONOFF==TRUE&&(get_water_type()==clear_water)){set_kettle_work_status(keep_warm_mode2);set_dp_keep_warm_switch(TRUE);set_dp_boil_value(FALSE);PR_DEBUG("keep_warm_mode2");}else{//关闭保温set_kettle_work_status(nature);set_dp_keep_warm_switch(FALSE);PR_DEBUG("closekeepwarm");}//上报dp数据report_one_dp_status(DP_KEEP_WARM);report_one_dp_status(DP_BOIL);}此时保温设置的执行函数已实现。 实现水质选择设定函数 云端可以控制水质选择,触发后要实现的具体功能如下: 具体代码实现,需要在kettle_app.c中增加执行函数。 voiddp_water_type_handle(intvalue){if(value==tap_water||value==clear_water){//设置水质模式tuya_hal_mutex_lock(mutex);kettle_work_information.water_mode=value;water_type_s.value=value;tuya_hal_mutex_unlock(mutex);//此时水壶处于自来水保温状态,且此时云端控制水质模式切换为纯净水,水壶状态切换到纯净水保温模式if(get_kettle_work_status()==keep_warm_mode1&&get_water_type()==clear_water){set_kettle_work_status(keep_warm_mode2);//此时水壶处于纯净水保温状态,且此时云端控制水质模式切换为自来水,水壶状态切换到自来水保温模式}elseif(get_kettle_work_status()==keep_warm_mode2&&get_water_type()==tap_water){set_kettle_work_status(keep_warm_mode1);}PR_DEBUG("waterchoose:%d",value);report_one_dp_status(DP_WATER_TYPE);}}//获取当前水壶的工作状态intget_kettle_work_status(){returnkettle_work_information.status;}//获取当前的水质模式intget_water_type(){returnkettle_work_information.water_mode;}此时水质选择设定函数已实现。 云端定时煮沸功能 云定时煮沸开启: 云端控制代码实现 上面已经实现了相应的执行函数,下面我们将实现App下发DP数据控制设备的功能。 云端控制代码实现: 指示灯驱动控制 指示灯作为烧水壶状态指示和配网指示,驱动形式为电平驱动,基本设置如下: 代码实现: 继电器的通断用于控制加热电路,驱动形式为电平驱动,基本设置如下: #defineP_RELAY GPIO_PD3/*P14*//*继电器端口初始化*/voidrelay_init(void){ gpio_set_func(P_RELAY,AS_GPIO); gpio_set_output_en(P_RELAY,1); gpio_write(P_RELAY,0);}/*继电器通断控制*/voidset_relay(boolb_on_off){staticbools_last_status=0;if(s_last_status!=b_on_off){if(b_on_off==ON){ gpio_write(P_RELAY,1);}else{ gpio_write(P_RELAY,0);}s_last_status=b_on_off;}}蜂鸣器驱动控制 蜂鸣器作为按键提示音和故障报警提示音,驱动形式为方波信号驱动,基本设置如下: 为了后期的程序扩展,采用注册回调函数的方式实现按键检测与处理 a.按键注册信息及初始化 用户可注册内容设定如下: #defineKEY1_CODE 0x01#defineKEY2_CODE 0x02#defineKEY_PRESS_SHORT_TIME50然后编写定时循环的按键状态扫描函数和按键处理函数: a.温度采集 NTC端口设置如下: a.初始化函数与主循环函数的编写 每2秒更新一次温度值,如果发生温度变化,则将数据更新上报至云端,并进行一次故障检测;如果故障状态变化,更新故障信息至云端: 按键信息注册如下: 根据功能设定,我们将烧水壶的工作模式拆分为以下4个模式: 要实现和云端进行数据交互,首先要使设备配网。根据功能简述中介绍可知,我们需要先进行以下配网检测处理: 下面我们介绍配网状态检测与处理的实现过程。 a.在上电初始化时,先对蓝牙连接状态进行判断和标记: #defineTIME_ALLOW_CONNECT(3*60*1000)/*3min*/staticuint32_tsg_ble_tm=0;FLAG_BITg_kettle_flag;#defineF_BLE_BONDINGg_kettle_flag.bit0#defineF_WAIT_BLE_CONNg_kettle_flag.bit1/*等待蓝牙连接*/staticvoidwait_ble_connect(void){ /*3分钟定时*/if(!clock_time_exceed(sg_ble_tm,TIME_ALLOW_CONNECT*1000)){return;}F_WAIT_BLE_CONN=CLR;/*关闭等待连接标志*/set_led_green_mode(LED_MODE_FIX);/*绿灯停止闪烁*/bls_ll_setAdvEnable(0);/*关闭蓝牙广播*/}/*更新蓝牙状态*/staticvoidupdate_ble_status(void){if(F_BLE_BONDING==CLR){ /*未绑定?*/if(F_WAIT_BLE_CONN==SET){ /*等待连接标志打开?*/wait_ble_connect(); /*等待蓝牙连接*/}}}c.在蓝牙连接状态发生改变时做如下处理: /*蓝牙连接状态改变时的处理函数*/voidtuya_app_kettle_ble_connect_status_change_handler(tuya_ble_connect_status_tstatus){if(status==BONDING_CONN){/*蓝牙已连接?*/report_all_dp_data();/*上报所有DP数据,保证APP显示与设备状态一致*/if(F_WAIT_BLE_CONN==SET){/*等待连接标志打开?*/F_BLE_BONDING=SET;/*标记为已绑定*/F_WAIT_BLE_CONN=CLR;/*停止配网等待*/set_led_green_mode(LED_MODE_FIX);/*停止闪烁*/}}if(status==UNBONDING_UNCONN){/*设备被解绑?*/F_BLE_BONDING=CLR;/*标记为未绑定*/bls_ll_setAdvEnable(0);/*停止蓝牙广播*/}}/*处理BLESDK消息的callback函数[tuya_ble_app_demo.c]*/staticvoidtuya_cb_handler(tuya_ble_cb_evt_param_t*event){ ...caseTUYA_BLE_CB_EVT_CONNECTE_STATUS: /*在状态改变事件发生时调用*/tuya_app_kettle_ble_connect_status_change_handler(event->connect_status);TUYA_APP_LOG_INFO("receivedtuyableconncetstatusupdateevent,currentconnectstatus=%d",event->connect_status);break;...}d.保温键长按5秒时,重新尝试等待配网的执行函数如下: 在设备配网后,就可以使用APP来控制设备和查看设备上报的数据,下面是数据上报的实现过程。 在App上改变设备状态时,会从云端下发控制数据,设备在接收到数据后进行如下处理,即可实现云端任务。 预约功能可通过云定时功能实现,即在涂鸦IoT平台上产品开发的功能定义页中,打开高级云功能的云定时功能: 至此智能恒温烧水壶就完成了,它可以APP远程控制,按键控制。具有水质模式切换,保温温度设定,定时烧水,故障告警等功能。在这款智能烧水壶的基础上还有很多功能可以深入开发,使体验更加人性化,智能化。同时您可以基于涂鸦IoT平台丰富它的功能,也可以更加方便的搭建更多智能产品原型,加速智能产品的开发流程。