欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>智能頸部按摩器原型開(kāi)源分享

智能頸部按摩器原型開(kāi)源分享

2023-06-15 | zip | 0.00 MB | 次下載 | 2積分

資料介紹

描述

概述

無(wú)論是因?yàn)樗霉止值?、?a href='http://www.delux-kingway.cn/v/tag/107/' target='_blank' class='arckwlink_none'>手機(jī)太多,還是彎腰坐著盯著電腦看幾個(gè)小時(shí),我們大多數(shù)人都會(huì)時(shí)不時(shí)地處理脖子上的扭結(jié)。緩解頸部疼痛的最佳方法之一是按摩療法。因此,我們改造了傳統(tǒng)的頸部按摩器,讓它變得聰明,輕松消除壓力。

頸部放松按摩器結(jié)合了中國(guó)傳統(tǒng)理療中的多種按摩手法,采用低頻電脈沖技術(shù)模擬真人按摩。能促進(jìn)局部血液循環(huán),有效緩解頸部疲勞和肌肉緊張。由于我們已經(jīng)使這款按摩器支持物聯(lián)網(wǎng),因此我們只需一部手機(jī)即可控制它。

特征

  • 五種模式:智能、放松、主動(dòng)、敲擊和刮擦。不同的模式讓您體驗(yàn)不同的按摩樂(lè)趣。
  • 15級(jí)強(qiáng)度由弱到強(qiáng):您可以自由調(diào)節(jié)適合自己的強(qiáng)度。
  • 三級(jí)溫度調(diào)節(jié):高、低、關(guān)。持續(xù)的熱按摩可以放松血管和頸部肌肉。

硬件

?
pYYBAGNof1-AFuF2AACpjHWAGVE051.png
?

腳步

第 1 步:硬件設(shè)計(jì)

使用涂鴉智能智能生活應(yīng)用程序實(shí)現(xiàn)遠(yuǎn)程控制,我們使用涂鴉的BTU 網(wǎng)絡(luò)模塊作為微控制器。

電路由BTU模塊、電池充電、語(yǔ)音播放、按鍵檢測(cè)、低頻脈沖電流輸出、加熱、溫度檢測(cè)等部分組成。

1.微控制器

?
pYYBAGNof2SARPA4AAM9XBe8QyM624.png
?

?

poYBAGNof2eAOt-rAALzh_FfYM0081.png
?

?

2. 功能模塊

NTC熱敏電阻是環(huán)氧樹(shù)脂涂層的小尺寸,用于溫度測(cè)量。它具有電阻范圍廣、精度穩(wěn)定性和靈敏度高、響應(yīng)速度快等特點(diǎn)。對(duì)于熱敏電阻的參數(shù),我們使用:B=3950,R=10k。

?

poYBAGNof2qANsVWAAAZsy4jOv4452.png
?

?

  • 溫度與電阻的關(guān)系

?

pYYBAGNof3CAc4iBAAUgcjr7q7k403.png
?
  • 溫度檢測(cè)電路

?

pYYBAGNof3KAIMtJAAAduF__51A240.png
?

模塊的 ADC 收集電壓并將其轉(zhuǎn)換為溫度值。然后,模塊相應(yīng)地調(diào)整溫度。

  • 加熱絲

白線是發(fā)熱絲。

?

pYYBAGNof3WATHL2AAAktQlmfig990.png
?
  • 加熱回路

?

poYBAGNof3eAakL5AAApAkKkTOM072.png
?

模塊上的P7輸出PWM波來(lái)調(diào)節(jié)電熱絲的溫度。當(dāng) P7 輸出低電平時(shí),加熱關(guān)閉。當(dāng) P7 以某個(gè)頻率輸出方波時(shí),發(fā)熱處于低水平。當(dāng) P7 輸出高電平時(shí),加熱處于高電平。

  • 揚(yáng)聲器

?

pYYBAGNof3qALh6DAAAWN6yffdc095.png
?
?
poYBAGNof36AE5KGAABmKRMDbv8316.png
?

在單線串口模式下,BTU模塊可以通過(guò)DATA線控制和發(fā)送數(shù)據(jù)到語(yǔ)音芯片,進(jìn)行語(yǔ)音播放、停止、循環(huán)等。

  • 電極墊

按摩器上有兩個(gè)不銹鋼電極墊。

?

pYYBAGNof4CAd6JSAAA5n56qYSk792.png
?

?

poYBAGNof4OAZ-rNAABqiHSZCQw393.png
?

低頻脈沖電流輸出

