我買的接收器是VS1838B
https://github.com/z3t0/Arduino-IRremote
想要做到把接收到的遙控器編碼顯示在LCD上,並且可以控制繼電器
依照底下程式碼把線接好,使用的是內建的library
#include <LiquidCrystal.h>
#include <IRremote.h>
#include <IRremoteInt.h>
LiquidCrystal lcd(11,12,6,5,4,3); //設定LCD需要的腳位
int irReceiverPin = 2; //設定紅外線的接收腳位
int power=7;
IRrecv irrecv(irReceiverPin); // 宣告一個變數儲存接收紅外線訊號
decode_results results; // 宣告一個變數儲存儲存訊號解譯的結果
void setup() {
// put your setup code here, to run once:
lcd.begin(16,2);
lcd.print("hello,world!");
Serial.begin(9600);
irrecv.blink13(true); // 設為true的話,當收到訊號時,腳位13的LED便會閃爍
irrecv.enableIRIn(); // 啟動接收
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.backlight();
pinMode(7,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
lcd.setCursor(0,1);
if (irrecv.decode(&results)) { // 假如有收到紅外線訊號
lcd.clear();
Serial.print("results value is "); // 輸出解碼後的資料
Serial.println(results.value, HEX);
lcd.print(results.value, HEX);
switch (results.value) {
case ;
//digitalWrite(7,HIGHT);
break;
case ;
//digitalWrite(7,LOW);
break;
}
delay(1000);
irrecv.resume(); // 準備接收下一個訊號
}
但是,用上面的libraries卻一直無法正確編譯,應該是說對於同一個紅外線按鈕解譯後的數值不固定,所以去找了一本"Arduino實作入門與應用",用作者所提供的libraies,才成功抓到固定的數值,這樣,我就可以把腳位13連到繼電器,用紅外線做了一個遙控開關,
#include <LiquidCrystal.h>
#include<rc95a.h>
int cir=7; //紅外線腳位
int led=13; //led腳位
LiquidCrystal lcd(11,12,6,5,4,3); //LCD需要的腳位
int c,i,code;
void setup() {
lcd.begin(16,2);
lcd.print("hello,world!");
pinMode(cir,INPUT);
Serial.begin(9600);
}
void loop() {
while(1)
{
lcd.setCursor(0,1);
Serial.println("ir code is : ");
loop:
no_ir=1; ir_ins(cir); if(no_ir==1) goto loop;
rev();
for(i=0; i<4; i++)
{c=(int)com[i]; Serial.print(c);lcd.print(c);}
code=(int)com[3];
switch (code)
{
case 243:
digitalWrite(led, HIGH);
break;
case 233:
digitalWrite(led, LOW);
break;
}
delay(30);
}
}
2019年6月25日 星期二
2019年6月24日 星期一
想要arduino跟手機連線,監測太陽能發電
因為在南投竹山老家安裝了兩片50W的太陽能板,就一直對發電狀況很有興趣
但是, 當初買的控制器沒有任何查詢功能,
不過手邊有一堆淘來的arduino,所以就想說來試試看
目的很簡單,就是想看看幾點開始發電,電壓多少,
電壓很快,只要加個偵測模組就好,
幾點發電就比較麻煩,因為arduino先天記憶體的限制,
好像幾天之後就必須reset,不然就會有記憶體溢位的問題,
所以就變成反推的方式,從太陽能可以發電就開始計時,
看時間就可以反推幾點開始發電,大概知道就好,
雖然想說底下就是完成品了,
但是,從太陽能可以發電就開始計時的話,arduino的電力就必須由太陽能供電,
所以就再找了降壓模組接到arduino,下圖就是完成品了,
其實,手癢接了個藍芽模組,就是標題說的手機連線,
結果,當我把電壓、溫度、濕度傳回手機的時候,
三個數值會在不同的欄位跳來跳去,電壓顯示在溫度,溫度顯示在溼度,
可是我明明是寫成一次傳回一個數值塞進一個欄位,再進行下一個傳送,
一直想不到問題原因,也不抓畫面了。

另外,接太陽能的蓄電池,除了汽車用的電池之後,我又用三顆18650當成一組,
做成三組接上去充電,已經一個月是沒有問題,再觀察看看。
不過手邊有一堆淘來的arduino,所以就想說來試試看
目的很簡單,就是想看看幾點開始發電,電壓多少,
電壓很快,只要加個偵測模組就好,
幾點發電就比較麻煩,因為arduino先天記憶體的限制,
好像幾天之後就必須reset,不然就會有記憶體溢位的問題,
所以就變成反推的方式,從太陽能可以發電就開始計時,
看時間就可以反推幾點開始發電,大概知道就好,
雖然想說底下就是完成品了,
但是,從太陽能可以發電就開始計時的話,arduino的電力就必須由太陽能供電,
所以就再找了降壓模組接到arduino,下圖就是完成品了,
其實,手癢接了個藍芽模組,就是標題說的手機連線,
結果,當我把電壓、溫度、濕度傳回手機的時候,
三個數值會在不同的欄位跳來跳去,電壓顯示在溫度,溫度顯示在溼度,
可是我明明是寫成一次傳回一個數值塞進一個欄位,再進行下一個傳送,
一直想不到問題原因,也不抓畫面了。

另外,接太陽能的蓄電池,除了汽車用的電池之後,我又用三顆18650當成一組,
做成三組接上去充電,已經一個月是沒有問題,再觀察看看。
2019年6月17日 星期一
HC-SR04超音波測距模組
利用超音波的發射、反射、接收所需的時間來計算距離,
所使用的原理跟公式網路上的說明非常多,但是對物理系的我來說公式都看得懂,
兜到程式上就是連結不起來,只好一步一步來了。
先講公式的原理,擷取自 https://atceiling.blogspot.com/2017/03/arduino_28.html
在攝氏零度之海平面音速約為331.5公尺/秒,每升高1攝氏度,音速就增加0.607公尺/秒,可以列出一個公式:
• 音速 c = 331.5 + 0.607 * t (其中 t 為攝氏溫度)。
例: 攝氏20度時的音速約為: 331.5 + 0.607*20 = 343.64 公尺/秒
因為我們是要把時間轉換成距離,所以知道速度之後,再把
• 音速公尺/秒 換算成 公分/微秒:343.64 * 100 / 1000000 = 0.034364 公分/微秒,亦即
音速每公分需要29.1 微秒: 1 / 0.034364 = 29.1 微秒/公分
不過,最前面有說過,這個模組的作用是發射、反射、接收所需的時間,因此實際上時間是兩倍,所以還要先把時間除以二。
duration = pulseIn(echoPin, HIGH); // 收到高電位時的時間 cm = (duration/2) / 29.1; // 將時間換算成距離 cm
那,這個模組是怎麼計算出這個時間呢,擷取自
http://ming-shian.blogspot.com/2013/09/arduino-hc-sr04.html
還是脫離不了最前面所說的發射、反射、接收,重點就是發射超音波,接收反射的超音波,
Trig就是驅動發射超音波,Echo就是送出接收反射的超音波
依據下圖的規格,第一步就是送出10us的TTL pulse給Trig (TTL pulse是什麼),
模組就會送出8個超音波,
最後再去接收時間,(要用pulseIn這個函數,讀取收到反射超音波的時間,所以要寫HIGH)
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH); // 給 Trig 高電位,持續 10微秒
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT); // 讀取 echo 的電位
duration = pulseIn(echoPin, HIGH); // 收到高電位時的時間
配合Otto的腳位,trig是8, echo是9,完整的測試碼如下所示
int trigPin = 8; //Trig Pin
int echoPin = 9; //Echo Pin
long duration, cm, inches;
void setup() {
Serial.begin (9600); // Serial Port begin
pinMode(trigPin, OUTPUT); //Define inputs and outputs
pinMode(echoPin, INPUT);
}
void loop()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH); // 給 Trig 高電位,持續 10微秒
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT); // 讀取 echo 的電位
duration = pulseIn(echoPin, HIGH); // 收到高電位時的時間
cm = (duration/2) / 29.1; // 將時間換算成距離 cm 或 inch
inches = (duration/2) / 74;
Serial.print("Distance : ");
Serial.print(inches);
Serial.print("in, ");
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(250);
}
2019年5月2日 星期四
LCD顯示
我買到的LCD顯示器有兩種,下圖上方是原始的,下圖下方是有加上轉換IC的,不同點在背面,
原始的LCD雖然接線很複雜,只要照著接就好,自己搞最久的是在相對簡單的加強版上
因為搞錯IC的型號,找到的函式庫都不對,測試了很久,終於找到了底下的連結可以使用
https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads/
另外,底下是原本的測試碼,用的是11,12,6,5,4,3這6個腳位,但是中間有跳過腳位,心理一直很介意
#include <LiquidCrystal.h>
LiquidCrystal lcd(11,12,6,5,4,3);
void setup() {
// put your setup code here, to run once:
lcd.begin(16,2);
lcd.print("hello,world!");
}
void loop() {
// put your main code here, to run repeatedly:
lcd.setCursor(0,1);
lcd.print(millis()/1000);
}
所以又尋找到一篇可以自訂腳位的方法,看到排線都在一邊,心裡就舒暢了點。
http://yhhuang1966.blogspot.com/2015/03/arduino_25.html
#include <LiquidCrystal.h>
#define RS 2
#define E 3
#define D4 4
#define D5 5
#define D6 6
#define D7 7
LiquidCrystal lcd(RS,E,D4,D5,D6,D7); //建立 LCD 物件
void setup() { //初始設定 (一次性)
lcd.begin(16,2); //定義 LCD 為 2 列 16 行顯示器
lcd.setCursor(0,0); //游標移到左上角
lcd.print("Hello World!"); //在第一列印出 Hello World!
}
void loop() { //無限迴圈
lcd.setCursor(0,1); //游標移到第 2 列第 1 行
lcd.print(millis()/1000); //印出秒數
}
| 接腳 | 功能 | 接 Arduino |
| 1 (VSS) | 電源負極 | GND |
| 2 (VCC) | 電源正極 | 5V |
| 3 (Vo) | 調整對比 | 可變電阻中腳 |
| 4 (RS) | D0~D7放入資料暫存器 (1) 或指令資料暫存器 (0) | 腳位 2 |
| 5 (RW) | 讀取 (1) 或寫入 (0) LCD | GND (寫入) |
| 6 (E) | 可寫入 (1) 或不可寫入 (0) LCD | 腳位 3 |
| 11 (D4) | 資料位元 4 | 腳位 4 |
| 12 (D5) | 資料位元 5 | 腳位 5 |
| 13 (D6) | 資料位元 6 | 腳位 6 |
| 14 (D7) | 資料位元 7 | 腳位 7 |
| 15 (A+) | 背光電源正極 | 5V |
| 16 (-K) | 背光電源負極 | GND |
再來看有轉換IC的
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup() {
// put your setup code here, to run once:
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.backlight();
lcd.print("hello,world!");
}
void loop() {
// put your main code here, to run repeatedly:
lcd.setCursor(0,1);
lcd.print(millis()/1000);
}
溫濕度感測器DHT11
這是測試用的sensor,背面有印上規格,
底下聯結有詳細說明
http://playground.arduino.cc/Main/DHT11Lib
並且有建議的接線方式
因為arduino要去讀懂這個sensor的data,所以我們必須要把解讀sensor的資訊給arduino,也就是這個sensor的library,底下的聯結有提供製作的方法
http://playground.arduino.cc/Main/DHT11Lib
像底下這樣子的檔案架構
準備好之後,就可以開始撰寫程式了,但是,有一個觀念要先說明,那就是sensor偵測到的值要怎麼顯示出來呢?因為現在還沒有講到LCD,只能叫arduino送出來,送到哪裡呢?就是寫程式時在工具那邊有個"序列埠監控視窗"的選項,為什麼是序列埠呢?這牽涉arduino的設計,
#include <dht11.h>
dht11 DHT11;
const byte dataPin=2;
void setup() {
Serial.begin(9600);
}
void loop() {
int chk=DHT11.read(dataPin);
if (chk==0) {
Serial.print("Humidity (%): ");
Serial.println((float)DHT11.humidity,2);
Serial.print("Temperature (.C): ");
Serial.println((float)DHT11.temperature,2);
}
else {
Serial.println("Sensor Error");
}
delay (2000);
}
2019年2月17日 星期日
MPU-6050三軸加速度陀螺儀6DOF模組 GY-521
這個模組能夠輸出六個數據,三個軸的傾斜角度跟加速度,但是角度是偵測水平變化,而加速度則是偵測線性運動的變化,在還沒開始使用前,自己就感到很困惑,因為拿到這個模組時,很懷疑這麼小的東西要怎麼偵測這兩種數據,尤其是還有陀螺儀,印象中,陀螺儀不就是一個陀螺在轉嗎?
於是上網用"mems 陀螺儀"查看看,了解是利用科氏力(科裡奧利力(Coriolis))的原理,在微電機裡面也不是真的有個陀螺,詳細就不去研究了,先知道個大概之後,就來用看看吧。
然後,又遇到問題了,我根本不知道有什麼SCL,SDA之類的,查到了SDA (Serial Data line),SCL (Serial Clock Line),的說明,這是兩個裝置通訊所用的接腳,至於通訊用的協定則是採用I2C,因為這個模組用的通訊協定是I2C,所以就會使用這兩個接腳,我有查到接腳的說明,路徑如下
https://www.mschoeffler.de/2017/10/05/tutorial-how-to-use-the-gy-521-module-mpu-6050-breakout-board-with-the-arduino-uno/
好,那arduino上呢?
- VCC (The breakout board has a voltage regulator. Therefore, you can connect the board to 3.3V and 5V sources.)
- GND
- SCL (Serial Clock Line of the I2C protocol.)
- SDA (Serial Data Line of the I2C protocol.)
- XDA (Auxiliary data => I2C master serial data for connecting the module to external sensors.)
- XCL (Auxiliary clock => I2C master serial clock for connecting the module to external sensors.)
- AD0 (If this pin is LOW, the I2C address of the board will be 0x68. Otherwise, if the pin is HIGH, the address will be 0x69.)
- INT (Interrupt digital output)
因為我用的是arduino nano,就查了一下接腳,A5是SCL,A4則是SDA
網路上有很多文章,我是參考底下這篇
http://dory168.blogspot.com/p/gy-521sensormpu-6050dmp-ic.html
函式庫是底下路徑,要注意的是所需要的函式庫是放在Arduino目錄下
https://github.com/jrowberg/i2cdevlib
還有,文章中有提到驗證會出現錯誤,我抓的版本沒有,也許有修正錯誤了
因為有輸出數據,就不想去研究了
看到了數字,就想試試看圖像化的效果,
但是,在下載 “Toxi” 函式庫時遇到問題,因為這個連結過去的好像不是,就GOOGLE了一下,從網站首頁找下底下的網址
https://bitbucket.org/postspectacular/toxiclibs/downloads/
結果,安裝processing的時候又遇到了問題,出現警告訊息說有檔案遺失而無法安裝,於是試了幾個版本,最新版都不行,防毒都關了也沒用,只有2.2.1可以開啟,但是編譯的時候卻出現錯誤,看來是JVM的版本不合,抓了各種JVM都不行,就卡在這裡了。
而且發現,瞬間超過某個角度之後,MPU6050就會當掉,又再上網查了之後知道這是抓data時會頓停的問題,但是就必須要連arduino都要重開,所以又在找到下面的文章,使用他的程式碼後就好了。
http://microchip.eefocus.com/module/forum/thread-57814-1-1.html
2019年2月13日 星期三
Mini MP3 Player
為了想要用arduino控制音效,所以淘了這個撥放器回來試試看,一看到底下說明整個就傻住了,竟然要發送指令,這,我不會啊,幸好賣家提供了一篇文章

