Serial.begin(9600);
String str="Hello World!";
Serial.println(str.length()); //輸出 12
Serial.println(str.indexOf(" ")); //輸出 5 (有找到傳回索引)
Serial.println(str.indexOf(" ", 6)); //輸出 -1 (沒找到傳回 -1)
Serial.println(str.lastIndexOf("!")); //輸出 11
Serial.println(str.substring(6)); //輸出 World!
Serial.println(str.substring(0,7)); //輸出 Hello W
str.replace("World","Tony");
Serial.println(str); //輸出 Hello Tony!
str.concat(" Good Day!");
Serial.println(str); //輸出 Hello Tony! Good Day!
str.remove(16); //從 Day 前面空格開始刪
Serial.println(str); //輸出 Hello Tony! Good
str.remove(11,5); //從 G 前面空格開始刪
Serial.println(str); //輸出 Hello Tony!
str.toLowerCase();
Serial.println(str); //輸出 hello tony!
str.toUpperCase();
Serial.println(str); //輸出 HELLO TONY!
Serial.println(str.charAt(1)); //輸出 E
str.setCharAt(5,'+'); //將空格改為 +
Serial.println(str); //輸出 HELLO+TONY!
String str2="Hello+Tony!";
Serial.println(str.equals(str2)); //輸出 0
Serial.println(str.equalsIgnoreCase(str2)); //輸出 1
Serial.println(str.compareTo(str2)); //輸出 -32 (不同, str 在前)
Serial.println(str.compareTo("HELLO+TONY!")); //輸出 0 (雷同)
Serial.println(str.startsWith("HELLO")); //輸出 1
Serial.println(str.endsWith("TONY!")); //輸出 1
str=" HELLO ";
str.trim();
Serial.println(str.length()); //輸出 5 (已刪除前後空格)
str="180 Days";
Serial.println(str.toInt()); //輸出 180
str="65.245KG";
Serial.println(str.toFloat()); //輸出 65.25 (四捨五入到小數第二位)
2015年12月1日 星期二
2015年11月25日 星期三
Android 手機與Arduino 藍芽HC-05 / 06 連結應用
讓Android、iPhone手機與Arduino連結交互應用是很有趣的程式設計,因此有些要注意的地方就留下紀錄
首先是Arduino部分
網路資源 搜尋藍芽裝置 網路資源 Arduino送資料給手機接收 收機接收資料
藍芽搜尋 藍芽傳送程式 透過藍芽上傳程式02
Arduino 資料型態 執行序資料傳遞 執行序Run與Start差異性
透過藍芽燒縙Arduino 程式取代USB
Part 1
首先是Arduino部分
網路資源 搜尋藍芽裝置 網路資源 Arduino送資料給手機接收 收機接收資料
藍芽搜尋 藍芽傳送程式 透過藍芽上傳程式02
Arduino 資料型態 執行序資料傳遞 執行序Run與Start差異性
透過藍芽燒縙Arduino 程式取代USB
Part 1
#include
#include
#include 2C
.h>
#define MAX_BTCMDLEN 128
// 建立一個軟體模擬的序列埠
// HC-06 Arduino
// TX RX/Pin10
// RX TX/Pin11
SoftwareSerial BTSerial(10,11); // Arduino RX/TX
// Addr, En, Rw, Rs, d4,d5,d6,d7 backlight, polarity
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);
byte cmd[MAX_BTCMDLEN]; // received 128 bytes from an Android system
int len = 0; // received command length
void setup() {
Serial.begin(9600); // Arduino起始鮑率:9600
BTSerial.begin(9600); // HC-06 出廠的鮑率:每個藍牙晶片的鮑率都不太一樣,請務必確認
// 初始化LCD1602
lcd.begin(16, 2);
lcd.clear();
lcd.backlight();
}
void loop() {
char str[MAX_BTCMDLEN];
int insize, ii;
int tick=0;
while ( tick// 因為包率同為9600, Android送過來的字元可能被切成數份
if ( (insize=(BTSerial.available()))>0 ){ // 讀取藍牙訊息
for ( ii=0; ii
cmd[(len++)%MAX_BTCMDLEN]=char(BTSerial.read());
}
}
else {
tick++;
}
}
if ( len ) { // 用LCD1602顯示從Android手機傳過來的訊息
sprintf(str,"%s",cmd);
// Serial.println(str);
// 將對串列埠的輸出改為對LCD1602輸出
lcd.clear();
lcd.print(str);
cmd[0] = '\0';
}
len = 0;
}
---------------------------------------------------------------------------------------------
Part 2
//-------------------------------------------------------------
// Controlling a servo position using serial port
// Controlling a 360 continuous rotation servo using bluetooth
// 2015.02.04
// by gsyan
//-------------------------------------------------------------
#include
long serialBaudRate = 115200; //藍牙(序列埠)通訊的速率(鮑率 baud rate)
int rightPin = 9; //右邊 servo 控制腳接在哪一個腳位
int leftPin = 10; //左邊 servo 控制腳接在哪一個腳位
//底下角度的值必須自行測試, 依 servo 來設定
int rightStopAngle = 95; //右邊 servo 停止轉動的值
int leftStopAngle = 106; //左邊 servo 停止轉動的值
int maxAngle = 75; //正轉、逆轉(加減)最大的值
const int delayMilliseconds = 20; // 每隔多少 MS 讀取一次資料
Servo rightServo; // create servo object to control right servo
Servo leftServo; // create servo object to control leftt servo
int angle = 0; //記錄目前 servor 動力的值(真正給 servo 的值還會加上 rightStopAngle或leftStopAngle
//讓兩顆 servo 停止
void servoStop() {
rightServo.write(rightStopAngle);
leftServo.write(leftStopAngle);
}
//讓兩顆 servo 暫停指定的時間
void servoPause(int t) {
servoStop();
delay(t);
}
//初始程序
void setup()
{
Serial.begin(serialBaudRate); //Arduino起始鮑率:38400
rightServo.attach(rightPin); // attaches the servo on pin "rightPin" to the right servo object
leftServo.attach(leftPin); // attaches the servo on pin "leftPin" to the left servo object
angle = 0;
servoStop();
}
//循環執行的程序
void loop()
{
byte inBytes[20]; //暫存所有外部傳來資料用
byte inByte; //暫存用
int inSize; //計算已取得多少資料用
if ((inSize=(Serial.available()))>0){ //讀取藍牙訊息
for (int i=0; i
inByte = Serial.read();
if(i<19 div="">19>
inBytes[i] = inByte;
}
}
//執行指定的動作 F(前進)、f(後退)、t(右轉)、T(左轉)和 S(停止)
switch(char(inBytes[0])) {
case 'F' : //Forward
if(angle > 0) {
servoPause(500);
}
angle = -1*maxAngle;
rightServo.write(rightStopAngle+angle);
leftServo.write(leftStopAngle-angle);
break;
case 'f' : //Backword
if(angle < 0) {
servoPause(500);
}
angle = maxAngle;
rightServo.write(rightStopAngle+angle);
leftServo.write(leftStopAngle-angle);
break;
case 'T' : //Left turn
servoPause(500);
angle = -1*maxAngle;
rightServo.write(rightStopAngle+angle);
leftServo.write(leftStopAngle+angle);
break;
case 't' : //Right turn
servoPause(500);
angle = maxAngle;
rightServo.write(rightStopAngle+angle);
leftServo.write(leftStopAngle+angle);
break;
case 'S' : //stop
servoStop();
break;
default : //others: stop
servoStop();
break;
}
}
delay(delayMilliseconds); // 暫停多少 MS 後繼續
}
Arduino 與無線WIFI ESP8266 使用
Arduino 與無線WIFI ESP8266 使用
參考文章 參考文章 ESP8266與Android溝通 ESP8266與Web應用 ESP8266
克里斯遊戲自己做文章 ESP8266-12應用 DIY想像力Blog
ESP8266設定AP ESP8266Code ESP8266 AT Command
資料上傳到Web
這幾篇文章寫的太好了幾乎ESP8266的問題從接線、設定到韌體升級都寫的非常詳細,照著做幾乎都能成功。
3.3V電源供電的方式很多,我是從Arduino UNO 3.3V供電升級韌體,Baud Rate設成9600
注意事項:韌體升級要求的電源比較嚴格,我用Arduino UNO 3.3V一孔拉出2條接ESP8266在RealTerm執行 AT Command都沒問題,但韌體升級就會出現無法連接的錯誤訊息,後來用3.3V電源才能正常升級。
常用AT Command如下
AT ------------------->回應OK代表連線正常
AT+GMR----------->取得目前的韌體版本號碼
指令「AT+CWLAP」
顯示可連線的Wifi網路清單。
一鍵燒錄更新軟體 GITHUB
測試ESP8226與電腦連線使用TelNet方式
如果你想使用自己設定的Port 可以用Telnet方式來測試
1.先把ESP8226連上WIFI設備
Wifi連線模式設為 Station模式:AT+CWMODE=1 確認OK
2.列出目前的Wifi清單:AT+CWLAP
請先看是否有目標 wifi名稱出現
3.準備與WIFI連線:AT+CWJAP="PALMONE","123456789" 確認OK
4.如果連線成功 AT+CIFSR 會有一組IP:192.168.1.185 如果沒連上WIFI回傳IP:0.0.0.0
5.把ESP8266當Server端讓筆電連上:把ESP多重連線打開 AT+CIPMUX=1 確認OK
6.ESP8266 開啟伺服器與Port :AT+CIPSERVER=1,8087 ,Port:8087 確認OK
以上步驟ESP8266就準備完成等待Client端請求連線
筆電部份:
我是用MacBook
1.先連上與ESP8266相同的WIFI,這動作讓筆電與ESP8266在同一網域,不同網域請先設定的路由器讓不同網域可以溝通
2.打開超級終端機 Ping 192.186.1.185 你會看到回應訊息代表IP位置存在
3.在超級終端機輸入telnet 192.168.1.185 8087 連線,如果成功ESP8266會出現Link訊息
4.測試訊息傳送在ESP8226這邊AT+CIPSEND=0,5 表示跟第1個連線裝置溝通 長度5,ESP8266最多同時能跟5個Client連線代碼 0 ~ 4
5.輸入Hello字串按Send ASCII鈕,接著在筆電的電超級終端機會收到Hello這5個字串顯示,代表ESP8266與筆電可以互傳訊息了
前前後後花了3天重複閱讀克里斯的文章與執行步驟,先幫ESP8266更新韌體把Baud Rate設成9600
非常感謝網友克里斯對 ESP8266 各種疑難雜症的分享與解釋讓我能順利的測試成功,不然像我這種對電子學完全不懂得門外漢是不可能理解 ESP8266每支腳位的代表意義
Arduino 程式
參考文章 參考文章 ESP8266與Android溝通 ESP8266與Web應用 ESP8266
克里斯遊戲自己做文章 ESP8266-12應用 DIY想像力Blog
ESP8266設定AP ESP8266Code ESP8266 AT Command
資料上傳到Web
這幾篇文章寫的太好了幾乎ESP8266的問題從接線、設定到韌體升級都寫的非常詳細,照著做幾乎都能成功。
3.3V電源供電的方式很多,我是從Arduino UNO 3.3V供電升級韌體,Baud Rate設成9600
注意事項:韌體升級要求的電源比較嚴格,我用Arduino UNO 3.3V一孔拉出2條接ESP8266在RealTerm執行 AT Command都沒問題,但韌體升級就會出現無法連接的錯誤訊息,後來用3.3V電源才能正常升級。
常用AT Command如下
AT ------------------->回應OK代表連線正常
AT+GMR----------->取得目前的韌體版本號碼
ESP8266的Wifi連線有三種模式:
- Station模式:扮演連線到現有Wifi的裝置。
- AP模式:扮演無線基地台,提供Wifi環境供連線。
- Station+AP混合模式:允許同時使用以上兩種模式的特有功能
取得目前Wifi連線模式:
指令「AT+CWMODE」
「AT+CWMODE?」查詢當前模式
「AT+CWMODE=2」將模式設定為第2種(AP模式)。
指令「AT+CWLAP」
顯示可連線的Wifi網路清單。
指令「AT+CWJAP」
「AT+CWJAP=, 」連線到已存在的無線網路。
「AT+CWJAP?」查詢已連線到的無線網路。:無線網路的識別名稱(要加引號)。 :無線網路的密碼(要加引號)。
如果需要切斷 Wifi連線,我們可以也可使用這個指令:
指令「AT+CWQAP」
切斷已連線的無線網路。
一鍵燒錄更新軟體 GITHUB
測試ESP8226與電腦連線使用TelNet方式
如果你想使用自己設定的Port 可以用Telnet方式來測試
1.先把ESP8226連上WIFI設備
Wifi連線模式設為 Station模式:AT+CWMODE=1 確認OK
2.列出目前的Wifi清單:AT+CWLAP
請先看是否有目標 wifi名稱出現
3.準備與WIFI連線:AT+CWJAP="PALMONE","123456789" 確認OK
4.如果連線成功 AT+CIFSR 會有一組IP:192.168.1.185 如果沒連上WIFI回傳IP:0.0.0.0
5.把ESP8266當Server端讓筆電連上:把ESP多重連線打開 AT+CIPMUX=1 確認OK
6.ESP8266 開啟伺服器與Port :AT+CIPSERVER=1,8087 ,Port:8087 確認OK
以上步驟ESP8266就準備完成等待Client端請求連線
筆電部份:
我是用MacBook
1.先連上與ESP8266相同的WIFI,這動作讓筆電與ESP8266在同一網域,不同網域請先設定的路由器讓不同網域可以溝通
2.打開超級終端機 Ping 192.186.1.185 你會看到回應訊息代表IP位置存在
3.在超級終端機輸入telnet 192.168.1.185 8087 連線,如果成功ESP8266會出現Link訊息
4.測試訊息傳送在ESP8226這邊AT+CIPSEND=0,5 表示跟第1個連線裝置溝通 長度5,ESP8266最多同時能跟5個Client連線代碼 0 ~ 4
5.輸入Hello字串按Send ASCII鈕,接著在筆電的電超級終端機會收到Hello這5個字串顯示,代表ESP8266與筆電可以互傳訊息了
前前後後花了3天重複閱讀克里斯的文章與執行步驟,先幫ESP8266更新韌體把Baud Rate設成9600
非常感謝網友克里斯對 ESP8266 各種疑難雜症的分享與解釋讓我能順利的測試成功,不然像我這種對電子學完全不懂得門外漢是不可能理解 ESP8266每支腳位的代表意義
Arduino 程式
#include "ESP8266.h"
#include
SoftwareSerial mySerial(3, 2); /* RX:D3, TX:D2 */
ESP8266 wifi(mySerial);
ESP8266_TX->RX(D3)
ESP8266_RX->TX(D2)
ESP8266_CH_PD->3.3V
ESP8266_VCC->3.3V
ESP8266_GND->GND
2015年11月24日 星期二
Arduino 中斷與外部中斷
Arduino 中斷與外部中斷
有時候執行Arduino程式時會發生Reset重起,這些資料可以參考
Cooper Maa attachInterrupt() 與外部中斷
Arduino 開發版中斷I/O Port 定義 UNO 外部中斷D2與D3
網站文章裡面提到:
要特別注意是,程式裏的 buttonState 變數是宣告成 volatile,這樣做的目的是告訴 Compiler 不要做最佳化,避免變數狀態不同步。給你一個建議,程式主體跟 ISR 都會用到的變數,盡可能把它宣告成 volatile。
attachInterrupt() 函式
attachInterrupt() 函式的用途是用來指定外部中斷的處理函式(Interrupt Service Routine, ISR),就像範例程式所示範的指定 buttonStateChanged() 當作 Interrupt 0 外部中斷的處理函式。
attachInterrupt() 函式有三個參數:
interrupt: 外部中斷的編號。大部份 Arduino 板子都有兩個外部中斷,編號 0 (Interrupt 0)是在 pin 2 上,而編號 1 (Interrupt 1)是在 pin 3 上。
function: 中斷處理函式(Interrupt Service Routine, ISR)。中斷處理函式必須是不接受參數而且不回傳任何東西。
mode: 定義什麼狀況下該觸發中斷,有四個可以設定的常數值:
LOW: 當 pin 為 LOW 時觸發中斷
CHANGE: 當 pin 狀態改變時觸發中斷,不管是從 HIGH 到 LOW 或從 LOW 到 HIGH
RISING: 當 pin 狀態從 LOW 到 HIGH 時觸發中斷,RISING 又稱正緣觸發
FALLING: 當 pin 狀態從 HIGH 到 LOW 時觸發中斷,FALLING 又稱負緣觸發
如果要移除外部中斷服務函式,就使用 detachInterrupt() 函式。
啟用與停止中斷
如果要停止 Arduino 所有中斷,可以呼叫 noInterrupt() 函式,要重新啟用中斷,只要呼叫一次 interrupts() 函式即可。
有時候執行Arduino程式時會發生Reset重起,這些資料可以參考
Cooper Maa attachInterrupt() 與外部中斷
Arduino 開發版中斷I/O Port 定義 UNO 外部中斷D2與D3
網站文章裡面提到:
要特別注意是,程式裏的 buttonState 變數是宣告成 volatile,這樣做的目的是告訴 Compiler 不要做最佳化,避免變數狀態不同步。給你一個建議,程式主體跟 ISR 都會用到的變數,盡可能把它宣告成 volatile。
attachInterrupt() 函式
attachInterrupt() 函式的用途是用來指定外部中斷的處理函式(Interrupt Service Routine, ISR),就像範例程式所示範的指定 buttonStateChanged() 當作 Interrupt 0 外部中斷的處理函式。
attachInterrupt() 函式有三個參數:
interrupt: 外部中斷的編號。大部份 Arduino 板子都有兩個外部中斷,編號 0 (Interrupt 0)是在 pin 2 上,而編號 1 (Interrupt 1)是在 pin 3 上。
function: 中斷處理函式(Interrupt Service Routine, ISR)。中斷處理函式必須是不接受參數而且不回傳任何東西。
mode: 定義什麼狀況下該觸發中斷,有四個可以設定的常數值:
LOW: 當 pin 為 LOW 時觸發中斷
CHANGE: 當 pin 狀態改變時觸發中斷,不管是從 HIGH 到 LOW 或從 LOW 到 HIGH
RISING: 當 pin 狀態從 LOW 到 HIGH 時觸發中斷,RISING 又稱正緣觸發
FALLING: 當 pin 狀態從 HIGH 到 LOW 時觸發中斷,FALLING 又稱負緣觸發
如果要移除外部中斷服務函式,就使用 detachInterrupt() 函式。
啟用與停止中斷
如果要停止 Arduino 所有中斷,可以呼叫 noInterrupt() 函式,要重新啟用中斷,只要呼叫一次 interrupts() 函式即可。
2015年11月20日 星期五
Arduino 與 全彩LED燈泡測試
Arduino 與 全彩LED燈泡測試
這次要測試剛買來的全彩LED燈泡測試
//範例用PWM來控制所以用9,10,11三隻PWM腳位,其他非PWM腳位也都可以但只有HIGH or LOW(1 or o) 看使用者應用,因為Arduino UNO腳位不多因此所有腳位都要充分利用。
//或是用Analog腳位A0~A5也是可以的
int redpin = 11; //select the pin for the red LED
int bluepin =10; // select the pin for the blue LED
int greenpin =9;// select the pin for the green LED
或是數位腳
int redpin = 7; //select the pin for the red LED
int greenpin =2;// select the pin for the green LED
int bluepin =4; // select the pin for the blue LED
int val;
void setup() {
pinMode(redpin, OUTPUT);
pinMode(bluepin, OUTPUT);
pinMode(greenpin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
analogWrite(A3, 255); //255 R 紅 其餘0
analogWrite(A5, 0); //255 G 綠 其餘0
analogWrite(A4, 0); //255 B 藍 其餘0
//黃=R255,G255,B0 橘=228,120,51
delay(1000);
analogWrite(A3, 0); //255 R 紅 其餘0
analogWrite(A5, 255); //255 G 綠 其餘0
analogWrite(A4, 0); //255 B 藍 其餘0
delay(1000);
analogWrite(A3, 255); //255 R 紅 其餘0
analogWrite(A5, 255); //255 G 綠 其餘0
analogWrite(A4, 0); //255 B 藍 其餘0
delay(1000);
digitalWrite(redpin, HIGH); //255 R 紅 其餘0
digitalWrite(greenpin, LOW); //255 G 綠 其餘0
digitalWrite(bluepin, LOW); //255 B 藍 其餘0
/*
for(val=255; val>0; val--)
{
analogWrite(11, val);
analogWrite(10, 255-val);
analogWrite(9, 128-val);
delay(10);
}
for(val=0; val<255 p="" val=""> {
analogWrite(11, val);
analogWrite(10, 255-val);
analogWrite(9, 128-val);
delay(10);
}
Serial.println(val, DEC);
*/
}255>
這次要測試剛買來的全彩LED燈泡測試
![]() |
| 網路上的示意圖但紅線(V腳位)不能接5V,要接Ground才能亮 |
//範例用PWM來控制所以用9,10,11三隻PWM腳位,其他非PWM腳位也都可以但只有HIGH or LOW(1 or o) 看使用者應用,因為Arduino UNO腳位不多因此所有腳位都要充分利用。
//或是用Analog腳位A0~A5也是可以的
int redpin = 11; //select the pin for the red LED
int bluepin =10; // select the pin for the blue LED
int greenpin =9;// select the pin for the green LED
或是數位腳
int redpin = 7; //select the pin for the red LED
int greenpin =2;// select the pin for the green LED
int bluepin =4; // select the pin for the blue LED
int val;
void setup() {
pinMode(redpin, OUTPUT);
pinMode(bluepin, OUTPUT);
pinMode(greenpin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
analogWrite(A3, 255); //255 R 紅 其餘0
analogWrite(A5, 0); //255 G 綠 其餘0
analogWrite(A4, 0); //255 B 藍 其餘0
//黃=R255,G255,B0 橘=228,120,51
delay(1000);
analogWrite(A3, 0); //255 R 紅 其餘0
analogWrite(A5, 255); //255 G 綠 其餘0
analogWrite(A4, 0); //255 B 藍 其餘0
delay(1000);
analogWrite(A3, 255); //255 R 紅 其餘0
analogWrite(A5, 255); //255 G 綠 其餘0
analogWrite(A4, 0); //255 B 藍 其餘0
delay(1000);
digitalWrite(redpin, HIGH); //255 R 紅 其餘0
digitalWrite(greenpin, LOW); //255 G 綠 其餘0
digitalWrite(bluepin, LOW); //255 B 藍 其餘0
/*
for(val=255; val>0; val--)
{
analogWrite(11, val);
analogWrite(10, 255-val);
analogWrite(9, 128-val);
delay(10);
}
for(val=0; val<255 p="" val=""> {
analogWrite(11, val);
analogWrite(10, 255-val);
analogWrite(9, 128-val);
delay(10);
}
Serial.println(val, DEC);
*/
}255>
2015年10月9日 星期五
Arduino WIFI 注意事項
Arduino WIFI 注意事項
ESP8266 WiFi 是Arduino常用的WIFI模組,該模組有兩種運行模式(AP模式和STA模式)
AP模式(相當於區域網路連結,手機本地控制):
把ESP8266 WiFi 熱點,也就是預先設定ESP8266 AP熱點名稱與密碼,這樣手機搜尋WIFI找到設定的名稱與密碼就可以連線使用。
執行手機APK程式就可以用WIFI方式與Arduino ESP8266溝通。
STA模式(相當於Internet網路連結,用於外部網路讓手機、網頁控制):
網路資源
另一塊WIFI模組 :nRF24L01 (電壓不可超過3.6V)
nFR24L01 2.4G無線模組只能單向雙工,一個模組只能單純發送或接收,不能改變,所以我們使用兩塊Arduino開發板來分別收發
網路資源 網路資源02 網路資源03 網路資源04
使用器材
arduino UNR R3*2
NRF2401 *2
使用庫
RF24
RF24Network
//////////////////////////////////////主機-發送信號/////////////////////////////////////
#include
#include
#include
// nRF24L01(+) radio attached using Getting Started board
RF24 radio(9,10);
// Network uses that radio
RF24Network network(radio);
// Address of our node
const uint16_t this_node = 1;
// Address of the other node
const uint16_t other_node = 0;
// How often to send 'hello world to the other unit
const unsigned long interval = 150; //ms
// When did we last send?
unsigned long last_sent;
// How many have we sent already
//unsigned long packets_sent;
// Structure of our payload
struct payload_t
{
uint32_t ms;
uint32_t sensorDataA;
uint32_t sensorDataB;
};
boolean power_SW;
int led_VOL;
void setup(void)
{
Serial.begin(115200);
Serial.println("RF24Network/examples/helloworld_tx/");
SPI.begin();
radio.begin();
radio.setDataRate( RF24_250KBPS ) ;
network.begin(/*channel*/ 50, /*node address*/ this_node);
randomSeed(analogRead(0));
pinMode(7,INPUT_PULLUP);
}
void loop(void)
{
power_SW=!digitalRead(7);
led_VOL=analogRead(A0)/4;
// Pump the network regularly
network.update();
// If it's time to send a message, send it!
unsigned long now = millis();
if ( now - last_sent >= interval )
{
last_sent = now;
Serial.print("power_SW:");
Serial.println(power_SW);
Serial.print("led_VOL:");
Serial.println(led_VOL);
Serial.print("Sending...");
payload_t payload = {
millis(),power_SW,led_VOL };
RF24NetworkHeader header(/*to node*/ other_node);
bool ok = network.write(header,&payload,sizeof(payload));
if (ok)
Serial.println("ok.");
else
Serial.println("failed.");
}
}
//////////////////////////////////////從機-接收信號/////////////////////////////////////
#include
#include
#include
// nRF24L01(+) radio attached using Getting Started board
RF24 radio(9,10);
// Network uses that radio
RF24Network network(radio);
// Address of our node
const uint16_t this_node = 0;
// Address of the other node
const uint16_t other_node = 1;
// Structure of our payload
struct payload_t
{
uint32_t ms;
uint32_t sensorDataA;
uint32_t sensorDataB;
};
#define power_PIN 5
#define led_PIN 6
boolean power_SW;
int led_VOL;
void setup(void)
{
Serial.begin(115200);
SPI.begin();
radio.begin();
radio.setDataRate( RF24_250KBPS ) ;
network.begin(/*channel*/ 50, /*node address*/ this_node);
pinMode(power_PIN,OUTPUT);
pinMode(led_PIN,OUTPUT);
}
void loop(void)
{
// Pump the network regularly
network.update();
// Is there anything ready for us?
while ( network.available() )
{
// If so, grab it and print it out
RF24NetworkHeader header;
payload_t payload;
network.read(header,&payload,sizeof(payload));
power_SW=payload.sensorDataA;
led_VOL=payload.sensorDataB;
Serial.print("power_SW:");
Serial.println(power_SW);
Serial.print("led_VOL:");
Serial.println(led_VOL);
}
digitalWrite(power_PIN,power_SW);
analogWrite(led_PIN,led_VOL);
}
ESP8266 WiFi 是Arduino常用的WIFI模組,該模組有兩種運行模式(AP模式和STA模式)
AP模式(相當於區域網路連結,手機本地控制):
把ESP8266 WiFi 熱點,也就是預先設定ESP8266 AP熱點名稱與密碼,這樣手機搜尋WIFI找到設定的名稱與密碼就可以連線使用。
執行手機APK程式就可以用WIFI方式與Arduino ESP8266溝通。
STA模式(相當於Internet網路連結,用於外部網路讓手機、網頁控制):
網路資源
另一塊WIFI模組 :nRF24L01 (電壓不可超過3.6V)
nFR24L01 2.4G無線模組只能單向雙工,一個模組只能單純發送或接收,不能改變,所以我們使用兩塊Arduino開發板來分別收發
網路資源 網路資源02 網路資源03 網路資源04
使用器材
arduino UNR R3*2
NRF2401 *2
使用庫
RF24
RF24Network
//////////////////////////////////////主機-發送信號/////////////////////////////////////
#include
#include
#include
// nRF24L01(+) radio attached using Getting Started board
RF24 radio(9,10);
// Network uses that radio
RF24Network network(radio);
// Address of our node
const uint16_t this_node = 1;
// Address of the other node
const uint16_t other_node = 0;
// How often to send 'hello world to the other unit
const unsigned long interval = 150; //ms
// When did we last send?
unsigned long last_sent;
// How many have we sent already
//unsigned long packets_sent;
// Structure of our payload
struct payload_t
{
uint32_t ms;
uint32_t sensorDataA;
uint32_t sensorDataB;
};
boolean power_SW;
int led_VOL;
void setup(void)
{
Serial.begin(115200);
Serial.println("RF24Network/examples/helloworld_tx/");
SPI.begin();
radio.begin();
radio.setDataRate( RF24_250KBPS ) ;
network.begin(/*channel*/ 50, /*node address*/ this_node);
randomSeed(analogRead(0));
pinMode(7,INPUT_PULLUP);
}
void loop(void)
{
power_SW=!digitalRead(7);
led_VOL=analogRead(A0)/4;
// Pump the network regularly
network.update();
// If it's time to send a message, send it!
unsigned long now = millis();
if ( now - last_sent >= interval )
{
last_sent = now;
Serial.print("power_SW:");
Serial.println(power_SW);
Serial.print("led_VOL:");
Serial.println(led_VOL);
Serial.print("Sending...");
payload_t payload = {
millis(),power_SW,led_VOL };
RF24NetworkHeader header(/*to node*/ other_node);
bool ok = network.write(header,&payload,sizeof(payload));
if (ok)
Serial.println("ok.");
else
Serial.println("failed.");
}
}
//////////////////////////////////////從機-接收信號/////////////////////////////////////
#include
#include
#include
// nRF24L01(+) radio attached using Getting Started board
RF24 radio(9,10);
// Network uses that radio
RF24Network network(radio);
// Address of our node
const uint16_t this_node = 0;
// Address of the other node
const uint16_t other_node = 1;
// Structure of our payload
struct payload_t
{
uint32_t ms;
uint32_t sensorDataA;
uint32_t sensorDataB;
};
#define power_PIN 5
#define led_PIN 6
boolean power_SW;
int led_VOL;
void setup(void)
{
Serial.begin(115200);
SPI.begin();
radio.begin();
radio.setDataRate( RF24_250KBPS ) ;
network.begin(/*channel*/ 50, /*node address*/ this_node);
pinMode(power_PIN,OUTPUT);
pinMode(led_PIN,OUTPUT);
}
void loop(void)
{
// Pump the network regularly
network.update();
// Is there anything ready for us?
while ( network.available() )
{
// If so, grab it and print it out
RF24NetworkHeader header;
payload_t payload;
network.read(header,&payload,sizeof(payload));
power_SW=payload.sensorDataA;
led_VOL=payload.sensorDataB;
Serial.print("power_SW:");
Serial.println(power_SW);
Serial.print("led_VOL:");
Serial.println(led_VOL);
}
digitalWrite(power_PIN,power_SW);
analogWrite(led_PIN,led_VOL);
}
2015年10月5日 星期一
Arduino 與藍芽模組設定 HC-05 HC06
Arduino 與藍芽模組設定 HC-05 HC06
網昱多媒體 網路參考資料 透過藍芽傳輸程式 透過藍芽傳輸程式02
透過藍芽傳輸程式03
AT:測試,回應「OK」
AT+VERSION:回應靭體的版本。
AT+NAMExyz:將裝置名稱改為「xyz」。
AT+PIN1234:將連線密碼換為「1234」。
AT+BAUD4:將 baud rate 換為 9600。
AT+BAUD5:將 baud rate 換為 19200
AT+BAUD6:將 baud rate 換為 38400
AT+BAUD7:將 baud rate 換為 57600
網昱多媒體 網路參考資料 透過藍芽傳輸程式 透過藍芽傳輸程式02
透過藍芽傳輸程式03
HC-06 和 Arduino 的腳位對應如下:
HC-06 VCC → Arduino 5V
HC-06 GND → Arduino GND
HC-06 TXD → Arduino pin 10
HC-06 RXD → Arduino pin 11
#include
SoftwareSerial BTSerial(10, 11); // RX | TX
void setup()
{
Serial.begin(9600);
Serial.println("Enter AT commands:");
BTSerial.begin(9600); // HC-06 current bound rate (default 9600)
}
void loop()
{
// Keep reading from HC-06 and send to Arduino Serial Monitor
if (BTSerial.available())
Serial.write(BTSerial.read());
// Keep reading from Arduino Serial Monitor and send to HC-06
if (Serial.available())
BTSerial.write(Serial.read());
}
執行AT命令修改相關資料
訂閱:
文章 (Atom)