P24 和 P9 輸出的脈沖是對(duì)稱(chēng)的。這兩個(gè)引腳不能同時(shí)輸出高電平。

  • 當(dāng)P24輸出高電平,P9輸出低電平時(shí),Q2導(dǎo)通,Q5截止。由于人體的阻抗,Q4、Q6、Q8 截止,Q3 處于飽和(導(dǎo)通狀態(tài))。

P17 輸出高電平。它輸出兩個(gè)低頻對(duì)稱(chēng)脈沖。

  • 當(dāng)P24輸出低電平,P9輸出高電平時(shí),Q2截止,Q5導(dǎo)通。Q4、Q6 和 Q8 處于導(dǎo)通狀態(tài),Q3 處于截止?fàn)顟B(tài)。

P17 輸出低電平。它輸出兩個(gè)低頻對(duì)稱(chēng)脈沖。

?

P24 和 P9 輸出的脈沖是不對(duì)稱(chēng)的。PB5 和 PCO 都輸出高電平。

  • 當(dāng) Q5、Q2 和 Q6 處于導(dǎo)通狀態(tài)時(shí),Q4 和 Q3 處于導(dǎo)通狀態(tài)。這樣,三極管可能會(huì)燒壞。
  • S8050晶體管的開(kāi)/關(guān)取決于二極管D4正端的電壓,該電壓由通過(guò)二極管的電流決定。因此,我們可以提供過(guò)流保護(hù)。一旦通過(guò)二極管D4的電流超過(guò)10mA,D4的壓降就會(huì)超過(guò)0.7V,三極管Q2就會(huì)導(dǎo)通。
  • 模塊上的P24和P9可以輸出不同頻率的脈沖信號(hào)(P24和P9輸出的脈沖是對(duì)稱(chēng)的),針對(duì)各種模式產(chǎn)生不同的波形。

二極管D4參數(shù)

  • 電池

我們買(mǎi)了一塊700毫安的鋰聚合物電池,額定電壓為3.7V,充電電壓為4.2V。內(nèi)置保護(hù)電路,防止過(guò)充、過(guò)放、過(guò)流、短路。

?

poYBAGNof4aAdr9-AAA0y-5FZCk806.png
?

尺寸:10 毫米(厚)x 23 毫米(寬)x 30 毫米(長(zhǎng))

?

poYBAGNof4iAaxZ_AAC77XtDlxg867.png
?

電池充電器電路和升壓電路

  • 電池充電器電路:XT2051是單節(jié)鋰離子電池的恒流恒壓充電器電路。該組件包括一個(gè)內(nèi)部功率晶體管,不需要外部電流檢測(cè)電阻器和阻塞二極管。XT2051 需要最少的外部元件并符合 USB 總線規(guī)范。它非常適合現(xiàn)場(chǎng)的便攜式應(yīng)用。
  • 升壓電路原理:當(dāng)三極管MMBT5551導(dǎo)通時(shí),肖特基二極管D1處于反向偏置狀態(tài)。通過(guò)電感器 L1 到晶體管 Q1 的電流完成了一個(gè)電路。施加到升壓電感器的輸入電壓被轉(zhuǎn)換成磁能進(jìn)行存儲(chǔ)。當(dāng)三極管Q1關(guān)斷時(shí),肖特基二極管D1正向偏置,電感中的磁能轉(zhuǎn)化為電能。該電壓與輸入電壓一起為負(fù)載供電并為輸出電容器 C6 充電。需要幾個(gè)脈沖來(lái)提供足夠的能量來(lái)增加輸出電壓。

?

第 2 步:創(chuàng)建產(chǎn)品

本節(jié)介紹如何在涂鴉IoT平臺(tái)上創(chuàng)建智能頸椎按摩器。有關(guān)詳細(xì)信息,請(qǐng)參閱創(chuàng)建產(chǎn)品。

1.登錄涂鴉IoT平臺(tái)。

2.在標(biāo)準(zhǔn)類(lèi)別選項(xiàng)卡上,單擊運(yùn)動(dòng)與健康>運(yùn)動(dòng)與健康。填寫(xiě)產(chǎn)品信息并選擇藍(lán)牙作為協(xié)議。

pYYBAGNof42AEltCAACLqE8oCg0142.png
?

3.點(diǎn)擊創(chuàng)建后,出現(xiàn)添加標(biāo)準(zhǔn)函數(shù)對(duì)話框。保留三個(gè)選定的所需功能。自定義函數(shù)部分中,單擊添加并創(chuàng)建兩個(gè)函數(shù)。有關(guān)要設(shè)置的項(xiàng)目,請(qǐng)參見(jiàn)下面的屏幕截圖。

