目錄
電容觸摸界面
手勢識別
網(wǎng)絡(luò)同步
RTduino使用
使用方法
項目源碼
1 電容觸摸界面
利用 Psoc6-evaluationkit-062S2 的 CapSense 模塊設(shè)計一個交互式觸摸面板。
可以通過觸摸面板調(diào) 整PWM的頻率使蜂鳴器播放不同的音調(diào)(需要映射do (1), re (2), mi (3), fa (4) 音符)+ 調(diào)整 PWM 信號的占空比控制 LED 指示燈。
1.1 Capsense觸控
在Slider例程上修改,根據(jù)觸摸位置(x)判斷音符、手勢
slider_touch_info = CyCapSense_GetTouchInfo(CY_CAPSENSE_LINEARSLIDER0_WDGT_ID, &cy_capsense_context); slider_touch_status = slider_touch_info->numPosition; slider_pos = slider_touch_info->ptrPosition->x; intx=slider_pos; if(RT_NULL != slider_touch_status) { intsenor_id=detect_sensor_id(); char*gesture=detect_gesture(x); intnow_note_id=detect_note(x); screen_show_info(now_note_id,senor_id,gesture); rt_event_send(&buzzer_event, EVENT_TOUCH); message_json(senor_id, gesture); }
獲取sensor id,逐個判斷是否激活,返回id
Cy_CapSense_IsSensorActive(CY_CAPSENSE_LINEARSLIDER0_WDGT_ID,i,&cy_capsense_context
intdetect_sensor_id(){ for(int i=0;i<4;i++)? ? {? ? ? ? if(Cy_CapSense_IsSensorActive\(CY_CAPSENSE_LINEARSLIDER0_WDGT_ID,i,&cy_capsense_context))? ? ? ? {? ? ? ? ? ? return?i;? ? ? ? }? ? } ?}
10ms掃描一次
voidloop(void){ /* put your main code here, to run repeatedly: */ rt_sem_take(trans_done_semphr,RT_WAITING_FOREVER); /* Process all widgets */ Cy_CapSense_ProcessAllWidgets(&cy_capsense_context); /* Process touch input */ process_touch(); /* Establishes synchronized operation between the CapSense * middleware and the CapSense Tuner tool. */ Cy_CapSense_RunTuner(&cy_capsense_context); /* Initiate next scan */ Cy_CapSense_ScanAllWidgets(&cy_capsense_context); rt_thread_mdelay(10);}
1.2 音調(diào)播放

改變pwm設(shè)置播放音調(diào),求出周期,設(shè)置20%的占空比
intnotes[] = {1,262,294,330,349,392,440,494};structrt_eventbuzzer_event;//int pre_note=0;voidset_notes(inti){ uint32_tperiod_ns =1000000000/ notes[i];// ns uint32_tpulse_ns = period_ns *0.2; // 20% rt_pwm_set(buzzer_pwm, PWM_DEV_CHANNEL, period_ns, pulse_ns); rt_pwm_enable(buzzer_pwm, PWM_DEV_CHANNEL);}
沒觸摸0.2s后停止播放
voidbuzzer_entry(void*parament){ rt_uint32_t e; while(1) { if(rt_event_recv(&buzzer_event,EVENT_TOUCH,RT_EVENT_FLAG_AND|RT_EVENT_FLAG_CLEAR,0,&e)!=RT_EOK) { rt_pwm_disable(buzzer_pwm,PWM_DEV_CHANNEL); } rt_thread_mdelay(200); }}
1.3 屏幕顯示

觸摸響應(yīng)時間必須≤100ms,并且觸發(fā)的命令須顯示在 OLED 屏幕上(分辨率≥128x64 像素),并清晰標(biāo)識觸摸區(qū)域和操作。
使用ssd1306軟件包,分別顯示了音符,觸摸區(qū)域id,手勢
voidscreen_show_info(intnote,intid,char *gesture){ rt_mutex_take(screen_mutex, RT_WAITING_FOREVER); ssd1306_SetCursor(2,15); ssd1306_WriteString(note_str[note], Font_7x10, White); ssd1306_SetCursor(20,15); ssd1306_WriteChar(id+'0', Font_7x10, White); ssd1306_SetCursor(2,30); ssd1306_WriteString(gesture, Font_7x10, White); ssd1306_UpdateScreen(); rt_mutex_release(screen_mutex);}
顯示時間
voidscreen_show_time(char *time){ rt_mutex_take(screen_mutex,RT_WAITING_FOREVER); ssd1306_SetCursor(2,0); ssd1306_WriteString(time,Font_6x8,White); ssd1306_UpdateScreen(); rt_mutex_release(screen_mutex);}
1.4 LED隨滑動控制
可以通過觸摸面板調(diào)整PWM的占空比控制 LED 指示燈的亮度。
使用pwm
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, 1 * 1000 * 1000, GET_DUTY_CYCLE(brightness)); }
可以更改其它引腳



2 手勢識別
使用 CapSense 模塊實(shí)現(xiàn) 2 種不同手勢的識別(向左滑動、向右滑動)。
由于本開發(fā)板上的是slider線性滑條,在CapSense組件中,只有觸摸板widget支持手勢功能。所以通過記錄最近3次觸摸位置(x),簡單判斷是否為手勢
char *detect_gesture(int num){ staticintval[3] = {0}; val[0] =val[1]; val[1] =val[2]; val[2] = num; rt_kprintf("val: %d %d %d\n",val[0],val[1],val[2]); char *gesture =""; if(ORDER(val[0],val[1],val[2])) { rt_kprintf("left\n"); gesture ="left "; } elseif (ORDER(val[2],val[1],val[0])) { rt_kprintf("right\n"); gesture ="right"; } else { gesture =" "; } returngesture;}
3 網(wǎng)絡(luò)同步
通過網(wǎng)絡(luò)模塊使用MQTT協(xié)議同步NTP時間并顯示到OLED上(格式:YYYY-MM-DD HHMMSS)。并將觸摸和手勢數(shù)據(jù)(包括:觸摸區(qū)域 ID、手勢類型)傳輸?shù)椒?wù)器端顯示。
3.1 rw007


