資料介紹
描述
簡(jiǎn)介
僅使用智能手機(jī)即可控制家中任何電器的能力非常有趣。這個(gè)項(xiàng)目包括使用一個(gè) Arduino、一個(gè)便宜的藍(lán)牙模塊和一個(gè)繼電器來(lái)控制,例如,通過(guò)藍(lán)牙將它與您的智能手機(jī)連接來(lái)控制一盞燈。這個(gè)項(xiàng)目旨在使用最少的資源和代碼來(lái)簡(jiǎn)單,但仍然包括整個(gè)過(guò)程的重要演示和描述。
重要說(shuō)明:此項(xiàng)目涉及使用高壓設(shè)備,因此建議格外小心,并盡可能在有經(jīng)驗(yàn)的人的監(jiān)督下進(jìn)行此項(xiàng)目。
內(nèi)容簡(jiǎn)介
在接下來(lái)的部分中,我們將按如下所示的順序更詳細(xì)地討論一些主題。
原理圖
讓我們從設(shè)置藍(lán)牙模塊(圖中左下方的組件)開(kāi)始。如您所見(jiàn),我們從 Arduino 一直拉出 5V 和地線,一直到藍(lán)牙模塊(紅線和黑線)。對(duì)于通信引腳,我們需要將發(fā)射器引腳 (TX) 連接到 Arduino 的接收器引腳 (RX)(綠線),將發(fā)射器引腳連接到 Arduino 的接收器引腳(橙色線)。如果你檢查藍(lán)牙模塊的背面,它會(huì)有一個(gè)標(biāo)簽顯示它的接收器引腳可以處理多少電壓(在我的例子中是 3.3V)并且由于我們的 Arduino 提供 5V,藍(lán)牙模塊在頻繁使用后可能會(huì)燒毀,這是為什么我們需要將該電壓降低到 3.3V。因此,它包含 2 個(gè)電阻器,用作穿過(guò)橙色線的“分壓器”。電阻是 560 歐姆,而第二個(gè)R2是 1K 歐姆。我使用這些電阻器是因?yàn)樗俏以O(shè)備中的電阻器,但如果你有任何其他電阻器,也許你可以使用這個(gè)公式找到適合你的設(shè)置,這會(huì)使電壓降低一點(diǎn):
Vout = (Vsource x R2)/R1+R2
就我而言,我得到了:
Vout = 5 x 1000 / 1560 = 3.2V..足夠接近..
(在谷歌上搜索分壓器計(jì)算器,它會(huì)給你很好的解釋和快速的計(jì)算)。
至于繼電器,我們還為它提供電源和地線(紅線和黑線)以及連接到 Arduino 的 10 號(hào)引腳的信號(hào)線,例如,它將命令繼電器何時(shí)打開(kāi)或關(guān)閉我們的燈。
藍(lán)色線代表插頭/插座擴(kuò)展線。顯然,您不希望將繼電器直接連接到燈的內(nèi)置插頭延長(zhǎng)件,這會(huì)破壞該項(xiàng)目,因此建議購(gòu)買(mǎi)獨(dú)立的插頭/插座延長(zhǎng)件。我所做的是購(gòu)買(mǎi)一根較小的電線,并在上面的幻燈片照片中添加插頭和插座。
現(xiàn)在您有了延長(zhǎng)線,拉出 1 根延長(zhǎng)線并剪斷它,您最終會(huì)得到 2 個(gè)電線末端(如上面的 2 張照片所示)。但是你在哪里可以將這兩個(gè)端點(diǎn)連接到繼電器呢?Relay有3個(gè)端口,NC(常閉),C(Common),NO(常開(kāi))。這意味著,當(dāng)繼電器處于正常狀態(tài)(沒(méi)有信號(hào)發(fā)送到繼電器)時(shí),NC 和 C 端口之間將建立連接。當(dāng)發(fā)送信號(hào)時(shí),將在 C 和 NO 之間設(shè)置連接。這就是為什么我們將 2 線端連接到 C 和 NO 的原因,因?yàn)槲覀兿胂蚶^電器發(fā)送信號(hào),以便讓電流流過(guò)這兩個(gè)通道并為我們的設(shè)備提供能量。這里有很好的解釋:http ://www.pcbheaven.com/wikipages/How_Relays_Work/
Arduino代碼
#include
#define RELAY 10
#define LIGHT 13
SoftwareSerial btm(2,3); // rx tx
int index = 0;
char data[10];
char c;
boolean flag = false;
void setup() {
pinMode(RELAY,OUTPUT);
pinMode(LIGHT,OUTPUT);
digitalWrite(RELAY,HIGH);
digitalWrite(LIGHT,LOW);
btm.begin(9600);
}
void loop() {
if(btm.available() > 0){
while(btm.available() > 0){
c = btm.read();
delay(10); //Delay required
data[index] = c;
index++;
}
data[index] = '\0';
flag = true;
}
if(flag){
processCommand();
flag = false;
index = 0;
data[0] = '\0';
}
}
void processCommand(){
char command = data[0];
char inst = data[1];
switch(command){
case 'R':
if(inst == 'Y'){
digitalWrite(RELAY,LOW);
btm.println("Relay: ON");
}
else if(inst == 'N'){
digitalWrite(RELAY,HIGH);
btm.println("Relay: OFF");
}
break;
case 'L':
if(inst == 'Y'){
digitalWrite(LIGHT,HIGH);
btm.println("Light: ON");
}
else if(inst == 'N'){
digitalWrite(LIGHT,LOW);
btm.println("Light: OFF");
}
break;
}
}
上面顯示的 Arduino 代碼通常分為 4 個(gè)階段。
- 5.1. 初始化
- 52.設(shè)置
- 5.3. 環(huán)形
- 5.4. 處理命令
重要的是要注意上面的所有代碼都是從 Arduino 的角度來(lái)看的,這意味著所有的“讀取”操作都是 arduino 從其他來(lái)源接收數(shù)據(jù)的操作,寫(xiě)操作是 arduino 發(fā)送的操作消息也發(fā)送到其他來(lái)源。我們系統(tǒng)中的使用順序是這樣的:
- 一種。用戶單擊智能手機(jī)中的按鈕以執(zhí)行藍(lán)牙命令。
- b. 藍(lán)牙模塊接收它并將該命令發(fā)送到 Arduino。
- C。然后 Arduino 將處理該命令并向繼電器發(fā)送信號(hào)以將其打開(kāi)或關(guān)閉。
- d. 然后 Arduino 向藍(lán)牙模塊發(fā)送成功消息,藍(lán)牙模塊將此消息發(fā)送回智能手機(jī)。
初始化
在前幾行代碼中,我們首先包含允許我們與藍(lán)牙模塊通信的 SoftwareSerial 庫(kù)。它還允許我們將不同的引腳用作接收器和發(fā)射器引腳,而不是為 Arduino 預(yù)定義的引腳(引腳 0 = RX 和引腳 1 = TX)。相反,我們將為 Arduino 的 RX 使用 2 號(hào)引腳,為 Arduino 的 TX 使用 3 號(hào)引腳。然后我們創(chuàng)建常量來(lái)標(biāo)識(shí)我們希望用于每個(gè)組件的引腳,在這種情況下,Arduino 控制繼電器的引腳是 10 號(hào),而控制 Arduino 內(nèi)置燈的引腳是 13 號(hào)。(這是可選的,如果你不想使用它也沒(méi)關(guān)系)。然后,名為“data”的“char”類型的數(shù)據(jù)結(jié)構(gòu)充當(dāng)我們從藍(lán)牙模塊傳入的消息的緩沖區(qū),循環(huán)部分。
設(shè)置
預(yù)定義方法“setup”將是我們實(shí)際預(yù)期的程序開(kāi)始運(yùn)行之前要執(zhí)行的第一個(gè)方法。它基本上允許我們?cè)谥鞒绦驁?zhí)行之前配置一些 Arduino 的引腳和其他東西。因此,我們首先說(shuō) RELAY 引腳將是一個(gè) OUTPUT 引腳,因?yàn)槲覀円l(fā)送一個(gè)信號(hào)來(lái)關(guān)閉或打開(kāi)繼電器。LIGHT 引腳也是如此。此外,我們可以選擇是否要啟動(dòng)程序并使用“digitalWrite”立即開(kāi)始發(fā)送信號(hào)。在繼電器的情況下,我們確實(shí)想要開(kāi)始發(fā)送信號(hào),因?yàn)槔^電器的工作方式有點(diǎn)違反直覺(jué),因?yàn)槔^電器的工作方式是當(dāng)繼電器檢測(cè)到信號(hào)時(shí),它會(huì)自行關(guān)閉,否則它切換回 ON。
環(huán)形
顧名思義,循環(huán)是一種被迭代調(diào)用的方法,以便重復(fù)處理我們傳遞給它的任何信息。話雖如此,我們首先檢查是否有來(lái)自藍(lán)牙模塊的傳入消息,如果有,則我們進(jìn)入一個(gè)循環(huán)以繼續(xù)逐字節(jié)讀取這些消息(每次迭代讀取類型“char”)。關(guān)于代碼 delay(10) 行,老實(shí)說(shuō),我不完全確定為什么代碼只適用于該 delay(10)。當(dāng)我嘗試不使用那行代碼時(shí),消息沒(méi)有被正確地接收到稱為“數(shù)據(jù)”(我們的緩沖區(qū))的字符數(shù)組中,我得到的只是緩沖區(qū)中的一堆垃圾。我最好的猜測(cè),這就是我使用它的原因,事實(shí)上,我們的組件在接收和傳輸時(shí)有不同的處理速度,在這種情況下是 Arduino 和藍(lán)牙模塊。在網(wǎng)絡(luò)上的一些 Arduino 代碼中,可以看到一些延遲代碼行,其中一些可能用于此目的。在這個(gè)延遲之后,假設(shè)我們已經(jīng)讀取了消息的第一個(gè)字節(jié) (char),然后我們將它添加到我們的緩沖區(qū)并增加稱為“索引”的計(jì)數(shù)器以繼續(xù)沿著數(shù)組的維度迭代和遞增地添加更多字節(jié)/緩沖。消息被讀取后,我們退出 while 循環(huán)并說(shuō)“是”,有一條消息要處理(通過(guò)將標(biāo)志設(shè)置為 true)。并且還添加一個(gè) '\0' 來(lái)指示緩沖區(qū)的結(jié)束。最后,
處理命令
最后,processCommand 方法將決定如何處理之前在循環(huán)代碼部分收到的藍(lán)牙消息。對(duì)于這個(gè)項(xiàng)目,我決定通過(guò)藍(lán)牙將智能手機(jī)發(fā)送的簡(jiǎn)單命令發(fā)送到 Arduino。要打開(kāi)繼電器,基于 Android 應(yīng)用程序構(gòu)建的簡(jiǎn)單消息將以字節(jié)形式發(fā)送以下字符串:“RY”(繼電器是)如果我們希望打開(kāi)繼電器或“RN”(繼電器否)如果我們希望打開(kāi)繼電器關(guān)閉。如前所述,我還包括一個(gè)“附加組件”,您可以在其中控制 Arduino 的內(nèi)置 LED(引腳號(hào) 13),因此命令為“LY”和“LN”,但您不必使用它。請(qǐng)記住,要打開(kāi)繼電器,我們需要從 Arduino 發(fā)送一個(gè)低電平信號(hào),反之亦然。
安卓代碼
在本節(jié)中,我們將討論如何實(shí)現(xiàn) Android 應(yīng)用程序以與藍(lán)牙模塊通信。我不會(huì)介紹 Android 功能的某些方面以及您應(yīng)該如何做某些事情,但主要介紹源代碼的內(nèi)容并對(duì)其進(jìn)行更好的解釋。但一般來(lái)說(shuō),該應(yīng)用程序是使用 Android Studio (AS) 創(chuàng)建的,并且 AS 允許您選擇一個(gè)簡(jiǎn)單的模板來(lái)啟動(dòng)您的應(yīng)用程序,選擇該基本模板。然后,AS 設(shè)置了啟動(dòng)應(yīng)用程序所需的所有內(nèi)容,包括 Android 清單,您可以在其中包含應(yīng)用程序的一般屬性,例如應(yīng)用程序需要的權(quán)限。一個(gè)簡(jiǎn)單的空白布局,您可以在其中添加一些組件(如按鈕)和一個(gè) java 源代碼,用于初始化應(yīng)用程序并控制布局上的所有 UI 內(nèi)容。如果你沒(méi)有 如果不選擇基本模板并選擇空模板,那么您始終可以創(chuàng)建一個(gè)新活動(dòng)來(lái)設(shè)置您需要的布局和相應(yīng)的源文件。源代碼和資源也可以在我的github上找到:https://github.com/serge144/ArduinoConnectorBT
下面是我們接下來(lái)要介紹的內(nèi)容:
- 安卓清單
- 簡(jiǎn)單的布局
- Java 源代碼 (Ardcon.java + ConnectedThread.java)
6.1 安卓清單
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="flipser.bluetooth">
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Bluetooth">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
application>
manifest>
android 清單描述了應(yīng)用程序的主要結(jié)構(gòu)以及應(yīng)用程序?qū)⑹褂媚男?a href='http://www.1cnz.cn/v/tag/527/' target='_blank' class='arckwlink_none'>操作系統(tǒng)的功能。在我們的例子中,我們需要包括與藍(lán)牙接口相關(guān)的權(quán)限。從上面的代碼中我們可以看出,為了使用操作系統(tǒng)的藍(lán)牙功能,插入了以下幾行:
簡(jiǎn)單布局
布局如下圖所示:
文本視圖僅用于輸出 Arduino + 藍(lán)牙模塊發(fā)送的消息。例如,通過(guò)向 arduino 發(fā)送消息,如果成功,它將向智能手機(jī)發(fā)回響應(yīng),并在文本視圖中顯示該消息。然后我們有兩個(gè)按鈕,繼電器按鈕和燈按鈕,用于打開(kāi)/關(guān)閉 Arduino 上的內(nèi)置 LED。我相信在這種情況下沒(méi)有必要包含代碼,因?yàn)槟枰龅木褪菍蓚€(gè)按鈕和一個(gè)文本視圖拖到您想要放置的位置。
6.3 Java 源代碼
(Ardcon.java)
我們將介紹的第一個(gè)源文件是Ardcon.java文件 (Arduino Connection)。這個(gè)文件主要做的是先初始化藍(lán)牙,建立連接。然后它檢查我們的兩個(gè)按鈕是否被點(diǎn)擊,并做相應(yīng)的操作。那么讓我們從初始化開(kāi)始:
public final static String MODULE_MAC = "98:D3:34:90:6F:A1";
public final static int REQUEST_ENABLE_BT = 1;
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
BluetoothAdapter bta; //bluetooth stuff
BluetoothSocket mmSocket; //bluetooth stuff
BluetoothDevice mmDevice; //bluetooth stuff
Button switchLight, switchRelay; //UI stuff
TextView response; //UI stuff
boolean lightflag = false; //flags to determ. if ON/OFF
boolean relayFlag = true; //flags to determ. if ON/OFF
ConnectedThread btt = null; //Our custom thread
public Handler mHandler; //this receives messages from thread
在我的例子中,藍(lán)牙模塊的媒體訪問(wèn)控制或 MAC 地址是 。為了找到你的藍(lán)牙模塊的MAC,你首先需要打開(kāi)電路,或者只是設(shè)置一些基本電路來(lái)打開(kāi)藍(lán)牙模塊。然后,使用您的智能手機(jī)檢查藍(lán)牙信號(hào),您的藍(lán)牙模塊應(yīng)該連同其 MAC 地址一起出現(xiàn)。如果未顯示 MAC 地址,請(qǐng)嘗試使用其他設(shè)備,例如您的 PC。然后藍(lán)牙模塊 HC-06 的 UUID始終是相同的,如果您使用的是 Android,這個(gè)數(shù)字可能會(huì)改變 iOS 使用。(查找 UUID 以獲取更多信息)。"98:D3:34:90:6F:A1"
00001101-0000-1000-8000-00805f9b34fb
然后我們初始化按鈕、文本視圖、標(biāo)志以確定繼電器和燈是關(guān)閉還是打開(kāi),一個(gè) ConnectedThread 主要負(fù)責(zé)向/從 Arduino + 藍(lán)牙發(fā)送/接收消息,最后是一個(gè)負(fù)責(zé)處理的處理程序從線程接收到的消息。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ardcon);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Log.i("[BLUETOOTH]", "Creating listeners");
response = (TextView) findViewById(R.id.response);
switchRelay = (Button) findViewById(R.id.relay);
switchLight = (Button) findViewById(R.id.switchlight);
switchLight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("[BLUETOOTH]", "Attempting to send data");
if (mmSocket.isConnected() && btt != null) {
if (!lightflag) {
String sendtxt = "LY";
btt.write(sendtxt.getBytes());
lightflag = true;
} else {
String sendtxt = "LN";
btt.write(sendtxt.getBytes());
lightflag = false;
}
} else {
Toast.makeText(Ardcon.this, "Something went wrong", Toast.LENGTH_LONG).show();
}
}
});
switchRelay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("[BLUETOOTH]", "Attempting to send data");
if (mmSocket.isConnected() && btt != null) {
if(relayFlag){
String sendtxt = "RY";
btt.write(sendtxt.getBytes());
relayFlag = false;
}else{
String sendtxt = "RN";
btt.write(sendtxt.getBytes());
relayFlag = true;
}
//disable the button and wait for 4 seconds to enable it again switchRelay.setEnabled(false);
new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(4000);
}catch(InterruptedException e){
return;
}
runOnUiThread(new Runnable() {
@Override
public void run() {
switchRelay.setEnabled(true);
}
});
}
}).start();
} else {
Toast.makeText(Ardcon.this, "Something went wrong", Toast.LENGTH_LONG).show();
}
}
});
bta = BluetoothAdapter.getDefaultAdapter();
//if bluetooth is not enabled then create Intent for user to turn it onif(!bta.isEnabled()){
Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBTIntent, REQUEST_ENABLE_BT);
}else{
initiateBluetoothProcess();
}
}
我現(xiàn)在將簡(jiǎn)要概述上面的代碼。
這是初始化應(yīng)用程序和所有 UI 的方法,我們首先從布局中獲取按鈕和文本視圖的引用。然后我們向兩個(gè)按鈕添加一些邏輯。例如,對(duì)于 switchLight,點(diǎn)擊偵聽(tīng)器將首先確定是否存在與模塊的藍(lán)牙連接,如果存在,則發(fā)送消息以關(guān)閉或打開(kāi)燈。這同樣適用于 switchRelay 按鈕,但在這種情況下,我們還包括一個(gè)小計(jì)時(shí)器,在執(zhí)行操作后將繼電器按鈕禁用 4 秒。這是一項(xiàng)安全措施,因?yàn)槲覀儾粫?huì)在快速按下按鈕的同時(shí)快速打開(kāi)/關(guān)閉來(lái)開(kāi)始弄亂設(shè)備。然后,在完成所有按鈕邏輯后,我們嘗試在初始化時(shí)立即連接到藍(lán)牙模塊。ACTION_REQUEST_ENABLE。這將觸發(fā)一個(gè)對(duì)話框窗口以確認(rèn)藍(lán)牙激活。然后我們?cè)O(shè)置一個(gè) onActivityResult 來(lái)接收用戶的確認(rèn),如下所示:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK && requestCode == REQUEST_ENABLE_BT){
initiateBluetoothProcess();
}
}
然后,initiaBluetoothProcess() 方法與藍(lán)牙模塊建立連接并創(chuàng)建一個(gè)處理程序,該處理程序是從 ConnectedThread 接收信息的組件,同樣,該線程負(fù)責(zé)從藍(lán)牙模塊接收/發(fā)送藍(lán)牙信息阿杜伊諾。處理程序只需使用響應(yīng)文本更新 TextView。
public void initiateBluetoothProcess(){
if(bta.isEnabled()){
//attempt to connect to bluetooth module BluetoothSocket tmp = null;
mmDevice = bta.getRemoteDevice(MODULE_MAC);
//create socket try {
tmp = mmDevice.createRfcommSocketToServiceRecord(MY_UUID);
mmSocket = tmp;
mmSocket.connect();
Log.i("[BLUETOOTH]","Connected to: "+mmDevice.getName());
}catch(IOException e){
try{mmSocket.close();}catch(IOException c){return;}
}
Log.i("[BLUETOOTH]", "Creating handler");
mHandler = new Handler(Looper.getMainLooper()){
@Override
public void handleMessage(Message msg) {
//super.handleMessage(msg); if(msg.what == ConnectedThread.RESPONSE_MESSAGE){
String txt = (String)msg.obj;
response.append("\n" + txt);
}
}
};
Log.i("[BLUETOOTH]", "Creating and running Thread");
btt = new ConnectedThread(mmSocket,mHandler);
btt.start();
}
}
(ConnectedThread.java)
如前所述,ConnectedThread.java文件包含通過(guò)藍(lán)牙發(fā)送和接收消息的必要代碼。它還通過(guò)處理程序?qū)⑿畔l(fā)送到Ardcon.java源文件。
public class ConnectedThread extends Thread{
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public static final int RESPONSE_MESSAGE = 10;
Handler uih;
...
首先我們用 Thread 擴(kuò)展我們的類,然后我們初始化一些允許我們接收和發(fā)送消息到藍(lán)牙模塊的對(duì)象。Handler 是負(fù)責(zé)將響應(yīng)發(fā)送回 UI 線程 (Ardcon.java) 的組件,以便我們可以更新文本視圖。
public ConnectedThread(BluetoothSocket socket, Handler uih){
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
this.uih = uih;
Log.i("[THREAD-CT]","Creating thread");
try{
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch(IOException e) {
Log.e("[THREAD-CT]","Error:"+ e.getMessage());
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
try {
mmOutStream.flush();
} catch (IOException e) {
return;
}
Log.i("[THREAD-CT]","IO's obtained");
}
因此,我們的 ConnectedThread 接收到名為 BluetoothSocket 的藍(lán)牙模塊和 Handler 的連接。此構(gòu)造函數(shù)初始化通信的輸入和輸出流。
public void run(){
BufferedReader br;
br = new BufferedReader(new InputStreamReader(mmInStream));
while(true){
try{ String resp = br.readLine();
Message msg = new Message();
msg.what = RESPONSE_MESSAGE;
msg.obj = resp;
uih.sendMessage(msg);
}catch(IOException e){
break;
}
}
Log.i("[THREAD-CT]","While loop ended");
}
然后,我們覆蓋Thread擴(kuò)展的run方法,在這個(gè)方法中,有一個(gè)循環(huán)不斷地尋找新到達(dá)的消息,如果是,則通過(guò)handler返回到UI線程。
public void write(byte[] bytes){
try{
Log.i("[THREAD-CT]", "Writting bytes");
mmOutStream.write(bytes);
}catch(IOException e){}
}
public void cancel(){
try{
mmSocket.close();
}catch(IOException e){}
}
最后,這兩個(gè)方法負(fù)責(zé)通過(guò)Outputstream向藍(lán)牙模塊寫(xiě)入(發(fā)送字節(jié))和取消連接。
- Arduino和Android窗簾控制
- 使用Arduino的Android控制RGB LED燈條
- Arduino Nano 33 IoT 12V WS2811 LED燈條控制器
- Arduino/Android藍(lán)牙多伺服電機(jī)控制
- 基于Arduino的數(shù)控燈控制器的設(shè)計(jì) 0次下載
- 基于arduino nano的數(shù)控燈控制器 0次下載
- Arduino/Android藍(lán)牙串行監(jiān)視器應(yīng)用程序
- 基于Arduino UNO的簡(jiǎn)單交通燈控制器 0次下載
- Arduino/Android藍(lán)牙伺服電機(jī)控制安卓APP
- 使用MKR IoT載體的Arduino燈控制器
- 適用于PC和Android的Arduino游戲控制器
- 兆易創(chuàng)新AN014 GD32微控制器在Arduino中的應(yīng)用
- 基于Arduino的控制器
- arduino藍(lán)牙控制LED燈模擬實(shí)驗(yàn)的詳細(xì)資料說(shuō)明 4次下載
- 使用Arduino為微控制器打造能用舵機(jī)控制的游戲平臺(tái) 14次下載
- Arduino WS2812B LED燈帶設(shè)計(jì)方案 1.2w次閱讀
- 如何使用Arduino Uno和HC-06實(shí)現(xiàn)智能手機(jī)對(duì)電燈的控制 4601次閱讀
- 如何從網(wǎng)頁(yè)控制arduino? 3836次閱讀
- 基于Arduino UNO和HC-05藍(lán)牙模塊控制伺服電機(jī) 4824次閱讀
- 自制一臺(tái)廣告燈控制器 1829次閱讀
- dfrobot低功耗藍(lán)牙控制器簡(jiǎn)介 1446次閱讀
- dfrobotBluno Mega1280控制器 Arduino兼容簡(jiǎn)介 2150次閱讀
- dfrobotRomeo BLE多合一控制器簡(jiǎn)介 2399次閱讀
- dfrobotDFRduino Pro Mini控制器簡(jiǎn)介 2023次閱讀
- dfrobotArduino Leonardo 控制器介紹 2259次閱讀
- dfrobotCheapduino控制器介紹 1370次閱讀
- dfrobotRomeo 三合一Arduino兼容控制器介紹 2372次閱讀
- 遠(yuǎn)程控制通訊--基于Arduino + ESP8266控制LED燈 3.9w次閱讀
- led燈帶控制器怎么用 2.8w次閱讀
- 簡(jiǎn)單的溫度控制器電路 5444次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多