poYBAGNof5CAaMS9AAEItdIVats167.png
?

4.在設(shè)備面板步驟中,選擇DIY風(fēng)格面板。然后,進(jìn)入硬件開(kāi)發(fā),選擇涂鴉標(biāo)準(zhǔn)模塊 SDKBT3L 藍(lán)牙模塊。單擊屏幕右側(cè)的獲取 10 個(gè)免費(fèi)許可證。您將在編碼中獲得 UUID、密鑰和 MAC 地址。

第 3 步:獲取 SDK 并設(shè)置 IDE

  • GitHub存儲(chǔ)庫(kù)將此存儲(chǔ)庫(kù)tuya_ble_sdk_Demo_Project_tlsr8253克隆到您的本地計(jì)算機(jī)并檢查README.md.
  • 設(shè)置IDE模塊上的芯片是TLSR825x,所以我們使用Telink IDE進(jìn)行開(kāi)發(fā)。轉(zhuǎn)到適用于 TLSR8 芯片的 IDE 并下載 IDE 并查看項(xiàng)目導(dǎo)入指南。
poYBAGNof5OAA9HUAACuIaGZpsM149.png
?

安裝 IDE 后,導(dǎo)入您的項(xiàng)目。

  • 用項(xiàng)目開(kāi)發(fā)1.編輯產(chǎn)品ID。
pYYBAGNof5mAAZ8YAAHRxDIhXos731.png
?

2.編輯auth_key、device_idmac

?

poYBAGNof5yAIULDAAIkjvXXIVk068.png
?

?

poYBAGNof6CAHfFpAAIXDpWwptw205.png
?

3.編譯代碼。

?

pYYBAGNof6KARGHYAAHOnK8-eLY039.png
?

?

pYYBAGNof6iAa9TpAAF4JkXG6Qc535.png
?

1.8258選擇芯片類(lèi)型和EVK下載模式。單擊文件并選擇bin要下載到開(kāi)發(fā)板的文件,該文件位于tuya_ble_sdk_Demo_Project_tlsr8253\telink_kite_ble_sdk_v3.4.0_20190816\ble_sdk_multimode\8258_module\8258_module.bin.

2.下載后點(diǎn)擊Reset運(yùn)行。

3.我們使用泰凌的作家。將板上的 SWM 接頭連接到寫(xiě)入器上的 SWM 接頭。

?

poYBAGNof62AMdKYAAVnWCxL7JU017.png
?

?

注意日志打印的引腳默認(rèn)為TL_C2,波特率為230400。由于我們沒(méi)有足夠的I/O,我們將日志打印的引腳改為TL_D3。您可以在編輯后編譯代碼。配置文件位于tuya_ble_sdk_Demo_Project_tlsr8253\telink_kite_ble_sdk_v3.4.0_20190816\ble_sdk_multimode\vendor\8258_module\app_config.h. 當(dāng) GPIO 讀高時(shí),它返回一個(gè)大于 1 的值,可能是 1、2 或 128。

在第 47 行:

#define DEBUG_INFO_TX_PIN				GPIO_PC2 

變成:

#define DEBUG_INFO_TX_PIN				GPIO_PD3

第四步:軟件設(shè)計(jì)

電脈沖按摩器采用中國(guó)傳統(tǒng)物理療法的電脈沖模擬,可促進(jìn)血液循環(huán),放松局部肌肉,電極墊設(shè)計(jì)達(dá)到雙重按摩效果。

我們實(shí)現(xiàn)了五種脈沖模式:智能、放松、主動(dòng)、敲擊和刮擦。

脈沖模式

模式 時(shí)間間隔 放松模式 30 毫秒 主動(dòng)模式 20 毫秒 輕敲模式 40 毫秒 抓取模式 50 毫秒 智能模式 20 毫秒、30 毫秒、40 毫秒或 50 毫秒隨機(jī)生成。

  • 原理圖,示意圖

P9 和 P24 控制三極管的開(kāi)/關(guān)以產(chǎn)生電脈沖并啟用不同的脈沖模式。

?

poYBAGNof4OAZ-rNAABqiHSZCQw393.png
?

?

  • 波形圖

P9 和 P24 輸出 PWM 信號(hào),正占空比為 26.5%,周期為 1 ms。注意這兩個(gè)引腳不能同時(shí)輸出高電平。否則三極管會(huì)燒壞。

以 30 ms 的間隔一次輸出四個(gè) PWM 波,以實(shí)現(xiàn)放松模式。

pYYBAGNof7KAQ48uAAFga_QesqQ854.png
?