3.2 mqtt
使用pahomqtt軟件包, 使用參考樣例的mqtt_start函數(shù)
設(shè)置好topic等宏
#defineMQTT_URI"tcp://broker.emqx.io:1883"#defineMQTT_SUBTOPIC"abc/sub"#defineMQTT_PUBTOPIC"abc/pub"#defineMQTT_WILLMSG"Goodbye!"#defineMQTT_USERNAME"name"#defineMQTT_PASSWORD"password"

可以等待網(wǎng)絡(luò)連接后再連接mqtt
intcheck_network(void){ structnetdev *netdev =netdev_get_by_family(AF_INET); return(netdev &&netdev_is_link_up(netdev)/* && netdev_is_internet_up(netdev) */);}
用RyanJson軟件包生成json數(shù)據(jù),mqtt發(fā)送到相應(yīng)的topic
char*message_json(inttouch_area_id,char*gesture_type)
{ RyanJson_t root; root =RyanJsonCreateObject(); RyanJsonAddIntToObject(root,"Touch area ID", touch_area_id); RyanJsonAddStringToObject(root,"Gesture type",gesture_type ); rt_uint32_tlen; tmp_json =RyanJsonPrint(root,650, RyanJsonTrue, &len); intret =paho_mqtt_publish(&client, QOS1, MQTT_PUBTOPIC, tmp_json); rt_kprintf("json:%s\n",tmp_json); RyanJsonDelete(root); returntmp_json;}
3.3 ntp
在netutils軟件包中使能ntp
每秒更新時間
staticvoidtime_thread_entry(void *parameter){ structtm *tm; while(1) { //獲取當(dāng)前時間 time_t now =time(NULL); tm =localtime(&now);//使用UTC時間 strftime(time_buf, sizeof(time_buf),"%Y-%m-%d %H:%M:%S", tm); screen_show_time(time_buf); //線程睡眠1秒鐘 rt_thread_mdelay(1000); }}
4 RTduino使用
4.1 RT-Thread多任務(wù)集成
利用 Psoc6 的 RTduino 支持(RT-Thread 的 Arduino 兼容生態(tài)系統(tǒng))來實(shí)現(xiàn)實(shí)時觸摸和手勢處理

4.2 使用.c文件中的函數(shù)
applications/arduino_main.cpp: :undefinedreference to`'
在arduino_main.cpp中調(diào)用其它文件的函數(shù)時,提示說未定義,要在對應(yīng)頭文件中添加extern "C"
#ifdef__cplusplusextern"C"{#endif#ifdef__cplusplus}#endif
5 使用方法
5.1 線程使用
buzzer線程,用于停止播放音調(diào)
time線程,用于更新屏幕顯示時間
rtduino loop,用于觸摸識別,與數(shù)據(jù)處理顯示
mqtt線程,用于等待網(wǎng)絡(luò)連接和啟動mqtt客戶端
5.2 軟件包使用

6 項目源碼
Gitee倉庫地址(https://gitee.com/dgjames/psoc6project)
RT-Thread Github 開源倉庫,歡迎撒個星(Star)支持,更期待你的代碼貢獻(xiàn):https://github.com/RT-Thread/rt-thread
-
英飛凌
+關(guān)注
關(guān)注
68文章
2546瀏覽量
143060 -
觸摸
+關(guān)注
關(guān)注
8文章
200瀏覽量
65820 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1627瀏覽量
45049 -
psoc6
+關(guān)注
關(guān)注
1文章
10瀏覽量
5243
發(fā)布評論請先 登錄
PSoC6-CY8CKIT-062S2-43012開發(fā)板簡介
【資料下載】英飛凌PSoC 6 RTT物聯(lián)網(wǎng)開發(fā)板
【英飛凌PSoC 6 RTT開發(fā)板試用】
【英飛凌PSoC 6 RTT開發(fā)板試用】以搭積木方式實(shí)現(xiàn)簡單的互聯(lián)型家庭網(wǎng)關(guān)
【英飛凌PSoC 6 RTT開發(fā)板試用】+開箱測試
RT-Thread文檔_英飛凌 Psoc6-CY8CKIT-062S2-43012上手指南
英飛凌聯(lián)合 RT-Thread 發(fā)布 PSoC? 62 with CAPSENSE ? evaluation kit開發(fā)板
基于RT-Thread的家庭智能家居系統(tǒng)的控制平臺設(shè)計
基于PSOC6開發(fā)板構(gòu)建的智能小車
如何設(shè)計一種基于PSOC6的人體交互式智能家居系統(tǒng)呢?
英飛凌Psoc6-evaluationkit-062S2測評1_LED
【PSoC?62 for RT-Thread】RT-Thread攜手英飛凌舉辦嵌入式網(wǎng)絡(luò)應(yīng)用開發(fā)沙龍,圓滿落幕!
RT-Thread開發(fā)者大會系統(tǒng)控制分論壇動手實(shí)踐指南
【英飛凌測評】英飛凌PSoC? 62開發(fā)板試用報告-LCD ILI9341 8080 DEMO
基于PSOC6的智能環(huán)境監(jiān)控系統(tǒng)
基于RT-Thread與英飛凌Psoc6-evaluationkit-062S2的智能觸摸與手勢系統(tǒng) | 技術(shù)集結(jié)
評論