https://stonez56.blogspot.com/2015/03/arduino-dfplayer-mini-mp3-module.html
原始文章應該出自底下
https://t93093.wordpress.com/2017/08/03/arduino-%E6%B8%AC%E8%A9%A6-dfplayer-mini-mp3-%E6%92%AD%E6%94%BE%E6%A8%A1%E7%B5%84/
但是,看的時候不仔細,多花了點時間,所以依照自己的方式做紀錄,
先到底下路徑抓函式庫放到arduino的libraries
https://github.com/DFRobot/DFPlayer-Mini-mp3
#include <DFPlayer_Mini_Mp3.h>
聲音檔的放置方式:
在準備的micro SD卡裡面新增"mp3" 資料夾,把聲音檔放進這個資料夾
而聲音檔要先以四個數字命名0001~9999,在寫arduino程式碼的時候,要使用哪個聲音檔,不管前面的0,比如0001寫1就可以,
mp3_play (1); //播放0001的聲音檔
測試用的程式碼,注意接腳用的是0、1,所以傳程式碼時先不要接
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
//
void setup () {
Serial.begin (9600);
mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module
mp3_set_volume (15);
}
//
void loop () {
mp3_play (1);
delay (6000);
}
聲音檔名的數字之後就可以加文字,比如0001test.mp3,
我也拆了一條USB線,測試讀卡功能,插到電腦上,還真的有抓到勒
只是,有個困惱的地方,接喇叭的正負極並沒有清楚的標示,實際上測試則是怎麼接都可以,但SPK2接正極的時候雜音比較少,至於要沒雜音的話,
依照官方的說法,需要接個1k的電阻,不過,上述的測試程式碼不能使用底下的接腳,因為是接10、11,所以為了符合底下的接腳說明,稍微修改了一下
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
void setup() {
Serial.begin (9600);
mySoftwareSerial.begin(9600);
mp3_set_serial (mySoftwareSerial); //set Serial for DFPlayer-mini mp3 module
mp3_set_volume (20);
}
void loop () {
mp3_play (1); //play 0001.mp3
delay(10)
}
官方也有提供函式庫跟範例
http://wiki.dfrobot.com.cn/index.php/(SKU:DFR0299)DFPlayer_Mini%E6%A8%A1%E5%9D%97
接著,我叫兒子錄了兩句話,把它接到otto上,只不過otto的10跟11是用來接嘴巴的Led,因為線太亂,我沒有接,修改成遇到障礙物發出人聲警告。
題外話,因為我本來是用mblock寫程式,但是不知道怎麼把MP3player加進去,所以想用arduino 的IDE來編輯程式碼,但是,不管怎麼compiler都失敗,後來,到下面下載函式庫放到libraries裡面就可以了。
https://github.com/stembotvn/OttoDIY_mBlock_Extension
https://stonez56.blogspot.com/2015/03/arduino-dfplayer-mini-mp3-module.html
原始文章應該出自底下
https://t93093.wordpress.com/2017/08/03/arduino-%E6%B8%AC%E8%A9%A6-dfplayer-mini-mp3-%E6%92%AD%E6%94%BE%E6%A8%A1%E7%B5%84/
但是,看的時候不仔細,多花了點時間,所以依照自己的方式做紀錄,
先到底下路徑抓函式庫放到arduino的libraries
https://github.com/DFRobot/DFPlayer-Mini-mp3
#include <DFPlayer_Mini_Mp3.h>
聲音檔的放置方式:
在準備的micro SD卡裡面新增"mp3" 資料夾,把聲音檔放進這個資料夾
而聲音檔要先以四個數字命名0001~9999,在寫arduino程式碼的時候,要使用哪個聲音檔,不管前面的0,比如0001寫1就可以,
mp3_play (1); //播放0001的聲音檔
測試用的程式碼,注意接腳用的是0、1,所以傳程式碼時先不要接
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
//
void setup () {
Serial.begin (9600);
mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module
mp3_set_volume (15);
}
//
void loop () {
mp3_play (1);
delay (6000);
}
聲音檔名的數字之後就可以加文字,比如0001test.mp3,
我也拆了一條USB線,測試讀卡功能,插到電腦上,還真的有抓到勒
依照官方的說法,需要接個1k的電阻,不過,上述的測試程式碼不能使用底下的接腳,因為是接10、11,所以為了符合底下的接腳說明,稍微修改了一下
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
void setup() {
Serial.begin (9600);
mySoftwareSerial.begin(9600);
mp3_set_serial (mySoftwareSerial); //set Serial for DFPlayer-mini mp3 module
mp3_set_volume (20);
}
void loop () {
mp3_play (1); //play 0001.mp3
delay(10)
}
官方也有提供函式庫跟範例
http://wiki.dfrobot.com.cn/index.php/(SKU:DFR0299)DFPlayer_Mini%E6%A8%A1%E5%9D%97
接著,我叫兒子錄了兩句話,把它接到otto上,只不過otto的10跟11是用來接嘴巴的Led,因為線太亂,我沒有接,修改成遇到障礙物發出人聲警告。
題外話,因為我本來是用mblock寫程式,但是不知道怎麼把MP3player加進去,所以想用arduino 的IDE來編輯程式碼,但是,不管怎麼compiler都失敗,後來,到下面下載函式庫放到libraries裡面就可以了。
https://github.com/stembotvn/OttoDIY_mBlock_Extension
訂閱:
文章 (Atom)