一個(gè)脈沖有四個(gè) PWM 波,如上圖所示。以 30 ms 的間隔產(chǎn)生脈沖。

pYYBAGNof7aAWQzpAAFBuNsImOg538.png
?
  • 模式實(shí)現(xiàn)

五種脈沖模式是通過(guò)改變脈沖間隔來(lái)實(shí)現(xiàn)的,如下表所示。

pYYBAGNof7iAeeRVAAAqy_5ACcI137.png
?

?

實(shí)現(xiàn)代碼

引腳初始化

void pattern_pin_init(void)
{
gpio_set_func(PATTERN_PIN_A, AS_PWM1_N);
gpio_set_func(PATTERN_PIN_B, AS_PWM5);
gpio_set_func(HEAT_PIN, AS_GPIO);
gpio_set_output_en(PATTERN_PIN_A, 1);
gpio_set_output_en(PATTERN_PIN_B, 1);
gpio_set_output_en(HEAT_PIN, 1);
gpio_write(PATTERN_PIN_A, 0);
gpio_write(PATTERN_PIN_B, 0);
//    gpio_write(HEAT_PIN, 1);
//PWM0 1ms cycle  26.5% duty 	 1,000 Hz
pwm_set_mode(PWM1_ID, PWM_NORMAL_MODE);
pwm_set_clk(CLOCK_SYS_CLOCK_HZ, CLOCK_SYS_CLOCK_HZ);
pwm_set_phase(PWM1_ID, 0);   // No phase at PWM beginning
pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
pwm_polo_enable(PWM1_ID, 1);  // Enable the PWM polarity
pwm_start(PWM1_ID);
// PWM5 1 ms cycle, 26.5% duty  1,000 Hz
pwm_set_mode(PWM5_ID, PWM_NORMAL_MODE);
pwm_set_clk(CLOCK_SYS_CLOCK_HZ, CLOCK_SYS_CLOCK_HZ);
pwm_set_phase(PWM5_ID, 0);   // No phase at PWM beginning
pwm_set_cycle_and_duty(PWM5_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );
}

GPIO_PC1 (PATTERN_PIN_A)和電平調(diào)整引腳GPIO_PC2 (BOOST_PIN)使用 PWM 功能。管腳GPIO_PC1 (PATTERN_PIN_A)只支持PWM_0通道,所以GPIO_PC2 (BOOST_PIN)使用PWM_0通道。GPIO_PC1 (PATTERN_PIN_A)使用AS_PWM1_N通道,因此您只需要編輯pwm_polo_enable(PWM1_ID, 1)即可更改 PWM 極性。

?

poYBAGNof7uAKyIHAABzMqUtM2E925.png
?

?

由于 PWM 波的數(shù)量和脈沖間隔是通過(guò)時(shí)間延遲來(lái)實(shí)現(xiàn)的,因此會(huì)產(chǎn)生誤差。程序運(yùn)行在裸機(jī)上,而不是 RTOS,所以這個(gè)函數(shù)必須while(1)循環(huán)運(yùn)行。

void switching_pattern(unsigned char pat)
{
if (pat > 4) {
TUYA_APP_LOG_ERROR("*********No such model!!!**********");
}
switch (pat) {
case relieve:
pwm_start(PWM5_ID);
sleep_us(450);	 	// Delay 480 μs to prevent the triode from being burned out.
pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );
sleep_us(5 * TIME_MS);
pwm_stop(PWM5_ID);
pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
sleep_us(30 * TIME_MS);
break;
case vitality:
pwm_start(PWM5_ID);
sleep_us(450);
pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );
sleep_us(5 * TIME_MS);
pwm_stop(PWM5_ID);
pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
sleep_us(20 * TIME_MS);
break;
case hammering:
pwm_start(PWM5_ID);
sleep_us(450);
pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );
sleep_us(5 * TIME_MS);
pwm_stop(PWM5_ID);
pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
sleep_us(40 * TIME_MS);
break;
case scraping_therapy:
pwm_start(PWM5_ID);
sleep_us(450);
pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );
sleep_us(5 * TIME_MS);
pwm_stop(PWM5_ID);
pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
sleep_us(50 * TIME_MS);
break;
case intelligent:
pwm_start(PWM5_ID);
sleep_us(450);
pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (265 * CLOCK_SYS_CLOCK_1US) );
sleep_us(5 * TIME_MS);
pwm_stop(PWM5_ID);
pwm_set_cycle_and_duty(PWM1_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
sleep_us(((rand() % 4 + 2) * 10) * TIME_MS);	 // 20 ms, 30 ms, 40 ms, or 50 ms is generated randomly.
break;
default:
break;
}
return;
}

我們已經(jīng)實(shí)現(xiàn)了五種脈沖模式,接下來(lái)是語(yǔ)音提示、加熱和電平調(diào)節(jié)。

1.語(yǔ)音提示

WTN6是一款多功能單語(yǔ)音芯片,語(yǔ)音合成4位MCU。

?

poYBAGNof76AGhi8AAD9fFd-L4M516.png
?
  • 工作電壓:2.8V至5.2V
  • 在待機(jī)模式下,靜態(tài)電流小于 5 μA。
  • 帶有內(nèi)置電阻器 (+/- 1%) 的精確嵌入式振蕩器。支持低電壓復(fù)位(LVR=1.8V)和看門(mén)狗復(fù)位。
  • 高品質(zhì) 12 位 PWM 直接驅(qū)動(dòng) 8Ω 0.5W 揚(yáng)聲器或蜂鳴器。DAC轉(zhuǎn)換器音頻輸出可以通過(guò)外部音頻放大器放大音量。
  • 內(nèi)置看門(mén)狗。
  • 串口控制方式:?jiǎn)尉€串口和兩線串口。最多可加載 224 條語(yǔ)音。
  • 支持忙碌狀態(tài)下的輸出功能。

?

pYYBAGNof8CAVzx8AABXtJVRtrc694.png
?

單線串行通訊

在單線串口模式下,BTU模塊可以通過(guò)DATA線控制和發(fā)送數(shù)據(jù)到語(yǔ)音芯片,進(jìn)行語(yǔ)音播放、停止、循環(huán)等。

引腳 描述 PA1 DATA PA2 BUSY 數(shù)據(jù)(十六進(jìn)制) 功能 00H 不播放音頻。01H 第一次音頻播放。02H 第二次音頻播放。…… …… DFH 第 222 段音頻播放。

  • 引腳配置
poYBAGNof8WAD3PcAAAMzeFN34g257.png
?
  • 單行音頻地址關(guān)聯(lián)

?

pYYBAGNof8eAQY17AAAnL2Qr5Sk104.png
?

?

單線串口時(shí)序圖

將數(shù)據(jù)線拉低至 5ms,然后發(fā)送 8 位數(shù)據(jù),先低位,后高位。用高電平與低電平的比值來(lái)表示每個(gè)數(shù)據(jù)位的值。

?

poYBAGNof8mAVuXvAAA2fc97RpA023.png
?

?

pYYBAGNof8yAODXeAAA4ykPlYF8383.png
?

?

實(shí)現(xiàn)代碼

  • 引腳初始化
void voice_prompt_init(void)
{
	gpio_set_func(WTN6_DATA_PIN | WTN6_BUSY_PIN, AS_GPIO);
	gpio_set_input_en(WTN6_BUSY_PIN, 1);
	gpio_set_output_en(WTN6_DATA_PIN, 1);

	gpio_write(WTN6_BUSY_PIN, 0);
}

?

  • 音頻播放
void voice_playing(uint8_t sb_data)
{
	uint8_t s_data, j;
	bool b_data;
	s_data = sb_data;
	gpio_write(WTN6_DATA_PIN, 0);
		sleep_us(5000);	 	// Delay 5 ms
	b_data = s_data & 0X01;

	for (j=0; j<8; j++) {
		if (b_data == 1) {
			gpio_write(WTN6_DATA_PIN, 1);
			   sleep_us(600); // Delay 600 μs
			gpio_write(WTN6_DATA_PIN, 0);
			   sleep_us(200); // Delay 200 μs
		} else {
			gpio_write(WTN6_DATA_PIN, 1);
			   sleep_us(200); // Delay 200 μs
			gpio_write(WTN6_DATA_PIN, 0);
			   sleep_us(600); // Delay 600 μs
		}
			s_data = s_data >> 1;
			b_data = s_data & 0X01;
	}
	gpio_write(WTN6_DATA_PIN, 1);
}

指定參數(shù)voice_playing(0x01)以播放離線音頻。

2:加熱

?

poYBAGNof4OAZ-rNAABqiHSZCQw393.png
?

?

我們向上或向下拉 P7 來(lái)控制加熱的開(kāi)/關(guān)。頸部按摩器有一個(gè)內(nèi)置傳感器來(lái)檢測(cè)溫度。當(dāng)溫度超過(guò) 40°C 時(shí),將關(guān)閉加熱以避免過(guò)熱。

?

poYBAGNof3eAakL5AAApAkKkTOM072.png
?

?

int switching_heat(unsigned char warm)
{
	if (warm > 1) {
		TUYA_APP_LOG_ERROR("*********No such model!!!**********");
	}
//	printf("wram%d massage_state.heat%d\r\n", warm, massage_state.heat);

	switch (warm) {
	case strong_heat:
		TUYA_APP_LOG_INFO("**********strong_heat************");
		gpio_write(HEAT_PIN, 1);
		temperature_detection();
		break;
	case off_heat:
		TUYA_APP_LOG_INFO("**********off_heat************");
		gpio_write(HEAT_PIN, 0);
		break;

	default:
		break;
	}

	return 0;
}

?

/*Temperature detection, which is called when heating feature is in high or low level.*/
int temperature_detection(void)
{
	int Rntc = 0, Vcc = 0;
	adc_channel_checkout(channel_x1);
	Vcc = adc_sample_and_get_result();	 // Unit: mV
	Rntc = Vcc*R25 / (3300-Vcc);
	TUYA_APP_LOG_INFO("Rntc_val=%dΩ", Rntc);
	if (Rntc >= 5311) {  	// NTC resistance value is 5311Ω at 40°C.
		TUYA_APP_LOG_WARNING("********High Temperature Warning!!!********");
		 gpio_write(HEAT_PIN, 0);  // When the temperature exceeds 40°C, heating will be turned off.
	}

	return 0;
}

有關(guān) NTC 溫度如何與電阻相關(guān)的更多信息,請(qǐng)參閱溫度和電阻之間的關(guān)系。

3:強(qiáng)度調(diào)整

按摩器提供從弱到強(qiáng)的 15 級(jí)強(qiáng)度。我們使用升壓電路實(shí)現(xiàn)此功能。

?

poYBAGNof4iAaxZ_AAC77XtDlxg867.png
?

?

我們可以改變 P8 輸出的 PWM 波的正占空比來(lái)提升電壓。下表列出了具體值。

?

pYYBAGNof9iAGPjtAAAlYb2iVuE883.png
?

強(qiáng)度通過(guò)按鈕調(diào)整。單按可增加等級(jí),雙按可降低等級(jí)。由于 SDK 配置,P8 在固件刷新后模塊復(fù)位時(shí)被拉高。因此,我們需要下拉P8。

void boost_init(void)
{
gpio_set_func(BOOST_PIN, AS_PWM0);
gpio_set_output_en(BOOST_PIN, 1);
// PWM0 1ms cycle
pwm_set_mode(PWM0_ID, PWM_NORMAL_MODE);
pwm_set_clk(CLOCK_SYS_CLOCK_HZ, BOOST_PWM_CLOCK_HZ); // When voltage is stepped up, the frequency of PWM is 16M / (968-1) ≈ 16.55 kHz.
pwm_set_phase(PWM0_ID, 0);   // No phase at PWM beginning
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (0 * CLOCK_SYS_CLOCK_1US) );
pwm_start(PWM0_ID);
}

初始化后,您可以指定占空比的值來(lái)升壓。

void switching_gear(unsigned char gears)
{
if (gears > 15) {
TUYA_APP_LOG_ERROR("*********There is no such gear!!!**********");
}
switch (gears) {
case first_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (10 * CLOCK_SYS_CLOCK_1US) );
break;
case second_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (20 * CLOCK_SYS_CLOCK_1US) );
break;
case third_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (40 * CLOCK_SYS_CLOCK_1US) );
break;
case fourth_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (60 * CLOCK_SYS_CLOCK_1US) );
break;
case fifth_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (70 * CLOCK_SYS_CLOCK_1US) );
break;
case sixth_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (90 * CLOCK_SYS_CLOCK_1US) );
break;
case seventh_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (120 * CLOCK_SYS_CLOCK_1US) );
break;
case eighth_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (160 * CLOCK_SYS_CLOCK_1US) );
break;
case ninth_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (180 * CLOCK_SYS_CLOCK_1US) );
break;
case tenth_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (220 * CLOCK_SYS_CLOCK_1US) );
break;
case eleventh_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (240 * CLOCK_SYS_CLOCK_1US) );
break;
case twelfth_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (260 * CLOCK_SYS_CLOCK_1US) );
break;
case thirteenth_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (300 * CLOCK_SYS_CLOCK_1US) );
break;
case fourteenth_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (340 * CLOCK_SYS_CLOCK_1US) );
break;
case fifteenth_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (360 * CLOCK_SYS_CLOCK_1US) );
break;
case max_gear:
pwm_set_cycle_and_duty(PWM0_ID, (u16) (1000 * CLOCK_SYS_CLOCK_1US),  (u16) (360 * CLOCK_SYS_CLOCK_1US) );
break;
default:
break;
}
}

4:斷電記憶

將設(shè)備掉電前的狀態(tài)數(shù)據(jù)寫(xiě)入可用的閃存中。當(dāng)設(shè)備再次上電時(shí)從閃存中讀取數(shù)據(jù)。這樣,設(shè)備上電后可以恢復(fù)到之前的狀態(tài)。

TLSR8253芯片的flash如下圖所示。

?

poYBAGNof9uARR3xAABJoYPGEqA283.png
?

?

0x040000to0x060000是設(shè)備可以寫(xiě)入數(shù)據(jù)的未使用空間。

1.將狀態(tài)寫(xiě)入閃存。

/***********************************************************
*   Function:  write_massage_status_to_flash
*   Input:     none
*   Output:    none
*   Return:    none
*   Notice:    Write massager status to the flash memory.
***********************************************************/
void write_massage_status_to_flash(void)
{
	Flash_Write_Buff[0] = massage_state.on_off;
	Flash_Write_Buff[1] = massage_state.pattern;
	Flash_Write_Buff[2] = massage_state.gear;
	Flash_Write_Buff[3] = massage_state.heat;

	flash_write_page(FLASH_ADDR, FLASH_BUFF_LEN, (unsigned char *)Flash_Write_Buff);

	return;
}

2.從閃存中讀取狀態(tài)。

/***********************************************************
*   Function:  write_massage_status_to_flash
*   Input:     none
*   Output:    none
*   Return:    none
*   Notice:    Write massager status to the flash memory.
***********************************************************/
void write_massage_status_to_flash(void)
{
Flash_Write_Buff[0] = massage_state.on_off;
Flash_Write_Buff[1] = massage_state.pattern;
Flash_Write_Buff[2] = massage_state.gear;
Flash_Write_Buff[3] = massage_state.heat;
flash_write_page(FLASH_ADDR, FLASH_BUFF_LEN, (unsigned char *)Flash_Write_Buff);
return;
}/**********************************************************************
*   Function:  read_massage_status_to_flash
*   Input:     none
*   Output:    none
*   Return:    none
* Notice:   Read the massager status data before power-off from the flash memory, and save it to the status struct.
**********************************************************************/
void read_massage_status_to_flash(void)
{
	flash_read_page(FLASH_ADDR, FLASH_BUFF_LEN, (unsigned char *)Flash_Read_Buff);

	// Store the data read from the flash memory into the struct.
	massage_state.on_off = Flash_Read_Buff[0];
	massage_state.pattern = Flash_Read_Buff[1];
	massage_state.gear = Flash_Read_Buff[2];
	massage_state.heat = Flash_Read_Buff[3];

	return;
}
/***********************************************************
*   Function:  erase_massage_flash
*   Input:     none
*   Output:    none
*   Return:    none
*   Notice:    Restore defaults
***********************************************************/
void erase_massage_flash(void)
{
massage_state.on_off = OFF;
massage_state.pattern = relieve;
massage_state.gear = first_gear;
massage_state.heat = off_heat;
Flash_Write_Buff[0] = OFF;
Flash_Write_Buff[1] = relieve;
Flash_Write_Buff[2] = first_gear;
Flash_Write_Buff[3] = off_heat;
flash_write_page(FLASH_ADDR, FLASH_BUFF_LEN, (unsigned char *)Flash_Write_Buff);
return;
}
  • 恢復(fù)默認(rèn)值。
/***********************************************************
*   Function:  erase_massage_flash
*   Input:     none
*   Output:    none
*   Return:    none
*   Notice:    Restore defaults
***********************************************************/
void erase_massage_flash(void)
{
	massage_state.on_off = OFF;
	massage_state.pattern = relieve;
	massage_state.gear = first_gear;
	massage_state.heat = off_heat;

	Flash_Write_Buff[0] = OFF;
	Flash_Write_Buff[1] = relieve;
	Flash_Write_Buff[2] = first_gear;
	Flash_Write_Buff[3] = off_heat;

	flash_write_page(FLASH_ADDR, FLASH_BUFF_LEN, (unsigned char *)Flash_Write_Buff);

	return;
}

5:云端控制

對(duì)于低功耗藍(lán)牙模塊,單個(gè)數(shù)據(jù)點(diǎn) (DP) 的所有數(shù)據(jù)都存儲(chǔ)在一個(gè)數(shù)組中。以 DP ID 104 為例。它的數(shù)組如下。

unsigned char mode_buf[]   = {0x68, 0x04, 0x01, 0x00};  //{DP_ID, DP_type, DP_len, DP_data}
tuya_ble_dp_data_report(mode_buf, 4);  // Data reporting function.

調(diào)用tuya_ble_dp_data_report(uint8_t *p_data,uint32_t len)將單個(gè)DP的狀態(tài)數(shù)據(jù)上報(bào)到云端。

來(lái)自移動(dòng)應(yīng)用程序的控制命令存儲(chǔ)在數(shù)組中dp_data_array[255+3]。您可以編寫(xiě)一個(gè)DP數(shù)據(jù)發(fā)送處理函數(shù),并dp_data_array[255+3]作為參數(shù)傳遞給該函數(shù)tuya_cb_handler(tuya_ble_cb_evt_param_t* event),tuya_ble_demo.c以實(shí)現(xiàn)從移動(dòng)應(yīng)用程序發(fā)送命令。

void app_dp_handle(uint8_t *dp_data)
{
printf("dp_data:%d  %d  %d  %d\r\n", dp_data[0], dp_data[1], dp_data[2], dp_data[3]);
switch (dp_data[0]) {
case 0x66:
if (dp_data[3] == strong_heat) {
massage_state.heat = strong_heat;
} else {
massage_state.heat = off_heat;
}
printf("dp_data[3]:%d massage_state.heat:%d\r\n", dp_data[3], massage_state.heat);
if (!app_flag) {
switching_heat(massage_state.heat);
}
break;
case 0x67:
printf("dp_data[3]:%d \r\n", dp_data[3]);
switch (dp_data[3]) {
case first_gear:
massage_state.gear = first_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case second_gear:
massage_state.gear = second_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case third_gear:
massage_state.gear = third_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case fourth_gear:
massage_state.gear = fourth_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case fifth_gear:
massage_state.gear = fifth_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case sixth_gear:
massage_state.gear = sixth_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case seventh_gear:
massage_state.gear = seventh_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case eighth_gear:
massage_state.gear = eighth_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case ninth_gear:
massage_state.gear = ninth_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case tenth_gear:
massage_state.gear = tenth_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case eleventh_gear:
massage_state.gear = eleventh_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case twelfth_gear:
massage_state.gear = twelfth_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case thirteenth_gear:
massage_state.gear = thirteenth_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case fourteenth_gear:
massage_state.gear = fourteenth_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case fifteenth_gear:
massage_state.gear = fifteenth_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
case max_gear:
massage_state.gear = max_gear;
if (!app_flag) {
switching_gear(massage_state.gear);
}
break;
default:
break;
}
break;
case 0x68:
if (dp_data[3] == relieve) {
massage_state.pattern = relieve;
} else if (dp_data[3] == vitality) {
massage_state.pattern = vitality;
} else if (dp_data[3] == hammering) {
massage_state.pattern = hammering;
} else if (dp_data[3] == scraping_therapy) {
massage_state.pattern = scraping_therapy;
} else {
massage_state.pattern = intelligent;
}
break;
case 0x69:
if (dp_data[3] == ON) {
massage_state.on_off = ON;
rs2255_init();
voice_prompt_init();
pattern_pin_init();
app_flag = 0;
} else {
massage_state.on_off = OFF;
power_off_init();
app_flag = 1;
}
break;
default:
break;
}
}

第 5 步:設(shè)備控制

在手機(jī)上安裝涂鴉智能應(yīng)用或智能生活應(yīng)用。它們?cè)谝苿?dòng)應(yīng)用市場(chǎng)上可用。打開(kāi)應(yīng)用程序并單擊右上角的+圖標(biāo)以配對(duì)設(shè)備。設(shè)備連接后,您可以通過(guò)應(yīng)用程序?qū)ζ溥M(jìn)行控制。

概括

恭喜!您已成功設(shè)計(jì)出智能頸部按摩器的原型。

這款多功能物聯(lián)網(wǎng)按摩器與 TENS 技術(shù)相結(jié)合,有助于緩解頸部酸痛和疼痛。內(nèi)置NTC傳感器,采用先進(jìn)的精確恒溫控制技術(shù),可改善血液循環(huán),緩解疼痛、結(jié)節(jié)和肌肉緊張。基于這個(gè)項(xiàng)目,您可以探索更多很棒的功能!

涂鴉物聯(lián)網(wǎng)平臺(tái)提供便捷的物聯(lián)網(wǎng)開(kāi)發(fā)工具和服務(wù),旨在讓您的物聯(lián)網(wǎng)項(xiàng)目更輕松、更高效。查看并發(fā)現(xiàn)更多很棒的想法。

?
?
?

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)